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         check_redacted do |changeset|
 
 246           get api_changeset_download_path(changeset)
 
 250       def test_show_redacted_unauthorized
 
 251         check_redacted do |changeset|
 
 252           get api_changeset_download_path(changeset, :show_redactions => "true")
 
 256       def test_show_redacted_normal_user
 
 257         auth_header = bearer_authorization_header
 
 259         check_redacted do |changeset|
 
 260           get api_changeset_download_path(changeset, :show_redactions => "true"), :headers => auth_header
 
 264       def test_show_redacted_moderator_without_show_redactions
 
 265         auth_header = bearer_authorization_header create(:moderator_user)
 
 267         check_redacted do |changeset|
 
 268           get api_changeset_download_path(changeset), :headers => auth_header
 
 272       def test_show_redacted_moderator
 
 273         auth_header = bearer_authorization_header create(:moderator_user)
 
 275         check_redacted(:redacted_included => true) do |changeset|
 
 276           get api_changeset_download_path(changeset, :show_redactions => "true"), :headers => auth_header
 
 282       def check_redacted(redacted_included: false)
 
 283         redaction = create(:redaction)
 
 284         changeset = create(:changeset)
 
 285         node = create(:node, :with_history, :version => 2, :changeset => changeset)
 
 286         node_v1 = node.old_nodes.find_by(:version => 1)
 
 287         node_v1.redact!(redaction)
 
 288         way = create(:way, :with_history, :version => 2, :changeset => changeset)
 
 289         way_v1 = way.old_ways.find_by(:version => 1)
 
 290         way_v1.redact!(redaction)
 
 291         relation = create(:relation, :with_history, :version => 2, :changeset => changeset)
 
 292         relation_v1 = relation.old_relations.find_by(:version => 1)
 
 293         relation_v1.redact!(redaction)
 
 297         assert_response :success
 
 298         assert_dom "osmChange", 1 do
 
 299           assert_dom "node[id='#{node.id}'][version='1']", redacted_included ? 1 : 0
 
 300           assert_dom "node[id='#{node.id}'][version='2']", 1
 
 301           assert_dom "way[id='#{way.id}'][version='1']", redacted_included ? 1 : 0
 
 302           assert_dom "way[id='#{way.id}'][version='2']", 1
 
 303           assert_dom "relation[id='#{relation.id}'][version='1']", redacted_included ? 1 : 0
 
 304           assert_dom "relation[id='#{relation.id}'][version='2']", 1