1 # frozen_string_literal: true
7 class DownloadsControllerTest < ActionDispatch::IntegrationTest
9 # test all routes which lead to this controller
12 { :path => "/api/0.6/changeset/1/download", :method => :get },
13 { :controller => "api/changesets/downloads", :action => "show", :changeset_id => "1" }
18 changeset = create(:changeset)
20 get api_changeset_download_path(changeset)
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
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)
47 get api_changeset_download_path(changeset)
49 assert_response :success
50 assert_dom "osmChange[version='#{Settings.api_version}'][generator='#{Settings.generator}']" do
51 assert_dom "create", 4 do
53 assert_dom "node[id='#{old_node1.node_id}']", 1 do
54 assert_dom "> @version", "1"
55 assert_dom "> @visible", "true"
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"
62 assert_dom "node[id='#{old_node2.node_id}']", 1 do
63 assert_dom "> @version", "1"
64 assert_dom "> @visible", "true"
66 assert_dom "tag[k='highway'][v='traffic_signals']"
67 assert_dom "> @lat", "60.2345600"
68 assert_dom "> @lon", "30.6543200"
71 assert_dom "way[id='#{old_way.way_id}']", 1 do
72 assert_dom "> @version", "1"
73 assert_dom "> @visible", "true"
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
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"
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"
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)
118 get api_changeset_download_path(changeset)
120 assert_response :success
121 assert_dom "osmChange[version='#{Settings.api_version}'][generator='#{Settings.generator}']" do
122 assert_dom "modify", 4 do
124 assert_dom "node[id='#{old_node1.node_id}']", 1 do
125 assert_dom "> @version", "2"
126 assert_dom "> @visible", "true"
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"
133 assert_dom "node[id='#{old_node2.node_id}']", 1 do
134 assert_dom "> @version", "2"
135 assert_dom "> @visible", "true"
137 assert_dom "tag[k='highway'][v='traffic_signals']"
138 assert_dom "> @lat", "60.2345600"
139 assert_dom "> @lon", "30.6543200"
142 assert_dom "way[id='#{old_way.way_id}']", 1 do
143 assert_dom "> @version", "2"
144 assert_dom "> @visible", "true"
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
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"
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"
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)
179 get api_changeset_download_path(changeset)
181 assert_response :success
182 assert_dom "osmChange[version='#{Settings.api_version}'][generator='#{Settings.generator}']" do
183 assert_dom "delete", 4 do
185 assert_dom "node[id='#{old_node1.node_id}']", 1 do
186 assert_dom "> @version", "3"
187 assert_dom "> @visible", "false"
189 assert_dom "node[id='#{old_node2.node_id}']", 1 do
190 assert_dom "> @version", "3"
191 assert_dom "> @visible", "false"
194 assert_dom "way[id='#{old_way.way_id}']", 1 do
195 assert_dom "> @version", "3"
196 assert_dom "> @visible", "false"
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"
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)
212 get api_changeset_download_path(changeset)
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
219 assert_dom modify[1], ">node", :count => 1 do |node|
220 assert_dom node, ">@id", node1.node_id.to_s
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)
230 get api_changeset_download_path(changeset)
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
237 assert_dom modify[1], ">node", :count => 1 do |node|
238 assert_dom node, ">@id", node1.node_id.to_s
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)
252 def test_show_redacted_unauthorized
253 check_redacted do |changeset|
254 get api_changeset_download_path(changeset, :show_redactions => "true")
258 def test_show_redacted_normal_user
259 auth_header = bearer_authorization_header
261 check_redacted do |changeset|
262 get api_changeset_download_path(changeset, :show_redactions => "true"), :headers => auth_header
266 def test_show_redacted_moderator_without_show_redactions
267 auth_header = bearer_authorization_header create(:moderator_user)
269 check_redacted do |changeset|
270 get api_changeset_download_path(changeset), :headers => auth_header
274 def test_show_redacted_moderator
275 auth_header = bearer_authorization_header create(:moderator_user)
277 check_redacted(:redacted_included => true) do |changeset|
278 get api_changeset_download_path(changeset, :show_redactions => "true"), :headers => auth_header
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)
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