]> git.openstreetmap.org Git - rails.git/blob - test/controllers/api/changesets/downloads_controller_test.rb
Merge remote-tracking branch 'upstream/pull/5721'
[rails.git] / test / controllers / api / changesets / downloads_controller_test.rb
1 require "test_helper"
2
3 module Api
4   module Changesets
5     class DownloadsControllerTest < ActionDispatch::IntegrationTest
6       ##
7       # test all routes which lead to this controller
8       def test_routes
9         assert_routing(
10           { :path => "/api/0.6/changeset/1/download", :method => :get },
11           { :controller => "api/changesets/downloads", :action => "show", :changeset_id => "1" }
12         )
13       end
14
15       def test_show_empty
16         changeset = create(:changeset)
17
18         get api_changeset_download_path(changeset)
19
20         assert_response :success
21         assert_dom "osmChange[version='#{Settings.api_version}'][generator='#{Settings.generator}']" do
22           assert_dom "create", 0
23           assert_dom "modify", 0
24           assert_dom "delete", 0
25         end
26       end
27
28       def test_show_created_elements
29         changeset = create(:changeset)
30         old_node1 = create(:old_node, :changeset => changeset, :version => 1, :latitude => (60.12345 * OldNode::SCALE).to_i, :longitude => (30.54321 * OldNode::SCALE).to_i)
31         create(:old_node_tag, :old_node => old_node1, :k => "highway", :v => "crossing")
32         create(:old_node_tag, :old_node => old_node1, :k => "crossing", :v => "marked")
33         old_node2 = create(:old_node, :changeset => changeset, :version => 1, :latitude => (60.23456 * OldNode::SCALE).to_i, :longitude => (30.65432 * OldNode::SCALE).to_i)
34         create(:old_node_tag, :old_node => old_node2, :k => "highway", :v => "traffic_signals")
35         old_way = create(:old_way, :changeset => changeset, :version => 1)
36         create(:old_way_tag, :old_way => old_way, :k => "highway", :v => "secondary")
37         create(:old_way_tag, :old_way => old_way, :k => "name", :v => "Some Street")
38         create(:old_way_node, :old_way => old_way, :node => old_node1.current_node, :sequence_id => 1)
39         create(:old_way_node, :old_way => old_way, :node => old_node2.current_node, :sequence_id => 2)
40         old_relation = create(:old_relation, :changeset => changeset, :version => 1)
41         create(:old_relation_tag, :old_relation => old_relation, :k => "type", :v => "restriction")
42         create(:old_relation_member, :old_relation => old_relation, :member => old_way.current_way, :member_role => "from", :sequence_id => 1)
43         create(:old_relation_member, :old_relation => old_relation, :member => old_node2.current_node, :member_role => "via", :sequence_id => 2)
44
45         get api_changeset_download_path(changeset)
46
47         assert_response :success
48         assert_dom "osmChange[version='#{Settings.api_version}'][generator='#{Settings.generator}']" do
49           assert_dom "create", 4 do
50             assert_dom "node", 2
51             assert_dom "node[id='#{old_node1.node_id}']", 1 do
52               assert_dom "> @version", "1"
53               assert_dom "> @visible", "true"
54               assert_dom "tag", 2
55               assert_dom "tag[k='highway'][v='crossing']"
56               assert_dom "tag[k='crossing'][v='marked']"
57               assert_dom "> @lat", "60.1234500"
58               assert_dom "> @lon", "30.5432100"
59             end
60             assert_dom "node[id='#{old_node2.node_id}']", 1 do
61               assert_dom "> @version", "1"
62               assert_dom "> @visible", "true"
63               assert_dom "tag", 1
64               assert_dom "tag[k='highway'][v='traffic_signals']"
65               assert_dom "> @lat", "60.2345600"
66               assert_dom "> @lon", "30.6543200"
67             end
68             assert_dom "way", 1
69             assert_dom "way[id='#{old_way.way_id}']", 1 do
70               assert_dom "> @version", "1"
71               assert_dom "> @visible", "true"
72               assert_dom "tag", 2
73               assert_dom "tag[k='highway'][v='secondary']"
74               assert_dom "tag[k='name'][v='Some Street']"
75               assert_dom "nd", 2 do |dom_nds|
76                 assert_dom dom_nds[0], "> @ref", old_node1.node_id.to_s
77                 assert_dom dom_nds[1], "> @ref", old_node2.node_id.to_s
78               end
79             end
80             assert_dom "relation", 1
81             assert_dom "relation[id='#{old_relation.relation_id}']", 1 do
82               assert_dom "> @version", "1"
83               assert_dom "> @visible", "true"
84               assert_dom "tag", 1
85               assert_dom "tag[k='type'][v='restriction']"
86               assert_dom "member", 2 do |dom_members|
87                 assert_dom dom_members[0], "> @type", "way"
88                 assert_dom dom_members[0], "> @ref", old_way.way_id.to_s
89                 assert_dom dom_members[0], "> @role", "from"
90                 assert_dom dom_members[1], "> @type", "node"
91                 assert_dom dom_members[1], "> @ref", old_node2.node_id.to_s
92                 assert_dom dom_members[1], "> @role", "via"
93               end
94             end
95           end
96         end
97       end
98
99       def test_show_edited_elements
100         changeset = create(:changeset)
101         old_node1 = create(:old_node, :changeset => changeset, :version => 2, :latitude => (60.12345 * OldNode::SCALE).to_i, :longitude => (30.54321 * OldNode::SCALE).to_i)
102         create(:old_node_tag, :old_node => old_node1, :k => "highway", :v => "crossing")
103         create(:old_node_tag, :old_node => old_node1, :k => "crossing", :v => "marked")
104         old_node2 = create(:old_node, :changeset => changeset, :version => 2, :latitude => (60.23456 * OldNode::SCALE).to_i, :longitude => (30.65432 * OldNode::SCALE).to_i)
105         create(:old_node_tag, :old_node => old_node2, :k => "highway", :v => "traffic_signals")
106         old_way = create(:old_way, :changeset => changeset, :version => 2)
107         create(:old_way_tag, :old_way => old_way, :k => "highway", :v => "secondary")
108         create(:old_way_tag, :old_way => old_way, :k => "name", :v => "Some Street")
109         create(:old_way_node, :old_way => old_way, :node => old_node1.current_node, :sequence_id => 1)
110         create(:old_way_node, :old_way => old_way, :node => old_node2.current_node, :sequence_id => 2)
111         old_relation = create(:old_relation, :changeset => changeset, :version => 2)
112         create(:old_relation_tag, :old_relation => old_relation, :k => "type", :v => "restriction")
113         create(:old_relation_member, :old_relation => old_relation, :member => old_way.current_way, :member_role => "from", :sequence_id => 1)
114         create(:old_relation_member, :old_relation => old_relation, :member => old_node2.current_node, :member_role => "via", :sequence_id => 2)
115
116         get api_changeset_download_path(changeset)
117
118         assert_response :success
119         assert_dom "osmChange[version='#{Settings.api_version}'][generator='#{Settings.generator}']" do
120           assert_dom "modify", 4 do
121             assert_dom "node", 2
122             assert_dom "node[id='#{old_node1.node_id}']", 1 do
123               assert_dom "> @version", "2"
124               assert_dom "> @visible", "true"
125               assert_dom "tag", 2
126               assert_dom "tag[k='highway'][v='crossing']"
127               assert_dom "tag[k='crossing'][v='marked']"
128               assert_dom "> @lat", "60.1234500"
129               assert_dom "> @lon", "30.5432100"
130             end
131             assert_dom "node[id='#{old_node2.node_id}']", 1 do
132               assert_dom "> @version", "2"
133               assert_dom "> @visible", "true"
134               assert_dom "tag", 1
135               assert_dom "tag[k='highway'][v='traffic_signals']"
136               assert_dom "> @lat", "60.2345600"
137               assert_dom "> @lon", "30.6543200"
138             end
139             assert_dom "way", 1
140             assert_dom "way[id='#{old_way.way_id}']", 1 do
141               assert_dom "> @version", "2"
142               assert_dom "> @visible", "true"
143               assert_dom "tag", 2
144               assert_dom "tag[k='highway'][v='secondary']"
145               assert_dom "tag[k='name'][v='Some Street']"
146               assert_dom "nd", 2 do |dom_nds|
147                 assert_dom dom_nds[0], "> @ref", old_node1.node_id.to_s
148                 assert_dom dom_nds[1], "> @ref", old_node2.node_id.to_s
149               end
150             end
151             assert_dom "relation", 1
152             assert_dom "relation[id='#{old_relation.relation_id}']", 1 do
153               assert_dom "> @version", "2"
154               assert_dom "> @visible", "true"
155               assert_dom "tag", 1
156               assert_dom "tag[k='type'][v='restriction']"
157               assert_dom "member", 2 do |dom_members|
158                 assert_dom dom_members[0], "> @type", "way"
159                 assert_dom dom_members[0], "> @ref", old_way.way_id.to_s
160                 assert_dom dom_members[0], "> @role", "from"
161                 assert_dom dom_members[1], "> @type", "node"
162                 assert_dom dom_members[1], "> @ref", old_node2.node_id.to_s
163                 assert_dom dom_members[1], "> @role", "via"
164               end
165             end
166           end
167         end
168       end
169
170       def test_show_deleted_elements
171         changeset = create(:changeset)
172         old_node1 = create(:old_node, :changeset => changeset, :version => 3, :visible => false)
173         old_node2 = create(:old_node, :changeset => changeset, :version => 3, :visible => false)
174         old_way = create(:old_way, :changeset => changeset, :version => 3, :visible => false)
175         old_relation = create(:old_relation, :changeset => changeset, :version => 3, :visible => false)
176
177         get api_changeset_download_path(changeset)
178
179         assert_response :success
180         assert_dom "osmChange[version='#{Settings.api_version}'][generator='#{Settings.generator}']" do
181           assert_dom "delete", 4 do
182             assert_dom "node", 2
183             assert_dom "node[id='#{old_node1.node_id}']", 1 do
184               assert_dom "> @version", "3"
185               assert_dom "> @visible", "false"
186             end
187             assert_dom "node[id='#{old_node2.node_id}']", 1 do
188               assert_dom "> @version", "3"
189               assert_dom "> @visible", "false"
190             end
191             assert_dom "way", 1
192             assert_dom "way[id='#{old_way.way_id}']", 1 do
193               assert_dom "> @version", "3"
194               assert_dom "> @visible", "false"
195             end
196             assert_dom "relation", 1
197             assert_dom "relation[id='#{old_relation.relation_id}']", 1 do
198               assert_dom "> @version", "3"
199               assert_dom "> @visible", "false"
200             end
201           end
202         end
203       end
204
205       def test_show_should_sort_by_timestamp
206         changeset = create(:changeset)
207         node1 = create(:old_node, :version => 2, :timestamp => "2020-02-01", :changeset => changeset)
208         node0 = create(:old_node, :version => 2, :timestamp => "2020-01-01", :changeset => changeset)
209
210         get api_changeset_download_path(changeset)
211
212         assert_response :success
213         assert_dom "modify", :count => 2 do |modify|
214           assert_dom modify[0], ">node", :count => 1 do |node|
215             assert_dom node, ">@id", node0.node_id.to_s
216           end
217           assert_dom modify[1], ">node", :count => 1 do |node|
218             assert_dom node, ">@id", node1.node_id.to_s
219           end
220         end
221       end
222
223       def test_show_should_sort_by_version
224         changeset = create(:changeset)
225         node1 = create(:old_node, :version => 3, :timestamp => "2020-01-01", :changeset => changeset)
226         node0 = create(:old_node, :version => 2, :timestamp => "2020-01-01", :changeset => changeset)
227
228         get api_changeset_download_path(changeset)
229
230         assert_response :success
231         assert_dom "modify", :count => 2 do |modify|
232           assert_dom modify[0], ">node", :count => 1 do |node|
233             assert_dom node, ">@id", node0.node_id.to_s
234           end
235           assert_dom modify[1], ">node", :count => 1 do |node|
236             assert_dom node, ">@id", node1.node_id.to_s
237           end
238         end
239       end
240
241       ##
242       # check that the changeset download for a changeset with a redacted
243       # element in it doesn't contain that element.
244       def test_show_redacted
245         changeset = create(:changeset)
246         node = create(:node, :with_history, :version => 2, :changeset => changeset)
247         node_v1 = node.old_nodes.find_by(:version => 1)
248         node_v1.redact!(create(:redaction))
249
250         get api_changeset_download_path(changeset)
251         assert_response :success
252
253         assert_select "osmChange", 1
254         # this changeset contains the node in versions 1 & 2, but 1 should
255         # be hidden.
256         assert_select "osmChange node[id='#{node.id}']", 1
257         assert_select "osmChange node[id='#{node.id}'][version='1']", 0
258       end
259     end
260   end
261 end