Merge remote-tracking branch 'openstreetmap/pull/1496'
[rails.git] / test / models / node_test.rb
1 require "test_helper"
2
3 class NodeTest < ActiveSupport::TestCase
4   api_fixtures
5
6   def test_node_too_far_north
7     node = build(:node, :latitude => 90.01 * OldNode::SCALE)
8     assert_equal false, node.valid?
9   end
10
11   def test_node_north_limit
12     node = build(:node, :latitude => 90 * OldNode::SCALE)
13     assert node.valid?
14   end
15
16   def test_node_too_far_south
17     node = build(:node, :latitude => -90.01 * OldNode::SCALE)
18     assert_equal false, node.valid?
19   end
20
21   def test_node_south_limit
22     node = build(:node, :latitude => -90 * OldNode::SCALE)
23     assert node.valid?
24   end
25
26   def test_node_too_far_west
27     node = build(:node, :longitude => -180.01 * OldNode::SCALE)
28     assert_equal false, node.valid?
29   end
30
31   def test_node_west_limit
32     node = build(:node, :longitude => -180 * OldNode::SCALE)
33     assert node.valid?
34   end
35
36   def test_node_too_far_east
37     node = build(:node, :longitude => 180.01 * OldNode::SCALE)
38     assert_equal false, node.valid?
39   end
40
41   def test_node_east_limit
42     node = build(:node, :longitude => 180 * OldNode::SCALE)
43     assert node.valid?
44   end
45
46   def test_totally_wrong
47     node = build(:node, :latitude => 200 * OldNode::SCALE, :longitude => 200 * OldNode::SCALE)
48     assert_equal false, node.valid?
49   end
50
51   # Check that you can create a node and store it
52   def test_create
53     changeset = create(:changeset)
54     node_template = Node.new(
55       :latitude => 12.3456,
56       :longitude => 65.4321,
57       :changeset_id => changeset.id,
58       :visible => 1,
59       :version => 1
60     )
61     assert node_template.create_with_history(changeset.user)
62
63     node = Node.find(node_template.id)
64     assert_not_nil node
65     assert_equal node_template.latitude, node.latitude
66     assert_equal node_template.longitude, node.longitude
67     assert_equal node_template.changeset_id, node.changeset_id
68     assert_equal node_template.visible, node.visible
69     assert_equal node_template.timestamp.to_i, node.timestamp.to_i
70
71     assert_equal OldNode.where(:node_id => node_template.id).count, 1
72     old_node = OldNode.where(:node_id => node_template.id).first
73     assert_not_nil old_node
74     assert_equal node_template.latitude, old_node.latitude
75     assert_equal node_template.longitude, old_node.longitude
76     assert_equal node_template.changeset_id, old_node.changeset_id
77     assert_equal node_template.visible, old_node.visible
78     assert_equal node_template.tags, old_node.tags
79     assert_equal node_template.timestamp.to_i, old_node.timestamp.to_i
80   end
81
82   def test_update
83     node = create(:node)
84     create(:old_node, :node_id => node.id, :version => 1)
85     node_template = Node.find(node.id)
86
87     assert_not_nil node_template
88     assert_equal OldNode.where(:node_id => node_template.id).count, 1
89     assert_not_nil node
90
91     node_template.latitude = 12.3456
92     node_template.longitude = 65.4321
93     # node_template.tags = "updated=yes"
94     assert node.update_from(node_template, node.changeset.user)
95
96     node = Node.find(node_template.id)
97     assert_not_nil node
98     assert_equal node_template.latitude, node.latitude
99     assert_equal node_template.longitude, node.longitude
100     assert_equal node_template.changeset_id, node.changeset_id
101     assert_equal node_template.visible, node.visible
102     # assert_equal node_template.tags, node.tags
103
104     assert_equal OldNode.where(:node_id => node_template.id).count, 2
105     old_node = OldNode.where(:node_id => node_template.id, :version => 2).first
106     assert_not_nil old_node
107     assert_equal node_template.latitude, old_node.latitude
108     assert_equal node_template.longitude, old_node.longitude
109     assert_equal node_template.changeset_id, old_node.changeset_id
110     assert_equal node_template.visible, old_node.visible
111     # assert_equal node_template.tags, old_node.tags
112   end
113
114   def test_delete
115     node = create(:node)
116     create(:old_node, :node_id => node.id, :version => 1)
117     node_template = Node.find(node.id)
118
119     assert_not_nil node_template
120     assert_equal OldNode.where(:node_id => node_template.id).count, 1
121     assert_not_nil node
122
123     assert node.delete_with_history!(node_template, node.changeset.user)
124
125     node = Node.find(node_template.id)
126     assert_not_nil node
127     assert_equal node_template.latitude, node.latitude
128     assert_equal node_template.longitude, node.longitude
129     assert_equal node_template.changeset_id, node.changeset_id
130     assert_equal false, node.visible
131     # assert_equal node_template.tags, node.tags
132
133     assert_equal OldNode.where(:node_id => node_template.id).count, 2
134     old_node = OldNode.where(:node_id => node_template.id, :version => 2).first
135     assert_not_nil old_node
136     assert_equal node_template.latitude, old_node.latitude
137     assert_equal node_template.longitude, old_node.longitude
138     assert_equal node_template.changeset_id, old_node.changeset_id
139     assert_equal false, old_node.visible
140     # assert_equal node_template.tags, old_node.tags
141   end
142
143   def test_from_xml_no_id
144     lat = 56.7
145     lon = -2.3
146     changeset = 2
147     version = 1
148     noid = "<osm><node lat='#{lat}' lon='#{lon}' changeset='#{changeset}' version='#{version}' /></osm>"
149     # First try a create which doesn't need the id
150     assert_nothing_raised(OSM::APIBadXMLError) do
151       Node.from_xml(noid, true)
152     end
153     # Now try an update with no id, and make sure that it gives the appropriate exception
154     message = assert_raise(OSM::APIBadXMLError) do
155       Node.from_xml(noid, false)
156     end
157     assert_match /ID is required when updating./, message.message
158   end
159
160   def test_from_xml_no_lat
161     nolat = "<osm><node id='1' lon='23.3' changeset='2' version='23' /></osm>"
162     message_create = assert_raise(OSM::APIBadXMLError) do
163       Node.from_xml(nolat, true)
164     end
165     assert_match /lat missing/, message_create.message
166     message_update = assert_raise(OSM::APIBadXMLError) do
167       Node.from_xml(nolat, false)
168     end
169     assert_match /lat missing/, message_update.message
170   end
171
172   def test_from_xml_no_lon
173     nolon = "<osm><node id='1' lat='23.1' changeset='2' version='23' /></osm>"
174     message_create = assert_raise(OSM::APIBadXMLError) do
175       Node.from_xml(nolon, true)
176     end
177     assert_match /lon missing/, message_create.message
178     message_update = assert_raise(OSM::APIBadXMLError) do
179       Node.from_xml(nolon, false)
180     end
181     assert_match /lon missing/, message_update.message
182   end
183
184   def test_from_xml_no_changeset_id
185     nocs = "<osm><node id='123' lon='23.23' lat='23.1' version='23' /></osm>"
186     message_create = assert_raise(OSM::APIBadXMLError) do
187       Node.from_xml(nocs, true)
188     end
189     assert_match /Changeset id is missing/, message_create.message
190     message_update = assert_raise(OSM::APIBadXMLError) do
191       Node.from_xml(nocs, false)
192     end
193     assert_match /Changeset id is missing/, message_update.message
194   end
195
196   def test_from_xml_no_version
197     no_version = "<osm><node id='123' lat='23' lon='23' changeset='23' /></osm>"
198     assert_nothing_raised(OSM::APIBadXMLError) do
199       Node.from_xml(no_version, true)
200     end
201     message_update = assert_raise(OSM::APIBadXMLError) do
202       Node.from_xml(no_version, false)
203     end
204     assert_match /Version is required when updating/, message_update.message
205   end
206
207   def test_from_xml_double_lat
208     nocs = "<osm><node id='123' lon='23.23' lat='23.1' lat='12' changeset='23' version='23' /></osm>"
209     message_create = assert_raise(OSM::APIBadXMLError) do
210       Node.from_xml(nocs, true)
211     end
212     assert_match /Fatal error: Attribute lat redefined at/, message_create.message
213     message_update = assert_raise(OSM::APIBadXMLError) do
214       Node.from_xml(nocs, false)
215     end
216     assert_match /Fatal error: Attribute lat redefined at/, message_update.message
217   end
218
219   def test_from_xml_id_zero
220     id_list = ["", "0", "00", "0.0", "a"]
221     id_list.each do |id|
222       zero_id = "<osm><node id='#{id}' lat='12.3' lon='12.3' changeset='33' version='23' /></osm>"
223       assert_nothing_raised(OSM::APIBadUserInput) do
224         Node.from_xml(zero_id, true)
225       end
226       message_update = assert_raise(OSM::APIBadUserInput) do
227         Node.from_xml(zero_id, false)
228       end
229       assert_match /ID of node cannot be zero when updating/, message_update.message
230     end
231   end
232
233   def test_from_xml_no_text
234     no_text = ""
235     message_create = assert_raise(OSM::APIBadXMLError) do
236       Node.from_xml(no_text, true)
237     end
238     assert_match /Must specify a string with one or more characters/, message_create.message
239     message_update = assert_raise(OSM::APIBadXMLError) do
240       Node.from_xml(no_text, false)
241     end
242     assert_match /Must specify a string with one or more characters/, message_update.message
243   end
244
245   def test_from_xml_no_node
246     no_node = "<osm></osm>"
247     message_create = assert_raise(OSM::APIBadXMLError) do
248       Node.from_xml(no_node, true)
249     end
250     assert_match %r{XML doesn't contain an osm/node element}, message_create.message
251     message_update = assert_raise(OSM::APIBadXMLError) do
252       Node.from_xml(no_node, false)
253     end
254     assert_match %r{XML doesn't contain an osm/node element}, message_update.message
255   end
256
257   def test_from_xml_no_k_v
258     nokv = "<osm><node id='23' lat='12.3' lon='23.4' changeset='12' version='23'><tag /></node></osm>"
259     message_create = assert_raise(OSM::APIBadXMLError) do
260       Node.from_xml(nokv, true)
261     end
262     assert_match /tag is missing key/, message_create.message
263     message_update = assert_raise(OSM::APIBadXMLError) do
264       Node.from_xml(nokv, false)
265     end
266     assert_match /tag is missing key/, message_update.message
267   end
268
269   def test_from_xml_no_v
270     no_v = "<osm><node id='23' lat='23.43' lon='23.32' changeset='23' version='32'><tag k='key' /></node></osm>"
271     message_create = assert_raise(OSM::APIBadXMLError) do
272       Node.from_xml(no_v, true)
273     end
274     assert_match /tag is missing value/, message_create.message
275     message_update = assert_raise(OSM::APIBadXMLError) do
276       Node.from_xml(no_v, false)
277     end
278     assert_match /tag is missing value/, message_update.message
279   end
280
281   def test_from_xml_duplicate_k
282     dupk = "<osm><node id='23' lat='23.2' lon='23' changeset='34' version='23'><tag k='dup' v='test' /><tag k='dup' v='tester' /></node></osm>"
283     message_create = assert_raise(OSM::APIDuplicateTagsError) do
284       Node.from_xml(dupk, true)
285     end
286     assert_equal "Element node/ has duplicate tags with key dup", message_create.message
287     message_update = assert_raise(OSM::APIDuplicateTagsError) do
288       Node.from_xml(dupk, false)
289     end
290     assert_equal "Element node/23 has duplicate tags with key dup", message_update.message
291   end
292
293   def test_node_tags
294     node = create(:node)
295     taglist = create_list(:node_tag, 2, :node => node)
296     tags = Node.find(node.id).node_tags.order(:k)
297     assert_equal taglist.count, tags.count
298     taglist.sort_by!(&:k).each_index do |i|
299       assert_equal taglist[i].k, tags[i].k
300       assert_equal taglist[i].v, tags[i].v
301     end
302   end
303
304   def test_tags
305     node = create(:node)
306     taglist = create_list(:node_tag, 2, :node => node)
307     tags = Node.find(node.id).tags
308     assert_equal taglist.count, tags.count
309     taglist.each do |tag|
310       assert_equal tag.v, tags[tag.k]
311     end
312   end
313
314   def test_containing_relation_members
315     node = current_nodes(:node_used_by_relationship)
316     crm = Node.find(node.id).containing_relation_members.order(:relation_id)
317     #    assert_equal 3, crm.size
318     assert_equal 1, crm.first.relation_id
319     assert_equal "Node", crm.first.member_type
320     assert_equal node.id, crm.first.member_id
321     assert_equal 1, crm.first.relation.id
322     assert_equal 2, crm.second.relation_id
323     assert_equal "Node", crm.second.member_type
324     assert_equal node.id, crm.second.member_id
325     assert_equal 2, crm.second.relation.id
326     assert_equal 3, crm.third.relation_id
327     assert_equal "Node", crm.third.member_type
328     assert_equal node.id, crm.third.member_id
329     assert_equal 3, crm.third.relation.id
330   end
331
332   def test_containing_relations
333     node = current_nodes(:node_used_by_relationship)
334     cr = Node.find(node.id).containing_relations.order(:id)
335     assert_equal 3, cr.size
336     assert_equal 1, cr.first.id
337     assert_equal 2, cr.second.id
338     assert_equal 3, cr.third.id
339   end
340 end