171 lines
5.2 KiB
Ruby
171 lines
5.2 KiB
Ruby
|
|
require 'spec_helper'
|
||
|
|
|
||
|
|
def update_collection_setting(collection, setting, value)
|
||
|
|
collection.collection_preference.send("#{setting}=", value)
|
||
|
|
collection.collection_preference.save
|
||
|
|
end
|
||
|
|
|
||
|
|
describe Collectible do
|
||
|
|
|
||
|
|
# TO-DO: update this to test the code for all types of collectibles,
|
||
|
|
# bookmarks, works, etc
|
||
|
|
|
||
|
|
it "should not be put into a nonexistent collection" do
|
||
|
|
fake_name = "blah_blah_blah_not_an_existing_name"
|
||
|
|
work = create(:work)
|
||
|
|
work.collection_names = fake_name
|
||
|
|
expect(work.errors[:base].first).to match("find") # use a very basic part of the error message
|
||
|
|
expect(work.errors[:base].first).to match(fake_name)
|
||
|
|
expect(work.save).to be_truthy
|
||
|
|
work.reload
|
||
|
|
expect(work.collection_names).not_to include(fake_name)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should return collections for approved_collections scope" do
|
||
|
|
work = create(:work)
|
||
|
|
collection1 = create(:collection)
|
||
|
|
collection2 = create(:collection)
|
||
|
|
|
||
|
|
work.collections << [collection1, collection2]
|
||
|
|
work.collection_items.update_all(
|
||
|
|
user_approval_status: "approved",
|
||
|
|
collection_approval_status: "approved"
|
||
|
|
)
|
||
|
|
|
||
|
|
expect(work.approved_collections.count).to eq(2)
|
||
|
|
expect(work.approved_collections).to include(collection1)
|
||
|
|
expect(work.approved_collections).to include(collection2)
|
||
|
|
end
|
||
|
|
|
||
|
|
context "approved_collections have more than one work" do
|
||
|
|
it "should return distinct collections for approved_collections scope" do
|
||
|
|
work1 = create(:work)
|
||
|
|
work2 = create(:work)
|
||
|
|
|
||
|
|
collection = create(:collection)
|
||
|
|
|
||
|
|
work1.collections << [collection]
|
||
|
|
work2.collections << [collection]
|
||
|
|
|
||
|
|
work1.collection_items.first.update!(
|
||
|
|
user_approval_status: "approved",
|
||
|
|
collection_approval_status: "approved"
|
||
|
|
)
|
||
|
|
|
||
|
|
work2.collection_items.first.update!(
|
||
|
|
user_approval_status: "approved",
|
||
|
|
collection_approval_status: "approved"
|
||
|
|
)
|
||
|
|
|
||
|
|
expect(work1.approved_collections.count).to eq(1)
|
||
|
|
expect(work2.approved_collections.count).to eq(1)
|
||
|
|
|
||
|
|
expect(work1.approved_collections).to include(collection)
|
||
|
|
expect(work2.approved_collections).to include(collection)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "being posted to a collection" do
|
||
|
|
let(:collection) { create(:collection) }
|
||
|
|
# build but don't save so we can change the collection settings
|
||
|
|
let(:work) { build(:work, collection_names: collection.name) }
|
||
|
|
subject { work }
|
||
|
|
|
||
|
|
context "once added" do
|
||
|
|
|
||
|
|
it "should be in that collection" do
|
||
|
|
work.save
|
||
|
|
expect(work.collections).to include(collection)
|
||
|
|
expect(collection.works).to include(work)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should be removable" do
|
||
|
|
# collection_names= exercises collections_to_(add/remove) methods
|
||
|
|
work.collection_names = ""
|
||
|
|
work.save
|
||
|
|
expect(work.collections).not_to include(collection)
|
||
|
|
expect(collection.works).not_to include(work)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should be automatically approved when there is no current user" do
|
||
|
|
work.save
|
||
|
|
expect(work.approved_collections).to include(collection)
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
{
|
||
|
|
unrevealed: :in_unrevealed_collection,
|
||
|
|
anonymous: :in_anon_collection
|
||
|
|
}.each_pair do |state, work_attribute|
|
||
|
|
context "which is #{state}" do
|
||
|
|
before do
|
||
|
|
# set the state of the collection and then save to put the work into the collection
|
||
|
|
collection.collection_preference.attributes = { state => true }
|
||
|
|
collection.collection_preference.save!
|
||
|
|
work.save!
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should be #{state}" do
|
||
|
|
expect(work.reload.send(work_attribute)).to be_truthy
|
||
|
|
end
|
||
|
|
|
||
|
|
context "and when the collection is no longer #{state}" do
|
||
|
|
before do
|
||
|
|
collection.collection_preference.attributes = { state => false }
|
||
|
|
collection.collection_preference.save!
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should not be #{state}" do
|
||
|
|
expect(collection.send("#{state}?")).to be_falsey
|
||
|
|
expect(work.reload.send(work_attribute)).to be_falsey
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "when the collectible's owner removes it from the collection" do
|
||
|
|
before do
|
||
|
|
work.collection_names = ""
|
||
|
|
work.save!
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should not be #{state}" do
|
||
|
|
expect(work.reload.send(work_attribute)).to be_falsey
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "when the collection item is destroyed" do
|
||
|
|
before do
|
||
|
|
ci = CollectionItem.find_by(item: work, collection: collection)
|
||
|
|
ci.destroy
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should not be #{state}" do
|
||
|
|
expect(work.reload.send(work_attribute)).to be_falsey
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "when the collection is destroyed" do
|
||
|
|
before { collection.destroy }
|
||
|
|
|
||
|
|
it "should not be #{state}" do
|
||
|
|
expect(work.reload.send(work_attribute)).to be_falsey
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "when the work's collection item is individually changed" do
|
||
|
|
before do
|
||
|
|
ci = CollectionItem.find_by(item: work, collection: collection)
|
||
|
|
ci.attributes = { state => false }
|
||
|
|
ci.save!
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should no longer be #{state}" do
|
||
|
|
expect(work.reload.send(work_attribute)).to be_falsey
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|