otwarchive-symphonyarchive/spec/lib/works_owner_spec.rb

231 lines
7.9 KiB
Ruby
Raw Permalink Normal View History

2026-03-11 22:22:11 +00:00
require 'spec_helper'
describe WorksOwner do
before do
@tag = Tag.new
@tag.id = 666
@time = "2013-09-27 19:14:18 -0400".to_datetime
@time_string = @time.to_i.to_s
travel_to(@time)
@tag.update_works_index_timestamp!
travel_back
end
describe "works_index_timestamp" do
it "should retrieve the owner's timestamp" do
expect(@tag.works_index_timestamp).to eq(@time_string)
end
end
describe "works_index_cache_key" do
it "should return the full cache key" do
expect(@tag.works_index_cache_key).to eq("works_index_for_tag_666_#{@time_string}")
end
it "should accept a tag argument and return the tag's timestamp" do
collection = Collection.new
collection.id = 42
expect(collection.works_index_cache_key(@tag)).to eq("works_index_for_collection_42_tag_666_#{@time_string}")
end
end
describe "update_works_index_timestamp!" do
it "should update the timestamp for the owner" do
@tag.update_works_index_timestamp!
expect(@tag.works_index_timestamp).not_to eq(@time_string)
end
end
describe "index_cache_key" do
shared_examples_for "an owner" do
it "should change after a work is updated" do
@work.save
expect(@original_cache_key).not_to eq(@owner.works_index_cache_key)
end
it "should change after a work is deleted" do
if @owner.class.name == "Collection"
travel_to(10.minutes.ago)
@work.add_to_collection(@owner)
@original_cache_key = @owner.works_index_cache_key
travel_back
end
@work.destroy
expect(@original_cache_key).not_to eq(@owner.works_index_cache_key)
end
end
shared_examples_for "an owner tag" do
it "should change after a new work is created" do
FactoryBot.create(:work, fandom_string: @owner.name)
expect(@original_cache_key).not_to eq(@owner.works_index_cache_key)
end
end
shared_examples_for "an owner collection" do
it "should change after a new work is created" do
FactoryBot.create(:work, collection_names: @owner.name)
@owner.collection_items.each {|ci| ci.approve(nil); ci.save}
@child.collection_items.each {|ci| ci.approve(nil); ci.save} if @child
expect(@original_cache_key).not_to eq(@owner.works_index_cache_key)
end
end
shared_examples_for "an owner user" do
it "should change after a new work is created" do
author = @owner.is_a?(Pseud) ? @owner : @owner.default_pseud
FactoryBot.create(:work, authors: [author])
expect(@original_cache_key).not_to eq(@owner.works_index_cache_key)
end
it "should change after a work is orphaned" do
# Ensure that the orphan account exists:
build(:user, login: "orphan_account").save
author = @owner.is_a?(Pseud) ? @owner : @owner.default_pseud
Creatorship.orphan([author], [@work])
expect(@original_cache_key).not_to eq(@owner.works_index_cache_key)
end
end
describe "for a canonical tag" do
before do
travel_to(10.minutes.ago)
@owner = FactoryBot.create(:fandom, canonical: true)
@work = FactoryBot.create(:work, fandom_string: @owner.name)
@original_cache_key = @owner.works_index_cache_key
travel_back
end
it_should_behave_like "an owner"
it_should_behave_like "an owner tag"
describe "with a synonym" do
before do
travel_to(10.minutes.ago)
@syn_tag = FactoryBot.create(:fandom, canonical: false)
@syn_tag.syn_string = @owner.name
@syn_tag.save
@work2 = @work
@work = FactoryBot.create(:work, fandom_string: @syn_tag.name)
@original_cache_key = @owner.works_index_cache_key
travel_back
end
it_should_behave_like "an owner"
it_should_behave_like "an owner tag"
it "should change after a new work is created in the synonym" do
FactoryBot.create(:work, fandom_string: @syn_tag.name)
expect(@original_cache_key).not_to eq(@owner.works_index_cache_key)
end
end
end
describe "for a collection" do
before do
travel_to(10.minutes.ago)
@owner = FactoryBot.create(:collection)
@work = FactoryBot.create(:work, collection_names: @owner.name)
# we have to approve the collection items before we get a change in
# the cache key, since it uses approved works
@owner.collection_items.each {|ci| ci.approve(nil); ci.save}
@original_cache_key = @owner.works_index_cache_key
travel_back
end
it_should_behave_like "an owner"
it_should_behave_like "an owner collection"
describe "with a child" do
before do
travel_to(10.minutes.ago)
@owner = FactoryBot.create(:collection)
# Temporarily set User.current_user to get past the collection
# needing to be owned by same person as parent:
User.current_user = @owner.owners.first.user
@child = FactoryBot.create(:collection, parent_name: @owner.name)
User.current_user = nil
# reload the parent collection
@owner.reload
@work1 = @work
@work = FactoryBot.create(:work, collection_names: @child.name)
@child.collection_items.each {|ci| ci.approve(nil); ci.save}
@original_cache_key = @owner.works_index_cache_key
travel_back
end
it_should_behave_like "an owner"
it_should_behave_like "an owner collection"
end
describe "with a subtag" do
before do
@fandom = FactoryBot.create(:fandom)
@work.fandom_string = @fandom.name
@work.save
@original_cache_key = @owner.works_index_cache_key(@fandom)
@original_cache_key_without_subtag = @owner.works_index_cache_key
end
it "should have a different key than without the subtag" do
expect(@original_cache_key).not_to eq(@original_cache_key_without_subtag)
end
describe "when a new work is added with that tag" do
before do
travel_to(1.second.from_now)
@work2 = FactoryBot.create(:work, fandom_string: @fandom.name, collection_names: @owner.name)
@owner.collection_items.each {|ci| ci.approve(nil); ci.save}
travel_back
end
it "should update both the cache keys" do
expect(@original_cache_key_without_subtag).not_to eq(@owner.works_index_cache_key)
# @original_cache_key.should_not eq(@owner.works_index_cache_key(@fandom))
end
end
describe "when a new work is added without that tag" do
before do
@fandom2 = FactoryBot.create(:fandom)
travel_to(1.second.from_now)
@work2 = FactoryBot.create(:work, fandom_string: @fandom2.name, collection_names: @owner.name)
@owner.collection_items.each { |ci| ci.approve(nil); ci.save }
travel_back
end
it "should update the main cache key without the tag" do
expect(@original_cache_key_without_subtag).not_to eq(@owner.works_index_cache_key)
end
it "should not update the cache key with the tag" do
expect(@owner.works_index_cache_key(@fandom)).to eq(@original_cache_key)
end
end
end
end
describe "for a user" do
before do
@owner = FactoryBot.create(:user)
@work = FactoryBot.create(:work, authors: [@owner.default_pseud])
end
it_should_behave_like "an owner"
it_should_behave_like "an owner user"
end
describe "for a pseud" do
before do
user = FactoryBot.create(:user)
@owner = FactoryBot.create(:pseud, user: user)
@work = FactoryBot.create(:work, authors: [@owner])
end
it_should_behave_like "an owner"
it_should_behave_like "an owner user"
end
end
end