class ChangesetControllerTest < ActionController::TestCase
api_fixtures
- fixtures :changeset_comments, :changesets_subscribers
+ fixtures :friends, :changeset_comments, :changesets_subscribers
##
# test all routes which lead to this controller
)
assert_routing(
{ :path => "/history/friends", :method => :get },
- { :controller => "changeset", :action => "list", :friends => true }
+ { :controller => "changeset", :action => "list", :friends => true, :format => :html }
)
assert_routing(
{ :path => "/history/nearby", :method => :get },
- { :controller => "changeset", :action => "list", :nearby => true }
+ { :controller => "changeset", :action => "list", :nearby => true, :format => :html }
)
assert_routing(
{ :path => "/history", :method => :get },
end
##
- # This should display the last 20 changesets closed.
+ # This should display the last 20 changesets closed
def test_list
get :list, :format => "html"
assert_response :success
assert_template :layout => "map"
assert_select "h2", :text => "Changesets", :count => 1
- get :list, :format => "html", :list => "1", :bbox => "-180,-90,90,180"
+ xhr :get, :list, :format => "html", :list => "1"
assert_response :success
assert_template "list"
- changesets = Changeset
- .where("num_changes > 0 and min_lon is not null")
- .order(:created_at => :desc)
- .limit(20)
- assert changesets.size <= 20
-
- # Now check that all 20 (or however many were returned) changesets are in the html
- assert_select "li", :count => changesets.size
- changesets.each do |_changeset|
- # FIXME: this test needs rewriting - test for table contents
- end
+ check_list_result(Changeset.all)
end
##
- # This should display the last 20 changesets closed.
+ # This should display the last 20 changesets closed
def test_list_xhr
xhr :get, :list, :format => "html"
assert_response :success
assert_template :layout => "xhr"
assert_select "h2", :text => "Changesets", :count => 1
- get :list, :format => "html", :list => "1", :bbox => "-180,-90,90,180"
+ xhr :get, :list, :format => "html", :list => "1"
assert_response :success
assert_template "list"
- changesets = Changeset
- .where("num_changes > 0 and min_lon is not null")
- .order(:created_at => :desc)
- .limit(20)
- assert changesets.size <= 20
+ check_list_result(Changeset.all)
+ end
- # Now check that all 20 (or however many were returned) changesets are in the html
- assert_select "li", :count => changesets.size
- changesets.each do |_changeset|
- # FIXME: this test needs rewriting - test for table contents
- end
+ ##
+ # This should display the last 20 changesets closed in a specific area
+ def test_list_bbox
+ get :list, :format => "html", :bbox => "4.5,4.5,5.5,5.5"
+ assert_response :success
+ assert_template "history"
+ assert_template :layout => "map"
+ assert_select "h2", :text => "Changesets", :count => 1
+
+ xhr :get, :list, :format => "html", :bbox => "4.5,4.5,5.5,5.5", :list => "1"
+ assert_response :success
+ assert_template "list"
+
+ check_list_result(Changeset.where("min_lon < 55000000 and max_lon > 45000000 and min_lat < 55000000 and max_lat > 45000000"))
end
##
# Checks the display of the user changesets listing
def test_list_user
user = users(:public_user)
+
get :list, :format => "html", :display_name => user.display_name
assert_response :success
assert_template "history"
- # FIXME: need to add more checks to see which if edits are actually shown if your data is public
+
+ get :list, :format => "html", :display_name => user.display_name, :list => "1"
+ assert_response :success
+ assert_template "list"
+
+ check_list_result(user.changesets)
+ end
+
+ ##
+ # Checks the display of the user changesets listing for a private user
+ def test_list_private_user
+ user = users(:normal_user)
+
+ get :list, :format => "html", :display_name => user.display_name
+ assert_response :success
+ assert_template "history"
+
+ get :list, :format => "html", :display_name => user.display_name, :list => "1"
+ assert_response :success
+ assert_template "list"
+
+ check_list_result(Changeset.none)
end
##
get :list, :format => "html", :display_name => "Some random user"
assert_response :not_found
assert_template "user/no_such_user"
+
+ get :list, :format => "html", :display_name => "Some random user", :list => "1"
+ assert_response :not_found
+ assert_template "user/no_such_user"
+ end
+
+ ##
+ # Checks the display of the friends changesets listing
+ def test_list_friends
+ user = users(:normal_user)
+
+ get :list, :friends => true
+ assert_response :redirect
+ assert_redirected_to :controller => :user, :action => :login, :referer => friend_changesets_path
+
+ session[:user] = user.id
+
+ get :list, :friends => true
+ assert_response :success
+ assert_template "history"
+
+ get :list, :friends => true, :list => "1"
+ assert_response :success
+ assert_template "list"
+
+ check_list_result(Changeset.where(:user => user.friend_users.identifiable))
+ end
+
+ ##
+ # Checks the display of the nearby user changesets listing
+ def test_list_nearby
+ user = users(:normal_user)
+
+ get :list, :nearby => true
+ assert_response :redirect
+ assert_redirected_to :controller => :user, :action => :login, :referer => nearby_changesets_path
+
+ session[:user] = user.id
+
+ get :list, :nearby => true
+ assert_response :success
+ assert_template "history"
+
+ get :list, :nearby => true, :list => "1"
+ assert_response :success
+ assert_template "list"
+
+ check_list_result(Changeset.where(:user => user.nearby))
end
##
- # This should display the last 20 changesets closed.
+ # This should display the last 20 changesets closed
def test_feed
- changesets = Changeset.where("num_changes > 0").order(:created_at => :desc).limit(20)
- assert changesets.size <= 20
- get :feed, :format => "atom"
+ get :feed, :format => :atom
assert_response :success
assert_template "list"
- # Now check that all 20 (or however many were returned) changesets are in the html
- assert_select "feed", :count => 1
- assert_select "entry", :count => changesets.size
- changesets.each do |_changeset|
- # FIXME: this test needs rewriting - test for feed contents
- end
+ assert_equal "application/atom+xml", response.content_type
+
+ check_feed_result(Changeset.all)
+ end
+
+ ##
+ # This should display the last 20 changesets closed in a specific area
+ def test_feed_bbox
+ get :feed, :format => :atom, :bbox => "4.5,4.5,5.5,5.5"
+ assert_response :success
+ assert_template "list"
+ assert_equal "application/atom+xml", response.content_type
+
+ check_feed_result(Changeset.where("min_lon < 55000000 and max_lon > 45000000 and min_lat < 55000000 and max_lat > 45000000"))
end
##
# Checks the display of the user changesets feed
def test_feed_user
user = users(:public_user)
- get :feed, :format => "atom", :display_name => user.display_name
+
+ get :feed, :format => :atom, :display_name => user.display_name
assert_response :success
assert_template "list"
assert_equal "application/atom+xml", response.content_type
- # FIXME: need to add more checks to see which if edits are actually shown if your data is public
+
+ check_feed_result(user.changesets)
end
##
assert_response :not_found
end
+ ##
+ # Check that we can't request later pages of the changesets feed
+ def test_feed_max_id
+ get :feed, :format => "atom", :max_id => 100
+ assert_response :redirect
+ assert_redirected_to :action => :feed
+ end
+
##
# check that the changeset download for a changeset with a redacted
# element in it doesn't contain that element.
end
end
- #------------------------------------------------------------
- # utility functions
- #------------------------------------------------------------
+ private
##
# boilerplate for checking that certain changesets exist in the
xml.find("//osm/way").first[name] = value.to_s
xml
end
+
+ ##
+ # check the result of a list
+ def check_list_result(changesets)
+ changesets = changesets.where("num_changes > 0")
+ .order(:created_at => :desc)
+ .limit(20)
+ assert changesets.size <= 20
+
+ assert_select "ol.changesets", :count => [changesets.size, 1].min do
+ assert_select "li", :count => changesets.size
+
+ changesets.each do |changeset|
+ assert_select "li#changeset_#{changeset.id}", :count => 1
+ end
+ end
+ end
+
+ ##
+ # check the result of a feed
+ def check_feed_result(changesets)
+ changesets = changesets.where("num_changes > 0")
+ .order(:created_at => :desc)
+ .limit(20)
+ assert changesets.size <= 20
+
+ assert_select "feed", :count => [changesets.size, 1].min do
+ assert_select "entry", :count => changesets.size
+
+ changesets.each do |changeset|
+ assert_select "entry > id", changeset_url(:id => changeset.id)
+ end
+ end
+ end
end
oauth10_without_callback(client)
oauth10_with_callback(client, "http://another.web.app.org/callback")
+ oauth10_refused(client)
end
def test_oauth10_desktop_app
assert_response :success
oauth10_without_callback(client)
+ oauth10_refused(client)
end
def test_oauth10a_web_app
oauth10a_without_callback(client)
oauth10a_with_callback(client, "http://another.web.app.org/callback")
+ oauth10a_refused(client)
end
def test_oauth10a_desktop_app
assert_response :success
oauth10a_without_callback(client)
+ oauth10a_refused(client)
end
private
assert_redirected_to "#{client.callback_url}?oauth_token=#{token.token}"
else
assert_response :success
- assert_template "authorize_success"
+ assert_template :authorize_success
end
token.reload
assert_not_nil token.created_at
assert_response :unauthorized
end
+ def oauth10_refused(client)
+ token = get_request_token(client)
+
+ post "/oauth/authorize", :oauth_token => token.token
+ assert_response :success
+ assert_template :authorize_failure
+ assert_select "p", "You have denied application #{client.name} access to your account."
+ token.reload
+ assert_nil token.authorized_at
+ assert_not_nil token.invalidated_at
+
+ post "/oauth/authorize", :oauth_token => token.token
+ assert_response :success
+ assert_template :authorize_failure
+ assert_select "p", "The authorization token is not valid."
+ token.reload
+ assert_nil token.authorized_at
+ assert_not_nil token.invalidated_at
+ end
+
def oauth10_with_callback(client, callback_url)
token = get_request_token(client)
assert_redirected_to "http://some.web.app.org/callback?oauth_token=#{token.token}&oauth_verifier=#{verifier}"
else
assert_response :success
- assert_template "authorize_success"
+ assert_template :authorize_success
m = response.body.match("<p>The verification code is ([A-Za-z0-9]+).</p>")
assert_not_nil m
verifier = m[1]
assert_response :unauthorized
end
+ def oauth10a_refused(client)
+ token = get_request_token(client, :oauth_callback => "oob")
+
+ post "/oauth/authorize", :oauth_token => token.token
+ assert_response :success
+ assert_template :authorize_failure
+ assert_select "p", "You have denied application #{client.name} access to your account."
+ token.reload
+ assert_nil token.authorized_at
+ assert_not_nil token.invalidated_at
+
+ post "/oauth/authorize", :oauth_token => token.token
+ assert_response :success
+ assert_template :authorize_failure
+ assert_select "p", "The authorization token is not valid."
+ token.reload
+ assert_nil token.authorized_at
+ assert_not_nil token.invalidated_at
+ end
+
def get_request_token(client, options = {})
signed_get "/oauth/request_token", options.merge(:consumer => client)
assert_response :success