openstreetmap-website/test/controllers/browse_controller_test.rb
Andy Allan a863be8831 Rename User#delete to User#destroy
"delete" is generally used for immediate SQL deletion without running
any callbacks or other ruby code, whereas "destroy" will trigger callbacks.

Although we don't currently use any callbacks, let's rename this method to
align better with the convention.
2021-12-22 11:32:33 +00:00

300 lines
9.8 KiB
Ruby

require "test_helper"
class BrowseControllerTest < ActionDispatch::IntegrationTest
##
# test all routes which lead to this controller
def test_routes
assert_routing(
{ :path => "/node/1", :method => :get },
{ :controller => "browse", :action => "node", :id => "1" }
)
assert_routing(
{ :path => "/node/1/history", :method => :get },
{ :controller => "browse", :action => "node_history", :id => "1" }
)
assert_routing(
{ :path => "/way/1", :method => :get },
{ :controller => "browse", :action => "way", :id => "1" }
)
assert_routing(
{ :path => "/way/1/history", :method => :get },
{ :controller => "browse", :action => "way_history", :id => "1" }
)
assert_routing(
{ :path => "/relation/1", :method => :get },
{ :controller => "browse", :action => "relation", :id => "1" }
)
assert_routing(
{ :path => "/relation/1/history", :method => :get },
{ :controller => "browse", :action => "relation_history", :id => "1" }
)
assert_routing(
{ :path => "/changeset/1", :method => :get },
{ :controller => "browse", :action => "changeset", :id => "1" }
)
assert_routing(
{ :path => "/note/1", :method => :get },
{ :controller => "browse", :action => "note", :id => "1" }
)
assert_routing(
{ :path => "/note/new", :method => :get },
{ :controller => "browse", :action => "new_note" }
)
assert_routing(
{ :path => "/query", :method => :get },
{ :controller => "browse", :action => "query" }
)
end
def test_read_relation
browse_check :relation_path, create(:relation).id, "browse/feature"
end
def test_read_relation_history
browse_check :relation_history_path, create(:relation, :with_history).id, "browse/history"
end
def test_read_way
browse_check :way_path, create(:way).id, "browse/feature"
end
def test_read_way_history
browse_check :way_history_path, create(:way, :with_history).id, "browse/history"
end
def test_read_node
browse_check :node_path, create(:node).id, "browse/feature"
end
def test_read_node_history
browse_check :node_history_path, create(:node, :with_history).id, "browse/history"
end
def test_read_changeset
user = create(:user)
changeset = create(:changeset, :user => user)
create(:changeset, :user => user)
browse_check :changeset_path, changeset.id, "browse/changeset"
end
def test_read_private_changeset
user = create(:user)
changeset = create(:changeset, :user => create(:user, :data_public => false))
create(:changeset, :user => user)
browse_check :changeset_path, changeset.id, "browse/changeset"
end
def test_read_changeset_hidden_comments
changeset = create(:changeset)
create_list(:changeset_comment, 3, :changeset => changeset)
create(:changeset_comment, :visible => false, :changeset => changeset)
browse_check :changeset_path, changeset.id, "browse/changeset"
assert_select "div.changeset-comments ul li", :count => 3
session_for(create(:moderator_user))
browse_check :changeset_path, changeset.id, "browse/changeset"
assert_select "div.changeset-comments ul li", :count => 4
end
def test_read_note
open_note = create(:note_with_comments)
browse_check :browse_note_path, open_note.id, "browse/note"
end
def test_read_hidden_note
hidden_note_with_comment = create(:note_with_comments, :status => "hidden")
get browse_note_path(:id => hidden_note_with_comment)
assert_response :not_found
assert_template "browse/not_found"
assert_template :layout => "map"
get browse_note_path(:id => hidden_note_with_comment), :xhr => true
assert_response :not_found
assert_template "browse/not_found"
assert_template :layout => "xhr"
session_for(create(:moderator_user))
browse_check :browse_note_path, hidden_note_with_comment.id, "browse/note"
end
def test_read_note_hidden_comments
note_with_hidden_comment = create(:note_with_comments, :comments_count => 2) do |note|
create(:note_comment, :note => note, :visible => false)
end
browse_check :browse_note_path, note_with_hidden_comment.id, "browse/note"
assert_select "div.note-comments ul li", :count => 1
session_for(create(:moderator_user))
browse_check :browse_note_path, note_with_hidden_comment.id, "browse/note"
assert_select "div.note-comments ul li", :count => 2
end
def test_read_note_hidden_user_comment
hidden_user = create(:user, :status => "deleted")
note_with_hidden_user_comment = create(:note_with_comments, :comments_count => 2) do |note|
create(:note_comment, :note => note, :author => hidden_user)
end
browse_check :browse_note_path, note_with_hidden_user_comment.id, "browse/note"
assert_select "div.note-comments ul li", :count => 1
session_for(create(:moderator_user))
browse_check :browse_note_path, note_with_hidden_user_comment.id, "browse/note"
assert_select "div.note-comments ul li", :count => 1
end
def test_read_closed_note
user = create(:user)
closed_note = create(:note_with_comments, :status => "closed", :closed_at => Time.now, :comments_count => 2) do |note|
create(:note_comment, :event => "closed", :note => note, :author => user)
end
browse_check :browse_note_path, closed_note.id, "browse/note"
assert_select "div.note-comments ul li", :count => 2
assert_select "div.details", /Resolved by #{user.display_name}/
user.destroy
reset!
browse_check :browse_note_path, closed_note.id, "browse/note"
assert_select "div.note-comments ul li", :count => 1
assert_select "div.details", /Resolved by deleted/
end
##
# Methods to check redaction.
#
# note that these are presently highly reliant on the structure of the
# page for the selection tests, which doesn't work out particularly
# well if that structure changes. so... if you change the page layout
# then please make it more easily (and robustly) testable!
##
def test_redacted_node
node = create(:node, :with_history, :deleted, :version => 2)
node_v1 = node.old_nodes.find_by(:version => 1)
node_v1.redact!(create(:redaction))
get node_path(:id => node)
assert_response :success
assert_template "feature"
# check that we don't show lat/lon for a redacted node.
assert_select ".browse-section", 1
assert_select ".browse-section.browse-node", 1
assert_select ".browse-section.browse-node .latitude", 0
assert_select ".browse-section.browse-node .longitude", 0
end
def test_redacted_node_history
node = create(:node, :with_history, :deleted, :version => 2)
node_v1 = node.old_nodes.find_by(:version => 1)
node_v1.redact!(create(:redaction))
get node_history_path(:id => node)
assert_response :success
assert_template "browse/history"
# there are 2 revisions of the redacted node, but only one
# should be showing details here.
assert_select ".browse-section", 2
assert_select ".browse-section.browse-redacted", 1
assert_select ".browse-section.browse-node", 1
assert_select ".browse-section.browse-node .latitude", 0
assert_select ".browse-section.browse-node .longitude", 0
end
def test_redacted_way_history
way = create(:way, :with_history, :version => 4)
way_v1 = way.old_ways.find_by(:version => 1)
way_v1.redact!(create(:redaction))
way_v3 = way.old_ways.find_by(:version => 3)
way_v3.redact!(create(:redaction))
get way_history_path(:id => way)
assert_response :success
assert_template "browse/history"
# there are 4 revisions of the redacted way, but only 2
# should be showing details here.
assert_select ".browse-section", 4
assert_select ".browse-section.browse-redacted", 2
assert_select ".browse-section.browse-way", 2
end
def test_redacted_relation_history
relation = create(:relation, :with_history, :version => 4)
relation_v1 = relation.old_relations.find_by(:version => 1)
relation_v1.redact!(create(:redaction))
relation_v3 = relation.old_relations.find_by(:version => 3)
relation_v3.redact!(create(:redaction))
get relation_history_path(:id => relation)
assert_response :success
assert_template "browse/history"
# there are 4 revisions of the redacted relation, but only 2
# should be showing details here.
assert_select ".browse-section", 4
assert_select ".browse-section.browse-redacted", 2
assert_select ".browse-section.browse-relation", 2
end
def test_new_note
get note_new_path
assert_response :success
assert_template "browse/new_note"
end
def test_query
get query_path
assert_response :success
assert_template "browse/query"
end
private
# This is a convenience method for most of the above checks
# First we check that when we don't have an id, it will correctly return a 404
# then we check that we get the correct 404 when a non-existant id is passed
# then we check that it will get a successful response, when we do pass an id
def browse_check(path, id, template)
path_method = method(path)
assert_raise ActionController::UrlGenerationError do
get path_method.call
end
assert_raise ActionController::UrlGenerationError do
get path_method.call(:id => -10) # we won't have an id that's negative
end
get path_method.call(:id => 0)
assert_response :not_found
assert_template "browse/not_found"
assert_template :layout => "map"
get path_method.call(:id => 0), :xhr => true
assert_response :not_found
assert_template "browse/not_found"
assert_template :layout => "xhr"
get path_method.call(:id => id)
assert_response :success
assert_template template
assert_template :layout => "map"
get path_method.call(:id => id), :xhr => true
assert_response :success
assert_template template
assert_template :layout => "xhr"
end
end