1 # frozen_string_literal: true
5 class WayTest < ActiveSupport::TestCase
8 visible_way = create(:way)
9 create(:way_node, :way => visible_way, :node => node)
10 invisible_way = create(:way, :deleted)
11 create(:way_node, :way => invisible_way, :node => node)
12 used_way = create(:way)
13 create(:way_node, :way => used_way, :node => node)
14 create(:relation_member, :member => used_way)
16 [visible_way, invisible_way, used_way].each do |way|
17 assert_equal node.bbox.min_lon, way.bbox.min_lon, "min_lon"
18 assert_equal node.bbox.min_lat, way.bbox.min_lat, "min_lat"
19 assert_equal node.bbox.max_lon, way.bbox.max_lon, "max_lon"
20 assert_equal node.bbox.max_lat, way.bbox.max_lat, "max_lat"
24 # Check that the preconditions fail when you are over the defined limit of
25 # the maximum number of nodes in each way.
26 def test_max_nodes_per_way_limit
27 node_a = create(:node)
28 node_b = create(:node)
29 node_c = create(:node)
30 way = create(:way_with_nodes, :nodes_count => 1)
31 # Take one of the current ways and add nodes to it until we are near the limit
32 assert_predicate way, :valid?
33 # it already has 1 node
34 1.upto(Settings.max_number_of_way_nodes / 2) do
35 way.add_nd_num(node_a.id)
36 way.add_nd_num(node_b.id)
39 assert_predicate way, :valid?
40 way.add_nd_num(node_c.id)
41 assert_predicate way, :valid?
44 def test_from_xml_no_id
45 noid = "<osm><way version='12' changeset='23' /></osm>"
46 assert_nothing_raised do
47 Way.from_xml(noid, :create => true)
49 message = assert_raise(OSM::APIBadXMLError) do
50 Way.from_xml(noid, :create => false)
52 assert_match(/ID is required when updating/, message.message)
55 def test_from_xml_no_changeset_id
56 nocs = "<osm><way id='123' version='23' /></osm>"
57 message_create = assert_raise(OSM::APIBadXMLError) do
58 Way.from_xml(nocs, :create => true)
60 assert_match(/Changeset id is missing/, message_create.message)
61 message_update = assert_raise(OSM::APIBadXMLError) do
62 Way.from_xml(nocs, :create => false)
64 assert_match(/Changeset id is missing/, message_update.message)
67 def test_from_xml_no_version
68 no_version = "<osm><way id='123' changeset='23' /></osm>"
69 assert_nothing_raised do
70 Way.from_xml(no_version, :create => true)
72 message_update = assert_raise(OSM::APIBadXMLError) do
73 Way.from_xml(no_version, :create => false)
75 assert_match(/Version is required when updating/, message_update.message)
78 def test_from_xml_id_zero
79 id_list = ["", "0", "00", "0.0", "a"]
81 zero_id = "<osm><way id='#{id}' changeset='33' version='23' /></osm>"
82 assert_nothing_raised do
83 Way.from_xml(zero_id, :create => true)
85 message_update = assert_raise(OSM::APIBadUserInput) do
86 Way.from_xml(zero_id, :create => false)
88 assert_match(/ID of way cannot be zero when updating/, message_update.message)
92 def test_from_xml_no_text
94 message_create = assert_raise(OSM::APIBadXMLError) do
95 Way.from_xml(no_text, :create => true)
97 assert_match(/Must specify a string with one or more characters/, message_create.message)
98 message_update = assert_raise(OSM::APIBadXMLError) do
99 Way.from_xml(no_text, :create => false)
101 assert_match(/Must specify a string with one or more characters/, message_update.message)
104 def test_from_xml_no_k_v
105 nokv = "<osm><way id='23' changeset='23' version='23'><tag /></way></osm>"
106 message_create = assert_raise(OSM::APIBadXMLError) do
107 Way.from_xml(nokv, :create => true)
109 assert_match(/tag is missing key/, message_create.message)
110 message_update = assert_raise(OSM::APIBadXMLError) do
111 Way.from_xml(nokv, :create => false)
113 assert_match(/tag is missing key/, message_update.message)
116 def test_from_xml_no_v
117 no_v = "<osm><way id='23' changeset='23' version='23'><tag k='key' /></way></osm>"
118 message_create = assert_raise(OSM::APIBadXMLError) do
119 Way.from_xml(no_v, :create => true)
121 assert_match(/tag is missing value/, message_create.message)
122 message_update = assert_raise(OSM::APIBadXMLError) do
123 Way.from_xml(no_v, :create => false)
125 assert_match(/tag is missing value/, message_update.message)
128 def test_from_xml_duplicate_k
129 dupk = "<osm><way id='23' changeset='23' version='23'><tag k='dup' v='test' /><tag k='dup' v='tester' /></way></osm>"
130 message_create = assert_raise(OSM::APIDuplicateTagsError) do
131 Way.from_xml(dupk, :create => true)
133 assert_equal "Element way/ has duplicate tags with key dup", message_create.message
134 message_update = assert_raise(OSM::APIDuplicateTagsError) do
135 Way.from_xml(dupk, :create => false)
137 assert_equal "Element way/23 has duplicate tags with key dup", message_update.message
142 node1 = create(:way_node, :way => way, :sequence_id => 1).node
143 node2 = create(:way_node, :way => way, :sequence_id => 2).node
144 node3 = create(:way_node, :way => way, :sequence_id => 3).node
146 nodes = Way.find(way.id).way_nodes
147 assert_equal 3, nodes.count
148 assert_equal node1.id, nodes[0].node_id
149 assert_equal node2.id, nodes[1].node_id
150 assert_equal node3.id, nodes[2].node_id
155 node1 = create(:way_node, :way => way, :sequence_id => 1).node
156 node2 = create(:way_node, :way => way, :sequence_id => 2).node
157 node3 = create(:way_node, :way => way, :sequence_id => 3).node
159 nodes = Way.find(way.id).nodes
160 assert_equal 3, nodes.count
161 assert_equal node1.id, nodes[0].id
162 assert_equal node2.id, nodes[1].id
163 assert_equal node3.id, nodes[2].id
168 node1 = create(:way_node, :way => way, :sequence_id => 1).node
169 node2 = create(:way_node, :way => way, :sequence_id => 2).node
170 node3 = create(:way_node, :way => way, :sequence_id => 3).node
172 nodes = Way.find(way.id).nds
173 assert_equal 3, nodes.count
174 assert_equal node1.id, nodes[0]
175 assert_equal node2.id, nodes[1]
176 assert_equal node3.id, nodes[2]
179 def test_element_tags
181 taglist = create_list(:way_tag, 2, :way => way)
182 tags = Way.find(way.id).element_tags.order(:k)
183 assert_equal taglist.count, tags.count
184 taglist.sort_by!(&:k).each_index do |i|
185 assert_equal taglist[i].k, tags[i].k
186 assert_equal taglist[i].v, tags[i].v
192 taglist = create_list(:way_tag, 2, :way => way)
193 tags = Way.find(way.id).tags
194 assert_equal taglist.count, tags.count
195 taglist.each do |tag|
196 assert_equal tag.v, tags[tag.k]
200 def test_containing_relation_members
202 relation = create(:relation)
203 create(:relation_member, :relation => relation, :member => way)
205 crm = Way.find(way.id).containing_relation_members.order(:relation_id)
206 # assert_equal 1, crm.size
207 assert_equal relation.id, crm.first.relation_id
208 assert_equal "Way", crm.first.member_type
209 assert_equal way.id, crm.first.member_id
210 assert_equal relation.id, crm.first.relation.id
213 def test_containing_relations
215 relation = create(:relation)
216 create(:relation_member, :relation => relation, :member => way)
218 cr = Way.find(way.id).containing_relations.order(:id)
219 assert_equal 1, cr.size
220 assert_equal relation.id, cr.first.id
223 test "raises missing changeset exception when creating" do
226 assert_raises OSM::APIChangesetMissingError do
227 way.create_with_history(user)
231 test "raises user-changeset mismatch exception when creating" do
233 changeset = create(:changeset)
234 way = Way.new(:changeset => changeset)
235 assert_raises OSM::APIUserChangesetMismatchError do
236 way.create_with_history(user)
240 test "raises already closed changeset exception when creating" do
242 changeset = create(:changeset, :closed, :user => user)
243 way = Way.new(:changeset => changeset)
244 assert_raises OSM::APIChangesetAlreadyClosedError do
245 way.create_with_history(user)
249 test "raises id precondition exception when updating" do
251 way = Way.new(:id => 23)
252 new_way = Way.new(:id => 42)
253 assert_raises OSM::APIPreconditionFailedError do
254 way.update_from(new_way, user)
258 test "raises version mismatch exception when updating" do
260 way = Way.new(:id => 42, :version => 7)
261 new_way = Way.new(:id => 42, :version => 12)
262 assert_raises OSM::APIVersionMismatchError do
263 way.update_from(new_way, user)
267 test "raises missing changeset exception when updating" do
269 way = Way.new(:id => 42, :version => 12)
270 new_way = Way.new(:id => 42, :version => 12)
271 assert_raises OSM::APIChangesetMissingError do
272 way.update_from(new_way, user)
276 test "raises user-changeset mismatch exception when updating" do
278 changeset = create(:changeset)
279 way = Way.new(:id => 42, :version => 12)
280 new_way = Way.new(:id => 42, :version => 12, :changeset => changeset)
281 assert_raises OSM::APIUserChangesetMismatchError do
282 way.update_from(new_way, user)
286 test "raises already closed changeset exception when updating" do
288 changeset = create(:changeset, :closed, :user => user)
289 way = Way.new(:id => 42, :version => 12)
290 new_way = Way.new(:id => 42, :version => 12, :changeset => changeset)
291 assert_raises OSM::APIChangesetAlreadyClosedError do
292 way.update_from(new_way, user)
296 test "raises id precondition exception when deleting" do
298 way = Way.new(:id => 23, :visible => true)
299 new_way = Way.new(:id => 42, :visible => false)
300 assert_raises OSM::APIPreconditionFailedError do
301 way.delete_with_history!(new_way, user)