280 lines
9.8 KiB
Ruby
280 lines
9.8 KiB
Ruby
|
|
# frozen_string_literal: true
|
||
|
|
|
||
|
|
require "spec_helper"
|
||
|
|
|
||
|
|
describe Admin::UserCreationsController do
|
||
|
|
include LoginMacros
|
||
|
|
include RedirectExpectationHelper
|
||
|
|
|
||
|
|
describe "PUT #hide" do
|
||
|
|
let(:admin) { create(:admin) }
|
||
|
|
|
||
|
|
context "when user creation is a work" do
|
||
|
|
let(:work) { create(:work) }
|
||
|
|
|
||
|
|
context "when admin does not have correct authorization" do
|
||
|
|
it "redirects with error" do
|
||
|
|
admin.update!(roles: [])
|
||
|
|
fake_login_admin(admin)
|
||
|
|
|
||
|
|
put :hide, params: { id: work.id, creation_type: "Work" }
|
||
|
|
it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "when admin has correct authorization" do
|
||
|
|
context "when work is visible and hidden param is true" do
|
||
|
|
it "hides work and redirects with notice" do
|
||
|
|
admin.update!(roles: ["policy_and_abuse"])
|
||
|
|
fake_login_admin(admin)
|
||
|
|
put :hide, params: { id: work.id, creation_type: "Work", hidden: true }
|
||
|
|
|
||
|
|
it_redirects_to_with_notice(work_path(work), "Item has been hidden.")
|
||
|
|
work.reload
|
||
|
|
expect(work.hidden_by_admin).to eq(true)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "when work is hidden and hidden param is false" do
|
||
|
|
it "makes work visible and redirects with notice" do
|
||
|
|
work.update!(hidden_by_admin: true)
|
||
|
|
admin.update!(roles: ["policy_and_abuse"])
|
||
|
|
fake_login_admin(admin)
|
||
|
|
put :hide, params: { id: work.id, creation_type: "Work", hidden: false }
|
||
|
|
|
||
|
|
it_redirects_to_with_notice(work_path(work), "Item is no longer hidden.")
|
||
|
|
work.reload
|
||
|
|
expect(work.hidden_by_admin).to eq(false)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
describe "PUT #set_spam" do
|
||
|
|
let(:admin) { create(:admin) }
|
||
|
|
|
||
|
|
context "when user creation is a work" do
|
||
|
|
let(:work) { create(:work) }
|
||
|
|
|
||
|
|
context "when admin does not have correct authorization" do
|
||
|
|
it "redirects with error" do
|
||
|
|
admin.update!(roles: [])
|
||
|
|
fake_login_admin(admin)
|
||
|
|
put :set_spam, params: { id: work.id, creation_type: "Work", spam: true }
|
||
|
|
|
||
|
|
it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "when admin has correct authorization" do
|
||
|
|
context "when work is not spam and spam param is true" do
|
||
|
|
it "marks work as spam, hides it, and redirects with notice" do
|
||
|
|
admin.update!(roles: ["policy_and_abuse"])
|
||
|
|
fake_login_admin(admin)
|
||
|
|
put :set_spam, params: { id: work.id, creation_type: "Work", spam: true }
|
||
|
|
|
||
|
|
it_redirects_to_with_notice(work_path(work), "Work was marked as spam and hidden.")
|
||
|
|
work.reload
|
||
|
|
expect(work.spam).to eq(true)
|
||
|
|
expect(work.hidden_by_admin).to eq(true)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "when work is spam and spam param is false" do
|
||
|
|
it "marks work as not spam, unhides it, and redirects with notice" do
|
||
|
|
admin.update!(roles: ["policy_and_abuse"])
|
||
|
|
work.update!(spam: true)
|
||
|
|
fake_login_admin(admin)
|
||
|
|
put :set_spam, params: { id: work.id, creation_type: "Work", spam: false }
|
||
|
|
|
||
|
|
it_redirects_to_with_notice(work_path(work), "Work was marked not spam and unhidden.")
|
||
|
|
work.reload
|
||
|
|
expect(work.spam).to eq(false)
|
||
|
|
expect(work.hidden_by_admin).to eq(false)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
describe "DELETE #destroy" do
|
||
|
|
let(:admin) { create(:admin) }
|
||
|
|
|
||
|
|
before { fake_login_admin(admin) }
|
||
|
|
|
||
|
|
shared_examples "unauthorized admin cannot delete works" do
|
||
|
|
let(:work) { create(:work) }
|
||
|
|
|
||
|
|
it "redirects with error" do
|
||
|
|
delete :destroy, params: { id: work.id, creation_type: "Work" }
|
||
|
|
it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
shared_examples "authorized admin can delete works" do
|
||
|
|
let(:work) { create(:work) }
|
||
|
|
|
||
|
|
it "destroys the work and redirects with notice" do
|
||
|
|
delete :destroy, params: { id: work.id, creation_type: "Work" }
|
||
|
|
it_redirects_to_with_notice(works_path, "Item was successfully deleted.")
|
||
|
|
expect { work.reload }.to raise_exception(ActiveRecord::RecordNotFound)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
shared_examples "unauthorized admin cannot delete bookmarks" do
|
||
|
|
let(:bookmark) { create(:bookmark) }
|
||
|
|
|
||
|
|
it "redirects with error" do
|
||
|
|
delete :destroy, params: { id: bookmark.id, creation_type: "Bookmark" }
|
||
|
|
it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
shared_examples "authorized admin can delete bookmarks" do
|
||
|
|
let(:bookmark) { create(:bookmark) }
|
||
|
|
|
||
|
|
it "destroys the bookmark and redirects with notice" do
|
||
|
|
delete :destroy, params: { id: bookmark.id, creation_type: "Bookmark" }
|
||
|
|
it_redirects_to_with_notice(bookmarks_path, "Item was successfully deleted.")
|
||
|
|
expect { bookmark.reload }.to raise_exception(ActiveRecord::RecordNotFound)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "when admin does not have correct authorization" do
|
||
|
|
before { admin.update!(roles: []) }
|
||
|
|
|
||
|
|
it_behaves_like "unauthorized admin cannot delete works"
|
||
|
|
it_behaves_like "unauthorized admin cannot delete bookmarks"
|
||
|
|
end
|
||
|
|
|
||
|
|
%w[superadmin policy_and_abuse].each do |role|
|
||
|
|
context "when admin has #{role} role" do
|
||
|
|
let(:admin) { create(:admin, roles: [role]) }
|
||
|
|
|
||
|
|
it_behaves_like "authorized admin can delete works"
|
||
|
|
it_behaves_like "authorized admin can delete bookmarks"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "when admin has support role" do
|
||
|
|
let(:admin) { create(:support_admin) }
|
||
|
|
|
||
|
|
it_behaves_like "authorized admin can delete works"
|
||
|
|
it_behaves_like "unauthorized admin cannot delete bookmarks"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
authorized_roles = %w[superadmin policy_and_abuse support].freeze
|
||
|
|
|
||
|
|
describe "GET #confirm_remove_pseud" do
|
||
|
|
subject { get :confirm_remove_pseud, params: { id: work.id } }
|
||
|
|
let(:work) do
|
||
|
|
work = create(:work)
|
||
|
|
create(:user, login: "orphan_account")
|
||
|
|
Creatorship.orphan(work.pseuds, [work], false)
|
||
|
|
work
|
||
|
|
end
|
||
|
|
let(:success) do
|
||
|
|
expect(response).to render_template(:confirm_remove_pseud)
|
||
|
|
end
|
||
|
|
|
||
|
|
it_behaves_like "an action only authorized admins can access", authorized_roles: authorized_roles
|
||
|
|
|
||
|
|
context "when logged in as user" do
|
||
|
|
it "redirects with notice" do
|
||
|
|
fake_login
|
||
|
|
subject
|
||
|
|
it_redirects_to_with_notice(root_path, "I'm sorry, only an admin can look at that area")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "for a non-orphaned work" do
|
||
|
|
let(:work) { create(:work) }
|
||
|
|
|
||
|
|
before do
|
||
|
|
fake_login_admin(create(:superadmin))
|
||
|
|
end
|
||
|
|
|
||
|
|
it "redirects with an error" do
|
||
|
|
subject
|
||
|
|
it_redirects_to_with_error(work_path(work), "Sorry, this action is only available for works by orphan_account pseuds.")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
describe "PUT #remove_pseud" do
|
||
|
|
subject { put :remove_pseud, params: { id: work.id } }
|
||
|
|
let(:user) { create(:user, login: "Leaver") }
|
||
|
|
let!(:orphan_account) { create(:user, login: "orphan_account") }
|
||
|
|
let!(:orphan_pseud) { create(:pseud, name: "Leaver", user: orphan_account) }
|
||
|
|
let(:work) do
|
||
|
|
work = create(:work, authors: [user.default_pseud])
|
||
|
|
Creatorship.orphan([user.default_pseud], [work], false)
|
||
|
|
work
|
||
|
|
end
|
||
|
|
let(:success) do
|
||
|
|
it_redirects_to_with_notice(work_path(work), "Successfully removed pseud Leaver (orphan_account) from this work.")
|
||
|
|
expect(work.reload.pseuds).to include(orphan_account.default_pseud)
|
||
|
|
expect(work.pseuds).not_to include(orphan_pseud)
|
||
|
|
end
|
||
|
|
|
||
|
|
it_behaves_like "an action only authorized admins can access", authorized_roles: authorized_roles
|
||
|
|
|
||
|
|
context "when logged in as user" do
|
||
|
|
it "redirects with notice" do
|
||
|
|
fake_login
|
||
|
|
subject
|
||
|
|
it_redirects_to_with_notice(root_path, "I'm sorry, only an admin can look at that area")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "for a work with multiple orphan pseuds" do
|
||
|
|
let!(:orphaneer_orphan_pseud) { create(:pseud, name: "orphaneer", user: orphan_account) }
|
||
|
|
|
||
|
|
let(:work) do
|
||
|
|
orphaneer = create(:user, login: "orphaneer")
|
||
|
|
work = create(:work, authors: [user.default_pseud, orphaneer.default_pseud])
|
||
|
|
Creatorship.orphan([user.default_pseud, orphaneer.default_pseud], [work], false)
|
||
|
|
work
|
||
|
|
end
|
||
|
|
|
||
|
|
before do
|
||
|
|
fake_login_admin(create(:superadmin))
|
||
|
|
end
|
||
|
|
|
||
|
|
context "without a pseuds parameter" do
|
||
|
|
it "redirects with an error" do
|
||
|
|
subject
|
||
|
|
it_redirects_to_with_error(work_path(work), "You must select which orphan_account pseud to remove.")
|
||
|
|
expect(work.reload.pseuds).not_to include(orphan_account.default_pseud)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "with a orphan_account pseuds parameter" do
|
||
|
|
subject { put :remove_pseud, params: { id: work.id, pseuds: [orphan_pseud.id] } }
|
||
|
|
|
||
|
|
it "redirects removes only that pseud" do
|
||
|
|
subject
|
||
|
|
it_redirects_to_with_notice(work_path(work), "Successfully removed pseud Leaver (orphan_account) from this work.")
|
||
|
|
expect(work.reload.pseuds).to include(orphan_account.default_pseud)
|
||
|
|
expect(work.pseuds).not_to include(orphan_pseud)
|
||
|
|
expect(work.pseuds).to include(orphaneer_orphan_pseud)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "with a pseud parameter by a normal user" do
|
||
|
|
subject { put :remove_pseud, params: { id: work.id, pseuds: [user.default_pseud.id] } }
|
||
|
|
let(:work) { create(:work, authors: [user.default_pseud]) }
|
||
|
|
|
||
|
|
it "does not modify the work" do
|
||
|
|
expect do
|
||
|
|
subject
|
||
|
|
end.not_to change { work.pseuds }
|
||
|
|
it_redirects_to(work_path(work))
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|