]> git.openstreetmap.org Git - rails.git/blob - test/models/changeset_test.rb
Add changeset counters per element type
[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_from_xml_no_text
314     no_text = ""
315     message_create = assert_raise(OSM::APIBadXMLError) do
316       Changeset.from_xml(no_text, :create => true)
317     end
318     assert_match(/Must specify a string with one or more characters/, message_create.message)
319     message_update = assert_raise(OSM::APIBadXMLError) do
320       Changeset.from_xml(no_text, :create => false)
321     end
322     assert_match(/Must specify a string with one or more characters/, message_update.message)
323   end
324
325   def test_from_xml_no_changeset
326     nocs = "<osm></osm>"
327     message_create = assert_raise(OSM::APIBadXMLError) do
328       Changeset.from_xml(nocs, :create => true)
329     end
330     assert_match %r{XML doesn't contain an osm/changeset element}, message_create.message
331     message_update = assert_raise(OSM::APIBadXMLError) do
332       Changeset.from_xml(nocs, :create => false)
333     end
334     assert_match %r{XML doesn't contain an osm/changeset element}, message_update.message
335   end
336
337   def test_from_xml_no_k_v
338     nokv = "<osm><changeset><tag /></changeset></osm>"
339     message_create = assert_raise(OSM::APIBadXMLError) do
340       Changeset.from_xml(nokv, :create => true)
341     end
342     assert_match(/tag is missing key/, message_create.message)
343     message_update = assert_raise(OSM::APIBadXMLError) do
344       Changeset.from_xml(nokv, :create => false)
345     end
346     assert_match(/tag is missing key/, message_update.message)
347   end
348
349   def test_from_xml_no_v
350     no_v = "<osm><changeset><tag k='key' /></changeset></osm>"
351     message_create = assert_raise(OSM::APIBadXMLError) do
352       Changeset.from_xml(no_v, :create => true)
353     end
354     assert_match(/tag is missing value/, message_create.message)
355     message_update = assert_raise(OSM::APIBadXMLError) do
356       Changeset.from_xml(no_v, :create => false)
357     end
358     assert_match(/tag is missing value/, message_update.message)
359   end
360
361   def test_from_xml_duplicate_k
362     dupk = "<osm><changeset><tag k='dup' v='test' /><tag k='dup' v='value' /></changeset></osm>"
363     message_create = assert_raise(OSM::APIDuplicateTagsError) do
364       Changeset.from_xml(dupk, :create => true)
365     end
366     assert_equal "Element changeset/ has duplicate tags with key dup", message_create.message
367     message_update = assert_raise(OSM::APIDuplicateTagsError) do
368       Changeset.from_xml(dupk, :create => false)
369     end
370     assert_equal "Element changeset/ has duplicate tags with key dup", message_update.message
371   end
372
373   def test_from_xml_valid
374     # Example taken from the Update section on the API_v0.6 docs on the wiki
375     xml = "<osm><changeset><tag k=\"comment\" v=\"Just adding some streetnames and a restaurant\"/></changeset></osm>"
376     assert_nothing_raised do
377       Changeset.from_xml(xml, :create => false)
378     end
379     assert_nothing_raised do
380       Changeset.from_xml(xml, :create => true)
381     end
382   end
383 end