1 # frozen_string_literal: true
 
   5 class ChangesetTest < ActiveSupport::TestCase
 
   6   def test_num_changes_valid
 
   7     changeset = create(:changeset)
 
   8     assert_predicate changeset, :valid?
 
   9     changeset.num_changes = nil
 
  10     assert_not_predicate changeset, :valid?
 
  11     changeset.num_changes = -1
 
  12     assert_not_predicate changeset, :valid?
 
  13     changeset.num_changes = 0
 
  14     assert_predicate changeset, :valid?
 
  15     changeset.num_changes = 1
 
  16     assert_predicate changeset, :valid?
 
  19   def test_num_type_changes_valid
 
  20     [:num_created_nodes, :num_modified_nodes, :num_deleted_nodes,
 
  21      :num_created_ways, :num_modified_ways, :num_deleted_ways,
 
  22      :num_created_relations, :num_modified_relations, :num_deleted_relations].each do |counter_attribute|
 
  23        changeset = create(:changeset)
 
  24        assert_predicate changeset, :valid?
 
  25        changeset[counter_attribute] = nil
 
  26        assert_not_predicate changeset, :valid?
 
  27        changeset[counter_attribute] = -1
 
  28        assert_not_predicate changeset, :valid?
 
  29        changeset[counter_attribute] = 0
 
  30        assert_predicate changeset, :valid?
 
  31        changeset[counter_attribute] = 1
 
  32        assert_predicate changeset, :valid?
 
  36   def test_num_type_changes_in_sync_for_new_changeset
 
  37     changeset = create(:changeset)
 
  39     assert_equal 0, changeset.num_created_elements
 
  40     assert_equal 0, changeset.num_modified_elements
 
  41     assert_equal 0, changeset.num_deleted_elements
 
  43     assert_equal 0, changeset.num_changed_nodes
 
  44     assert_equal 0, changeset.num_changed_ways
 
  45     assert_equal 0, changeset.num_changed_relations
 
  47     assert_predicate changeset, :num_type_changes_in_sync?
 
  50   def test_num_type_changes_not_in_sync_for_changeset_without_type_changes
 
  51     changeset = create(:changeset, :num_changes => 1)
 
  53     assert_equal 0, changeset.num_created_elements
 
  54     assert_equal 0, changeset.num_modified_elements
 
  55     assert_equal 0, changeset.num_deleted_elements
 
  57     assert_equal 0, changeset.num_changed_nodes
 
  58     assert_equal 0, changeset.num_changed_ways
 
  59     assert_equal 0, changeset.num_changed_relations
 
  61     assert_not_predicate changeset, :num_type_changes_in_sync?
 
  64   def test_num_type_changes_in_sync_for_changeset_with_created_nodes
 
  65     changeset = create(:changeset, :num_changes => 1, :num_created_nodes => 1)
 
  67     assert_equal 1, changeset.num_created_elements
 
  68     assert_equal 0, changeset.num_modified_elements
 
  69     assert_equal 0, changeset.num_deleted_elements
 
  71     assert_equal 1, changeset.num_changed_nodes
 
  72     assert_equal 0, changeset.num_changed_ways
 
  73     assert_equal 0, changeset.num_changed_relations
 
  75     assert_predicate changeset, :num_type_changes_in_sync?
 
  78   def test_num_type_changes_in_sync_for_changeset_with_modified_nodes
 
  79     changeset = create(:changeset, :num_changes => 1, :num_modified_nodes => 1)
 
  81     assert_equal 0, changeset.num_created_elements
 
  82     assert_equal 1, changeset.num_modified_elements
 
  83     assert_equal 0, changeset.num_deleted_elements
 
  85     assert_equal 1, changeset.num_changed_nodes
 
  86     assert_equal 0, changeset.num_changed_ways
 
  87     assert_equal 0, changeset.num_changed_relations
 
  89     assert_predicate changeset, :num_type_changes_in_sync?
 
  92   def test_num_type_changes_in_sync_for_changeset_with_deleted_nodes
 
  93     changeset = create(:changeset, :num_changes => 1, :num_deleted_nodes => 1)
 
  95     assert_equal 0, changeset.num_created_elements
 
  96     assert_equal 0, changeset.num_modified_elements
 
  97     assert_equal 1, changeset.num_deleted_elements
 
  99     assert_equal 1, changeset.num_changed_nodes
 
 100     assert_equal 0, changeset.num_changed_ways
 
 101     assert_equal 0, changeset.num_changed_relations
 
 103     assert_predicate changeset, :num_type_changes_in_sync?
 
 106   def test_num_type_changes_in_sync_for_changeset_with_changed_nodes
 
 107     changeset = create(:changeset, :num_changes => 3 + 2 + 1,
 
 108                                    :num_created_nodes => 3,
 
 109                                    :num_modified_nodes => 2,
 
 110                                    :num_deleted_nodes => 1)
 
 112     assert_equal 3, changeset.num_created_elements
 
 113     assert_equal 2, changeset.num_modified_elements
 
 114     assert_equal 1, changeset.num_deleted_elements
 
 116     assert_equal 3 + 2 + 1, changeset.num_changed_nodes
 
 117     assert_equal 0, changeset.num_changed_ways
 
 118     assert_equal 0, changeset.num_changed_relations
 
 120     assert_predicate changeset, :num_type_changes_in_sync?
 
 123   def test_num_type_changes_in_sync_for_changeset_with_created_ways
 
 124     changeset = create(:changeset, :num_changes => 1, :num_created_ways => 1)
 
 126     assert_equal 1, changeset.num_created_elements
 
 127     assert_equal 0, changeset.num_modified_elements
 
 128     assert_equal 0, changeset.num_deleted_elements
 
 130     assert_equal 0, changeset.num_changed_nodes
 
 131     assert_equal 1, changeset.num_changed_ways
 
 132     assert_equal 0, changeset.num_changed_relations
 
 134     assert_predicate changeset, :num_type_changes_in_sync?
 
 137   def test_num_type_changes_in_sync_for_changeset_with_modified_ways
 
 138     changeset = create(:changeset, :num_changes => 1, :num_modified_ways => 1)
 
 140     assert_equal 0, changeset.num_created_elements
 
 141     assert_equal 1, changeset.num_modified_elements
 
 142     assert_equal 0, changeset.num_deleted_elements
 
 144     assert_equal 0, changeset.num_changed_nodes
 
 145     assert_equal 1, changeset.num_changed_ways
 
 146     assert_equal 0, changeset.num_changed_relations
 
 148     assert_predicate changeset, :num_type_changes_in_sync?
 
 151   def test_num_type_changes_in_sync_for_changeset_with_deleted_ways
 
 152     changeset = create(:changeset, :num_changes => 1, :num_deleted_ways => 1)
 
 154     assert_equal 0, changeset.num_created_elements
 
 155     assert_equal 0, changeset.num_modified_elements
 
 156     assert_equal 1, changeset.num_deleted_elements
 
 158     assert_equal 0, changeset.num_changed_nodes
 
 159     assert_equal 1, changeset.num_changed_ways
 
 160     assert_equal 0, changeset.num_changed_relations
 
 162     assert_predicate changeset, :num_type_changes_in_sync?
 
 165   def test_num_type_changes_in_sync_for_changeset_with_changed_ways
 
 166     changeset = create(:changeset, :num_changes => 3 + 2 + 1,
 
 167                                    :num_created_ways => 3,
 
 168                                    :num_modified_ways => 2,
 
 169                                    :num_deleted_ways => 1)
 
 171     assert_equal 3, changeset.num_created_elements
 
 172     assert_equal 2, changeset.num_modified_elements
 
 173     assert_equal 1, changeset.num_deleted_elements
 
 175     assert_equal 0, changeset.num_changed_nodes
 
 176     assert_equal 3 + 2 + 1, changeset.num_changed_ways
 
 177     assert_equal 0, changeset.num_changed_relations
 
 179     assert_predicate changeset, :num_type_changes_in_sync?
 
 182   def test_num_type_changes_in_sync_for_changeset_with_created_relations
 
 183     changeset = create(:changeset, :num_changes => 1, :num_created_relations => 1)
 
 185     assert_equal 1, changeset.num_created_elements
 
 186     assert_equal 0, changeset.num_modified_elements
 
 187     assert_equal 0, changeset.num_deleted_elements
 
 189     assert_equal 0, changeset.num_changed_nodes
 
 190     assert_equal 0, changeset.num_changed_ways
 
 191     assert_equal 1, changeset.num_changed_relations
 
 193     assert_predicate changeset, :num_type_changes_in_sync?
 
 196   def test_num_type_changes_in_sync_for_changeset_with_modified_relations
 
 197     changeset = create(:changeset, :num_changes => 1, :num_modified_relations => 1)
 
 199     assert_equal 0, changeset.num_created_elements
 
 200     assert_equal 1, changeset.num_modified_elements
 
 201     assert_equal 0, changeset.num_deleted_elements
 
 203     assert_equal 0, changeset.num_changed_nodes
 
 204     assert_equal 0, changeset.num_changed_ways
 
 205     assert_equal 1, changeset.num_changed_relations
 
 207     assert_predicate changeset, :num_type_changes_in_sync?
 
 210   def test_num_type_changes_in_sync_for_changeset_with_deleted_relations
 
 211     changeset = create(:changeset, :num_changes => 1, :num_deleted_relations => 1)
 
 213     assert_equal 0, changeset.num_created_elements
 
 214     assert_equal 0, changeset.num_modified_elements
 
 215     assert_equal 1, changeset.num_deleted_elements
 
 217     assert_equal 0, changeset.num_changed_nodes
 
 218     assert_equal 0, changeset.num_changed_ways
 
 219     assert_equal 1, changeset.num_changed_relations
 
 221     assert_predicate changeset, :num_type_changes_in_sync?
 
 224   def test_num_type_changes_in_sync_for_changeset_with_changed_relations
 
 225     changeset = create(:changeset, :num_changes => 3 + 2 + 1,
 
 226                                    :num_created_relations => 3,
 
 227                                    :num_modified_relations => 2,
 
 228                                    :num_deleted_relations => 1)
 
 230     assert_equal 3, changeset.num_created_elements
 
 231     assert_equal 2, changeset.num_modified_elements
 
 232     assert_equal 1, changeset.num_deleted_elements
 
 234     assert_equal 0, changeset.num_changed_nodes
 
 235     assert_equal 0, changeset.num_changed_ways
 
 236     assert_equal 3 + 2 + 1, changeset.num_changed_relations
 
 238     assert_predicate changeset, :num_type_changes_in_sync?
 
 241   def test_num_type_changes_in_sync_for_changeset_with_created_elements
 
 242     changeset = create(:changeset, :num_changes => 3 + 2 + 1,
 
 243                                    :num_created_nodes => 3,
 
 244                                    :num_created_ways => 2,
 
 245                                    :num_created_relations => 1)
 
 247     assert_equal 3 + 2 + 1, changeset.num_created_elements
 
 248     assert_equal 0, changeset.num_modified_elements
 
 249     assert_equal 0, changeset.num_deleted_elements
 
 251     assert_equal 3, changeset.num_changed_nodes
 
 252     assert_equal 2, changeset.num_changed_ways
 
 253     assert_equal 1, changeset.num_changed_relations
 
 255     assert_predicate changeset, :num_type_changes_in_sync?
 
 258   def test_num_type_changes_in_sync_for_changeset_with_modified_elements
 
 259     changeset = create(:changeset, :num_changes => 3 + 2 + 1,
 
 260                                    :num_modified_nodes => 3,
 
 261                                    :num_modified_ways => 2,
 
 262                                    :num_modified_relations => 1)
 
 264     assert_equal 0, changeset.num_created_elements
 
 265     assert_equal 3 + 2 + 1, changeset.num_modified_elements
 
 266     assert_equal 0, changeset.num_deleted_elements
 
 268     assert_equal 3, changeset.num_changed_nodes
 
 269     assert_equal 2, changeset.num_changed_ways
 
 270     assert_equal 1, changeset.num_changed_relations
 
 272     assert_predicate changeset, :num_type_changes_in_sync?
 
 275   def test_num_type_changes_in_sync_for_changeset_with_deleted_elements
 
 276     changeset = create(:changeset, :num_changes => 3 + 2 + 1,
 
 277                                    :num_deleted_nodes => 3,
 
 278                                    :num_deleted_ways => 2,
 
 279                                    :num_deleted_relations => 1)
 
 281     assert_equal 0, changeset.num_created_elements
 
 282     assert_equal 0, changeset.num_modified_elements
 
 283     assert_equal 3 + 2 + 1, changeset.num_deleted_elements
 
 285     assert_equal 3, changeset.num_changed_nodes
 
 286     assert_equal 2, changeset.num_changed_ways
 
 287     assert_equal 1, changeset.num_changed_relations
 
 289     assert_predicate changeset, :num_type_changes_in_sync?
 
 292   def test_num_type_changes_in_sync_for_changeset_with_changed_elements
 
 293     changeset = create(:changeset, :num_changes => 33 + 32 + 31 + 23 + 22 + 21 + 13 + 12 + 11,
 
 294                                    :num_created_nodes => 33,
 
 295                                    :num_created_ways => 32,
 
 296                                    :num_created_relations => 31,
 
 297                                    :num_modified_nodes => 23,
 
 298                                    :num_modified_ways => 22,
 
 299                                    :num_modified_relations => 21,
 
 300                                    :num_deleted_nodes => 13,
 
 301                                    :num_deleted_ways => 12,
 
 302                                    :num_deleted_relations => 11)
 
 304     assert_equal 33 + 32 + 31, changeset.num_created_elements
 
 305     assert_equal 23 + 22 + 21, changeset.num_modified_elements
 
 306     assert_equal 13 + 12 + 11, changeset.num_deleted_elements
 
 308     assert_equal 33 + 23 + 13, changeset.num_changed_nodes
 
 309     assert_equal 32 + 22 + 12, changeset.num_changed_ways
 
 310     assert_equal 31 + 21 + 11, changeset.num_changed_relations
 
 312     assert_predicate changeset, :num_type_changes_in_sync?
 
 315   def test_actual_num_changed_elements_in_sync
 
 316     changeset = create(:changeset, :num_changes => 5 + 4 + 3,
 
 317                                    :num_created_nodes => 5,
 
 318                                    :num_created_ways => 4,
 
 319                                    :num_created_relations => 3)
 
 320     create_list(:old_node, 5, :changeset => changeset)
 
 321     create_list(:old_way, 4, :changeset => changeset)
 
 322     create_list(:old_relation, 3, :changeset => changeset)
 
 324     assert_predicate changeset, :num_type_changes_in_sync?
 
 326     assert_equal 5, changeset.actual_num_changed_nodes
 
 327     assert_equal 4, changeset.actual_num_changed_ways
 
 328     assert_equal 3, changeset.actual_num_changed_relations
 
 331   def test_actual_num_changed_elements_out_of_sync
 
 332     changeset = create(:changeset, :num_changes => 5 + 4 + 3)
 
 333     create_list(:old_node, 5, :changeset => changeset)
 
 334     create_list(:old_way, 4, :changeset => changeset)
 
 335     create_list(:old_relation, 3, :changeset => changeset)
 
 337     assert_not_predicate changeset, :num_type_changes_in_sync?
 
 339     assert_equal 5, changeset.actual_num_changed_nodes
 
 340     assert_equal 4, changeset.actual_num_changed_ways
 
 341     assert_equal 3, changeset.actual_num_changed_relations
 
 344   def test_from_xml_no_text
 
 346     message_create = assert_raise(OSM::APIBadXMLError) do
 
 347       Changeset.from_xml(no_text, :create => true)
 
 349     assert_match(/Must specify a string with one or more characters/, message_create.message)
 
 350     message_update = assert_raise(OSM::APIBadXMLError) do
 
 351       Changeset.from_xml(no_text, :create => false)
 
 353     assert_match(/Must specify a string with one or more characters/, message_update.message)
 
 356   def test_from_xml_no_changeset
 
 358     message_create = assert_raise(OSM::APIBadXMLError) do
 
 359       Changeset.from_xml(nocs, :create => true)
 
 361     assert_match %r{XML doesn't contain an osm/changeset element}, message_create.message
 
 362     message_update = assert_raise(OSM::APIBadXMLError) do
 
 363       Changeset.from_xml(nocs, :create => false)
 
 365     assert_match %r{XML doesn't contain an osm/changeset element}, message_update.message
 
 368   def test_from_xml_no_k_v
 
 369     nokv = "<osm><changeset><tag /></changeset></osm>"
 
 370     message_create = assert_raise(OSM::APIBadXMLError) do
 
 371       Changeset.from_xml(nokv, :create => true)
 
 373     assert_match(/tag is missing key/, message_create.message)
 
 374     message_update = assert_raise(OSM::APIBadXMLError) do
 
 375       Changeset.from_xml(nokv, :create => false)
 
 377     assert_match(/tag is missing key/, message_update.message)
 
 380   def test_from_xml_no_v
 
 381     no_v = "<osm><changeset><tag k='key' /></changeset></osm>"
 
 382     message_create = assert_raise(OSM::APIBadXMLError) do
 
 383       Changeset.from_xml(no_v, :create => true)
 
 385     assert_match(/tag is missing value/, message_create.message)
 
 386     message_update = assert_raise(OSM::APIBadXMLError) do
 
 387       Changeset.from_xml(no_v, :create => false)
 
 389     assert_match(/tag is missing value/, message_update.message)
 
 392   def test_from_xml_duplicate_k
 
 393     dupk = "<osm><changeset><tag k='dup' v='test' /><tag k='dup' v='value' /></changeset></osm>"
 
 394     message_create = assert_raise(OSM::APIDuplicateTagsError) do
 
 395       Changeset.from_xml(dupk, :create => true)
 
 397     assert_equal "Element changeset/ has duplicate tags with key dup", message_create.message
 
 398     message_update = assert_raise(OSM::APIDuplicateTagsError) do
 
 399       Changeset.from_xml(dupk, :create => false)
 
 401     assert_equal "Element changeset/ has duplicate tags with key dup", message_update.message
 
 404   def test_from_xml_valid
 
 405     # Example taken from the Update section on the API_v0.6 docs on the wiki
 
 406     xml = "<osm><changeset><tag k=\"comment\" v=\"Just adding some streetnames and a restaurant\"/></changeset></osm>"
 
 407     assert_nothing_raised do
 
 408       Changeset.from_xml(xml, :create => false)
 
 410     assert_nothing_raised do
 
 411       Changeset.from_xml(xml, :create => true)