+ def test_comment_spammy
+ user = create(:user)
+ other_user = create(:user)
+
+ # Find the entry to comment on
+ entry = create(:diary_entry, :user => user)
+ post :subscribe, { :id => entry.id, :display_name => entry.user.display_name }, { :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
+ post :comment, { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => spammy_text } }, { :user => other_user }
+ end
+ end
+ assert_response :redirect
+ assert_redirected_to :action => :view, :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 :list, { :display_name => user.display_name }, { :user => other_user }
+ assert_response :redirect
+ assert_redirected_to :controller => :user, :action => :suspended
+
+ # Now view the diary entry, and check the new comment is not present
+ get :view, :display_name => entry.user.display_name, :id => entry.id
+ assert_response :success
+ assert_select ".diary-comment", :count => 0
+ end
+
+ def test_list_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 :list
+ check_diary_list diary_entry, geo_entry, public_entry
+ end
+
+ def test_list_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 :list, :display_name => user.display_name
+ check_diary_list diary_entry, geo_entry
+
+ # Try a list of diary entries for an invalid user
+ get :list, :display_name => "No Such User"
+ assert_response :not_found
+ assert_template "user/no_such_user"
+ end
+
+ def test_list_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 :list, :friends => true
+ assert_response :redirect
+ assert_redirected_to :controller => :user, :action => :login, :referer => "/diary/friends"
+
+ # Try a list of diary entries for your friends when logged in
+ get :list, { :friends => true }, { :user => user }
+ check_diary_list diary_entry
+ get :list, { :friends => true }, { :user => other_user }
+ check_diary_list
+ end
+
+ def test_list_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 :list, :nearby => true
+ assert_response :redirect
+ assert_redirected_to :controller => :user, :action => :login, :referer => "/diary/nearby"
+
+ # Try a list of diary entries for nearby users when logged in
+ get :list, { :nearby => true }, { :user => nearby_user }
+ check_diary_list diary_entry
+ get :list, { :nearby => true }, { :user => user }
+ check_diary_list
+ end
+
+ def test_list_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 :list, :language => "en"
+ check_diary_list diary_entry_en, diary_entry_en2
+
+ # Try a list of diary entries in german
+ get :list, :language => "de"
+ check_diary_list diary_entry_de