Merge remote-tracking branch 'upstream/pull/1576'

This commit is contained in:
Tom Hughes 2018-06-16 11:45:23 +01:00
commit 7441f15b4f
40 changed files with 1887 additions and 5 deletions

View file

@ -0,0 +1,27 @@
require "test_helper"
class IssueCommentsControllerTest < ActionController::TestCase
def test_comment_by_normal_user
issue = create(:issue)
# Login as normal user
session[:user] = create(:user).id
post :create, :params => { :issue_id => issue.id }
assert_response :redirect
assert_redirected_to root_path
assert_equal 0, issue.comments.length
end
def test_comment
issue = create(:issue)
# Login as administrator
session[:user] = create(:administrator_user).id
post :create, :params => { :issue_id => issue.id, :issue_comment => { :body => "test comment" } }
assert_response :redirect
assert_redirected_to issue
assert_equal 1, issue.comments.length
end
end

View file

@ -0,0 +1,144 @@
require "test_helper"
class IssuesControllerTest < ActionController::TestCase
def test_index
# Access issues list without login
get :index
assert_response :redirect
assert_redirected_to login_path(:referer => issues_path)
# Access issues list as normal user
session[:user] = create(:user).id
get :index
assert_response :redirect
assert_redirected_to root_path
# Access issues list as administrator
session[:user] = create(:administrator_user).id
get :index
assert_response :success
# Access issues list as moderator
session[:user] = create(:moderator_user).id
get :index
assert_response :success
end
def test_show
target_user = create(:user)
issue = create(:issue, :reportable => target_user, :reported_user => target_user)
# Access issue without login
get :show, :params => { :id => issue.id }
assert_response :redirect
assert_redirected_to login_path(:referer => issue_path(issue))
# Access issue as normal user
session[:user] = create(:user).id
get :show, :params => { :id => issue.id }
assert_response :redirect
assert_redirected_to root_path
# Access issue as administrator
session[:user] = create(:administrator_user).id
get :show, :params => { :id => issue.id }
assert_response :success
# Access issue as moderator
session[:user] = create(:moderator_user).id
get :show, :params => { :id => issue.id }
assert_response :success
end
def test_resolve
target_user = create(:user)
issue = create(:issue, :reportable => target_user, :reported_user => target_user)
# Resolve issue without login
get :resolve, :params => { :id => issue.id }
assert_response :redirect
assert_redirected_to login_path(:referer => resolve_issue_path(issue))
# Resolve issue as normal user
session[:user] = create(:user).id
get :resolve, :params => { :id => issue.id }
assert_response :redirect
assert_redirected_to root_path
# Resolve issue as administrator
session[:user] = create(:administrator_user).id
get :resolve, :params => { :id => issue.id }
assert_response :redirect
assert_equal true, issue.reload.resolved?
issue.reopen!
# Resolve issue as moderator
session[:user] = create(:moderator_user).id
get :resolve, :params => { :id => issue.id }
assert_response :redirect
assert_equal true, issue.reload.resolved?
end
def test_ignore
target_user = create(:user)
issue = create(:issue, :reportable => target_user, :reported_user => target_user)
# Ignore issue without login
get :ignore, :params => { :id => issue.id }
assert_response :redirect
assert_redirected_to login_path(:referer => ignore_issue_path(issue))
# Ignore issue as normal user
session[:user] = create(:user).id
get :ignore, :params => { :id => issue.id }
assert_response :redirect
assert_redirected_to root_path
# Ignore issue as administrator
session[:user] = create(:administrator_user).id
get :ignore, :params => { :id => issue.id }
assert_response :redirect
assert_equal true, issue.reload.ignored?
issue.reopen!
# Ignore issue as moderator
session[:user] = create(:moderator_user).id
get :ignore, :params => { :id => issue.id }
assert_response :redirect
assert_equal true, issue.reload.ignored?
end
def test_reopen
target_user = create(:user)
issue = create(:issue, :reportable => target_user, :reported_user => target_user)
issue.resolve!
# Reopen issue without login
get :reopen, :params => { :id => issue.id }
assert_response :redirect
assert_redirected_to login_path(:referer => reopen_issue_path(issue))
# Reopen issue as normal user
session[:user] = create(:user).id
get :reopen, :params => { :id => issue.id }
assert_response :redirect
assert_redirected_to root_path
# Reopen issue as administrator
session[:user] = create(:administrator_user).id
get :reopen, :params => { :id => issue.id }
assert_response :redirect
assert_equal true, issue.reload.open?
issue.resolve!
# Reopen issue as moderator
session[:user] = create(:moderator_user).id
get :reopen, :params => { :id => issue.id }
assert_response :redirect
assert_equal true, issue.reload.open?
end
end

