otwarchive-symphonyarchive/spec/helpers/application_helper_spec.rb
2026-03-11 22:22:11 +00:00

388 lines
14 KiB
Ruby

# frozen_string_literal: true
require "spec_helper"
describe ApplicationHelper do
describe "#creation_id_for_css_classes" do
context "when creation is ExternalWork" do
let(:external_work) { create(:external_work) }
it "returns string for exteral work" do
result = helper.creation_id_for_css_classes(external_work)
expect(result).to eq("external-work-#{external_work.id}")
end
end
context "when creation is Series" do
let(:series) { create(:series) }
it "returns string for series" do
result = helper.creation_id_for_css_classes(series)
expect(result).to eq("series-#{series.id}")
end
end
context "when creation is Work" do
let(:work) { create(:work) }
it "returns string for work" do
result = helper.creation_id_for_css_classes(work)
expect(result).to eq("work-#{work.id}")
end
end
end
describe "#creator_ids_for_css_classes" do
context "when creation is ExternalWork" do
let(:external_work) { create(:external_work) }
it "returns empty array for exteral work" do
result = helper.creator_ids_for_css_classes(external_work)
expect(result).to be_empty
end
end
context "when creation is Series" do
let(:series) { create(:series_with_a_work) }
let(:user1) { series.users.first }
let(:work) { series.works.first }
it "returns array of strings for series" do
result = helper.creator_ids_for_css_classes(series)
expect(result).to eq(["user-#{user1.id}"])
end
context "with multiple pseuds from same user" do
let(:user1_pseud2) { create(:pseud, user: user1) }
before do
series.creatorships.find_or_create_by(pseud_id: user1_pseud2.id)
end
it "returns array of strings with one user" do
result = helper.creator_ids_for_css_classes(series)
expect(result).to eq(["user-#{user1.id}"])
end
end
context "with pseuds from multiple users" do
let(:user2) { create(:user) }
before do
series.creatorships.find_or_create_by(pseud_id: user2.default_pseud_id)
series.pseuds.reload # load pseuds
end
it "returns array of strings with all users" do
result = helper.creator_ids_for_css_classes(series)
expect(result).to eq(["user-#{user1.id}", "user-#{user2.id}"])
end
end
context "when series is anonymous" do
let(:collection) { create(:anonymous_collection) }
before { work.collections << collection }
it "returns empty array" do
result = helper.creator_ids_for_css_classes(series)
expect(result).to be_empty
end
end
context "when work is unrevealed" do
let(:collection) { create(:unrevealed_collection) }
before { work.collections << collection }
it "returns array of strings" do
result = helper.creator_ids_for_css_classes(series)
expect(result).to eq(["user-#{user1.id}"])
end
end
end
context "when creation is Work" do
let(:work) { create(:work) }
let(:user1) { work.users.first }
it "returns array of strings for work" do
result = helper.creator_ids_for_css_classes(work)
expect(result).to eq(["user-#{user1.id}"])
end
context "with multiple pseuds from same user" do
let(:user1_pseud2) { create(:pseud, user: user1) }
before do
work.creatorships.find_or_create_by(pseud_id: user1_pseud2.id)
end
it "returns array of strings with one user" do
result = helper.creator_ids_for_css_classes(work)
expect(result).to eq(["user-#{user1.id}"])
end
end
context "with pseuds from multiple users" do
let(:user2) { create(:user) }
before do
work.creatorships.find_or_create_by(pseud_id: user2.default_pseud_id)
work.pseuds.reload # load pseuds
end
it "returns array of strings with all users" do
result = helper.creator_ids_for_css_classes(work)
expect(result).to eq(["user-#{user1.id}", "user-#{user2.id}"])
end
end
context "when work is anonymous" do
let(:collection) { create(:anonymous_collection) }
before { work.collections << collection }
it "returns empty array" do
result = helper.creator_ids_for_css_classes(work)
expect(result).to be_empty
end
end
context "when work is unrevealed" do
let(:collection) { create(:unrevealed_collection) }
before { work.collections << collection }
it "returns empty array" do
result = helper.creator_ids_for_css_classes(work)
expect(result).to be_empty
end
end
context "when work has external author" do
let(:external_creatorship) { create(:external_creatorship, work: work) }
it "returns array of strings with user" do
result = helper.creator_ids_for_css_classes(work)
expect(result).to eq(["user-#{user1.id}"])
end
end
context "when work has no user" do
before do
work.creatorships.delete_all
work.pseuds.reload
end
it "returns empty array" do
result = helper.creator_ids_for_css_classes(work)
expect(result).to be_empty
end
end
end
end
describe "#css_classes_for_creation_blurb" do
let(:default_classes) { "blurb group" }
context "when creation is ExternalWork" do
let(:external_work) { create(:external_work) }
it "returns string with default classes and creation info" do
result = helper.css_classes_for_creation_blurb(external_work)
expect(result).to eq("#{default_classes} external-work-#{external_work.id}")
end
end
context "when creation is Series" do
let(:series) { create(:series_with_a_work) }
let(:work) { series.works.first }
let(:user1) { series.users.first }
let(:user2) { create(:user) }
it "returns string with default classes and creation and creator info" do
result = helper.css_classes_for_creation_blurb(series)
expect(result).to eq("#{default_classes} series-#{series.id} user-#{user1.id}")
end
context "when series is updated" do
context "when new user is added" do
it "returns updated string" do
original_cache_key = "#{series.cache_key_with_version}/blurb_css_classes-v2"
expect(helper.css_classes_for_creation_blurb(series)).to eq("#{default_classes} series-#{series.id} user-#{user1.id}")
travel(1.day)
series.creatorships.find_or_create_by(pseud_id: user2.default_pseud_id)
expect(helper.css_classes_for_creation_blurb(series.reload)).to eq("#{default_classes} series-#{series.id} user-#{user1.id} user-#{user2.id}")
expect(original_cache_key).not_to eq("#{series.cache_key_with_version}/blurb_css_classes-v2")
travel_back
end
end
context "when user is removed from series" do
before do
series.creatorships.find_or_create_by(pseud_id: user2.default_pseud_id)
series.pseuds.reload
end
it "returns updated string" do
original_cache_key = "#{series.cache_key_with_version}/blurb_css_classes-v2"
expect(helper.css_classes_for_creation_blurb(series)).to eq("#{default_classes} series-#{series.id} user-#{user1.id} user-#{user2.id}")
travel(1.day)
series.creatorships.find_by(pseud_id: user2.default_pseud_id).destroy
expect(helper.css_classes_for_creation_blurb(series.reload)).to eq("#{default_classes} series-#{series.id} user-#{user1.id}")
expect(original_cache_key).not_to eq("#{series.cache_key_with_version}/blurb_css_classes-v2")
travel_back
end
end
end
context "when series' work is updated" do
context "when new user is added to series' work" do
it "returns updated string" do
original_cache_key = "#{series.cache_key_with_version}/blurb_css_classes-v2"
expect(helper.css_classes_for_creation_blurb(series)).to eq("#{default_classes} series-#{series.id} user-#{user1.id}")
travel(1.day)
work.creatorships.find_or_create_by(pseud_id: user2.default_pseud_id)
expect(helper.css_classes_for_creation_blurb(series.reload)).to eq("#{default_classes} series-#{series.id} user-#{user1.id} user-#{user2.id}")
expect(original_cache_key).not_to eq("#{series.cache_key_with_version}/blurb_css_classes-v2")
travel_back
end
end
context "when user is removed from series' work" do
before do
work.creatorships.find_or_create_by(pseud_id: user2.default_pseud_id)
series.reload # make sure the series has the right value for updated_at
end
# TODO: AO3-5739 Co-creators removed from all works in a series are not removed from series
it "returns same string" do
original_cache_key = "#{series.cache_key_with_version}/blurb_css_classes-v2"
expect(helper.css_classes_for_creation_blurb(series)).to eq("#{default_classes} series-#{series.id} user-#{user1.id} user-#{user2.id}")
travel(1.day)
work.creatorships.find_by(pseud_id: user2.default_pseud_id).destroy
expect(helper.css_classes_for_creation_blurb(series.reload)).to eq("#{default_classes} series-#{series.id} user-#{user1.id} user-#{user2.id}")
expect(original_cache_key).to eq("#{series.cache_key_with_version}/blurb_css_classes-v2")
travel_back
end
end
context "when work becomes anonymous" do
let(:collection) { create(:anonymous_collection) }
it "returns updated string" do
original_cache_key = "#{series.cache_key_with_version}/blurb_css_classes-v2"
expect(helper.css_classes_for_creation_blurb(series)).to eq("#{default_classes} series-#{series.id} user-#{user1.id}")
travel(1.day)
work.collections << collection
expect(helper.css_classes_for_creation_blurb(series.reload)).to eq("#{default_classes} series-#{series.id}")
expect(original_cache_key).not_to eq("#{series.cache_key_with_version}/blurb_css_classes-v2")
travel_back
end
end
context "when work becomes unrevealed" do
let(:collection) { create(:unrevealed_collection) }
it "returns same string" do
original_cache_key = "#{series.cache_key_with_version}/blurb_css_classes-v2"
expect(helper.css_classes_for_creation_blurb(series)).to eq("#{default_classes} series-#{series.id} user-#{user1.id}")
travel(1.day)
work.collections << collection
expect(helper.css_classes_for_creation_blurb(series.reload)).to eq("#{default_classes} series-#{series.id} user-#{user1.id}")
expect(original_cache_key).to eq("#{series.cache_key_with_version}/blurb_css_classes-v2")
travel_back
end
end
end
end
context "when creation is Work" do
let(:work) { create(:work) }
let(:user1) { work.users.first }
let(:user2) { create(:user) }
it "returns string with default classes and creation and creator info" do
result = helper.css_classes_for_creation_blurb(work)
expect(result).to eq("#{default_classes} work-#{work.id} user-#{user1.id}")
end
context "when new user is added" do
it "returns updated string" do
travel_to(1.day.ago)
original_cache_key = "#{work.cache_key_with_version}/blurb_css_classes-v2"
expect(helper.css_classes_for_creation_blurb(work)).to eq("#{default_classes} work-#{work.id} user-#{user1.id}")
travel_back
work.creatorships.find_or_create_by(pseud_id: user2.default_pseud_id)
work.pseuds.reload
expect(helper.css_classes_for_creation_blurb(work)).to eq("#{default_classes} work-#{work.id} user-#{user1.id} user-#{user2.id}")
expect(original_cache_key).not_to eq("#{work.cache_key_with_version}/blurb_css_classes-v2")
end
end
context "when user is removed" do
it "returns updated string" do
travel_to(1.day.ago)
work.creatorships.find_or_create_by(pseud_id: user2.default_pseud_id)
work.pseuds.reload
original_cache_key = "#{work.cache_key_with_version}/blurb_css_classes-v2"
expect(helper.css_classes_for_creation_blurb(work)).to eq("#{default_classes} work-#{work.id} user-#{user1.id} user-#{user2.id}")
travel_back
work.creatorships.find_by(pseud_id: user2.default_pseud_id).destroy
expect(helper.css_classes_for_creation_blurb(work.reload)).to eq("#{default_classes} work-#{work.id} user-#{user1.id}")
expect(original_cache_key).not_to eq("#{work.cache_key_with_version}/blurb_css_classes-v2")
end
end
context "when work becomes anonymous" do
let(:collection) { create(:anonymous_collection) }
it "returns updated string" do
travel_to(1.day.ago)
original_cache_key = "#{work.cache_key_with_version}/blurb_css_classes-v2"
expect(helper.css_classes_for_creation_blurb(work)).to eq("#{default_classes} work-#{work.id} user-#{user1.id}")
travel_back
work.collections << collection
expect(helper.css_classes_for_creation_blurb(work)).to eq("#{default_classes} work-#{work.id}")
expect(original_cache_key).not_to eq("#{work.cache_key_with_version}/blurb_css_classes-v2")
end
end
context "when work becomes unrevealed" do
let(:collection) { create(:unrevealed_collection) }
it "returns updated string" do
travel_to(1.day.ago)
original_cache_key = "#{work.cache_key_with_version}/blurb_css_classes-v2"
expect(helper.css_classes_for_creation_blurb(work)).to eq("#{default_classes} work-#{work.id} user-#{user1.id}")
travel_back
work.collections << collection
expect(helper.css_classes_for_creation_blurb(work)).to eq("#{default_classes} work-#{work.id}")
expect(original_cache_key).not_to eq("#{work.cache_key_with_version}/blurb_css_classes-v2")
end
end
end
end
describe "#first_paragraph" do
it "extracts first paragraph" do
expect(first_paragraph("<p>first</p><p>second</p>")).to eq("<p>first</p>")
end
end
end