openstreetmap-website/test/functional/message_controller_test.rb
Tom Hughes ab3b4b0437 Increase allowed time delta in message sending test
Only allowing one second can fail sometimes, because if the actual
time is close to rolling over to the next second then the message
time will be rounded down but Time.now may roll over to the next
second before we get to the assertion.
2012-09-30 14:24:28 +01:00

339 lines
14 KiB
Ruby

require File.dirname(__FILE__) + '/../test_helper'
class MessageControllerTest < ActionController::TestCase
fixtures :users, :messages
##
# test all routes which lead to this controller
def test_routes
assert_routing(
{ :path => "/user/username/inbox", :method => :get },
{ :controller => "message", :action => "inbox", :display_name => "username" }
)
assert_routing(
{ :path => "/user/username/outbox", :method => :get },
{ :controller => "message", :action => "outbox", :display_name => "username" }
)
assert_routing(
{ :path => "/message/new/username", :method => :get },
{ :controller => "message", :action => "new", :display_name => "username" }
)
assert_routing(
{ :path => "/message/new/username", :method => :post },
{ :controller => "message", :action => "new", :display_name => "username" }
)
assert_routing(
{ :path => "/message/read/1", :method => :get },
{ :controller => "message", :action => "read", :message_id => "1" }
)
assert_routing(
{ :path => "/message/mark/1", :method => :post },
{ :controller => "message", :action => "mark", :message_id => "1" }
)
assert_routing(
{ :path => "/message/reply/1", :method => :get },
{ :controller => "message", :action => "reply", :message_id => "1" }
)
assert_routing(
{ :path => "/message/reply/1", :method => :post },
{ :controller => "message", :action => "reply", :message_id => "1" }
)
assert_routing(
{ :path => "/message/delete/1", :method => :post },
{ :controller => "message", :action => "delete", :message_id => "1" }
)
end
##
# test the new action
def test_new
# Check that the new message page requires us to login
get :new, :display_name => users(:public_user).display_name
assert_redirected_to login_path(:referer => new_message_path(:display_name => users(:public_user).display_name))
# Login as a normal user
session[:user] = users(:normal_user).id
cookies["_osm_username"] = users(:normal_user).display_name
# Check that the new message page loads
get :new, :display_name => users(:public_user).display_name
assert_response :success
assert_template "new"
assert_select "title", "OpenStreetMap | Send message"
assert_select "form[action='#{new_message_path(:display_name => users(:public_user).display_name)}']", :count => 1 do
assert_select "input#message_title", :count => 1
assert_select "textarea#message_body", :count => 1
assert_select "input[type='submit'][value='Send']", :count => 1
end
# Check that sending a message works
assert_difference "ActionMailer::Base.deliveries.size", 1 do
assert_difference "Message.count", 1 do
post :new,
:display_name => users(:public_user).display_name,
:message => { :title => "Test Message", :body => "Test message body" }
end
end
assert_redirected_to inbox_path(:display_name => users(:normal_user).display_name)
assert_equal "Message sent", flash[:notice]
e = ActionMailer::Base.deliveries.first
assert_equal [ users(:public_user).email ], e.to
assert_equal "[OpenStreetMap] Test Message", e.subject
assert_match /Test message body/, e.text_part.decoded
assert_match /Test message body/, e.html_part.decoded
ActionMailer::Base.deliveries.clear
m = Message.find(3)
assert_equal users(:normal_user).id, m.from_user_id
assert_equal users(:public_user).id, m.to_user_id
assert_in_delta Time.now, m.sent_on, 2
assert_equal "Test Message", m.title
assert_equal "Test message body", m.body
assert_equal "markdown", m.body_format
# Asking to send a message with a bogus user name should fail
get :new, :display_name => "non_existent_user"
assert_response :not_found
assert_template "user/no_such_user"
assert_select "h2", "The user non_existent_user does not exist"
end
##
# test the reply action
def test_reply
# Check that the message reply page requires us to login
get :reply, :message_id => messages(:unread_message).id
assert_redirected_to login_path(:referer => reply_message_path(:message_id => messages(:unread_message).id))
# Login as the wrong user
session[:user] = users(:second_public_user).id
cookies["_osm_username"] = users(:second_public_user).display_name
# Check that we can't reply to somebody else's message
get :reply, :message_id => messages(:unread_message).id
assert_redirected_to login_path(:referer => reply_message_path(:message_id => messages(:unread_message).id))
assert_equal "You are logged in as `pulibc_test2' but the message you have asked to reply to was not sent to that user. Please login as the correct user in order to reply.", flash[:notice]
# Login as the right user
session[:user] = users(:public_user).id
cookies["_osm_username"] = users(:public_user).display_name
# Check that the message reply page loads
get :reply, :message_id => messages(:unread_message).id
assert_response :success
assert_template "new"
assert_select "title", "OpenStreetMap | Re: test message 1"
assert_select "form[action='#{new_message_path(:display_name => users(:normal_user).display_name)}']", :count => 1 do
assert_select "input#message_title[value='Re: test message 1']", :count => 1
assert_select "textarea#message_body", :count => 1
assert_select "input[type='submit'][value='Send']", :count => 1
end
assert_equal true, Message.find(messages(:unread_message).id).message_read
# Asking to reply to a message with no ID should fail
assert_raise ActionController::RoutingError do
get :reply
end
# Asking to reply to a message with a bogus ID should fail
get :reply, :message_id => 99999
assert_response :not_found
assert_template "no_such_message"
end
##
# test the read action
def test_read
# Check that the read message page requires us to login
get :read, :message_id => messages(:unread_message).id
assert_redirected_to login_path(:referer => read_message_path(:message_id => messages(:unread_message).id))
# Login as the wrong user
session[:user] = users(:second_public_user).id
cookies["_osm_username"] = users(:second_public_user).display_name
# Check that we can't read the message
get :read, :message_id => messages(:unread_message).id
assert_redirected_to login_path(:referer => read_message_path(:message_id => messages(:unread_message).id))
assert_equal "You are logged in as `pulibc_test2' but the message you have asked to read was not sent by or to that user. Please login as the correct user in order to read it.", flash[:notice]
# Login as the message sender
session[:user] = users(:normal_user).id
cookies["_osm_username"] = users(:normal_user).display_name
# Check that the message sender can read the message
get :read, :message_id => messages(:unread_message).id
assert_response :success
assert_template "read"
assert_equal false, Message.find(messages(:unread_message).id).message_read
# Login as the message recipient
session[:user] = users(:public_user).id
cookies["_osm_username"] = users(:public_user).display_name
# Check that the message recipient can read the message
get :read, :message_id => messages(:unread_message).id
assert_response :success
assert_template "read"
assert_equal true, Message.find(messages(:unread_message).id).message_read
# Asking to read a message with no ID should fail
assert_raise ActionController::RoutingError do
get :read
end
# Asking to read a message with a bogus ID should fail
get :read, :message_id => 99999
assert_response :not_found
assert_template "no_such_message"
end
##
# test the inbox action
def test_inbox
# Check that the inbox page requires us to login
get :inbox, :display_name => users(:normal_user).display_name
assert_redirected_to login_path(:referer => inbox_path(:display_name => users(:normal_user).display_name))
# Login
session[:user] = users(:normal_user).id
cookies["_osm_username"] = users(:normal_user).display_name
# Check that we can view our inbox when logged in
get :inbox, :display_name => users(:normal_user).display_name
assert_response :success
assert_template "inbox"
assert_select "table.messages", :count => 1 do
assert_select "tr", :count => 2
assert_select "tr#inbox-#{messages(:read_message).id}.inbox-row", :count => 1
end
# Check that we can't view somebody else's inbox when logged in
get :inbox, :display_name => users(:public_user).display_name
assert_redirected_to inbox_path(:display_name => users(:normal_user).display_name)
end
##
# test the outbox action
def test_outbox
# Check that the outbox page requires us to login
get :outbox, :display_name => users(:normal_user).display_name
assert_redirected_to login_path(:referer => outbox_path(:display_name => users(:normal_user).display_name))
# Login
session[:user] = users(:normal_user).id
cookies["_osm_username"] = users(:normal_user).display_name
# Check that we can view our outbox when logged in
get :outbox, :display_name => users(:normal_user).display_name
assert_response :success
assert_template "outbox"
assert_select "table.messages", :count => 1 do
assert_select "tr", :count => 2
assert_select "tr.inbox-row", :count => 1
end
# Check that we can't view somebody else's outbox when logged in
get :outbox, :display_name => users(:public_user).display_name
assert_redirected_to outbox_path(:display_name => users(:normal_user).display_name)
end
##
# test the mark action
def test_mark
# Check that the marking a message requires us to login
post :mark, :message_id => messages(:unread_message).id
assert_response :forbidden
# Login as a user with no messages
session[:user] = users(:second_public_user).id
cookies["_osm_username"] = users(:second_public_user).display_name
# Check that marking a message we didn't send or receive fails
post :mark, :message_id => messages(:read_message).id
assert_response :not_found
assert_template "no_such_message"
# Login as the message recipient
session[:user] = users(:public_user).id
cookies["_osm_username"] = users(:public_user).display_name
# Check that the marking a message read works
post :mark, :message_id => messages(:unread_message).id, :mark => "read"
assert_redirected_to inbox_path(:display_name => users(:public_user).display_name)
assert_equal true, Message.find(messages(:unread_message).id).message_read
# Check that the marking a message unread works
post :mark, :message_id => messages(:unread_message).id, :mark => "unread"
assert_redirected_to inbox_path(:display_name => users(:public_user).display_name)
assert_equal false, Message.find(messages(:unread_message).id).message_read
# Check that the marking a message read via XHR works
xhr :post, :mark, :message_id => messages(:unread_message).id, :mark => "read"
assert_response :success
assert_template "mark"
assert_equal true, Message.find(messages(:unread_message).id).message_read
# Check that the marking a message unread via XHR works
xhr :post, :mark, :message_id => messages(:unread_message).id, :mark => "unread"
assert_response :success
assert_template "mark"
assert_equal false, Message.find(messages(:unread_message).id).message_read
# Asking to mark a message with no ID should fail
assert_raise ActionController::RoutingError do
post :mark
end
# Asking to mark a message with a bogus ID should fail
post :mark, :message_id => 99999
assert_response :not_found
assert_template "no_such_message"
end
##
# test the delete action
def test_delete
# Check that the deleting a message requires us to login
post :delete, :message_id => messages(:read_message).id
assert_response :forbidden
# Login as a user with no messages
session[:user] = users(:second_public_user).id
cookies["_osm_username"] = users(:second_public_user).display_name
# Check that deleting a message we didn't send or receive fails
post :delete, :message_id => messages(:read_message).id
assert_response :not_found
assert_template "no_such_message"
# Login as the message recipient
session[:user] = users(:normal_user).id
cookies["_osm_username"] = users(:normal_user).display_name
# Check that the deleting a received message works
post :delete, :message_id => messages(:read_message).id
assert_redirected_to inbox_path(:display_name => users(:normal_user).display_name)
assert_equal "Message deleted", flash[:notice]
m = Message.find(messages(:read_message).id)
assert_equal true, m.from_user_visible
assert_equal false, m.to_user_visible
# Check that the deleting a sent message works
post :delete, :message_id => messages(:unread_message).id
assert_redirected_to inbox_path(:display_name => users(:normal_user).display_name)
assert_equal "Message deleted", flash[:notice]
m = Message.find(messages(:unread_message).id)
assert_equal false, m.from_user_visible
assert_equal true, m.to_user_visible
# Asking to delete a message with no ID should fail
assert_raise ActionController::RoutingError do
post :delete
end
# Asking to delete a message with a bogus ID should fail
post :delete, :message_id => 99999
assert_response :not_found
assert_template "no_such_message"
end
end