openstreetmap-website/test/controllers/diary_entries_controller_test.rb
Andy Allan 1700c23dd1 Prefer find_by() instead of where().first
These are very similar, differing only if we would expect multiple
results and the sorting is important. However, in all our cases
we're only expecting one result to be returned, and so find_by is
easier to read.
2023-10-04 17:53:58 +01:00

1015 lines
40 KiB
Ruby

require "test_helper"
class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
include ActionView::Helpers::NumberHelper
def setup
super
# Create the default language for diary entries
create(:language, :code => "en")
# Stub nominatim response for diary entry locations
stub_request(:get, %r{^https://nominatim\.openstreetmap\.org/reverse\?})
.to_return(:status => 404)
end
##
# test all routes which lead to this controller
def test_routes
assert_routing(
{ :path => "/diary", :method => :get },
{ :controller => "diary_entries", :action => "index" }
)
assert_routing(
{ :path => "/diary/language", :method => :get },
{ :controller => "diary_entries", :action => "index", :language => "language" }
)
assert_routing(
{ :path => "/user/username/diary", :method => :get },
{ :controller => "diary_entries", :action => "index", :display_name => "username" }
)
assert_routing(
{ :path => "/diary/friends", :method => :get },
{ :controller => "diary_entries", :action => "index", :friends => true }
)
assert_routing(
{ :path => "/diary/nearby", :method => :get },
{ :controller => "diary_entries", :action => "index", :nearby => true }
)
assert_routing(
{ :path => "/diary/rss", :method => :get },
{ :controller => "diary_entries", :action => "rss", :format => :rss }
)
assert_routing(
{ :path => "/diary/language/rss", :method => :get },
{ :controller => "diary_entries", :action => "rss", :language => "language", :format => :rss }
)
assert_routing(
{ :path => "/user/username/diary/rss", :method => :get },
{ :controller => "diary_entries", :action => "rss", :display_name => "username", :format => :rss }
)
assert_routing(
{ :path => "/user/username/diary/comments", :method => :get },
{ :controller => "diary_entries", :action => "comments", :display_name => "username" }
)
assert_routing(
{ :path => "/user/username/diary/comments/1", :method => :get },
{ :controller => "diary_entries", :action => "comments", :display_name => "username", :page => "1" }
)
assert_routing(
{ :path => "/diary/new", :method => :get },
{ :controller => "diary_entries", :action => "new" }
)
assert_routing(
{ :path => "/diary", :method => :post },
{ :controller => "diary_entries", :action => "create" }
)
assert_routing(
{ :path => "/user/username/diary/1", :method => :get },
{ :controller => "diary_entries", :action => "show", :display_name => "username", :id => "1" }
)
assert_routing(
{ :path => "/user/username/diary/1/edit", :method => :get },
{ :controller => "diary_entries", :action => "edit", :display_name => "username", :id => "1" }
)
assert_routing(
{ :path => "/user/username/diary/1", :method => :put },
{ :controller => "diary_entries", :action => "update", :display_name => "username", :id => "1" }
)
assert_routing(
{ :path => "/user/username/diary/1/newcomment", :method => :post },
{ :controller => "diary_entries", :action => "comment", :display_name => "username", :id => "1" }
)
assert_routing(
{ :path => "/user/username/diary/1/hide", :method => :post },
{ :controller => "diary_entries", :action => "hide", :display_name => "username", :id => "1" }
)
assert_routing(
{ :path => "/user/username/diary/1/unhide", :method => :post },
{ :controller => "diary_entries", :action => "unhide", :display_name => "username", :id => "1" }
)
assert_routing(
{ :path => "/user/username/diary/1/hidecomment/2", :method => :post },
{ :controller => "diary_entries", :action => "hidecomment", :display_name => "username", :id => "1", :comment => "2" }
)
assert_routing(
{ :path => "/user/username/diary/1/unhidecomment/2", :method => :post },
{ :controller => "diary_entries", :action => "unhidecomment", :display_name => "username", :id => "1", :comment => "2" }
)
assert_routing(
{ :path => "/user/username/diary/1/subscribe", :method => :post },
{ :controller => "diary_entries", :action => "subscribe", :display_name => "username", :id => "1" }
)
assert_routing(
{ :path => "/user/username/diary/1/unsubscribe", :method => :post },
{ :controller => "diary_entries", :action => "unsubscribe", :display_name => "username", :id => "1" }
)
end
def test_new_no_login
# Make sure that you are redirected to the login page when you
# are not logged in
get new_diary_entry_path
assert_response :redirect
assert_redirected_to login_path(:referer => "/diary/new")
end
def test_new_form
# Now try again when logged in
session_for(create(:user))
get new_diary_entry_path
assert_response :success
assert_select "title", :text => /New Diary Entry/, :count => 1
assert_select "div.content-heading", :count => 1 do
assert_select "h1", :text => /New Diary Entry/, :count => 1
end
assert_select "div#content", :count => 1 do
assert_select "form[action='/diary'][method=post]", :count => 1 do
assert_select "input#diary_entry_title[name='diary_entry[title]']", :count => 1
assert_select "textarea#diary_entry_body[name='diary_entry[body]']", :text => "", :count => 1
assert_select "select#diary_entry_language_code", :count => 1
assert_select "input#latitude[name='diary_entry[latitude]']", :count => 1
assert_select "input#longitude[name='diary_entry[longitude]']", :count => 1
assert_select "input[name=commit][type=submit][value=Publish]", :count => 1
assert_select "input[name=commit][type=submit][value=Edit]", :count => 1
assert_select "input[name=commit][type=submit][value=Preview]", :count => 1
assert_select "input", :count => 7
end
end
end
def test_new_get_with_params
# Now try creating a diary entry using get
session_for(create(:user))
assert_difference "DiaryEntry.count", 0 do
get new_diary_entry_path(:commit => "save",
:diary_entry => { :title => "New Title", :body => "This is a new body for the diary entry", :latitude => "1.1",
:longitude => "2.2", :language_code => "en" })
end
assert_response :success
assert_template :new
end
def test_create_no_body
# Now try creating a invalid diary entry with an empty body
user = create(:user)
session_for(user)
assert_no_difference "DiaryEntry.count" do
post diary_entries_path(:commit => "save",
:diary_entry => { :title => "New Title", :body => "", :latitude => "1.1",
:longitude => "2.2", :language_code => "en" })
end
assert_response :success
assert_template :new
assert_nil UserPreference.find_by(:user => user, :k => "diary.default_language")
end
def test_create
# Now try creating a diary entry
user = create(:user)
session_for(user)
assert_difference "DiaryEntry.count", 1 do
post diary_entries_path(:commit => "save",
:diary_entry => { :title => "New Title", :body => "This is a new body for the diary entry", :latitude => "1.1",
:longitude => "2.2", :language_code => "en" })
end
assert_response :redirect
assert_redirected_to :action => :index, :display_name => user.display_name
entry = DiaryEntry.order(:id).last
assert_equal user.id, entry.user_id
assert_equal "New Title", entry.title
assert_equal "This is a new body for the diary entry", entry.body
assert_equal "1.1".to_f, entry.latitude
assert_equal "2.2".to_f, entry.longitude
assert_equal "en", entry.language_code
# checks if user was subscribed
assert_equal 1, entry.subscribers.length
assert_equal "en", UserPreference.find_by(:user => user, :k => "diary.default_language").v
end
def test_create_german
create(:language, :code => "de")
user = create(:user)
session_for(user)
# Now try creating a diary entry in a different language
assert_difference "DiaryEntry.count", 1 do
post diary_entries_path(:commit => "save",
:diary_entry => { :title => "New Title", :body => "This is a new body for the diary entry", :latitude => "1.1",
:longitude => "2.2", :language_code => "de" })
end
assert_response :redirect
assert_redirected_to :action => :index, :display_name => user.display_name
entry = DiaryEntry.order(:id).last
assert_equal user.id, entry.user_id
assert_equal "New Title", entry.title
assert_equal "This is a new body for the diary entry", entry.body
assert_equal "1.1".to_f, entry.latitude
assert_equal "2.2".to_f, entry.longitude
assert_equal "de", entry.language_code
# checks if user was subscribed
assert_equal 1, entry.subscribers.length
assert_equal "de", UserPreference.find_by(:user => user, :k => "diary.default_language").v
end
def test_new_spammy
user = create(:user)
session_for(user)
# Generate some spammy content
spammy_title = "Spam Spam Spam Spam Spam"
spammy_body = 1.upto(50).map { |n| "http://example.com/spam#{n}" }.join(" ")
# Try creating a spammy diary entry
assert_difference "DiaryEntry.count", 1 do
post diary_entries_path(:commit => "save",
:diary_entry => { :title => spammy_title, :body => spammy_body, :language_code => "en" })
end
assert_response :redirect
assert_redirected_to :action => :index, :display_name => user.display_name
entry = DiaryEntry.order(:id).last
assert_equal user.id, entry.user_id
assert_equal spammy_title, entry.title
assert_equal spammy_body, entry.body
assert_equal "en", entry.language_code
assert_equal "suspended", User.find(user.id).status
# Follow the redirect
get diary_entries_path(:display_name => user.display_name)
assert_response :redirect
assert_redirected_to :controller => :users, :action => :suspended
end
def test_edit
user = create(:user)
other_user = create(:user)
entry = create(:diary_entry, :user => user)
# Make sure that you are redirected to the login page when you are
# not logged in, without and with the id of the entry you want to edit
get edit_diary_entry_path(:display_name => entry.user.display_name, :id => entry)
assert_response :redirect
assert_redirected_to login_path(:referer => "/user/#{ERB::Util.u(entry.user.display_name)}/diary/#{entry.id}/edit")
session_for(other_user)
# Verify that you get redirected to show if you are not the user
# that created the entry
get edit_diary_entry_path(:display_name => entry.user.display_name, :id => entry)
assert_response :redirect
assert_redirected_to :action => :show, :display_name => entry.user.display_name, :id => entry.id
session_for(entry.user)
# Verify that you get a not found error, when you pass a bogus id
get edit_diary_entry_path(:display_name => entry.user.display_name, :id => 9999)
assert_response :not_found
assert_select "div.content-heading", :count => 1 do
assert_select "h1", :text => "No entry with the id: 9999", :count => 1
end
# Now pass the id, and check that you can edit it, when using the same
# user as the person who created the entry
get edit_diary_entry_path(:display_name => entry.user.display_name, :id => entry)
assert_response :success
assert_select "title", :text => /Edit Diary Entry/, :count => 1
assert_select "div.content-heading", :count => 1 do
assert_select "h1", :text => /Edit Diary Entry/, :count => 1
end
assert_select "div#content", :count => 1 do
assert_select "form[action='/user/#{ERB::Util.u(entry.user.display_name)}/diary/#{entry.id}'][method=post]", :count => 1 do
assert_select "input#diary_entry_title[name='diary_entry[title]'][value='#{entry.title}']", :count => 1
assert_select "textarea#diary_entry_body[name='diary_entry[body]']", :text => entry.body, :count => 1
assert_select "select#diary_entry_language_code", :count => 1
assert_select "input#latitude[name='diary_entry[latitude]']", :count => 1
assert_select "input#longitude[name='diary_entry[longitude]']", :count => 1
assert_select "input[name=commit][type=submit][value=Update]", :count => 1
assert_select "input[name=commit][type=submit][value=Edit]", :count => 1
assert_select "input[name=commit][type=submit][value=Preview]", :count => 1
assert_select "input", :count => 8
end
end
# Now lets see if you can edit the diary entry
new_title = "New Title"
new_body = "This is a new body for the diary entry"
new_latitude = "1.1"
new_longitude = "2.2"
new_language_code = "en"
put diary_entry_path(:display_name => entry.user.display_name, :id => entry, :commit => "save",
:diary_entry => { :title => new_title, :body => new_body, :latitude => new_latitude,
:longitude => new_longitude, :language_code => new_language_code })
assert_response :redirect
assert_redirected_to :action => :show, :display_name => entry.user.display_name, :id => entry.id
# Now check that the new data is rendered, when logged in
get diary_entry_path(:display_name => entry.user.display_name, :id => entry)
assert_response :success
assert_template "show"
assert_select "title", :text => /Users' Diaries | /, :count => 1
assert_select "div.content-heading", :count => 1 do
assert_select "h1", :text => /#{entry.user.display_name}'s Diary/, :count => 1
end
assert_select "div#content", :count => 1 do
assert_select "h2", :text => /#{new_title}/, :count => 1
# This next line won't work if the text has been run through the htmlize function
# due to formatting that could be introduced
assert_select "p", :text => /#{new_body}/, :count => 1
assert_select "abbr[class='geo'][title='#{number_with_precision(new_latitude, :precision => 4)}; #{number_with_precision(new_longitude, :precision => 4)}']", :count => 1
# As we're not logged in, check that you cannot edit
assert_select "a[href='/user/#{ERB::Util.u(entry.user.display_name)}/diary/#{entry.id}/edit']", :text => "Edit this entry", :count => 1
end
# and when not logged in as the user who wrote the entry
session_for(create(:user))
get diary_entry_path(:display_name => entry.user.display_name, :id => entry)
assert_response :success
assert_template "show"
assert_select "title", :text => /Users' Diaries | /, :count => 1
assert_select "div.content-heading", :count => 1 do
assert_select "h1", :text => /#{entry.user.display_name}'s Diary/, :count => 1
end
assert_select "div#content", :count => 1 do
assert_select "h2", :text => /#{new_title}/, :count => 1
# This next line won't work if the text has been run through the htmlize function
# due to formatting that could be introduced
assert_select "p", :text => /#{new_body}/, :count => 1
assert_select "abbr[class=geo][title='#{number_with_precision(new_latitude, :precision => 4)}; #{number_with_precision(new_longitude, :precision => 4)}']", :count => 1
# As we're not logged in, check that you cannot edit
assert_select "a[href='/user/#{ERB::Util.u(entry.user.display_name)}/diary/#{entry.id}/edit']", false
end
end
def test_edit_i18n
user = create(:user)
diary_entry = create(:diary_entry, :language_code => "en", :user => user)
session_for(user)
get edit_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
assert_response :success
assert_select "span[class=translation_missing]", false, "Missing translation in edit diary entry"
end
def test_comment
user = create(:user)
other_user = create(:user)
entry = create(:diary_entry, :user => user)
create(:diary_entry_subscription, :diary_entry => entry, :user => user)
# Make sure that you are denied when you are not logged in
post comment_diary_entry_path(:display_name => entry.user.display_name, :id => entry)
assert_response :forbidden
session_for(other_user)
# Verify that you get a not found error, when you pass a bogus id
post comment_diary_entry_path(:display_name => entry.user.display_name, :id => 9999)
assert_response :not_found
assert_select "div.content-heading", :count => 1 do
assert_select "h1", :text => "No entry with the id: 9999", :count => 1
end
# Now try an invalid comment with an empty body
assert_no_difference "ActionMailer::Base.deliveries.size" do
assert_no_difference "DiaryComment.count" do
assert_no_difference "entry.subscribers.count" do
perform_enqueued_jobs do
post comment_diary_entry_path(:display_name => entry.user.display_name, :id => entry, :diary_comment => { :body => "" })
end
end
end
end
assert_response :success
assert_template :show
# Now try again with the right id
assert_difference "ActionMailer::Base.deliveries.size", entry.subscribers.count do
assert_difference "DiaryComment.count", 1 do
assert_difference "entry.subscribers.count", 1 do
perform_enqueued_jobs do
post comment_diary_entry_path(:display_name => entry.user.display_name, :id => entry, :diary_comment => { :body => "New comment" })
end
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(/New comment/, email.text_part.decoded)
assert_match(/New comment/, 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 "New comment", comment.body
# Now show the diary entry, and check the new comment is present
get diary_entry_path(:display_name => entry.user.display_name, :id => entry)
assert_response :success
assert_select ".diary-comment", :count => 1 do
assert_select "#comment#{comment.id}", :count => 1 do
assert_select "a[href='/user/#{ERB::Util.u(other_user.display_name)}']", :text => other_user.display_name, :count => 1
end
assert_select ".richtext", :text => /New comment/, :count => 1
end
end
def test_comment_spammy
user = create(:user)
other_user = create(:user)
entry = create(:diary_entry, :user => user)
create(:diary_entry_subscription, :diary_entry => entry, :user => user)
session_for(other_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_diary_entry_path(:display_name => entry.user.display_name, :id => entry, :diary_comment => { :body => spammy_text })
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 diary_entries_path(:display_name => user.display_name)
assert_response :redirect
assert_redirected_to :controller => :users, :action => :suspended
# Now show the diary entry, and check the new comment is not present
get diary_entry_path(:display_name => entry.user.display_name, :id => entry)
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 diary_entries_path
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 diary_entries_path(:display_name => user.display_name)
check_diary_index diary_entry, geo_entry
# Try a list of diary entries for an invalid user
get diary_entries_path(: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)
friendship = create(:friendship, :befriender => user)
diary_entry = create(:diary_entry, :user => friendship.befriendee)
_other_entry = create(:diary_entry, :user => other_user)
# Try a list of diary entries for your friends when not logged in
get friends_diary_entries_path
assert_response :redirect
assert_redirected_to login_path(:referer => "/diary/friends")
# Try a list of diary entries for your friends when logged in
session_for(user)
get friends_diary_entries_path
check_diary_index diary_entry
session_for(other_user)
get friends_diary_entries_path
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 nearby_diary_entries_path
assert_response :redirect
assert_redirected_to login_path(:referer => "/diary/nearby")
# Try a list of diary entries for nearby users when logged in
session_for(nearby_user)
get nearby_diary_entries_path
check_diary_index diary_entry
session_for(user)
get nearby_diary_entries_path
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 diary_entries_path(:language => "en")
check_diary_index diary_entry_en, diary_entry_en2
# Try a list of diary entries in german
get diary_entries_path(:language => "de")
check_diary_index diary_entry_de
# Try a list of diary entries in slovenian
get diary_entries_path(: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 diary_entries_path
assert_response :success
assert_select "article.diary_post", :count => 20
assert_select "li.page-item a.page-link", :text => "Older Entries", :count => 1
assert_select "li.page-item.disabled span.page-link", :text => "Newer Entries", :count => 1
# Try and get the second page
get css_select("li.page-item .page-link").last["href"]
assert_response :success
assert_select "article.diary_post", :count => 20
assert_select "li.page-item a.page-link", :text => "Older Entries", :count => 1
assert_select "li.page-item a.page-link", :text => "Newer Entries", :count => 1
# Try and get the third page
get css_select("li.page-item .page-link").last["href"]
assert_response :success
assert_select "article.diary_post", :count => 10
assert_select "li.page-item.disabled span.page-link", :text => "Older Entries", :count => 1
assert_select "li.page-item a.page-link", :text => "Newer Entries", :count => 1
# Go back to the second page
get css_select("li.page-item .page-link").first["href"]
assert_response :success
assert_select "article.diary_post", :count => 20
assert_select "li.page-item a.page-link", :text => "Older Entries", :count => 1
assert_select "li.page-item a.page-link", :text => "Newer Entries", :count => 1
# Go back to the first page
get css_select("li.page-item .page-link").first["href"]
assert_response :success
assert_select "article.diary_post", :count => 20
assert_select "li.page-item a.page-link", :text => "Older Entries", :count => 1
assert_select "li.page-item.disabled span.page-link", :text => "Newer Entries", :count => 1
end
def test_rss
create(:language, :code => "de")
create(:diary_entry, :language_code => "en")
create(:diary_entry, :language_code => "en")
create(:diary_entry, :language_code => "de")
get diary_rss_path
assert_response :success, "Should be able to get a diary RSS"
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "channel>title", :count => 1
assert_select "image", :count => 1
assert_select "channel>item", :count => 3
end
end
end
def test_rss_language
create(:language, :code => "de")
create(:diary_entry, :language_code => "en")
create(:diary_entry, :language_code => "en")
create(:diary_entry, :language_code => "de")
get diary_rss_path(:language => "en")
assert_response :success, "Should be able to get a specific language diary RSS"
assert_select "rss>channel>item", :count => 2 # , "Diary entries should be filtered by language"
end
# def test_rss_nonexisting_language
# get :rss, :params => { :language => 'xx', :format => :rss }
# assert_response :not_found, "Should not be able to get a nonexisting language diary RSS"
# end
def test_rss_language_with_no_entries
create(:language, :code => "sl")
create(:diary_entry, :language_code => "en")
get diary_rss_path(:language => "sl")
assert_response :success, "Should be able to get a specific language diary RSS"
assert_select "rss>channel>item", :count => 0 # , "Diary entries should be filtered by language"
end
def test_rss_user
user = create(:user)
other_user = create(:user)
create(:diary_entry, :user => user)
create(:diary_entry, :user => user)
create(:diary_entry, :user => other_user)
get diary_rss_path(:display_name => user.display_name)
assert_response :success, "Should be able to get a specific users diary RSS"
assert_select "rss>channel>item", :count => 2 # , "Diary entries should be filtered by user"
end
def test_rss_nonexisting_user
# Try a user that has never existed
get diary_rss_path(:display_name => "fakeUsername76543")
assert_response :not_found, "Should not be able to get a nonexisting users diary RSS"
# Try a suspended user
get diary_rss_path(:display_name => create(:user, :suspended).display_name)
assert_response :not_found, "Should not be able to get a suspended users diary RSS"
# Try a deleted user
get diary_rss_path(:display_name => create(:user, :deleted).display_name)
assert_response :not_found, "Should not be able to get a deleted users diary RSS"
end
def test_rss_character_escaping
create(:diary_entry, :title => "<script>")
get diary_rss_path
assert_match "<title>&lt;script&gt;</title>", response.body
end
def test_feed_delay
create(:diary_entry, :created_at => 7.hours.ago)
create(:diary_entry, :created_at => 5.hours.ago)
get diary_rss_path
assert_select "rss>channel>item", :count => 2
with_diary_feed_delay(6) do
get diary_rss_path
assert_select "rss>channel>item", :count => 1
end
end
def test_show
user = create(:user)
suspended_user = create(:user, :suspended)
deleted_user = create(:user, :deleted)
# Try a normal entry that should work
diary_entry = create(:diary_entry, :user => user)
get diary_entry_path(:display_name => user.display_name, :id => diary_entry)
assert_response :success
assert_template :show
# Try a non-integer ID
assert_raise ActionController::RoutingError do
get "/user/#{CGI.escape(user.display_name)}/diary/#{diary_entry.id})"
end
# Try a deleted entry
diary_entry_deleted = create(:diary_entry, :user => user, :visible => false)
get diary_entry_path(:display_name => user.display_name, :id => diary_entry_deleted)
assert_response :not_found
# Try an entry by a suspended user
diary_entry_suspended_user = create(:diary_entry, :user => suspended_user)
get diary_entry_path(:display_name => suspended_user.display_name, :id => diary_entry_suspended_user)
assert_response :not_found
# Try an entry by a deleted user
diary_entry_deleted_user = create(:diary_entry, :user => deleted_user)
get diary_entry_path(:display_name => deleted_user.display_name, :id => diary_entry_deleted_user)
assert_response :not_found
# Now try as a moderator
session_for(create(:moderator_user))
get diary_entry_path(:display_name => user.display_name, :id => diary_entry_deleted)
assert_response :success
assert_template :show
# Finally try as an administrator
session_for(create(:administrator_user))
get diary_entry_path(:display_name => user.display_name, :id => diary_entry_deleted)
assert_response :success
assert_template :show
end
def test_show_hidden_comments
# Get a diary entry that has hidden comments
user = create(:user)
diary_entry = create(:diary_entry, :user => user)
visible_comment = create(:diary_comment, :diary_entry => diary_entry)
suspended_user_comment = create(:diary_comment, :diary_entry => diary_entry, :user => create(:user, :suspended))
deleted_user_comment = create(:diary_comment, :diary_entry => diary_entry, :user => create(:user, :deleted))
hidden_comment = create(:diary_comment, :diary_entry => diary_entry, :visible => false)
get diary_entry_path(:display_name => user.display_name, :id => diary_entry)
assert_response :success
assert_template :show
assert_select "div.comments" do
assert_select "p#comment#{visible_comment.id}", :count => 1
assert_select "p#comment#{suspended_user_comment.id}", :count => 0
assert_select "p#comment#{deleted_user_comment.id}", :count => 0
assert_select "p#comment#{hidden_comment.id}", :count => 0
end
end
def test_hide
user = create(:user)
diary_entry = create(:diary_entry, :user => user)
# Try without logging in
post hide_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
assert_response :forbidden
assert DiaryEntry.find(diary_entry.id).visible
# Now try as a normal user
session_for(user)
post hide_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
assert_response :redirect
assert_redirected_to :controller => :errors, :action => :forbidden
assert DiaryEntry.find(diary_entry.id).visible
# Now try as a moderator
session_for(create(:moderator_user))
post hide_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
assert_response :redirect
assert_redirected_to :action => :index, :display_name => user.display_name
assert_not DiaryEntry.find(diary_entry.id).visible
# Reset
diary_entry.reload.update(:visible => true)
# Finally try as an administrator
session_for(create(:administrator_user))
post hide_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
assert_response :redirect
assert_redirected_to :action => :index, :display_name => user.display_name
assert_not DiaryEntry.find(diary_entry.id).visible
end
def test_unhide
user = create(:user)
# Try without logging in
diary_entry = create(:diary_entry, :user => user, :visible => false)
post unhide_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
assert_response :forbidden
assert_not DiaryEntry.find(diary_entry.id).visible
# Now try as a normal user
session_for(user)
post unhide_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
assert_response :redirect
assert_redirected_to :controller => :errors, :action => :forbidden
assert_not DiaryEntry.find(diary_entry.id).visible
# Now try as a moderator
session_for(create(:moderator_user))
post unhide_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
assert_response :redirect
assert_redirected_to :action => :index, :display_name => user.display_name
assert DiaryEntry.find(diary_entry.id).visible
# Reset
diary_entry.reload.update(:visible => true)
# Finally try as an administrator
session_for(create(:administrator_user))
post unhide_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
assert_response :redirect
assert_redirected_to :action => :index, :display_name => user.display_name
assert DiaryEntry.find(diary_entry.id).visible
end
def test_hidecomment
user = create(:user)
diary_entry = create(:diary_entry, :user => user)
diary_comment = create(:diary_comment, :diary_entry => diary_entry)
# Try without logging in
post hide_diary_comment_path(:display_name => user.display_name, :id => diary_entry, :comment => diary_comment)
assert_response :forbidden
assert DiaryComment.find(diary_comment.id).visible
# Now try as a normal user
session_for(user)
post hide_diary_comment_path(:display_name => user.display_name, :id => diary_entry, :comment => diary_comment)
assert_response :redirect
assert_redirected_to :controller => :errors, :action => :forbidden
assert DiaryComment.find(diary_comment.id).visible
# Try as a moderator
session_for(create(:moderator_user))
post hide_diary_comment_path(:display_name => user.display_name, :id => diary_entry, :comment => diary_comment)
assert_response :redirect
assert_redirected_to :action => :show, :display_name => user.display_name, :id => diary_entry.id
assert_not DiaryComment.find(diary_comment.id).visible
# Reset
diary_comment.reload.update(:visible => true)
# Finally try as an administrator
session_for(create(:administrator_user))
post hide_diary_comment_path(:display_name => user.display_name, :id => diary_entry, :comment => diary_comment)
assert_response :redirect
assert_redirected_to :action => :show, :display_name => user.display_name, :id => diary_entry.id
assert_not DiaryComment.find(diary_comment.id).visible
end
def test_unhidecomment
user = create(:user)
diary_entry = create(:diary_entry, :user => user)
diary_comment = create(:diary_comment, :diary_entry => diary_entry, :visible => false)
# Try without logging in
post unhide_diary_comment_path(:display_name => user.display_name, :id => diary_entry, :comment => diary_comment)
assert_response :forbidden
assert_not DiaryComment.find(diary_comment.id).visible
# Now try as a normal user
session_for(user)
post unhide_diary_comment_path(:display_name => user.display_name, :id => diary_entry, :comment => diary_comment)
assert_response :redirect
assert_redirected_to :controller => :errors, :action => :forbidden
assert_not DiaryComment.find(diary_comment.id).visible
# Now try as a moderator
session_for(create(:moderator_user))
post unhide_diary_comment_path(:display_name => user.display_name, :id => diary_entry, :comment => diary_comment)
assert_response :redirect
assert_redirected_to :action => :show, :display_name => user.display_name, :id => diary_entry.id
assert DiaryComment.find(diary_comment.id).visible
# Reset
diary_comment.reload.update(:visible => true)
# Finally try as an administrator
session_for(create(:administrator_user))
post unhide_diary_comment_path(:display_name => user.display_name, :id => diary_entry, :comment => diary_comment)
assert_response :redirect
assert_redirected_to :action => :show, :display_name => user.display_name, :id => diary_entry.id
assert DiaryComment.find(diary_comment.id).visible
end
def test_comments
user = create(:user)
other_user = create(:user)
suspended_user = create(:user, :suspended)
deleted_user = create(:user, :deleted)
# Test a user with no comments
get diary_comments_path(:display_name => user.display_name)
assert_response :success
assert_template :comments
assert_select "h4", :html => "No diary comments"
# Test a user with a comment
create(:diary_comment, :user => other_user)
get diary_comments_path(:display_name => other_user.display_name)
assert_response :success
assert_template :comments
assert_select "table.table-striped" do
assert_select "tr", :count => 2 # header and one comment
end
# Test a suspended user
get diary_comments_path(:display_name => suspended_user.display_name)
assert_response :not_found
# Test a deleted user
get diary_comments_path(:display_name => deleted_user.display_name)
assert_response :not_found
end
def test_subscribe_success
user = create(:user)
other_user = create(:user)
diary_entry = create(:diary_entry, :user => user)
session_for(other_user)
assert_difference "diary_entry.subscribers.count", 1 do
post diary_entry_subscribe_path(:id => diary_entry, :display_name => diary_entry.user.display_name)
end
assert_response :redirect
end
def test_subscribe_fail
user = create(:user)
other_user = create(:user)
diary_entry = create(:diary_entry, :user => user)
# not signed in
assert_no_difference "diary_entry.subscribers.count" do
post diary_entry_subscribe_path(:id => diary_entry, :display_name => diary_entry.user.display_name)
end
assert_response :forbidden
session_for(other_user)
# bad diary id
post diary_entry_subscribe_path(:id => 999111, :display_name => "username")
assert_response :not_found
# trying to subscribe when already subscribed
post diary_entry_subscribe_path(:id => diary_entry, :display_name => diary_entry.user.display_name)
assert_no_difference "diary_entry.subscribers.count" do
post diary_entry_subscribe_path(:id => diary_entry, :display_name => diary_entry.user.display_name)
end
end
def test_unsubscribe_success
user = create(:user)
other_user = create(:user)
diary_entry = create(:diary_entry, :user => user)
create(:diary_entry_subscription, :diary_entry => diary_entry, :user => other_user)
session_for(other_user)
assert_difference "diary_entry.subscribers.count", -1 do
post diary_entry_unsubscribe_path(:id => diary_entry, :display_name => diary_entry.user.display_name)
end
assert_response :redirect
end
def test_unsubscribe_fail
user = create(:user)
other_user = create(:user)
diary_entry = create(:diary_entry, :user => user)
# not signed in
assert_no_difference "diary_entry.subscribers.count" do
post diary_entry_unsubscribe_path(:id => diary_entry, :display_name => diary_entry.user.display_name)
end
assert_response :forbidden
session_for(other_user)
# bad diary id
post diary_entry_unsubscribe_path(:id => 999111, :display_name => "username")
assert_response :not_found
# trying to unsubscribe when not subscribed
assert_no_difference "diary_entry.subscribers.count" do
post diary_entry_unsubscribe_path(:id => diary_entry, :display_name => diary_entry.user.display_name)
end
end
private
def check_diary_index(*entries)
assert_response :success
assert_template "index"
assert_no_missing_translations
assert_select "article.diary_post", entries.count
entries.each do |entry|
assert_select "a[href=?]", "/user/#{ERB::Util.u(entry.user.display_name)}/diary/#{entry.id}"
end
end
def with_diary_feed_delay(value)
diary_feed_delay = Settings.diary_feed_delay
Settings.diary_feed_delay = value
yield
Settings.diary_feed_delay = diary_feed_delay
end
end