otwarchive-symphonyarchive/spec/models/search/pseud_search_form_spec.rb
2026-03-11 22:22:11 +00:00

186 lines
7.4 KiB
Ruby

require "spec_helper"
describe PseudSearchForm, pseud_search: true do
context "searching pseuds in a fandom" do
let(:fandom_kp) { create(:canonical_fandom) }
let(:fandom_mlaatr) { create(:canonical_fandom) }
let!(:work_1) { create(:work, fandoms: [fandom_kp]) }
let!(:work_2) { create(:work, fandoms: [fandom_kp], restricted: true) }
let!(:work_3) { create(:work, fandoms: [fandom_mlaatr]) }
let!(:work_4) { create(:work, fandoms: [fandom_mlaatr], restricted: true) }
before { run_all_indexing_jobs }
it "returns all pseuds writing in the fandom when logged in" do
User.current_user = User.new
results = PseudSearchForm.new(fandom: fandom_kp.name).search_results
expect(results).to include work_1.pseuds.first
expect(results).to include work_2.pseuds.first
expect(results).not_to include work_3.pseuds.first
expect(results).not_to include work_4.pseuds.first
end
it "returns pseuds writing public works in the fandom" do
results = PseudSearchForm.new(fandom: fandom_kp.name).search_results
expect(results).to include work_1.pseuds.first
expect(results).not_to include work_2.pseuds.first
expect(results).not_to include work_3.pseuds.first
expect(results).not_to include work_4.pseuds.first
end
end
context "searching pseuds in multiple fandoms" do
let(:fandom_kp) { create(:canonical_fandom) }
let(:fandom_mlaatr) { create(:canonical_fandom) }
let(:user) { create(:user) }
let!(:work_1) { create(:work, fandoms: [fandom_kp, fandom_mlaatr]) }
let!(:work_2) { create(:work, fandoms: [fandom_kp], authors: [user.default_pseud]) }
let!(:work_3) { create(:work, fandoms: [fandom_mlaatr], authors: [user.default_pseud], restricted: true) }
before { run_all_indexing_jobs }
it "returns all pseuds writing in all fandoms" do
User.current_user = User.new
results = PseudSearchForm.new(fandom: "#{fandom_kp.name},#{fandom_mlaatr.name}").search_results
expect(results).to include work_1.pseuds.first
expect(results).to include user.default_pseud
end
it "returns pseuds writing public works in all fandoms" do
results = PseudSearchForm.new(fandom: "#{fandom_kp.name},#{fandom_mlaatr.name}").search_results
expect(results).to include work_1.pseuds.first
# This author posts in both fandoms, but their only work for fandom_mlaatr is restricted.
# To logged out users, this author does not post in both specified fandoms.
expect(results).not_to include user.default_pseud
end
end
context "a user with multiple pseuds" do
let!(:user) { create(:user, login: "avatar") }
let!(:second_pseud) { create(:pseud, name: "kyoshi", user: user) }
before { run_all_indexing_jobs }
it "reindexes all pseuds when changing username" do
results = PseudSearchForm.new(name: "avatar").search_results
expect(results).to include(user.default_pseud)
expect(results).to include(second_pseud)
user.reload
user.login = "aang"
user.save
run_all_indexing_jobs
results = PseudSearchForm.new(name: "avatar").search_results
expect(results).to be_empty
results = PseudSearchForm.new(name: "aang").search_results
expect(results).to include(user.default_pseud)
expect(results).to include(second_pseud)
end
end
context "pseud index of bookmarkers" do
let(:bookmarker) { create(:pseud, name: "bookmarkermit") }
it "updates when bookmarked work changes restricted status" do
work = create(:work)
expect(work.restricted).to be_falsy
bookmark = create(:bookmark, bookmarkable_id: work.id, pseud: bookmarker)
run_all_indexing_jobs
result = PseudSearchForm.new(name: bookmark.pseud.name).search_results.first
expect(result).to eq bookmark.pseud
# Bookmark of public work is counted for logged in and logged out searches
User.current_user = User.new
expect(result.bookmarks_count).to eq 1
User.current_user = nil
expect(result.bookmarks_count).to eq 1
# Work becomes restricted
work.update_attribute(:restricted, true)
expect(work.restricted).to be_truthy
run_all_indexing_jobs
result = PseudSearchForm.new(name: bookmark.pseud.name).search_results.first
expect(result).to eq bookmark.pseud
# Bookmark of restricted work is only counted for logged in searches
User.current_user = User.new
expect(result.bookmarks_count).to eq 1
User.current_user = nil
expect(result.bookmarks_count).to eq 0
end
it "updates when bookmarked series changes restricted status" do
series = create(:series)
serial_work = create(:serial_work, series: series)
expect(series.restricted).to be_falsy
bookmark = create(:bookmark, bookmarkable_id: series.id, bookmarkable_type: "Series", pseud: bookmarker)
run_all_indexing_jobs
result = PseudSearchForm.new(name: bookmark.pseud.name).search_results.first
expect(result).to eq bookmark.pseud
# Bookmark of public series is counted for logged in and logged out searches
User.current_user = User.new
expect(result.bookmarks_count).to eq 1
User.current_user = nil
expect(result.bookmarks_count).to eq 1
# Series becomes restricted
serial_work.work.update_attribute(:restricted, true)
series.reload
expect(series.restricted).to be_truthy
run_all_indexing_jobs
result = PseudSearchForm.new(name: bookmark.pseud.name).search_results.first
expect(result).to eq bookmark.pseud
# Bookmark of restricted series is only counted for logged in searches
User.current_user = User.new
expect(result.bookmarks_count).to eq 1
User.current_user = nil
expect(result.bookmarks_count).to eq 0
end
{
Work: :work,
Series: :series_with_a_work,
ExternalWork: :external_work
}.each_pair do |type, factory|
it "updates when bookmarked #{type} changes hidden by admin status" do
bookmarkable = create(factory)
expect(bookmarkable.restricted).to be_falsy
expect(bookmarkable.hidden_by_admin).to be_falsy
bookmark = create(:bookmark, bookmarkable_id: bookmarkable.id, bookmarkable_type: type, pseud: bookmarker)
run_all_indexing_jobs
result = PseudSearchForm.new(name: bookmark.pseud.name).search_results.first
expect(result).to eq bookmark.pseud
# Bookmark of public bookmarkable is counted for logged in and logged out searches
User.current_user = User.new
expect(result.bookmarks_count).to eq 1
User.current_user = nil
expect(result.bookmarks_count).to eq 1
# When a series and its work are first created, the series loads
# an empty collection of bookmarks, which stays unupdated when we pluck
# the bookmark IDs to reindex bookmarker pseuds, so no pseuds get reindexed.
# We need to reload the series.
bookmarkable.reload
bookmarkable.update_attribute(:hidden_by_admin, true)
run_all_indexing_jobs
result = PseudSearchForm.new(name: bookmark.pseud.name).search_results.first
expect(result).to eq bookmark.pseud
# Bookmark of bookmarkable hidden by admin is counted for no one
User.current_user = User.new
expect(result.bookmarks_count).to eq 0
User.current_user = nil
expect(result.bookmarks_count).to eq 0
end
end
end
end