]> git.openstreetmap.org Git - rails.git/blob - test/models/changeset_test.rb
Merge remote-tracking branch 'upstream/pull/6305'
[rails.git] / test / models / changeset_test.rb
1 require "test_helper"
2
3 class ChangesetTest < ActiveSupport::TestCase
4   def test_num_changes_valid
5     changeset = create(:changeset)
6     assert_predicate changeset, :valid?
7     changeset.num_changes = nil
8     assert_not_predicate changeset, :valid?
9     changeset.num_changes = -1
10     assert_not_predicate changeset, :valid?
11     changeset.num_changes = 0
12     assert_predicate changeset, :valid?
13     changeset.num_changes = 1
14     assert_predicate changeset, :valid?
15   end
16
17   def test_num_type_changes_valid
18     [:num_created_nodes, :num_modified_nodes, :num_deleted_nodes,
19      :num_created_ways, :num_modified_ways, :num_deleted_ways,
20      :num_created_relations, :num_modified_relations, :num_deleted_relations].each do |counter_attribute|
21        changeset = create(:changeset)
22        assert_predicate changeset, :valid?
23        changeset[counter_attribute] = nil
24        assert_not_predicate changeset, :valid?
25        changeset[counter_attribute] = -1
26        assert_not_predicate changeset, :valid?
27        changeset[counter_attribute] = 0
28        assert_predicate changeset, :valid?
29        changeset[counter_attribute] = 1
30        assert_predicate changeset, :valid?
31      end
32   end
33
34   def test_num_type_changes_in_sync_for_new_changeset
35     changeset = create(:changeset)
36
37     assert_equal 0, changeset.num_created_elements
38     assert_equal 0, changeset.num_modified_elements
39     assert_equal 0, changeset.num_deleted_elements
40
41     assert_equal 0, changeset.num_changed_nodes
42     assert_equal 0, changeset.num_changed_ways
43     assert_equal 0, changeset.num_changed_relations
44
45     assert_predicate changeset, :num_type_changes_in_sync?
46   end
47
48   def test_num_type_changes_not_in_sync_for_changeset_without_type_changes
49     changeset = create(:changeset, :num_changes => 1)
50
51     assert_equal 0, changeset.num_created_elements
52     assert_equal 0, changeset.num_modified_elements
53     assert_equal 0, changeset.num_deleted_elements
54
55     assert_equal 0, changeset.num_changed_nodes
56     assert_equal 0, changeset.num_changed_ways
57     assert_equal 0, changeset.num_changed_relations
58
59     assert_not_predicate changeset, :num_type_changes_in_sync?
60   end
61
62   def test_num_type_changes_in_sync_for_changeset_with_created_nodes
63     changeset = create(:changeset, :num_changes => 1, :num_created_nodes => 1)
64
65     assert_equal 1, changeset.num_created_elements
66     assert_equal 0, changeset.num_modified_elements
67     assert_equal 0, changeset.num_deleted_elements
68
69     assert_equal 1, changeset.num_changed_nodes
70     assert_equal 0, changeset.num_changed_ways
71     assert_equal 0, changeset.num_changed_relations
72
73     assert_predicate changeset, :num_type_changes_in_sync?
74   end
75
76   def test_num_type_changes_in_sync_for_changeset_with_modified_nodes
77     changeset = create(:changeset, :num_changes => 1, :num_modified_nodes => 1)
78
79     assert_equal 0, changeset.num_created_elements
80     assert_equal 1, changeset.num_modified_elements
81     assert_equal 0, changeset.num_deleted_elements
82
83     assert_equal 1, changeset.num_changed_nodes
84     assert_equal 0, changeset.num_changed_ways
85     assert_equal 0, changeset.num_changed_relations
86
87     assert_predicate changeset, :num_type_changes_in_sync?
88   end
89
90   def test_num_type_changes_in_sync_for_changeset_with_deleted_nodes
91     changeset = create(:changeset, :num_changes => 1, :num_deleted_nodes => 1)
92
93     assert_equal 0, changeset.num_created_elements
94     assert_equal 0, changeset.num_modified_elements
95     assert_equal 1, changeset.num_deleted_elements
96
97     assert_equal 1, changeset.num_changed_nodes
98     assert_equal 0, changeset.num_changed_ways
99     assert_equal 0, changeset.num_changed_relations
100
101     assert_predicate changeset, :num_type_changes_in_sync?
102   end
103
104   def test_num_type_changes_in_sync_for_changeset_with_changed_nodes
105     changeset = create(:changeset, :num_changes => 3 + 2 + 1,
106                                    :num_created_nodes => 3,
107                                    :num_modified_nodes => 2,
108                                    :num_deleted_nodes => 1)
109
110     assert_equal 3, changeset.num_created_elements
111     assert_equal 2, changeset.num_modified_elements
112     assert_equal 1, changeset.num_deleted_elements
113
114     assert_equal 3 + 2 + 1, changeset.num_changed_nodes
115     assert_equal 0, changeset.num_changed_ways
116     assert_equal 0, changeset.num_changed_relations
117
118     assert_predicate changeset, :num_type_changes_in_sync?
119   end
120
121   def test_num_type_changes_in_sync_for_changeset_with_created_ways
122     changeset = create(:changeset, :num_changes => 1, :num_created_ways => 1)
123
124     assert_equal 1, changeset.num_created_elements
125     assert_equal 0, changeset.num_modified_elements
126     assert_equal 0, changeset.num_deleted_elements
127
128     assert_equal 0, changeset.num_changed_nodes
129     assert_equal 1, changeset.num_changed_ways
130     assert_equal 0, changeset.num_changed_relations
131
132     assert_predicate changeset, :num_type_changes_in_sync?
133   end
134
135   def test_num_type_changes_in_sync_for_changeset_with_modified_ways
136     changeset = create(:changeset, :num_changes => 1, :num_modified_ways => 1)
137
138     assert_equal 0, changeset.num_created_elements
139     assert_equal 1, changeset.num_modified_elements
140     assert_equal 0, changeset.num_deleted_elements
141
142     assert_equal 0, changeset.num_changed_nodes
143     assert_equal 1, changeset.num_changed_ways
144     assert_equal 0, changeset.num_changed_relations
145
146     assert_predicate changeset, :num_type_changes_in_sync?
147   end
148
149   def test_num_type_changes_in_sync_for_changeset_with_deleted_ways
150     changeset = create(:changeset, :num_changes => 1, :num_deleted_ways => 1)
151
152     assert_equal 0, changeset.num_created_elements
153     assert_equal 0, changeset.num_modified_elements
154     assert_equal 1, changeset.num_deleted_elements
155
156     assert_equal 0, changeset.num_changed_nodes
157     assert_equal 1, changeset.num_changed_ways
158     assert_equal 0, changeset.num_changed_relations
159
160     assert_predicate changeset, :num_type_changes_in_sync?
161   end
162
163   def test_num_type_changes_in_sync_for_changeset_with_changed_ways
164     changeset = create(:changeset, :num_changes => 3 + 2 + 1,
165                                    :num_created_ways => 3,
166                                    :num_modified_ways => 2,
167                                    :num_deleted_ways => 1)
168
169     assert_equal 3, changeset.num_created_elements
170     assert_equal 2, changeset.num_modified_elements
171     assert_equal 1, changeset.num_deleted_elements
172
173     assert_equal 0, changeset.num_changed_nodes
174     assert_equal 3 + 2 + 1, changeset.num_changed_ways
175     assert_equal 0, changeset.num_changed_relations
176
177     assert_predicate changeset, :num_type_changes_in_sync?
178   end
179
180   def test_num_type_changes_in_sync_for_changeset_with_created_relations
181     changeset = create(:changeset, :num_changes => 1, :num_created_relations => 1)
182
183     assert_equal 1, changeset.num_created_elements
184     assert_equal 0, changeset.num_modified_elements
185     assert_equal 0, changeset.num_deleted_elements
186
187     assert_equal 0, changeset.num_changed_nodes
188     assert_equal 0, changeset.num_changed_ways
189     assert_equal 1, changeset.num_changed_relations
190
191     assert_predicate changeset, :num_type_changes_in_sync?
192   end
193
194   def test_num_type_changes_in_sync_for_changeset_with_modified_relations
195     changeset = create(:changeset, :num_changes => 1, :num_modified_relations => 1)
196
197     assert_equal 0, changeset.num_created_elements
198     assert_equal 1, changeset.num_modified_elements
199     assert_equal 0, changeset.num_deleted_elements
200
201     assert_equal 0, changeset.num_changed_nodes
202     assert_equal 0, changeset.num_changed_ways
203     assert_equal 1, changeset.num_changed_relations
204
205     assert_predicate changeset, :num_type_changes_in_sync?
206   end
207
208   def test_num_type_changes_in_sync_for_changeset_with_deleted_relations
209     changeset = create(:changeset, :num_changes => 1, :num_deleted_relations => 1)
210
211     assert_equal 0, changeset.num_created_elements
212     assert_equal 0, changeset.num_modified_elements
213     assert_equal 1, changeset.num_deleted_elements
214
215     assert_equal 0, changeset.num_changed_nodes
216     assert_equal 0, changeset.num_changed_ways
217     assert_equal 1, changeset.num_changed_relations
218
219     assert_predicate changeset, :num_type_changes_in_sync?
220   end
221
222   def test_num_type_changes_in_sync_for_changeset_with_changed_relations
223     changeset = create(:changeset, :num_changes => 3 + 2 + 1,
224                                    :num_created_relations => 3,
225                                    :num_modified_relations => 2,
226                                    :num_deleted_relations => 1)
227
228     assert_equal 3, changeset.num_created_elements
229     assert_equal 2, changeset.num_modified_elements
230     assert_equal 1, changeset.num_deleted_elements
231
232     assert_equal 0, changeset.num_changed_nodes
233     assert_equal 0, changeset.num_changed_ways
234     assert_equal 3 + 2 + 1, changeset.num_changed_relations
235
236     assert_predicate changeset, :num_type_changes_in_sync?
237   end
238
239   def test_num_type_changes_in_sync_for_changeset_with_created_elements
240     changeset = create(:changeset, :num_changes => 3 + 2 + 1,
241                                    :num_created_nodes => 3,
242                                    :num_created_ways => 2,
243                                    :num_created_relations => 1)
244
245     assert_equal 3 + 2 + 1, changeset.num_created_elements
246     assert_equal 0, changeset.num_modified_elements
247     assert_equal 0, changeset.num_deleted_elements
248
249     assert_equal 3, changeset.num_changed_nodes
250     assert_equal 2, changeset.num_changed_ways
251     assert_equal 1, changeset.num_changed_relations
252
253     assert_predicate changeset, :num_type_changes_in_sync?
254   end
255
256   def test_num_type_changes_in_sync_for_changeset_with_modified_elements
257     changeset = create(:changeset, :num_changes => 3 + 2 + 1,
258                                    :num_modified_nodes => 3,
259                                    :num_modified_ways => 2,
260                                    :num_modified_relations => 1)
261
262     assert_equal 0, changeset.num_created_elements
263     assert_equal 3 + 2 + 1, changeset.num_modified_elements
264     assert_equal 0, changeset.num_deleted_elements
265
266     assert_equal 3, changeset.num_changed_nodes
267     assert_equal 2, changeset.num_changed_ways
268     assert_equal 1, changeset.num_changed_relations
269
270     assert_predicate changeset, :num_type_changes_in_sync?
271   end
272
273   def test_num_type_changes_in_sync_for_changeset_with_deleted_elements
274     changeset = create(:changeset, :num_changes => 3 + 2 + 1,
275                                    :num_deleted_nodes => 3,
276                                    :num_deleted_ways => 2,
277                                    :num_deleted_relations => 1)
278
279     assert_equal 0, changeset.num_created_elements
280     assert_equal 0, changeset.num_modified_elements
281     assert_equal 3 + 2 + 1, changeset.num_deleted_elements
282
283     assert_equal 3, changeset.num_changed_nodes
284     assert_equal 2, changeset.num_changed_ways
285     assert_equal 1, changeset.num_changed_relations
286
287     assert_predicate changeset, :num_type_changes_in_sync?
288   end
289
290   def test_num_type_changes_in_sync_for_changeset_with_changed_elements
291     changeset = create(:changeset, :num_changes => 33 + 32 + 31 + 23 + 22 + 21 + 13 + 12 + 11,
292                                    :num_created_nodes => 33,
293                                    :num_created_ways => 32,
294                                    :num_created_relations => 31,
295                                    :num_modified_nodes => 23,
296                                    :num_modified_ways => 22,
297                                    :num_modified_relations => 21,
298                                    :num_deleted_nodes => 13,
299                                    :num_deleted_ways => 12,
300                                    :num_deleted_relations => 11)
301
302     assert_equal 33 + 32 + 31, changeset.num_created_elements
303     assert_equal 23 + 22 + 21, changeset.num_modified_elements
304     assert_equal 13 + 12 + 11, changeset.num_deleted_elements
305
306     assert_equal 33 + 23 + 13, changeset.num_changed_nodes
307     assert_equal 32 + 22 + 12, changeset.num_changed_ways
308     assert_equal 31 + 21 + 11, changeset.num_changed_relations
309
310     assert_predicate changeset, :num_type_changes_in_sync?
311   end
312
313   def test_actual_num_changed_elements_in_sync
314     changeset = create(:changeset, :num_changes => 5 + 4 + 3,
315                                    :num_created_nodes => 5,
316                                    :num_created_ways => 4,
317                                    :num_created_relations => 3)
318     create_list(:old_node, 5, :changeset => changeset)
319     create_list(:old_way, 4, :changeset => changeset)
320     create_list(:old_relation, 3, :changeset => changeset)
321
322     assert_predicate changeset, :num_type_changes_in_sync?
323
324     assert_equal 5, changeset.actual_num_changed_nodes
325     assert_equal 4, changeset.actual_num_changed_ways
326     assert_equal 3, changeset.actual_num_changed_relations
327   end
328
329   def test_actual_num_changed_elements_out_of_sync
330     changeset = create(:changeset, :num_changes => 5 + 4 + 3)
331     create_list(:old_node, 5, :changeset => changeset)
332     create_list(:old_way, 4, :changeset => changeset)
333     create_list(:old_relation, 3, :changeset => changeset)
334
335     assert_not_predicate changeset, :num_type_changes_in_sync?
336
337     assert_equal 5, changeset.actual_num_changed_nodes
338     assert_equal 4, changeset.actual_num_changed_ways
339     assert_equal 3, changeset.actual_num_changed_relations
340   end
341
342   def test_from_xml_no_text
343     no_text = ""
344     message_create = assert_raise(OSM::APIBadXMLError) do
345       Changeset.from_xml(no_text, :create => true)
346     end
347     assert_match(/Must specify a string with one or more characters/, message_create.message)
348     message_update = assert_raise(OSM::APIBadXMLError) do
349       Changeset.from_xml(no_text, :create => false)
350     end
351     assert_match(/Must specify a string with one or more characters/, message_update.message)
352   end
353
354   def test_from_xml_no_changeset
355     nocs = "<osm></osm>"
356     message_create = assert_raise(OSM::APIBadXMLError) do
357       Changeset.from_xml(nocs, :create => true)
358     end
359     assert_match %r{XML doesn't contain an osm/changeset element}, message_create.message
360     message_update = assert_raise(OSM::APIBadXMLError) do
361       Changeset.from_xml(nocs, :create => false)
362     end
363     assert_match %r{XML doesn't contain an osm/changeset element}, message_update.message
364   end
365
366   def test_from_xml_no_k_v
367     nokv = "<osm><changeset><tag /></changeset></osm>"
368     message_create = assert_raise(OSM::APIBadXMLError) do
369       Changeset.from_xml(nokv, :create => true)
370     end
371     assert_match(/tag is missing key/, message_create.message)
372     message_update = assert_raise(OSM::APIBadXMLError) do
373       Changeset.from_xml(nokv, :create => false)
374     end
375     assert_match(/tag is missing key/, message_update.message)
376   end
377
378   def test_from_xml_no_v
379     no_v = "<osm><changeset><tag k='key' /></changeset></osm>"
380     message_create = assert_raise(OSM::APIBadXMLError) do
381       Changeset.from_xml(no_v, :create => true)
382     end
383     assert_match(/tag is missing value/, message_create.message)
384     message_update = assert_raise(OSM::APIBadXMLError) do
385       Changeset.from_xml(no_v, :create => false)
386     end
387     assert_match(/tag is missing value/, message_update.message)
388   end
389
390   def test_from_xml_duplicate_k
391     dupk = "<osm><changeset><tag k='dup' v='test' /><tag k='dup' v='value' /></changeset></osm>"
392     message_create = assert_raise(OSM::APIDuplicateTagsError) do
393       Changeset.from_xml(dupk, :create => true)
394     end
395     assert_equal "Element changeset/ has duplicate tags with key dup", message_create.message
396     message_update = assert_raise(OSM::APIDuplicateTagsError) do
397       Changeset.from_xml(dupk, :create => false)
398     end
399     assert_equal "Element changeset/ has duplicate tags with key dup", message_update.message
400   end
401
402   def test_from_xml_valid
403     # Example taken from the Update section on the API_v0.6 docs on the wiki
404     xml = "<osm><changeset><tag k=\"comment\" v=\"Just adding some streetnames and a restaurant\"/></changeset></osm>"
405     assert_nothing_raised do
406       Changeset.from_xml(xml, :create => false)
407     end
408     assert_nothing_raised do
409       Changeset.from_xml(xml, :create => true)
410     end
411   end
412 end