+ # Find the entry to comment on
+ entry = create(:diary_entry, :user => user)
+ post :subscribe,
+ :params => { :id => entry.id, :display_name => entry.user.display_name },
+ :session => { :user => user }
+
+ # Generate some spammy content
+ spammy_text = 1.upto(50).map { |n| "http://example.com/spam#{n}" }.join(" ")
+
+ # Try creating a spammy comment
+ assert_difference "ActionMailer::Base.deliveries.size", 1 do
+ assert_difference "DiaryComment.count", 1 do
+ perform_enqueued_jobs do
+ post :comment,
+ :params => { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => spammy_text } },
+ :session => { :user => other_user }
+ end
+ end
+ end
+ assert_response :redirect
+ assert_redirected_to :action => :show, :display_name => entry.user.display_name, :id => entry.id
+ email = ActionMailer::Base.deliveries.first
+ assert_equal [user.email], email.to
+ assert_equal "[OpenStreetMap] #{other_user.display_name} commented on a diary entry", email.subject
+ assert_match %r{http://example.com/spam}, email.text_part.decoded
+ assert_match %r{http://example.com/spam}, email.html_part.decoded
+ ActionMailer::Base.deliveries.clear
+ comment = DiaryComment.order(:id).last
+ assert_equal entry.id, comment.diary_entry_id
+ assert_equal other_user.id, comment.user_id
+ assert_equal spammy_text, comment.body
+ assert_equal "suspended", User.find(other_user.id).status
+
+ # Follow the redirect
+ get :index,
+ :params => { :display_name => user.display_name },
+ :session => { :user => other_user }
+ assert_response :redirect
+ assert_redirected_to :controller => :users, :action => :suspended
+
+ # Now show the diary entry, and check the new comment is not present
+ get :show,
+ :params => { :display_name => entry.user.display_name, :id => entry.id }
+ assert_response :success
+ assert_select ".diary-comment", :count => 0
+ end
+
+ def test_index_all
+ diary_entry = create(:diary_entry)
+ geo_entry = create(:diary_entry, :latitude => 51.50763, :longitude => -0.10781)
+ public_entry = create(:diary_entry, :user => create(:user))
+
+ # Try a list of all diary entries
+ get :index
+ check_diary_index diary_entry, geo_entry, public_entry
+ end
+
+ def test_index_user
+ user = create(:user)
+ other_user = create(:user)
+
+ diary_entry = create(:diary_entry, :user => user)
+ geo_entry = create(:diary_entry, :user => user, :latitude => 51.50763, :longitude => -0.10781)
+ _other_entry = create(:diary_entry, :user => other_user)
+
+ # Try a list of diary entries for a valid user
+ get :index, :params => { :display_name => user.display_name }
+ check_diary_index diary_entry, geo_entry
+
+ # Try a list of diary entries for an invalid user
+ get :index, :params => { :display_name => "No Such User" }
+ assert_response :not_found
+ assert_template "users/no_such_user"
+ end
+
+ def test_index_friends
+ user = create(:user)
+ other_user = create(:user)
+ friend = create(:friend, :befriender => user)
+ diary_entry = create(:diary_entry, :user => friend.befriendee)
+ _other_entry = create(:diary_entry, :user => other_user)
+
+ # Try a list of diary entries for your friends when not logged in
+ get :index, :params => { :friends => true }
+ assert_response :redirect
+ assert_redirected_to :controller => :users, :action => :login, :referer => "/diary/friends"
+
+ # Try a list of diary entries for your friends when logged in
+ get :index, :params => { :friends => true }, :session => { :user => user }
+ check_diary_index diary_entry
+ get :index, :params => { :friends => true }, :session => { :user => other_user }
+ check_diary_index
+ end
+
+ def test_index_nearby
+ user = create(:user, :home_lat => 12, :home_lon => 12)
+ nearby_user = create(:user, :home_lat => 11.9, :home_lon => 12.1)
+
+ diary_entry = create(:diary_entry, :user => user)
+
+ # Try a list of diary entries for nearby users when not logged in
+ get :index, :params => { :nearby => true }
+ assert_response :redirect
+ assert_redirected_to :controller => :users, :action => :login, :referer => "/diary/nearby"
+
+ # Try a list of diary entries for nearby users when logged in
+ get :index, :params => { :nearby => true }, :session => { :user => nearby_user }
+ check_diary_index diary_entry
+ get :index, :params => { :nearby => true }, :session => { :user => user }
+ check_diary_index
+ end
+
+ def test_index_language
+ create(:language, :code => "de")
+ create(:language, :code => "sl")
+ diary_entry_en = create(:diary_entry, :language_code => "en")
+ diary_entry_en2 = create(:diary_entry, :language_code => "en")
+ diary_entry_de = create(:diary_entry, :language_code => "de")
+
+ # Try a list of diary entries in english
+ get :index, :params => { :language => "en" }
+ check_diary_index diary_entry_en, diary_entry_en2
+
+ # Try a list of diary entries in german
+ get :index, :params => { :language => "de" }
+ check_diary_index diary_entry_de
+
+ # Try a list of diary entries in slovenian
+ get :index, :params => { :language => "sl" }
+ check_diary_index
+ end
+
+ def test_index_paged
+ # Create several pages worth of diary entries
+ create_list(:diary_entry, 50)
+
+ # Try and get the index
+ get :index
+ assert_response :success
+ assert_select "div.diary_post", :count => 20
+
+ # Try and get the second page
+ get :index, :params => { :page => 2 }
+ assert_response :success
+ assert_select "div.diary_post", :count => 20