From 5bbe1c4aee4e070cb1867d7bdfec9566aacb1466 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 28 May 2014 09:55:13 +0100 Subject: [PATCH] Improve testing of emails Make sure we test that everything which should send email does and that we clear the pending emails afterwards. --- test/controllers/user_controller_test.rb | 62 +++++++++++++++++++----- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/test/controllers/user_controller_test.rb b/test/controllers/user_controller_test.rb index c068ee408..a39e07efc 100644 --- a/test/controllers/user_controller_test.rb +++ b/test/controllers/user_controller_test.rb @@ -222,8 +222,8 @@ class UserControllerTest < ActionController::TestCase def test_user_create_success user = new_user - assert_difference('User.count') do - assert_difference('ActionMailer::Base.deliveries.size') do + assert_difference('User.count', 1) do + assert_difference('ActionMailer::Base.deliveries.size', 1) do post :save, {}, {:new_user => user} end end @@ -303,11 +303,17 @@ class UserControllerTest < ActionController::TestCase def test_user_save_referer_params user = new_user - post :save, {}, {:new_user => user, - :referer => '/edit?editor=id#map=1/2/3'} + assert_difference('User.count', 1) do + assert_difference('ActionMailer::Base.deliveries.size', 1) do + post :save, {}, {:new_user => user, + :referer => '/edit?editor=id#map=1/2/3'} + end + end assert_equal welcome_path(:editor => 'id', :zoom => 1, :lat => 2, :lon => 3), user.tokens.order("id DESC").first.referer + + ActionMailer::Base.deliveries.clear end def test_user_confirm_expired_token @@ -370,7 +376,10 @@ class UserControllerTest < ActionController::TestCase assert_response :redirect assert_redirected_to :action => :login assert_match /^Sorry you lost it/, flash[:notice] - assert_equal users(:normal_user).email, ActionMailer::Base.deliveries.last.to[0] + email = ActionMailer::Base.deliveries.first + assert_equal 1, email.to.count + assert_equal users(:normal_user).email, email.to.first + ActionMailer::Base.deliveries.clear # Test resetting using an address that matches a different user # that has the same address in a different case @@ -380,7 +389,10 @@ class UserControllerTest < ActionController::TestCase assert_response :redirect assert_redirected_to :action => :login assert_match /^Sorry you lost it/, flash[:notice] - assert_equal users(:uppercase_user).email, ActionMailer::Base.deliveries.last.to[0] + email = ActionMailer::Base.deliveries.first + assert_equal 1, email.to.count + assert_equal users(:uppercase_user).email, email.to.first + ActionMailer::Base.deliveries.clear # Test resetting using an address that is a case insensitive match # for more than one user but not an exact match for either @@ -399,7 +411,10 @@ class UserControllerTest < ActionController::TestCase assert_response :redirect assert_redirected_to :action => :login assert_match /^Sorry you lost it/, flash[:notice] - assert_equal users(:public_user).email, ActionMailer::Base.deliveries.last.to[0] + email = ActionMailer::Base.deliveries.first + assert_equal 1, email.to.count + assert_equal users(:public_user).email, email.to.first + ActionMailer::Base.deliveries.clear # Test resetting using an address that matches a user that has the # same (case insensitively unique) address in a different case @@ -409,7 +424,10 @@ class UserControllerTest < ActionController::TestCase assert_response :redirect assert_redirected_to :action => :login assert_match /^Sorry you lost it/, flash[:notice] - assert_equal users(:public_user).email, ActionMailer::Base.deliveries.last.to[0] + email = ActionMailer::Base.deliveries.first + assert_equal 1, email.to.count + assert_equal users(:public_user).email, email.to.first + ActionMailer::Base.deliveries.clear end def test_reset_password @@ -503,7 +521,9 @@ class UserControllerTest < ActionController::TestCase # Changing email to one that exists should fail user.new_email = users(:public_user).email - post :account, { :display_name => user.display_name, :user => user.attributes }, { "user" => user.id } + assert_no_difference('ActionMailer::Base.deliveries.size') do + post :account, { :display_name => user.display_name, :user => user.attributes }, { "user" => user.id } + end assert_response :success assert_template :account assert_select ".notice", false @@ -512,7 +532,9 @@ class UserControllerTest < ActionController::TestCase # Changing email to one that exists should fail, regardless of case user.new_email = users(:public_user).email.upcase - post :account, { :display_name => user.display_name, :user => user.attributes }, { "user" => user.id } + assert_no_difference('ActionMailer::Base.deliveries.size') do + post :account, { :display_name => user.display_name, :user => user.attributes }, { "user" => user.id } + end assert_response :success assert_template :account assert_select ".notice", false @@ -521,12 +543,18 @@ class UserControllerTest < ActionController::TestCase # Changing email to one that doesn't exist should work user.new_email = "new_tester@example.com" - post :account, { :display_name => user.display_name, :user => user.attributes }, { "user" => user.id } + assert_difference('ActionMailer::Base.deliveries.size', 1) do + post :account, { :display_name => user.display_name, :user => user.attributes }, { "user" => user.id } + end assert_response :success assert_template :account assert_select "div#errorExplanation", false assert_select ".notice", /^User information updated successfully/ assert_select "form#accountForm > fieldset > div.form-row > input#user_new_email[value=?]", user.new_email + email = ActionMailer::Base.deliveries.first + assert_equal 1, email.to.count + assert_equal user.new_email, email.to.first + ActionMailer::Base.deliveries.clear end # Check that the user account page will display and contains some relevant @@ -744,13 +772,21 @@ class UserControllerTest < ActionController::TestCase assert_nil Friend.where(:user_id => user.id, :friend_user_id => friend.id).first # When logged in a POST should add the friendship - post :make_friend, {:display_name => friend.display_name}, {"user" => user} + assert_difference('ActionMailer::Base.deliveries.size', 1) do + post :make_friend, {:display_name => friend.display_name}, {"user" => user} + end assert_redirected_to user_path(:display_name => friend.display_name) assert_match /is now your friend/, flash[:notice] assert Friend.where(:user_id => user.id, :friend_user_id => friend.id).first + email = ActionMailer::Base.deliveries.first + assert_equal 1, email.to.count + assert_equal friend.email, email.to.first + ActionMailer::Base.deliveries.clear # A second POST should report that the friendship already exists - post :make_friend, {:display_name => friend.display_name}, {"user" => user} + assert_no_difference('ActionMailer::Base.deliveries.size') do + post :make_friend, {:display_name => friend.display_name}, {"user" => user} + end assert_redirected_to user_path(:display_name => friend.display_name) assert_match /You are already friends with/, flash[:warning] assert Friend.where(:user_id => user.id, :friend_user_id => friend.id).first -- 2.43.2