View file

@ -0,0 +1,131 @@
require "test_helper"
class ReportsControllerTest < ActionController::TestCase
def test_new_report_without_login
target_user = create(:user)
get :new, :params => { :reportable_id => target_user.id, :reportable_type => "User" }
assert_response :redirect
assert_redirected_to login_path(:referer => new_report_path(:reportable_id => target_user.id, :reportable_type => "User"))
end
def test_new_report_after_login
target_user = create(:user)
session[:user] = create(:user).id
# Create an Issue and a report
get :new, :params => { :reportable_id => target_user.id, :reportable_type => "User" }
assert_response :success
assert_difference "Issue.count", 1 do
details = "Details of a report"
category = "other"
post :create,
:params => {
:report => {
:details => details,
:category => category,
:issue => { :reportable_id => target_user.id, :reportable_type => "User" }
}
}
end
assert_response :redirect
assert_redirected_to user_path(target_user.display_name)
end
def test_new_report_with_incomplete_details
# Test creation of a new issue and a new report
target_user = create(:user)
# Login
session[:user] = create(:user).id
# Create an Issue and a report
get :new, :params => { :reportable_id => target_user.id, :reportable_type => "User" }
assert_response :success
assert_difference "Issue.count", 1 do
details = "Details of a report"
category = "other"
post :create,
:params => {
:report => {
:details => details,
:category => category,
:issue => { :reportable_id => target_user.id, :reportable_type => "User" }
}
}
end
assert_response :redirect
assert_redirected_to user_path(target_user.display_name)
issue = Issue.last
assert_equal 1, issue.reports.count
get :new, :params => { :reportable_id => target_user.id, :reportable_type => "User" }
assert_response :success
# Report without details
assert_no_difference "Issue.count" do
category = "other"
post :create,
:params => {
:report => {
:category => category,
:issue => { :reportable_id => 1, :reportable_type => "User" }
}
}
end
assert_response :redirect
assert_equal 1, issue.reports.count
end
def test_new_report_with_complete_details
# Test creation of a new issue and a new report
target_user = create(:user)
# Login
session[:user] = create(:user).id
# Create an Issue and a report
get :new, :params => { :reportable_id => target_user.id, :reportable_type => "User" }
assert_response :success
assert_difference "Issue.count", 1 do
details = "Details of a report"
category = "other"
post :create,
:params => {
:report => {
:details => details,
:category => category,
:issue => { :reportable_id => target_user.id, :reportable_type => "User" }
}
}
end
assert_response :redirect
assert_redirected_to user_path(target_user.display_name)
issue = Issue.last
assert_equal 1, issue.reports.count
# Create a report for an existing Issue
get :new, :params => { :reportable_id => target_user.id, :reportable_type => "User" }
assert_response :success
assert_no_difference "Issue.count" do
details = "Details of another report under the same issue"
category = "other"
post :create,
:params => {
:report => {
:details => details,
:category => category,
:issue => { :reportable_id => target_user.id, :reportable_type => "User" }
}
}
end
assert_response :redirect
assert_equal 2, issue.reports.count
end
end

7
test/factories/issues.rb Normal file
View file

@ -0,0 +1,7 @@
FactoryBot.define do
factory :issue do
# Default to reporting users
association :reportable, :factory => :user
association :reported_user, :factory => :user
end
end

View file

@ -0,0 +1,8 @@
FactoryBot.define do
factory :report do
sequence(:details) { |n| "Report details #{n}" }
category "other"
issue
user
end
end

View file

@ -0,0 +1,7 @@
require "test_helper"
class IssueCommentTest < ActiveSupport::TestCase
# test "the truth" do
# assert true
# end
end

