5 class DownloadsControllerTest < ActionDispatch::IntegrationTest
7 # test all routes which lead to this controller
10 { :path => "/api/0.6/changeset/1/download", :method => :get },
11 { :controller => "api/changesets/downloads", :action => "show", :changeset_id => "1" }
16 changeset = create(:changeset)
18 get api_changeset_download_path(changeset)
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
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)
45 get api_changeset_download_path(changeset)
47 assert_response :success
48 assert_dom "osmChange[version='#{Settings.api_version}'][generator='#{Settings.generator}']" do
49 assert_dom "create", 4 do
51 assert_dom "node[id='#{old_node1.node_id}']", 1 do
52 assert_dom "> @version", "1"
53 assert_dom "> @visible", "true"
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"
60 assert_dom "node[id='#{old_node2.node_id}']", 1 do
61 assert_dom "> @version", "1"
62 assert_dom "> @visible", "true"
64 assert_dom "tag[k='highway'][v='traffic_signals']"
65 assert_dom "> @lat", "60.2345600"
66 assert_dom "> @lon", "30.6543200"
69 assert_dom "way[id='#{old_way.way_id}']", 1 do
70 assert_dom "> @version", "1"
71 assert_dom "> @visible", "true"
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
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"
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"
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)
116 get api_changeset_download_path(changeset)
118 assert_response :success
119 assert_dom "osmChange[version='#{Settings.api_version}'][generator='#{Settings.generator}']" do
120 assert_dom "modify", 4 do
122 assert_dom "node[id='#{old_node1.node_id}']", 1 do
123 assert_dom "> @version", "2"
124 assert_dom "> @visible", "true"
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"
131 assert_dom "node[id='#{old_node2.node_id}']", 1 do
132 assert_dom "> @version", "2"
133 assert_dom "> @visible", "true"
135 assert_dom "tag[k='highway'][v='traffic_signals']"
136 assert_dom "> @lat", "60.2345600"
137 assert_dom "> @lon", "30.6543200"
140 assert_dom "way[id='#{old_way.way_id}']", 1 do
141 assert_dom "> @version", "2"
142 assert_dom "> @visible", "true"
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
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"
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"
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)
177 get api_changeset_download_path(changeset)
179 assert_response :success
180 assert_dom "osmChange[version='#{Settings.api_version}'][generator='#{Settings.generator}']" do
181 assert_dom "delete", 4 do
183 assert_dom "node[id='#{old_node1.node_id}']", 1 do
184 assert_dom "> @version", "3"
185 assert_dom "> @visible", "false"
187 assert_dom "node[id='#{old_node2.node_id}']", 1 do
188 assert_dom "> @version", "3"
189 assert_dom "> @visible", "false"
192 assert_dom "way[id='#{old_way.way_id}']", 1 do
193 assert_dom "> @version", "3"
194 assert_dom "> @visible", "false"
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"
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)
210 get api_changeset_download_path(changeset)
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
217 assert_dom modify[1], ">node", :count => 1 do |node|
218 assert_dom node, ">@id", node1.node_id.to_s
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)
228 get api_changeset_download_path(changeset)
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
235 assert_dom modify[1], ">node", :count => 1 do |node|
236 assert_dom node, ">@id", node1.node_id.to_s
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))
250 get api_changeset_download_path(changeset)
251 assert_response :success
253 assert_select "osmChange", 1
254 # this changeset contains the node in versions 1 & 2, but 1 should
256 assert_select "osmChange node[id='#{node.id}']", 1
257 assert_select "osmChange node[id='#{node.id}'][version='1']", 0