otwarchive-symphonyarchive/spec/models/series_spec.rb

114 lines
4.2 KiB
Ruby
Raw Normal View History

2026-03-11 22:22:11 +00:00
# frozen_string_literal: true
require 'spec_helper'
describe Series do
let(:unrestricted_work) { create(:work, restricted: false) }
let(:restricted_work) { create(:work, restricted: true) }
let(:series) { create(:series) }
it "should be unrestricted when it has unrestricted works" do
series.works = [unrestricted_work]
series.reload
expect(series.restricted).not_to be_truthy
end
it "should be restricted when it has no unrestricted works" do
series.works = [restricted_work]
series.reload
expect(series.restricted).to be_truthy
end
it "should be unrestricted when it has both restricted and unrestricted works" do
series.works = [restricted_work, unrestricted_work]
series.reload
expect(series.restricted).not_to be_truthy
end
it "has all of the pseuds from all of its serial works" do
series.works = [restricted_work, unrestricted_work]
series.reload
expect(series.work_pseuds).to match_array(unrestricted_work.pseuds +
restricted_work.pseuds)
expect(series.pseuds).to include(*unrestricted_work.pseuds.to_a)
expect(series.pseuds).to include(*restricted_work.pseuds.to_a)
end
describe "co-creator permissions" do
let(:creator) { create(:user) }
let(:co_creator) { create(:user) }
let(:no_co_creator) { create(:user) }
before do
# In order to enable co-creator checks (instead of just having everything
# be automatically approved), we need to make sure that User.current_user
# is not nil.
User.current_user = creator
co_creator.preference.update!(allow_cocreator: true)
no_co_creator.preference.update!(allow_cocreator: false)
end
it "allows normal users to invite others as series co-creators" do
work = create(:work, authors: creator.pseuds)
series = create(:series, authors: creator.pseuds, works: [work])
series.author_attributes = { byline: co_creator.login }
expect(series).to be_valid
expect(series.save).to be_truthy
expect(series.user_has_creator_invite?(co_creator)).to be_truthy
end
it "doesn't allow users to invite others who disallow co-creators" do
work = create(:work, authors: creator.pseuds)
series = create(:series, authors: creator.pseuds, works: [work])
series.author_attributes = { byline: no_co_creator.login }
expect(series).to be_invalid
expect(series.save).to be_falsey
expect(series.user_has_creator_invite?(no_co_creator)).to be_falsey
end
it "allows new series to be added to an existing work co-created with someone who disallowed co-creators" do
# Set up a work co-created with a user that doesn't allow co-creators:
no_co_creator.preference.update!(allow_cocreator: true)
work = create(:work, authors: creator.pseuds + no_co_creator.pseuds)
work.creatorships.for_user(no_co_creator).each(&:accept!)
no_co_creator.preference.update!(allow_cocreator: false)
series = create(:series, authors: creator.pseuds)
work.reload.series << series
expect(series.pseuds.reload).to match_array(creator.pseuds +
no_co_creator.pseuds)
end
end
describe "#remove_author" do
context "when a work in the series has a chapter whose sole creator is being removed" do
let(:to_remove) { create(:user, login: "to_remove") }
let(:other) { create(:user, login: "other") }
let!(:work) do
create(:work, authors: [to_remove.default_pseud, other.default_pseud])
end
let!(:solo_chapter) do
create(:chapter, work: work, authors: [to_remove.default_pseud])
end
let!(:series) do
create(:series,
works: [work],
authors: [to_remove.default_pseud, other.default_pseud])
end
# Make sure we see the newest chapter:
before { series.reload }
it "sets the chapter's and the work's creators" do
series.remove_author(to_remove)
expect(series.pseuds.reload).to contain_exactly(other.default_pseud)
expect(work.pseuds.reload).to contain_exactly(other.default_pseud)
expect(solo_chapter.pseuds.reload).to contain_exactly(other.default_pseud)
end
end
end
end