88
test/models/issue_test.rb Normal file
View file

@ -0,0 +1,88 @@
require "test_helper"
class IssueTest < ActiveSupport::TestCase
def test_assigned_role
issue = create(:issue)
assert issue.valid?
issue.assigned_role = "bogus"
assert_not issue.valid?
end
def test_reported_user
create(:language, :code => "en")
user = create(:user)
note = create(:note_comment, :author => create(:user)).note
anonymous_note = create(:note_comment, :author => nil).note
diary_entry = create(:diary_entry)
diary_comment = create(:diary_comment, :diary_entry => diary_entry)
issue = Issue.new(:reportable => user)
issue.save!
assert_equal issue.reported_user, user
issue = Issue.new(:reportable => note)
issue.save!
assert_equal issue.reported_user, note.author
issue = Issue.new(:reportable => anonymous_note)
issue.save!
assert_nil issue.reported_user
issue = Issue.new(:reportable => diary_entry)
issue.save!
assert_equal issue.reported_user, diary_entry.user
issue = Issue.new(:reportable => diary_comment)
issue.save!
assert_equal issue.reported_user, diary_comment.user
end
def test_default_assigned_role
create(:language, :code => "en")
user = create(:user)
note = create(:note_with_comments)
diary_entry = create(:diary_entry)
diary_comment = create(:diary_comment, :diary_entry => diary_entry)
issue = Issue.new(:reportable => user)
issue.save!
assert_equal "administrator", issue.assigned_role
issue = Issue.new(:reportable => note)
issue.save!
assert_equal "moderator", issue.assigned_role
issue = Issue.new(:reportable => diary_entry)
issue.save!
assert_equal "administrator", issue.assigned_role
issue = Issue.new(:reportable => diary_comment)
issue.save!
assert_equal "administrator", issue.assigned_role
end
def test_no_default_explicit_role
create(:language, :code => "en")
user = create(:user)
note = create(:note_with_comments)
diary_entry = create(:diary_entry)
diary_comment = create(:diary_comment, :diary_entry => diary_entry)
issue = Issue.new(:reportable => user, :assigned_role => "moderator")
issue.save!
assert_equal "moderator", issue.reload.assigned_role
issue = Issue.new(:reportable => note, :assigned_role => "administrator")
issue.save!
assert_equal "administrator", issue.reload.assigned_role
issue = Issue.new(:reportable => diary_entry, :assigned_role => "moderator")
issue.save!
assert_equal "moderator", issue.reload.assigned_role
issue = Issue.new(:reportable => diary_comment, :assigned_role => "moderator")
issue.save!
assert_equal "moderator", issue.reload.assigned_role
end
end

View file

@ -0,0 +1,35 @@
require "test_helper"
class ReportTest < ActiveSupport::TestCase
def test_issue_required
report = create(:report)
assert report.valid?
report.issue = nil
assert_not report.valid?
end
def test_user_required
report = create(:report)
assert report.valid?
report.user = nil
assert_not report.valid?
end
def test_details_required
report = create(:report)
assert report.valid?
report.details = ""
assert_not report.valid?
end
def test_category_required
report = create(:report)
assert report.valid?
report.category = ""
assert_not report.valid?
end
end

119
test/system/issues_test.rb Normal file
View file

