231 lines
8.7 KiB
Ruby
231 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
|