1 # frozen_string_literal: true
 
   5 class ChangesetsControllerTest < ActionDispatch::IntegrationTest
 
   7   # test all routes which lead to this controller
 
  10       { :path => "/changeset/1", :method => :get },
 
  11       { :controller => "changesets", :action => "show", :id => "1" }
 
  14       { :path => "/user/name/history", :method => :get },
 
  15       { :controller => "changesets", :action => "index", :display_name => "name" }
 
  18       { :path => "/user/name/history/feed", :method => :get },
 
  19       { :controller => "changesets", :action => "feed", :display_name => "name", :format => :atom }
 
  22       { :path => "/history/friends", :method => :get },
 
  23       { :controller => "changesets", :action => "index", :friends => true, :format => :html }
 
  26       { :path => "/history/nearby", :method => :get },
 
  27       { :controller => "changesets", :action => "index", :nearby => true, :format => :html }
 
  30       { :path => "/history", :method => :get },
 
  31       { :controller => "changesets", :action => "index" }
 
  34       { :path => "/history/feed", :method => :get },
 
  35       { :controller => "changesets", :action => "feed", :format => :atom }
 
  40   # This should display the last 20 changesets closed
 
  42     changesets = create_list(:changeset, 30, :num_changes => 1)
 
  44     get history_path(:format => "html")
 
  45     assert_response :success
 
  46     assert_template "history"
 
  47     assert_template :layout => "map"
 
  48     assert_select "h2", :text => "Changesets", :count => 1
 
  49     assert_select "link[rel='alternate'][type='application/atom+xml']", :count => 1 do
 
  50       assert_select "[href=?]", "http://www.example.com/history/feed"
 
  53     get history_path(:format => "html", :list => "1"), :xhr => true
 
  54     assert_response :success
 
  55     assert_template "index"
 
  57     check_index_result(changesets.last(20))
 
  61   # This should display the last 20 changesets closed
 
  63     changesets = create_list(:changeset, 30, :num_changes => 1)
 
  65     get history_path(:format => "html"), :xhr => true
 
  66     assert_response :success
 
  67     assert_template "history"
 
  68     assert_template :layout => "xhr"
 
  69     assert_select "h2", :text => "Changesets", :count => 1
 
  70     assert_select "link[rel='alternate'][type='application/atom+xml']", :count => 1 do
 
  71       assert_select "[href=?]", "http://www.example.com/history/feed"
 
  74     get history_path(:format => "html", :list => "1"), :xhr => true
 
  75     assert_response :success
 
  76     assert_template "index"
 
  78     check_index_result(changesets.last(20))
 
  82   # This should report an error
 
  83   def test_index_invalid_xhr
 
  84     %w[-1 0 fred].each do |id|
 
  85       get history_path(:format => "html", :list => "1", :before => id)
 
  86       assert_redirected_to :controller => :errors, :action => :bad_request
 
  88       get history_path(:format => "html", :list => "1", :after => id)
 
  89       assert_redirected_to :controller => :errors, :action => :bad_request
 
  94   # This should display the last 20 changesets closed in a specific area
 
  96     changesets = create_list(:changeset, 10, :num_changes => 1, :bbox => [5, 5, 5, 5])
 
  97     other_changesets = create_list(:changeset, 10, :num_changes => 1, :bbox => [0, 0, 1, 1])
 
  99     # First check they all show up without a bbox parameter
 
 100     get history_path(:format => "html", :list => "1"), :xhr => true
 
 101     assert_response :success
 
 102     assert_template "index"
 
 103     check_index_result(changesets + other_changesets)
 
 105     # Then check with bbox parameter
 
 106     get history_path(:format => "html", :bbox => "4.5,4.5,5.5,5.5")
 
 107     assert_response :success
 
 108     assert_template "history"
 
 109     assert_template :layout => "map"
 
 110     assert_select "h2", :text => "Changesets", :count => 1
 
 111     assert_select "link[rel='alternate'][type='application/atom+xml']", :count => 1 do
 
 112       assert_select "[href=?]", "http://www.example.com/history/feed?bbox=4.5%2C4.5%2C5.5%2C5.5"
 
 115     get history_path(:format => "html", :bbox => "4.5,4.5,5.5,5.5", :list => "1"), :xhr => true
 
 116     assert_response :success
 
 117     assert_template "index"
 
 119     check_index_result(changesets)
 
 122   def test_index_bbox_across_antimeridian_with_changesets_close_to_antimeridian
 
 123     west_of_antimeridian_changeset = create(:changeset, :num_changes => 1, :bbox => [176, 0, 178, 1])
 
 124     east_of_antimeridian_changeset = create(:changeset, :num_changes => 1, :bbox => [-178, 0, -176, 1])
 
 126     get history_path(:format => "html", :list => "1")
 
 127     assert_response :success
 
 128     check_index_result([east_of_antimeridian_changeset, west_of_antimeridian_changeset])
 
 130     # negative longitudes
 
 131     get history_path(:format => "html", :list => "1", :bbox => "-190,-10,-170,10")
 
 132     assert_response :success
 
 133     check_index_result([east_of_antimeridian_changeset, west_of_antimeridian_changeset])
 
 135     get history_path(:format => "html", :list => "1", :bbox => "-183,-10,-177,10")
 
 136     assert_response :success
 
 137     check_index_result([east_of_antimeridian_changeset, west_of_antimeridian_changeset])
 
 139     get history_path(:format => "html", :list => "1", :bbox => "-181,-10,-177,10")
 
 140     assert_response :success
 
 141     check_index_result([east_of_antimeridian_changeset])
 
 143     get history_path(:format => "html", :list => "1", :bbox => "-183,-10,-179,10")
 
 144     assert_response :success
 
 145     check_index_result([west_of_antimeridian_changeset])
 
 147     get history_path(:format => "html", :list => "1", :bbox => "-181,-10,-179,10")
 
 148     assert_response :success
 
 149     check_index_result([])
 
 151     # positive longitudes
 
 152     get history_path(:format => "html", :list => "1", :bbox => "170,-10,190,10")
 
 153     assert_response :success
 
 154     check_index_result([east_of_antimeridian_changeset, west_of_antimeridian_changeset])
 
 156     get history_path(:format => "html", :list => "1", :bbox => "177,-10,183,10")
 
 157     assert_response :success
 
 158     check_index_result([east_of_antimeridian_changeset, west_of_antimeridian_changeset])
 
 160     get history_path(:format => "html", :list => "1", :bbox => "177,-10,181,10")
 
 161     assert_response :success
 
 162     check_index_result([west_of_antimeridian_changeset])
 
 164     get history_path(:format => "html", :list => "1", :bbox => "179,-10,183,10")
 
 165     assert_response :success
 
 166     check_index_result([east_of_antimeridian_changeset])
 
 168     get history_path(:format => "html", :list => "1", :bbox => "179,-10,181,10")
 
 169     assert_response :success
 
 170     check_index_result([])
 
 173   def test_index_bbox_across_antimeridian_with_changesets_around_globe
 
 174     changeset1 = create(:changeset, :num_changes => 1, :bbox => [-150, 40, -140, 50])
 
 175     changeset2 = create(:changeset, :num_changes => 1, :bbox => [-30, -30, -20, -20])
 
 176     changeset3 = create(:changeset, :num_changes => 1, :bbox => [10, 60, 20, 70])
 
 177     changeset4 = create(:changeset, :num_changes => 1, :bbox => [150, -60, 160, -50])
 
 179     # no bbox, get all changesets
 
 180     get history_path(:format => "html", :list => "1")
 
 181     assert_response :success
 
 182     check_index_result([changeset4, changeset3, changeset2, changeset1])
 
 184     # large enough bbox within normal range
 
 185     get history_path(:format => "html", :list => "1", :bbox => "-170,-80,170,80")
 
 186     assert_response :success
 
 187     check_index_result([changeset4, changeset3, changeset2, changeset1])
 
 189     # bbox for [1,2] within normal range
 
 190     get history_path(:format => "html", :list => "1", :bbox => "-160,-80,0,80")
 
 191     assert_response :success
 
 192     check_index_result([changeset2, changeset1])
 
 194     # bbox for [1,4] containing antimeridian with negative lon
 
 195     get history_path(:format => "html", :list => "1", :bbox => "-220,-80,-100,80")
 
 196     assert_response :success
 
 197     check_index_result([changeset4, changeset1])
 
 199     # bbox for [1,4] containing antimeridian with positive lon
 
 200     get history_path(:format => "html", :list => "1", :bbox => "100,-80,220,80")
 
 201     assert_response :success
 
 202     check_index_result([changeset4, changeset1])
 
 204     # large enough bbox outside normal range
 
 205     get history_path(:format => "html", :list => "1", :bbox => "-220,-80,220,80")
 
 206     assert_response :success
 
 207     check_index_result([changeset4, changeset3, changeset2, changeset1])
 
 211   # Test that -180..180 longitudes don't result in empty bbox
 
 212   def test_index_bbox_entire_world
 
 213     changeset = create(:changeset, :num_changes => 1, :bbox => [30, 60, 31, 61])
 
 215     get history_path(:format => "html", :list => "1", :bbox => "-180,-80,-180,80")
 
 216     assert_response :success
 
 217     check_index_result([])
 
 219     get history_path(:format => "html", :list => "1", :bbox => "180,-80,180,80")
 
 220     assert_response :success
 
 221     check_index_result([])
 
 223     get history_path(:format => "html", :list => "1", :bbox => "-180,-80,180,80")
 
 224     assert_response :success
 
 225     check_index_result([changeset])
 
 229   # Test that -270..270 longitudes don't result in 90..-90 bbox
 
 230   def test_index_bbox_larger_than_entire_world
 
 231     changeset1 = create(:changeset, :num_changes => 1, :bbox => [30, 60, 31, 61])
 
 232     changeset2 = create(:changeset, :num_changes => 1, :bbox => [130, 60, 131, 61])
 
 234     get history_path(:format => "html", :list => "1", :bbox => "-90,-80,90,80")
 
 235     assert_response :success
 
 236     check_index_result([changeset1])
 
 238     get history_path(:format => "html", :list => "1", :bbox => "-270,-80,270,80")
 
 239     assert_response :success
 
 240     check_index_result([changeset2, changeset1])
 
 244   # Checks the display of the user changesets listing
 
 247     create(:changeset, :user => user, :num_changes => 1)
 
 248     create(:changeset, :closed, :user => user, :num_changes => 1)
 
 251     get history_path(:format => "html", :display_name => user.display_name)
 
 252     assert_response :success
 
 253     assert_template "history"
 
 254     assert_template :layout => "map"
 
 255     assert_select "h2", :text => "Changesets by #{user.display_name}", :count => 1 do
 
 256       assert_select "a[href=?]", user_path(user)
 
 258     assert_select "link[rel='alternate'][type='application/atom+xml']", :count => 1 do
 
 259       assert_select "[href=?]", "http://www.example.com/user/#{ERB::Util.url_encode(user.display_name)}/history/feed"
 
 262     get history_path(:format => "html", :display_name => user.display_name, :list => "1"), :xhr => true
 
 263     assert_response :success
 
 264     assert_template "index"
 
 266     check_index_result(user.changesets)
 
 270   # Checks the display of the user changesets listing for a private user
 
 271   def test_index_private_user
 
 272     private_user = create(:user, :data_public => false)
 
 273     create(:changeset, :user => private_user)
 
 274     create(:changeset, :closed, :user => private_user)
 
 276     get history_path(:format => "html", :display_name => private_user.display_name)
 
 277     assert_response :success
 
 278     assert_template "history"
 
 280     get history_path(:format => "html", :display_name => private_user.display_name, :list => "1"), :xhr => true
 
 281     assert_response :success
 
 282     assert_template "index"
 
 284     check_index_result([])
 
 288   # Check the not found of the index user changesets
 
 289   def test_index_user_not_found
 
 290     get history_path(:format => "html", :display_name => "Some random user")
 
 291     assert_response :not_found
 
 292     assert_template "users/no_such_user"
 
 294     get history_path(:format => "html", :display_name => "Some random user", :list => "1"), :xhr => true
 
 295     assert_response :not_found
 
 296     assert_template "users/no_such_user"
 
 300   # Checks the display of the friends changesets listing
 
 301   def test_index_friends
 
 302     private_user = create(:user, :data_public => true)
 
 303     follow = create(:follow, :follower => private_user)
 
 304     changeset = create(:changeset, :user => follow.following, :num_changes => 1)
 
 305     _changeset2 = create(:changeset, :user => create(:user), :num_changes => 1)
 
 307     get friend_changesets_path
 
 308     assert_redirected_to login_path(:referer => friend_changesets_path)
 
 310     session_for(private_user)
 
 312     get friend_changesets_path
 
 313     assert_response :success
 
 314     assert_template "history"
 
 316     get friend_changesets_path(:list => "1"), :xhr => true
 
 317     assert_response :success
 
 318     assert_template "index"
 
 320     check_index_result([changeset])
 
 324   # Checks the display of the nearby user changesets listing
 
 325   def test_index_nearby
 
 326     private_user = create(:user, :data_public => false, :home_lat => 51.1, :home_lon => 1.0)
 
 327     user = create(:user, :home_lat => 51.0, :home_lon => 1.0)
 
 328     far_away_user = create(:user, :home_lat => 51.0, :home_lon => 130)
 
 329     changeset = create(:changeset, :user => user, :num_changes => 1)
 
 330     _changeset2 = create(:changeset, :user => far_away_user, :num_changes => 1)
 
 332     get nearby_changesets_path
 
 333     assert_redirected_to login_path(:referer => nearby_changesets_path)
 
 335     session_for(private_user)
 
 337     get nearby_changesets_path
 
 338     assert_response :success
 
 339     assert_template "history"
 
 341     get nearby_changesets_path(:list => "1"), :xhr => true
 
 342     assert_response :success
 
 343     assert_template "index"
 
 345     check_index_result([changeset])
 
 349   # Check that we can't request later pages of the changesets index
 
 350   def test_index_before_id
 
 351     changeset1 = create(:changeset, :num_changes => 1)
 
 352     changeset2 = create(:changeset, :num_changes => 1)
 
 354     get history_path(:format => "html", :before => changeset2.id), :xhr => true
 
 355     assert_response :success
 
 356     assert_template "history"
 
 357     assert_template :layout => "xhr"
 
 358     assert_select "h2", :text => "Changesets", :count => 1
 
 360     get history_path(:format => "html", :list => "1", :before => changeset2.id), :xhr => true
 
 361     assert_response :success
 
 362     assert_template "index"
 
 364     check_index_result [changeset1]
 
 367   def test_index_after_id
 
 368     changeset1 = create(:changeset, :num_changes => 1)
 
 369     changeset2 = create(:changeset, :num_changes => 1)
 
 371     get history_path(:format => "html", :after => changeset1.id), :xhr => true
 
 372     assert_response :success
 
 373     assert_template "history"
 
 374     assert_template :layout => "xhr"
 
 375     assert_select "h2", :text => "Changesets", :count => 1
 
 377     get history_path(:format => "html", :list => "1", :after => changeset1.id), :xhr => true
 
 378     assert_response :success
 
 379     assert_template "index"
 
 381     check_index_result [changeset2]
 
 385   # Check that a list with a next page link works
 
 387     create_list(:changeset, 50)
 
 389     get history_path(:format => "html")
 
 390     assert_response :success
 
 392     get history_path(:format => "html"), :xhr => true
 
 393     assert_response :success
 
 397     changeset = create(:changeset)
 
 398     create(:changeset_tag, :changeset => changeset, :k => "comment", :v => "tested-changeset-comment")
 
 399     commenting_user = create(:user)
 
 400     changeset_comment = create(:changeset_comment, :changeset => changeset, :author => commenting_user, :body => "Unwanted comment")
 
 402     sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
 
 403     assert_dom "h2", :text => "Changeset: #{changeset.id}"
 
 404     assert_dom "p", :text => "tested-changeset-comment"
 
 405     assert_dom "article#c#{changeset_comment.id}" do
 
 406       assert_dom "> small", :text => /^Comment from #{commenting_user.display_name}/
 
 407       assert_dom "a[href='#{user_path(commenting_user)}']"
 
 411   def test_show_closed_changeset
 
 412     changeset = create(:changeset, :closed)
 
 414     sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
 
 417   def test_show_private_changeset
 
 419     changeset = create(:changeset, :user => create(:user, :data_public => false))
 
 420     create(:changeset, :user => user)
 
 422     sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
 
 425   def test_show_element_links
 
 426     changeset = create(:changeset)
 
 427     node = create(:node, :with_history, :changeset => changeset)
 
 428     way = create(:way, :with_history, :changeset => changeset)
 
 429     relation = create(:relation, :with_history, :changeset => changeset)
 
 431     sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
 
 432     assert_dom "a[href='#{node_path node}']", :count => 1
 
 433     assert_dom "a[href='#{old_node_path node, 1}']", :count => 1
 
 434     assert_dom "a[href='#{way_path way}']", :count => 1
 
 435     assert_dom "a[href='#{old_way_path way, 1}']", :count => 1
 
 436     assert_dom "a[href='#{relation_path relation}']", :count => 1
 
 437     assert_dom "a[href='#{old_relation_path relation, 1}']", :count => 1
 
 440   def test_show_paginated_element_links
 
 442     changeset = create(:changeset)
 
 443     nodes = create_list(:node, page_size + 1, :with_history, :changeset => changeset)
 
 444     ways = create_list(:way, page_size + 1, :with_history, :changeset => changeset)
 
 445     relations = create_list(:relation, page_size + 1, :with_history, :changeset => changeset)
 
 447     sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
 
 448     page_size.times do |i|
 
 449       assert_dom "a[href='#{node_path nodes[i]}']", :count => 1
 
 450       assert_dom "a[href='#{old_node_path nodes[i], 1}']", :count => 1
 
 451       assert_dom "a[href='#{way_path ways[i]}']", :count => 1
 
 452       assert_dom "a[href='#{old_way_path ways[i], 1}']", :count => 1
 
 453       assert_dom "a[href='#{relation_path relations[i]}']", :count => 1
 
 454       assert_dom "a[href='#{old_relation_path relations[i], 1}']", :count => 1
 
 458   def test_show_adjacent_changesets
 
 460     changesets = create_list(:changeset, 3, :user => user, :num_changes => 1)
 
 462     sidebar_browse_check :changeset_path, changesets[1].id, "changesets/show"
 
 463     assert_dom "a[href='#{changeset_path changesets[0]}']", :count => 1
 
 464     assert_dom "a[href='#{changeset_path changesets[2]}']", :count => 1
 
 467   def test_show_adjacent_nonempty_changesets
 
 469     changeset1 = create(:changeset, :user => user, :num_changes => 1)
 
 470     create(:changeset, :user => user, :num_changes => 0)
 
 471     changeset3 = create(:changeset, :user => user, :num_changes => 1)
 
 472     create(:changeset, :user => user, :num_changes => 0)
 
 473     changeset5 = create(:changeset, :user => user, :num_changes => 1)
 
 475     sidebar_browse_check :changeset_path, changeset3.id, "changesets/show"
 
 476     assert_dom "a[href='#{changeset_path changeset1}']", :count => 1
 
 477     assert_dom "a[href='#{changeset_path changeset5}']", :count => 1
 
 481   # This should display the last 20 non-empty changesets
 
 483     changeset = create(:changeset, :num_changes => 1)
 
 484     create(:changeset_tag, :changeset => changeset)
 
 485     create(:changeset_tag, :changeset => changeset, :k => "website", :v => "http://example.com/")
 
 486     closed_changeset = create(:changeset, :closed, :num_changes => 1)
 
 487     create(:changeset_tag, :changeset => closed_changeset, :k => "website", :v => "https://osm.org/")
 
 488     _empty_changeset = create(:changeset, :num_changes => 0)
 
 490     get history_feed_path(:format => :atom)
 
 491     assert_response :success
 
 492     assert_template "index"
 
 493     assert_equal "application/atom+xml", response.media_type
 
 495     check_feed_result([closed_changeset, changeset])
 
 499   # This should correctly escape XML special characters in the comment
 
 500   def test_feed_with_comment_tag
 
 501     changeset = create(:changeset, :num_changes => 1)
 
 502     create(:changeset_tag, :changeset => changeset, :k => "comment", :v => "tested<changeset>comment")
 
 504     get history_feed_path(:format => :atom)
 
 505     assert_response :success
 
 506     assert_template "index"
 
 507     assert_equal "application/atom+xml", response.media_type
 
 509     check_feed_result([changeset])
 
 513   # This should display the last 20 changesets closed in a specific area
 
 515     changeset = create(:changeset, :num_changes => 1, :bbox => [5, 5, 5, 5])
 
 516     create(:changeset_tag, :changeset => changeset)
 
 517     create(:changeset_tag, :changeset => changeset, :k => "website", :v => "http://example.com/")
 
 518     closed_changeset = create(:changeset, :closed, :num_changes => 1, :bbox => [5, 5, 5, 5])
 
 519     _elsewhere_changeset = create(:changeset, :num_changes => 1, :bbox => [-5, -5, -5, -5])
 
 520     _empty_changeset = create(:changeset, :num_changes => 0, :bbox => [5, 5, 5, 5])
 
 522     get history_feed_path(:format => :atom, :bbox => "4.5,4.5,5.5,5.5")
 
 523     assert_response :success
 
 524     assert_template "index"
 
 525     assert_equal "application/atom+xml", response.media_type
 
 527     check_feed_result([closed_changeset, changeset])
 
 531   # Checks the display of the user changesets feed
 
 534     changesets = create_list(:changeset, 3, :user => user, :num_changes => 4)
 
 535     create(:changeset_tag, :changeset => changesets[1])
 
 536     create(:changeset_tag, :changeset => changesets[1], :k => "website", :v => "http://example.com/")
 
 537     _other_changeset = create(:changeset)
 
 539     get history_feed_path(:format => :atom, :display_name => user.display_name)
 
 541     assert_response :success
 
 542     assert_template "index"
 
 543     assert_equal "application/atom+xml", response.media_type
 
 545     check_feed_result(changesets.reverse)
 
 549   # Check the not found of the user changesets feed
 
 550   def test_feed_user_not_found
 
 551     get history_feed_path(:format => "atom", :display_name => "Some random user")
 
 552     assert_response :not_found
 
 556   # Check that we can't request later pages of the changesets feed
 
 558     get history_feed_path(:format => "atom", :before => 100)
 
 559     assert_redirected_to :action => :feed
 
 563     get history_feed_path(:format => "atom", :after => 100)
 
 564     assert_redirected_to :action => :feed
 
 570   # check the result of a index
 
 571   def check_index_result(changesets)
 
 573       assert_select "ol", :count => 0
 
 575       assert_select "ol", :count => 1 do
 
 576         assert_select "li", :count => changesets.size
 
 578         changesets.each do |changeset|
 
 579           assert_select "li#changeset_#{changeset.id}", :count => 1
 
 586   # check the result of a feed
 
 587   def check_feed_result(changesets)
 
 588     assert_operator changesets.size, :<=, 20
 
 591       assert_select "feed", :count => 0
 
 593       assert_select "feed", :count => 1 do
 
 594         assert_select "> title", :count => 1, :text => /^Changesets/
 
 595         assert_select "> entry", :count => changesets.size do |entries|
 
 596           entries.zip(changesets) do |entry, changeset|
 
 597             assert_select entry, "> id", :text => changeset_url(:id => changeset.id)
 
 599             changeset_comment = changeset.tags["comment"]
 
 601               assert_select entry, "> title", :count => 1, :text => "Changeset #{changeset.id} - #{changeset_comment}"
 
 603               assert_select entry, "> title", :count => 1, :text => "Changeset #{changeset.id}"
 
 606             assert_select entry, "> content > xhtml|div > xhtml|table" do
 
 607               if changeset.tags.empty?
 
 608                 assert_select "> xhtml|tr > xhtml|td > xhtml|table", :count => 0
 
 610                 assert_select "> xhtml|tr > xhtml|td > xhtml|table", :count => 1 do
 
 611                   changeset.tags.each_key do |key|
 
 612                     assert_select "> xhtml|tr > xhtml|td", :text => /^#{key} = /