@ -0,0 +1,119 @@
require "application_system_test_case"
class IssuesTest < ApplicationSystemTestCase
include IssuesHelper
def test_view_issues_not_logged_in
visit issues_path
assert page.has_content?(I18n.t("user.login.title"))
end
def test_view_issues_normal_user
sign_in_as(create(:user))
visit issues_path
assert page.has_content?(I18n.t("application.require_moderator_or_admin.not_a_moderator_or_admin"))
end
def test_view_no_issues
sign_in_as(create(:moderator_user))
visit issues_path
assert page.has_content?(I18n.t("issues.index.issues_not_found"))
end
def test_view_issues
sign_in_as(create(:moderator_user))
issues = create_list(:issue, 3, :assigned_role => "moderator")
visit issues_path
assert page.has_content?(issues.first.reported_user.display_name)
end
def test_view_issues_with_no_reported_user
sign_in_as(create(:moderator_user))
anonymous_note = create(:note_with_comments)
issue = create(:issue, :reportable => anonymous_note)
visit issues_path
assert page.has_content?(reportable_title(anonymous_note))
visit issue_path(issue)
assert page.has_content?(reportable_title(anonymous_note))
end
def test_search_issues_by_user
good_user = create(:user)
bad_user = create(:user)
create(:issue, :reportable => bad_user, :reported_user => bad_user, :assigned_role => "administrator")
sign_in_as(create(:administrator_user))
# No issues against the user
visit issues_path
fill_in "search_by_user", :with => good_user.display_name
click_on "Search"
assert_not page.has_content?(I18n.t("issues.index.user_not_found"))
assert page.has_content?(I18n.t("issues.index.issues_not_found"))
# User doesn't exist
visit issues_path
fill_in "search_by_user", :with => "Nonexistant User"
click_on "Search"
assert page.has_content?(I18n.t("issues.index.user_not_found"))
assert page.has_content?(I18n.t("issues.index.issues_not_found"))
# Find Issue against bad_user
visit issues_path
fill_in "search_by_user", :with => bad_user.display_name
click_on "Search"
assert_not page.has_content?(I18n.t("issues.index.user_not_found"))
assert_not page.has_content?(I18n.t("issues.index.issues_not_found"))
end
def test_commenting
issue = create(:issue)
sign_in_as(create(:moderator_user))
visit issue_path(issue)
fill_in :issue_comment_body, :with => "test comment"
click_on "Submit"
assert page.has_content?(I18n.t("issue_comments.create.comment_created"))
assert page.has_content?("test comment")
issue.reload
assert_equal issue.comments.first.body, "test comment"
end
def test_reassign_issue
issue = create(:issue)
assert_equal "administrator", issue.assigned_role
sign_in_as(create(:administrator_user))
visit issue_path(issue)
fill_in :issue_comment_body, :with => "reassigning to moderators"
check :reassign
click_on "Submit"
issue.reload
assert_equal "moderator", issue.assigned_role
end
def test_issue_index_with_multiple_roles
user1 = create(:user)
user2 = create(:user)
issue1 = create(:issue, :reportable => user1, :assigned_role => "administrator")
issue2 = create(:issue, :reportable => user2, :assigned_role => "moderator")
user = create(:administrator_user)
create(:user_role, :user => user, :role => "moderator")
sign_in_as(user)
visit issues_path
assert page.has_link?(I18n.t("issues.index.reports_count", :count => issue1.reports_count), :href => issue_path(issue1))
assert page.has_link?(I18n.t("issues.index.reports_count", :count => issue2.reports_count), :href => issue_path(issue2))
end
end

View file

@ -0,0 +1,36 @@
require "application_system_test_case"
class ReportDiaryCommentTest < ApplicationSystemTestCase
def setup
create(:language, :code => "en")
@diary_entry = create(:diary_entry)
@comment = create(:diary_comment, :diary_entry => @diary_entry)
end
def test_no_link_when_not_logged_in
visit diary_entry_path(@diary_entry.user.display_name, @diary_entry)
assert page.has_content?(@comment.body)
assert_not page.has_content?(I18n.t("diary_entry.diary_comment.report"))
end
def test_it_works
sign_in_as(create(:user))
visit diary_entry_path(@diary_entry.user.display_name, @diary_entry)
assert page.has_content? @diary_entry.title
click_on I18n.t("diary_entry.diary_comment.report")
assert page.has_content? "Report"
assert page.has_content? I18n.t("reports.new.disclaimer.intro")
choose I18n.t("reports.new.categories.diary_comment.spam")
fill_in "report_details", :with => "This comment is spam"
assert_difference "Issue.count", 1 do
click_on "Create Report"
end
assert page.has_content? "Your report has been registered sucessfully"
assert_equal @comment, Issue.last.reportable
end
end

View file

