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