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