1 # frozen_string_literal: true
 
   5 class FollowsControllerTest < ActionDispatch::IntegrationTest
 
   7   # test all routes which lead to this controller
 
  10       { :path => "/user/username/follow", :method => :get },
 
  11       { :controller => "follows", :action => "show", :display_name => "username" }
 
  14       { :path => "/user/username/follow", :method => :post },
 
  15       { :controller => "follows", :action => "create", :display_name => "username" }
 
  18       { :path => "/user/username/follow", :method => :delete },
 
  19       { :controller => "follows", :action => "destroy", :display_name => "username" }
 
  24     # Get users to work with
 
  26     follow = create(:user)
 
  28     # Check that the users aren't already friends
 
  29     assert_nil Follow.find_by(:follower => user, :following => follow)
 
  31     # When not logged in a GET should ask us to login
 
  32     get follow_path(follow)
 
  33     assert_redirected_to login_path(:referer => follow_path(follow))
 
  35     # When not logged in a POST should error
 
  36     post follow_path(follow)
 
  37     assert_response :forbidden
 
  38     assert_nil Follow.find_by(:follower => user, :following => follow)
 
  42     # When logged in a GET should get a confirmation page
 
  43     get follow_path(follow)
 
  44     assert_response :success
 
  46     assert_select "a[href*='test']", 0
 
  47     assert_nil Follow.find_by(:follower => user, :following => follow)
 
  49     # When logged in a POST should add the follow
 
  50     assert_difference "ActionMailer::Base.deliveries.size", 1 do
 
  51       perform_enqueued_jobs do
 
  52         post follow_path(follow)
 
  55     assert_redirected_to user_path(follow)
 
  56     assert_match(/You are now following/, flash[:notice])
 
  57     assert Follow.find_by(:follower => user, :following => follow)
 
  58     email = ActionMailer::Base.deliveries.first
 
  59     assert_equal 1, email.to.count
 
  60     assert_equal follow.email, email.to.first
 
  62     # A second POST should report that the follow already exists
 
  63     assert_no_difference "ActionMailer::Base.deliveries.size" do
 
  64       perform_enqueued_jobs do
 
  65         post follow_path(follow)
 
  68     assert_redirected_to user_path(follow)
 
  69     assert_match(/You already follow/, flash[:warning])
 
  70     assert Follow.find_by(:follower => user, :following => follow)
 
  73   def test_follow_with_referer
 
  74     # Get users to work with
 
  76     follow = create(:user)
 
  79     # Check that the users aren't already friends
 
  80     assert_nil Follow.find_by(:follower => user, :following => follow)
 
  82     # The GET should preserve any referer
 
  83     get follow_path(follow), :params => { :referer => "/test" }
 
  84     assert_response :success
 
  86     assert_select "a[href*='test']"
 
  87     assert_nil Follow.find_by(:follower => user, :following => follow)
 
  89     # When logged in a POST should add the follow and refer us
 
  90     assert_difference "ActionMailer::Base.deliveries.size", 1 do
 
  91       perform_enqueued_jobs do
 
  92         post follow_path(follow), :params => { :referer => "/test" }
 
  95     assert_redirected_to "/test"
 
  96     assert_match(/You are now following/, flash[:notice])
 
  97     assert Follow.find_by(:follower => user, :following => follow)
 
  98     email = ActionMailer::Base.deliveries.first
 
  99     assert_equal 1, email.to.count
 
 100     assert_equal follow.email, email.to.first
 
 103   def test_follow_unknown_user
 
 104     # Should error when a bogus user is specified
 
 105     session_for(create(:user))
 
 106     get follow_path("No Such User")
 
 107     assert_response :not_found
 
 108     assert_template :no_such_user
 
 112     # Get users to work with
 
 114     follow = create(:user)
 
 115     create(:follow, :follower => user, :following => follow)
 
 117     # Check that the users are friends
 
 118     assert Follow.find_by(:follower => user, :following => follow)
 
 120     # When not logged in a GET should ask us to login
 
 121     get follow_path(follow)
 
 122     assert_redirected_to login_path(:referer => follow_path(follow))
 
 124     # When not logged in a POST should error
 
 125     delete follow_path, :params => { :display_name => follow.display_name }
 
 126     assert_response :forbidden
 
 127     assert Follow.find_by(:follower => user, :following => follow)
 
 131     # When logged in a GET should get a confirmation page
 
 132     get follow_path(follow)
 
 133     assert_response :success
 
 134     assert_template :show
 
 135     assert_select "a[href*='test']", 0
 
 136     assert Follow.find_by(:follower => user, :following => follow)
 
 138     # When logged in a DELETE should remove the follow
 
 139     delete follow_path(follow)
 
 140     assert_redirected_to user_path(follow)
 
 141     assert_match(/You successfully unfollowed/, flash[:notice])
 
 142     assert_nil Follow.find_by(:follower => user, :following => follow)
 
 144     # A second DELETE should report that the follow does not exist
 
 145     delete follow_path(follow)
 
 146     assert_redirected_to user_path(follow)
 
 147     assert_match(/You are not following/, flash[:error])
 
 148     assert_nil Follow.find_by(:follower => user, :following => follow)
 
 151   def test_unfollow_with_referer
 
 152     # Get users to work with
 
 154     follow = create(:user)
 
 155     create(:follow, :follower => user, :following => follow)
 
 158     # Check that the users are friends
 
 159     assert Follow.find_by(:follower => user, :following => follow)
 
 161     # The GET should preserve any referer
 
 162     get follow_path(follow), :params => { :referer => "/test" }
 
 163     assert_response :success
 
 164     assert_template :show
 
 165     assert_select "a[href*='test']"
 
 166     assert Follow.find_by(:follower => user, :following => follow)
 
 168     # When logged in a POST should remove the follow and refer
 
 169     delete follow_path(follow), :params => { :referer => "/test" }
 
 170     assert_redirected_to "/test"
 
 171     assert_match(/You successfully unfollowed/, flash[:notice])
 
 172     assert_nil Follow.find_by(:follower => user, :following => follow)
 
 175   def test_unfollow_unknown_user
 
 176     # Should error when a bogus user is specified
 
 177     session_for(create(:user))
 
 178     get follow_path("No Such User")
 
 179     assert_response :not_found
 
 180     assert_template :no_such_user