@ -0,0 +1,64 @@
require "application_system_test_case"
class ReportDiaryEntryTest < ApplicationSystemTestCase
def setup
create(:language, :code => "en")
@diary_entry = create(:diary_entry)
end
def test_no_link_when_not_logged_in
visit diary_entry_path(@diary_entry.user.display_name, @diary_entry)
assert page.has_content?(@diary_entry.title)
assert_not page.has_content?(I18n.t("diary_entry.diary_entry.report"))
end
def test_it_works
sign_in_as(create(:user))
visit diary_entry_path(@diary_entry.user.display_name, @diary_entry)
assert page.has_content? @diary_entry.title
click_on I18n.t("diary_entry.diary_entry.report")
assert page.has_content? "Report"
assert page.has_content? I18n.t("reports.new.disclaimer.intro")
choose I18n.t("reports.new.categories.diary_entry.spam")
fill_in "report_details", :with => "This is advertising"
assert_difference "Issue.count", 1 do
click_on "Create Report"
end
assert page.has_content? "Your report has been registered sucessfully"
assert_equal @diary_entry, Issue.last.reportable
end
def test_it_reopens_issue
issue = create(:issue, :reportable => @diary_entry)
issue.resolve!
sign_in_as(create(:user))
visit diary_entry_path(@diary_entry.user.display_name, @diary_entry)
assert page.has_content? @diary_entry.title
click_on I18n.t("diary_entry.diary_entry.report")
assert page.has_content? "Report"
assert page.has_content? I18n.t("reports.new.disclaimer.intro")
choose I18n.t("reports.new.categories.diary_entry.spam")
fill_in "report_details", :with => "This is advertising"
assert_no_difference "Issue.count" do
click_on "Create Report"
end
issue.reload
assert_not issue.resolved?
assert issue.open?
end
def test_missing_report_params
sign_in_as(create(:user))
visit new_report_path
assert page.has_content? I18n.t("reports.new.missing_params")
end
end

View file

@ -0,0 +1,51 @@
require "application_system_test_case"
class ReportNoteTest < ApplicationSystemTestCase
def test_no_link_when_not_logged_in
note = create(:note_with_comments)
visit browse_note_path(note)
assert page.has_content?(note.comments.first.body)
assert_not page.has_content?(I18n.t("browse.note.report"))
end
def test_can_report_anonymous_notes
note = create(:note_with_comments)
sign_in_as(create(:user))
visit browse_note_path(note)
click_on I18n.t("browse.note.report")
assert page.has_content? "Report"
assert page.has_content? I18n.t("reports.new.disclaimer.intro")
choose I18n.t("reports.new.categories.note.spam")
fill_in "report_details", :with => "This is spam"
assert_difference "Issue.count", 1 do
click_on "Create Report"
end
assert page.has_content? "Your report has been registered sucessfully"
assert_equal note, Issue.last.reportable
end
def test_can_report_notes_with_author
note = create(:note_comment, :author => create(:user)).note
sign_in_as(create(:user))
visit browse_note_path(note)
click_on I18n.t("browse.note.report")
assert page.has_content? "Report"
assert page.has_content? I18n.t("reports.new.disclaimer.intro")
choose I18n.t("reports.new.categories.note.spam")
fill_in "report_details", :with => "This is spam"
assert_difference "Issue.count", 1 do
click_on "Create Report"
end
assert page.has_content? "Your report has been registered sucessfully"
assert_equal note, Issue.last.reportable
end
end

View file

@ -0,0 +1,31 @@
require "application_system_test_case"
class ReportUserTest < ApplicationSystemTestCase
def test_no_link_when_not_logged_in
note = create(:note_with_comments)
visit browse_note_path(note)
assert page.has_content?(note.comments.first.body)
assert_not page.has_content?(I18n.t("user.view.report"))
end
def test_can_report_user
user = create(:user)
sign_in_as(create(:user))
visit user_path(user.display_name)
click_on I18n.t("user.view.report")
assert page.has_content? "Report"
assert page.has_content? I18n.t("reports.new.disclaimer.intro")
choose I18n.t("reports.new.categories.user.vandal")
fill_in "report_details", :with => "This user is a vandal"
assert_difference "Issue.count", 1 do
click_on "Create Report"
end
assert page.has_content? "Your report has been registered sucessfully"
assert_equal user, Issue.last.reportable
end
end