otwarchive-symphonyarchive/spec/controllers/troubleshooting_controller_spec.rb
2026-03-11 22:22:11 +00:00

230 lines
8.7 KiB
Ruby

# frozen_string_literal: true
require "spec_helper"
describe TroubleshootingController do
include LoginMacros
include RedirectExpectationHelper
let(:tag) { create(:canonical_fandom) }
let(:work) { create(:work) }
let(:tag_wrangler) { create(:user, roles: [Role.new(name: "tag_wrangler")]) }
let(:non_tag_wrangler) { create(:user) }
context "show" do
context "when logged out" do
it "errors and redirects to the login page" do
get :show, params: { tag_id: tag.to_param }
it_redirects_to_with_error(new_user_session_path, "Sorry, you don't have permission to access the page you were trying to reach. Please log in.")
end
end
context "when logged in as a regular user" do
before { fake_login_known_user(non_tag_wrangler) }
it "errors and redirects to user's profile" do
get :show, params: { tag_id: tag.to_param }
it_redirects_to_with_error(non_tag_wrangler, "Sorry, you don't have permission to access the page you were trying to reach.")
end
end
context "when logged in as a tag wrangler" do
before { fake_login_known_user(tag_wrangler) }
it "shows a form with the allowed actions for tags" do
get :show, params: { tag_id: tag.to_param }
expect(response).to render_template(:show)
expect(assigns[:allowed_actions]).to \
contain_exactly("fix_associations", "fix_counts", "fix_meta_tags")
end
it "shows a form with the allowed actions for works" do
get :show, params: { work_id: work.id }
expect(response).to render_template(:show)
expect(assigns[:allowed_actions]).to \
contain_exactly("update_work_filters")
end
end
context "when logged in as an admin" do
before { fake_login_admin(create(:admin)) }
it "shows a form with the allowed actions for tags" do
get :show, params: { tag_id: tag.to_param }
expect(response).to render_template(:show)
expect(assigns[:allowed_actions]).to \
contain_exactly("fix_associations", "reindex_tag", "update_tag_filters", "fix_counts", "fix_meta_tags")
end
it "shows a form with the allowed actions for works" do
get :show, params: { work_id: work.id }
expect(response).to render_template(:show)
expect(assigns[:allowed_actions]).to \
contain_exactly("reindex_work", "update_work_filters")
end
end
end
context "update" do
context "when logged out" do
it "errors and redirects to the login page" do
put :update, params: { tag_id: tag.to_param, actions: ["fix_counts"] }
it_redirects_to_with_error(new_user_session_path, "Sorry, you don't have permission to access the page you were trying to reach. Please log in.")
end
end
context "when logged in as a regular user" do
before { fake_login_known_user(non_tag_wrangler) }
it "errors and redirects to user's profile" do
put :update, params: { tag_id: tag.to_param, actions: ["fix_counts"] }
it_redirects_to_with_error(non_tag_wrangler, "Sorry, you don't have permission to access the page you were trying to reach.")
end
end
shared_examples "permitted for tag wranglers" do
it "removes invalid tag associations and redirects to the tag" do
tag.common_taggings.build(filterable: create(:freeform)).save(validate: false)
tag.child_taggings.build(common_tag: create(:media)).save(validate: false)
tag.meta_taggings.build(meta_tag: tag).save(validate: false)
put :update, params: { tag_id: tag.to_param, actions: ["fix_associations"] }
expect(tag.parents.reload).to contain_exactly(Media.uncategorized)
expect(tag.children.reload).to contain_exactly
expect(tag.meta_tags.reload).to contain_exactly
it_redirects_to_simple(tag_path(tag))
end
it "fixes tag counts and redirects to the tag" do
tag.create_filter_count(public_works_count: 100)
expect(tag.filter_count.public_works_count).to eq 100
put :update, params: { tag_id: tag.to_param, actions: ["fix_counts"] }
tag.reload
expect(tag.filter_count.public_works_count).to eq 0
it_redirects_to_simple(tag_path(tag))
end
it "fixes metatags and redirects to the tag" do
meta = create(:canonical_fandom)
grand = create(:canonical_fandom)
phantom = create(:canonical_fandom)
tag.meta_tags << meta
meta.meta_tags << grand
tag.meta_tags.delete(grand)
MetaTagging.create(sub_tag: tag, meta_tag: phantom, direct: false)
# Because the inherited metatags are wrong, we should end up updating
# the filters for all of the tagged works as well:
expect_any_instance_of(Tag).to receive(:update_filters_for_filterables)
put :update, params: { tag_id: tag.to_param, actions: ["fix_meta_tags"] }
expect(tag.meta_tags.reload).to contain_exactly(meta, grand)
it_redirects_to_simple(tag_path(tag))
end
it "doesn't update filters if the metatags don't need fixing" do
expect_any_instance_of(Tag).not_to receive(:update_filters_for_filterables)
put :update, params: { tag_id: tag.to_param, actions: ["fix_meta_tags"] }
end
it "recalculates the work's filters and redirects" do
work.fandoms = [tag]
work.filter_taggings.destroy_all
put :update, params: { work_id: work.id, actions: ["update_work_filters"] }
expect(work.filters.reload).to include(tag)
it_redirects_to_simple(work)
end
end
context "when logged in as a tag wrangler" do
before { fake_login_known_user(tag_wrangler) }
include_examples "permitted for tag wranglers"
it "doesn't allow the user to reindex a tag" do
put :update, params: { tag_id: tag.to_param, actions: ["reindex_tag"] }
it_redirects_to_with_error(tag_troubleshooting_path(tag), "The following actions aren't allowed: Reindex Tag.")
end
it "doesn't allow the user to update filters for a tag" do
put :update, params: { tag_id: tag.to_param, actions: ["update_tag_filters"] }
it_redirects_to_with_error(tag_troubleshooting_path(tag), "The following actions aren't allowed: Update Tag Filters.")
end
it "doesn't allow the user to reindex the work" do
put :update, params: { work_id: work.id, actions: ["reindex_work"] }
it_redirects_to_with_error(work_troubleshooting_path(work), "The following actions aren't allowed: Reindex Work.")
end
end
context "when logged in as an admin" do
before { fake_login_admin(create(:admin)) }
# Anything permitted for tag wranglers is also permitted for admins:
include_examples "permitted for tag wranglers"
it "reindexes everything related to the tag and redirects" do
bookmark = create(:bookmark, tags: [tag])
series = create(:series)
work = create(:work, fandoms: [tag], series: [series])
external_work = create(:external_work, fandoms: [tag])
pseud = work.pseuds.first
expect do
put :update, params: { tag_id: tag.to_param, actions: ["reindex_tag"] }
end.to(
add_to_reindex_queue(series, :background) &
add_to_reindex_queue(bookmark, :background) &
add_to_reindex_queue(work, :background) &
add_to_reindex_queue(pseud, :background) &
add_to_reindex_queue(external_work, :background)
)
it_redirects_to_simple(tag_path(tag))
end
it "recalculates filters and redirects to the tag" do
syn = create(:fandom, merger: tag)
tag_work = create(:work, fandoms: [tag])
tag_work.filter_taggings.destroy_all
syn_work = create(:work, fandoms: [syn])
syn_work.filter_taggings.destroy_all
put :update, params: { tag_id: tag.to_param, actions: ["update_tag_filters"] }
expect(tag_work.direct_filters.reload).to include(tag)
expect(syn_work.direct_filters.reload).to include(tag)
it_redirects_to_simple(tag_path(tag))
end
it "recalculates filters for unfilterable tags" do
unfilterable = create(:fandom)
work = create(:work, fandoms: [unfilterable])
# Create an unnecessary filter tagging:
work.filter_taggings.create(filter: unfilterable)
put :update, params: { tag_id: unfilterable.to_param, actions: ["update_tag_filters"] }
expect(work.filters.reload).not_to include(unfilterable)
it_redirects_to_simple(tag_path(unfilterable))
end
it "reindexes the work and redirects" do
expect do
put :update, params: { work_id: work.id, actions: ["reindex_work"] }
end.to(add_to_reindex_queue(work, :main))
it_redirects_to_simple(work)
end
end
end
end