3 class FollowsControllerTest < ActionDispatch::IntegrationTest
 
   5   # test all routes which lead to this controller
 
   8       { :path => "/user/username/follow", :method => :get },
 
   9       { :controller => "follows", :action => "show", :display_name => "username" }
 
  12       { :path => "/user/username/follow", :method => :post },
 
  13       { :controller => "follows", :action => "create", :display_name => "username" }
 
  16       { :path => "/user/username/follow", :method => :delete },
 
  17       { :controller => "follows", :action => "destroy", :display_name => "username" }
 
  22     # Get users to work with
 
  24     follow = create(:user)
 
  26     # Check that the users aren't already friends
 
  27     assert_nil Follow.find_by(:follower => user, :following => follow)
 
  29     # When not logged in a GET should ask us to login
 
  30     get follow_path(follow)
 
  31     assert_redirected_to login_path(:referer => follow_path(follow))
 
  33     # When not logged in a POST should error
 
  34     post follow_path(follow)
 
  35     assert_response :forbidden
 
  36     assert_nil Follow.find_by(:follower => user, :following => follow)
 
  40     # When logged in a GET should get a confirmation page
 
  41     get follow_path(follow)
 
  42     assert_response :success
 
  44     assert_select "a[href*='test']", 0
 
  45     assert_nil Follow.find_by(:follower => user, :following => follow)
 
  47     # When logged in a POST should add the follow
 
  48     assert_difference "ActionMailer::Base.deliveries.size", 1 do
 
  49       perform_enqueued_jobs do
 
  50         post follow_path(follow)
 
  53     assert_redirected_to user_path(follow)
 
  54     assert_match(/You are now following/, flash[:notice])
 
  55     assert Follow.find_by(:follower => user, :following => follow)
 
  56     email = ActionMailer::Base.deliveries.first
 
  57     assert_equal 1, email.to.count
 
  58     assert_equal follow.email, email.to.first
 
  60     # A second POST should report that the follow already exists
 
  61     assert_no_difference "ActionMailer::Base.deliveries.size" do
 
  62       perform_enqueued_jobs do
 
  63         post follow_path(follow)
 
  66     assert_redirected_to user_path(follow)
 
  67     assert_match(/You already follow/, flash[:warning])
 
  68     assert Follow.find_by(:follower => user, :following => follow)
 
  71   def test_follow_with_referer
 
  72     # Get users to work with
 
  74     follow = create(:user)
 
  77     # Check that the users aren't already friends
 
  78     assert_nil Follow.find_by(:follower => user, :following => follow)
 
  80     # The GET should preserve any referer
 
  81     get follow_path(follow), :params => { :referer => "/test" }
 
  82     assert_response :success
 
  84     assert_select "a[href*='test']"
 
  85     assert_nil Follow.find_by(:follower => user, :following => follow)
 
  87     # When logged in a POST should add the follow and refer us
 
  88     assert_difference "ActionMailer::Base.deliveries.size", 1 do
 
  89       perform_enqueued_jobs do
 
  90         post follow_path(follow), :params => { :referer => "/test" }
 
  93     assert_redirected_to "/test"
 
  94     assert_match(/You are now following/, flash[:notice])
 
  95     assert Follow.find_by(:follower => user, :following => follow)
 
  96     email = ActionMailer::Base.deliveries.first
 
  97     assert_equal 1, email.to.count
 
  98     assert_equal follow.email, email.to.first
 
 101   def test_follow_unknown_user
 
 102     # Should error when a bogus user is specified
 
 103     session_for(create(:user))
 
 104     get follow_path("No Such User")
 
 105     assert_response :not_found
 
 106     assert_template :no_such_user
 
 110     # Get users to work with
 
 112     follow = create(:user)
 
 113     create(:follow, :follower => user, :following => follow)
 
 115     # Check that the users are friends
 
 116     assert Follow.find_by(:follower => user, :following => follow)
 
 118     # When not logged in a GET should ask us to login
 
 119     get follow_path(follow)
 
 120     assert_redirected_to login_path(:referer => follow_path(follow))
 
 122     # When not logged in a POST should error
 
 123     delete follow_path, :params => { :display_name => follow.display_name }
 
 124     assert_response :forbidden
 
 125     assert Follow.find_by(:follower => user, :following => follow)
 
 129     # When logged in a GET should get a confirmation page
 
 130     get follow_path(follow)
 
 131     assert_response :success
 
 132     assert_template :show
 
 133     assert_select "a[href*='test']", 0
 
 134     assert Follow.find_by(:follower => user, :following => follow)
 
 136     # When logged in a DELETE should remove the follow
 
 137     delete follow_path(follow)
 
 138     assert_redirected_to user_path(follow)
 
 139     assert_match(/You successfully unfollowed/, flash[:notice])
 
 140     assert_nil Follow.find_by(:follower => user, :following => follow)
 
 142     # A second DELETE should report that the follow does not exist
 
 143     delete follow_path(follow)
 
 144     assert_redirected_to user_path(follow)
 
 145     assert_match(/You are not following/, flash[:error])
 
 146     assert_nil Follow.find_by(:follower => user, :following => follow)
 
 149   def test_unfollow_with_referer
 
 150     # Get users to work with
 
 152     follow = create(:user)
 
 153     create(:follow, :follower => user, :following => follow)
 
 156     # Check that the users are friends
 
 157     assert Follow.find_by(:follower => user, :following => follow)
 
 159     # The GET should preserve any referer
 
 160     get follow_path(follow), :params => { :referer => "/test" }
 
 161     assert_response :success
 
 162     assert_template :show
 
 163     assert_select "a[href*='test']"
 
 164     assert Follow.find_by(:follower => user, :following => follow)
 
 166     # When logged in a POST should remove the follow and refer
 
 167     delete follow_path(follow), :params => { :referer => "/test" }
 
 168     assert_redirected_to "/test"
 
 169     assert_match(/You successfully unfollowed/, flash[:notice])
 
 170     assert_nil Follow.find_by(:follower => user, :following => follow)
 
 173   def test_unfollow_unknown_user
 
 174     # Should error when a bogus user is specified
 
 175     session_for(create(:user))
 
 176     get follow_path("No Such User")
 
 177     assert_response :not_found
 
 178     assert_template :no_such_user