otwarchive-symphonyarchive/spec/controllers/admin_posts_controller_spec.rb

351 lines
13 KiB
Ruby
Raw Normal View History

2026-03-11 22:22:11 +00:00
require "spec_helper"
describe AdminPostsController do
include LoginMacros
include RedirectExpectationHelper
describe "GET #index" do
context "when filtering by language" do
let(:translated_post1) { create(:admin_post, tag_list: "xylophone,aardvark") }
let!(:translation_post1) { create(:admin_post, translated_post_id: translated_post1.id, language: create(:language, short: "fr")) }
let(:translated_post2) { create(:admin_post, tag_list: "xylophone,aardvark") }
let!(:translation_post2) { create(:admin_post, translated_post_id: translated_post2.id, language: translation_post1.language) }
let!(:untranslated_post) { create(:admin_post, tag_list: "uncommon tag") }
it "assigns the admin post tags for the language ordered by name" do
get :index, params: { language_id: "fr" }
expect(assigns[:tags].map(&:name).join(", ")).to eql("aardvark, xylophone")
end
end
end
describe "GET #show" do
context "when admin post does not exist" do
it "raises an error" do
expect do
get :show, params: { id: "999999999" }
end.to raise_error ActiveRecord::RecordNotFound
end
end
end
describe "POST #create" do
let(:base_params) { { title: "AdminPost Title",
content: "AdminPost content long enough to pass validation" } }
authorized_roles = %w[superadmin board board_assistants_team communications support translation]
unauthorized_roles = Admin::VALID_ROLES - authorized_roles
context "when admin does not have correct authorization" do
let(:admin) { create(:admin) }
unauthorized_roles.each do |admin_role|
context "with #{admin_role}" do
it "redirects with error" do
admin.update!(roles: [admin_role])
fake_login_admin(admin)
post :create, params: { admin_post: base_params }
it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.")
end
end
end
context "with no role" do
it "redirects with error" do
admin.update!(roles: [])
fake_login_admin(admin)
post :create, params: { admin_post: base_params }
it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.")
end
end
end
context "when admin has correct authorization" do
authorized_roles.each do |admin_role|
context "with #{admin_role} role" do
before { fake_login_admin(create(:admin, roles: [admin_role])) }
context "when admin post is valid" do
it "redirects to post with notice" do
post :create, params: { admin_post: base_params }
it_redirects_to_with_notice(admin_post_path(assigns[:admin_post]), "Admin Post was successfully created.")
end
end
context "when admin post is invalid" do
context "with invalid translated post id" do
it "renders the new template with error message" do
post :create, params: { admin_post: { translated_post_id: 0 } }.merge(base_params)
expect(response).to render_template(:new)
expect(assigns[:admin_post].errors.full_messages).to include("Translated post does not exist")
end
it "doesn't create new tags" do
post :create, params: { admin_post: { translated_post_id: 0, tag_list: "badtag" } }.merge(base_params)
expect(AdminPostTag.find_by(name: "badtag")).to be_nil
end
end
end
context "when translated post has same language id" do
let(:admin_post) { create(:admin_post) }
it "renders the new template with error message" do
post :create, params: { admin_post: { translated_post_id: admin_post.id, language_id: admin_post.language_id } }.merge(base_params)
expect(response).to render_template(:new)
expect(assigns[:admin_post].errors.full_messages).to include("Translated post cannot be same language as original post")
end
end
end
end
end
end
describe "POST #update" do
let(:admin) { create(:admin) }
let(:post) { create(:admin_post) }
authorized_roles = %w[superadmin board board_assistants_team communications support translation]
unauthorized_roles = Admin::VALID_ROLES - authorized_roles
context "when admin does not have correct authorization" do
unauthorized_roles.each do |admin_role|
context "with the role #{admin_role}" do
it "redirects with error" do
admin.update!(roles: [admin_role])
fake_login_admin(admin)
put :update, params: { id: post.id, admin_post: { admin_id: admin.id } }
it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.")
end
end
end
context "with no role" do
it "redirects with error" do
admin.update!(roles: [])
fake_login_admin(admin)
put :update, params: { id: post.id, admin_post: { admin_id: admin.id } }
it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.")
end
end
end
context "when admin has correct authorization" do
authorized_roles.each do |admin_role|
context "with #{admin_role} role" do
context "with valid title" do
it "updates title and redirects with notice" do
admin.update!(roles: [admin_role])
fake_login_admin(admin)
put :update, params: { id: post.id, admin_post: { admin_id: admin.id, title: "Modified Title of Post" } }
expect(post.reload.title).to eq("Modified Title of Post")
it_redirects_to_with_notice(admin_post_path(assigns[:admin_post]), "Admin Post was successfully updated.")
end
end
context "with invalid translated_post_id" do
it "renders the edit template with error message" do
admin.update!(roles: [admin_role])
fake_login_admin(admin)
put :update, params: { id: post.id, admin_post: { admin_id: admin.id, translated_post_id: 0 } }
expect(response).to render_template(:edit)
expect(assigns[:admin_post].errors.full_messages).to include("Translated post does not exist")
end
end
context "with valid translated_post_id" do
let!(:translation) { create(:admin_post, translated_post_id: post.id, language_id: create(:language).id) }
context "with valid comment_permissions" do
it "does not change comment_permissions and redirects with notice" do
admin.update!(roles: [admin_role])
fake_login_admin(admin)
expect do
put :update, params: {
id: translation.id,
admin_post: {
admin_id: admin.id,
comment_permissions: :disable_all
}
}
end.not_to change { AdminPost.comment_permissions }
expect(translation.reload.comment_permissions).to eq(post.comment_permissions)
it_redirects_to_with_notice(admin_post_path(translation), "Admin Post was successfully updated.")
end
end
context "with invalid translated_post language" do
it "renders the edit template with error message" do
admin.update!(roles: [admin_role])
fake_login_admin(admin)
put :update, params: { id: translation.id, admin_post: { language_id:post.language_id } }
expect(response).to render_template(:edit)
expect(assigns[:admin_post].errors.full_messages).to include("Translated post cannot be same language as original post")
end
end
end
end
end
end
end
describe "GET #edit" do
let(:admin) { create(:admin) }
let(:post) { create(:admin_post) }
authorized_roles = %w[superadmin board board_assistants_team communications support translation]
unauthorized_roles = Admin::VALID_ROLES - authorized_roles
context "when admin does not have correct authorization" do
unauthorized_roles.each do |admin_role|
context "with the role #{admin_role}" do
it "redirects with error" do
admin.update!(roles: [admin_role])
fake_login_admin(admin)
get :edit, params: { id: post.id }
it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.")
end
end
end
context "with no role" do
it "redirects with error" do
admin.update!(roles: [])
fake_login_admin(admin)
get :edit, params: { id: post.id }
it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.")
end
end
end
context "when admin has correct authorization" do
authorized_roles.each do |admin_role|
context "with #{admin_role} role" do
it "renders edit template" do
admin.update!(roles: [admin_role])
fake_login_admin(admin)
get :edit, params: { id: post.id }
expect(response).to render_template(:edit)
end
end
end
end
end
describe "GET #new" do
let(:admin) { create(:admin) }
let(:post) { create(:admin_post) }
authorized_roles = %w[superadmin board board_assistants_team communications support translation]
unauthorized_roles = Admin::VALID_ROLES - authorized_roles
context "when admin does not have correct authorization" do
unauthorized_roles.each do |admin_role|
context "with the role #{admin_role}" do
it "redirects with error" do
admin.update!(roles: [admin_role])
fake_login_admin(admin)
get :edit, params: { id: post.id }
it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.")
end
end
end
context "with no role" do
it "redirects with error" do
admin.update!(roles: [])
fake_login_admin(admin)
get :edit, params: { id: post.id }
it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.")
end
end
end
context "when admin has correct authorization" do
authorized_roles.each do |admin_role|
context "with #{admin_role} role" do
it "renders new template" do
admin.update!(roles: [admin_role])
fake_login_admin(admin)
get :new, params: { id: post.id }
expect(response).to render_template(:new)
end
end
end
end
end
describe "DELETE #destroy" do
let(:admin) { create(:admin) }
let(:post) { create(:admin_post) }
authorized_roles = %w[superadmin board board_assistants_team communications support translation]
unauthorized_roles = Admin::VALID_ROLES - authorized_roles
context "when admin does not have correct authorization" do
unauthorized_roles.each do |admin_role|
context "with the role #{admin_role}" do
it "redirects with error" do
admin.update!(roles: [admin_role])
fake_login_admin(admin)
delete :destroy, params: { id: post.id }
it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.")
end
end
end
context "with no role" do
it "redirects with error" do
admin.update!(roles: [])
fake_login_admin(admin)
delete :destroy, params: { id: post.id }
it_redirects_to_with_error(root_url, "Sorry, only an authorized admin can access the page you were trying to reach.")
end
end
end
context "when admin has correct authorization" do
authorized_roles.each do |admin_role|
context "with #{admin_role} role" do
it "deletes post and redirects without notice" do
admin.update!(roles: [admin_role])
fake_login_admin(admin)
delete :destroy, params: { id: post.id }
expect { post.reload }.to raise_exception(ActiveRecord::RecordNotFound)
it_redirects_to(admin_posts_path)
end
context "with translated post" do
let!(:translation) { create(:admin_post, translated_post_id: post.id, language_id: create(:language).id) }
it "deletes translations of post along with post" do
admin.update!(roles: [admin_role])
fake_login_admin(admin)
delete :destroy, params: { id: post.id }
expect { post.reload }.to raise_exception(ActiveRecord::RecordNotFound)
expect { translation.reload }.to raise_exception(ActiveRecord::RecordNotFound)
end
end
end
end
end
end
end