From: Shaun McDonald Date: Tue, 18 Nov 2008 16:21:32 +0000 (+0000) Subject: Validations on the way tags, with unit tests X-Git-Tag: live~8121^2~139 X-Git-Url: https://git.openstreetmap.org./rails.git/commitdiff_plain/96dfe22fb006ec421f6b0bf42ca71f365b1a1e95?ds=sidebyside Validations on the way tags, with unit tests --- diff --git a/app/models/node_tag.rb b/app/models/node_tag.rb index de3d0629c..6b21e4b01 100644 --- a/app/models/node_tag.rb +++ b/app/models/node_tag.rb @@ -4,5 +4,5 @@ class NodeTag < ActiveRecord::Base belongs_to :node, :foreign_key => 'id' validates_presence_of :id - validates_length_of :k, :v, :within => 0..255, :allow_blank => true + validates_length_of :k, :v, :maximum => 255, :allow_blank => true end diff --git a/app/models/old_node_tag.rb b/app/models/old_node_tag.rb index ef32a0613..392e3934e 100644 --- a/app/models/old_node_tag.rb +++ b/app/models/old_node_tag.rb @@ -4,6 +4,6 @@ class OldNodeTag < ActiveRecord::Base set_table_name 'node_tags' validates_presence_of :id, :version - validates_length_of :k, :v, :within => 0..255, :allow_blank => true + validates_length_of :k, :v, :maximum => 255, :allow_blank => true end diff --git a/app/models/old_way_tag.rb b/app/models/old_way_tag.rb index b02fd45b9..547fd177c 100644 --- a/app/models/old_way_tag.rb +++ b/app/models/old_way_tag.rb @@ -3,4 +3,8 @@ class OldWayTag < ActiveRecord::Base set_table_name 'way_tags' + validates_presence_of :id + validates_length_of :k, :v, :maximum => 255, :allow_blank => true + validates_uniqueness_of :id, :scope => [:k, :version] + validates_numericality_of :id, :version, :only_integer => true end diff --git a/app/models/way_tag.rb b/app/models/way_tag.rb index 4548674d4..fa9b43361 100644 --- a/app/models/way_tag.rb +++ b/app/models/way_tag.rb @@ -6,4 +6,9 @@ class WayTag < ActiveRecord::Base # FIXME add a real multipart key to waytags so that we can do eager loadin belongs_to :way, :foreign_key => 'id' + + validates_presence_of :id + validates_length_of :k, :v, :maximum => 255, :allow_blank => true + validates_uniqueness_of :id, :scope => :k + validates_numericality_of :id, :only_integer => true end diff --git a/test/unit/node_tag_test.rb b/test/unit/node_tag_test.rb index fe6ebb166..9d3da03b1 100644 --- a/test/unit/node_tag_test.rb +++ b/test/unit/node_tag_test.rb @@ -46,8 +46,8 @@ class NodeTagTest < Test::Unit::TestCase tag = NodeTag.new tag.id = current_node_tags(:t1).id tag.k = i - tag.v = "v", "Key should be too long" - assert !tag.valid? + tag.v = "v" + assert !tag.valid?, "Key should be too long" assert tag.errors.invalid?(:k) end end diff --git a/test/unit/old_way_tag_test.rb b/test/unit/old_way_tag_test.rb new file mode 100644 index 000000000..8210ef0c4 --- /dev/null +++ b/test/unit/old_way_tag_test.rb @@ -0,0 +1,76 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class WayTagTest < Test::Unit::TestCase + fixtures :way_tags + set_fixture_class :way_tags => OldWayTag + + def test_tag_count + assert_equal 3, OldWayTag.count + end + + def test_length_key_valid + key = "k" + (0..255).each do |i| + tag = OldWayTag.new + tag.id = way_tags(:t1).id + tag.version = 1 + tag.k = key*i + tag.v = "v" + assert_valid tag + end + end + + def test_length_value_valid + val = "v" + (0..255).each do |i| + tag = OldWayTag.new + tag.id = way_tags(:t1).id + tag.version = 1 + tag.k = "k" + tag.v = val*i + assert_valid tag + end + end + + def test_length_key_invalid + ["k"*256].each do |i| + tag = OldWayTag.new + tag.id = way_tags(:t1).id + tag.version = 1 + tag.k = i + tag.v = "v" + assert !tag.valid?, "Key should be too long" + assert tag.errors.invalid?(:k) + end + end + + def test_length_value_invalid + ["k"*256].each do |i| + tag = OldWayTag.new + tag.id = way_tags(:t1).id + tag.version = 1 + tag.k = "k" + tag.v = i + assert !tag.valid?, "Value should be too long" + assert tag.errors.invalid?(:v) + end + end + + def test_empty_node_tag_invalid + tag = OldNodeTag.new + assert !tag.valid?, "Empty tag should be invalid" + assert tag.errors.invalid?(:id) + end + + def test_uniqueness + tag = OldWayTag.new + tag.id = way_tags(:t1).id + tag.version = way_tags(:t1).version + tag.k = way_tags(:t1).k + tag.v = way_tags(:t1).v + assert tag.new_record? + assert !tag.valid? + assert_raise(ActiveRecord::RecordInvalid) {tag.save!} + assert tag.new_record? + end +end diff --git a/test/unit/way_tag_test.rb b/test/unit/way_tag_test.rb index cd296749e..44b96ffe3 100644 --- a/test/unit/way_tag_test.rb +++ b/test/unit/way_tag_test.rb @@ -8,4 +8,63 @@ class WayTagTest < Test::Unit::TestCase assert_equal 3, WayTag.count end + def test_length_key_valid + key = "k" + (0..255).each do |i| + tag = WayTag.new + tag.id = current_way_tags(:t1).id + tag.k = key*i + tag.v = current_way_tags(:t1).v + assert_valid tag + end + end + + def test_length_value_valid + val = "v" + (0..255).each do |i| + tag = WayTag.new + tag.id = current_way_tags(:t1).id + tag.k = "k" + tag.v = val*i + assert_valid tag + end + end + + def test_length_key_invalid + ["k"*256].each do |i| + tag = WayTag.new + tag.id = current_way_tags(:t1).id + tag.k = i + tag.v = "v" + assert !tag.valid?, "Key #{i} should be too long" + assert tag.errors.invalid?(:k) + end + end + + def test_length_value_invalid + ["k"*256].each do |i| + tag = WayTag.new + tag.id = current_way_tags(:t1).id + tag.k = "k" + tag.v = i + assert !tag.valid?, "Value #{i} should be too long" + end + end + + def test_empty_tag_invalid + tag = WayTag.new + assert !tag.valid?, "Empty way tag should be invalid" + assert tag.errors.invalid?(:id) + end + + def test_uniquess + tag = WayTag.new + tag.id = current_way_tags(:t1).id + tag.k = current_way_tags(:t1).k + tag.v = current_way_tags(:t1).v + assert tag.new_record? + assert !tag.valid? + assert_raise(ActiveRecord::RecordInvalid) {tag.save!} + assert tag.new_record? + end end