diff --git a/lib/hydra/pcdm.rb b/lib/hydra/pcdm.rb index 3205c96c..51fce364 100644 --- a/lib/hydra/pcdm.rb +++ b/lib/hydra/pcdm.rb @@ -24,6 +24,9 @@ module PCDM autoload :GetCollectionsFromCollection, 'hydra/pcdm/services/collection/get_collections' autoload :GetObjectsFromCollection, 'hydra/pcdm/services/collection/get_objects' autoload :GetRelatedObjectsFromCollection, 'hydra/pcdm/services/collection/get_related_objects' + autoload :RemoveCollectionFromCollection, 'hydra/pcdm/services/collection/remove_collection' + autoload :RemoveObjectFromCollection, 'hydra/pcdm/services/collection/remove_object' + autoload :RemoveRelatedObjectFromCollection, 'hydra/pcdm/services/collection/remove_related_object' # object services autoload :AddFileToObject, 'hydra/pcdm/services/object/add_file' @@ -33,6 +36,8 @@ module PCDM autoload :GetObjectsFromObject, 'hydra/pcdm/services/object/get_objects' autoload :GetRelatedObjectsFromObject, 'hydra/pcdm/services/object/get_related_objects' autoload :GetFilesFromObject, 'hydra/pcdm/services/object/get_collections' + autoload :RemoveObjectFromObject, 'hydra/pcdm/services/object/remove_object' + autoload :RemoveRelatedObjectFromObject, 'hydra/pcdm/services/object/remove_related_object' # model validations diff --git a/lib/hydra/pcdm/services/collection/get_related_objects.rb b/lib/hydra/pcdm/services/collection/get_related_objects.rb index 4c88dea8..ad472793 100644 --- a/lib/hydra/pcdm/services/collection/get_related_objects.rb +++ b/lib/hydra/pcdm/services/collection/get_related_objects.rb @@ -10,8 +10,7 @@ class GetRelatedObjectsFromCollection def self.call( parent_collection ) raise ArgumentError, "parent_collection must be a pcdm collection" unless Hydra::PCDM.collection? parent_collection - - parent_collection.related_objects + parent_collection.related_objects.to_a end end diff --git a/lib/hydra/pcdm/services/collection/remove_collection.rb b/lib/hydra/pcdm/services/collection/remove_collection.rb new file mode 100644 index 00000000..344bc1ea --- /dev/null +++ b/lib/hydra/pcdm/services/collection/remove_collection.rb @@ -0,0 +1,33 @@ +module Hydra::PCDM + class RemoveCollectionFromCollection + + ## + # Remove a collection from a collection. + # + # @param [Hydra::PCDM::Collection] :parent_collection from which to remove collection + # @param [Hydra::PCDM::Collection] :child_collection being removed + # + # @return [Hydra::PCDM::Collection] the updated pcdm collection + + def self.call( parent_collection, child_collection ) + raise ArgumentError, "parent_collection must be a pcdm collection" unless Hydra::PCDM.collection? parent_collection + raise ArgumentError, "child_collection must be a pcdm collection" unless Hydra::PCDM.collection? child_collection + + + # TODO FIX when members is empty, members.delete raises ActiveFedora::ObjectNotFoundError "Can't reload an object that hasn't been saved" (activefedora-aggregation issue #35) + + # TODO members.delete should... (issue #103)(activefedora-aggregation issue #34) + # * return child_collection when successful delete + # * return nil if child_collection does not exist in parent_collection + # * raise error for any other problems + + # parent_collection.members.delete child_collection # TODO Uncomment + + return nil unless Hydra::PCDM::GetCollectionsFromCollection.call( parent_collection ).include? child_collection # TODO Remove + removed_collection = parent_collection.members.delete child_collection # TODO Remove + removed_collection = removed_collection.first if removed_collection.is_a? Array # TODO Remove + removed_collection # TODO Remove + end + + end +end diff --git a/lib/hydra/pcdm/services/collection/remove_object.rb b/lib/hydra/pcdm/services/collection/remove_object.rb new file mode 100644 index 00000000..c64dc9b5 --- /dev/null +++ b/lib/hydra/pcdm/services/collection/remove_object.rb @@ -0,0 +1,40 @@ +module Hydra::PCDM + class RemoveObjectFromCollection + + ## + # Remove an object from a collection. + # + # @param [Hydra::PCDM::Collection] :parent_collection from which to remove object + # @param [Hydra::PCDM::Object] :child_object being removed + # @param [Fixnum] :nth_occurrence remove nth occurrence of this object in the list (default=1) + # + # @return [Hydra::PCDM::Collection] the updated pcdm collection + + def self.call( parent_collection, child_object, nth_occurrence=1 ) + raise ArgumentError, "parent_collection must be a pcdm collection" unless Hydra::PCDM.collection? parent_collection + raise ArgumentError, "child_object must be a pcdm object" unless Hydra::PCDM.object? child_object + + + # TODO FIX when members is empty, members.delete raises ActiveFedora::ObjectNotFoundError "Can't reload an object that hasn't been saved" (activefedora-aggregation issue #35) + + # TODO members.delete should... (issue #103)(activefedora-aggregation issue #34) + # * return child_object when successful delete + # * return nil if child_object does not exist in parent_collection + # * raise error for any other problems + + # parent_collection.members.delete child_object # TODO Uncomment + + return nil unless parent_collection.members.include? child_object # TODO Remove + removed_object = parent_collection.members.delete child_object # TODO Remove + removed_object = removed_object.first if removed_object.is_a? Array # TODO Remove + removed_object # TODO Remove + + + # TODO -- The same object may be in the list multiple times. (issue #102) + # * How to remove nth occurrence? + # * Default to removing 1st occurrence from the beginning of the list. + + end + + end +end diff --git a/lib/hydra/pcdm/services/collection/remove_related_object.rb b/lib/hydra/pcdm/services/collection/remove_related_object.rb new file mode 100644 index 00000000..1867d4b5 --- /dev/null +++ b/lib/hydra/pcdm/services/collection/remove_related_object.rb @@ -0,0 +1,33 @@ +module Hydra::PCDM + class RemoveRelatedObjectFromCollection + + ## + # Remove an object from a collection. + # + # @param [Hydra::PCDM::Collection] :parent_collection from which to remove the related object + # @param [Hydra::PCDM::Object] :child_related_object being removed + # + # @return [Hydra::PCDM::Collection] the updated pcdm collection + + def self.call( parent_collection, child_related_object ) + raise ArgumentError, "parent_collection must be a pcdm collection" unless Hydra::PCDM.collection? parent_collection + raise ArgumentError, "child_related_object must be a pcdm object" unless Hydra::PCDM.object? child_related_object + + + # TODO FIX when related_objects is empty, related_objects.delete raises ActiveFedora::ObjectNotFoundError "Can't reload an object that hasn't been saved" (activefedora-aggregation issue #35) + + # TODO members.delete should... (issue #103)(activefedora-aggregation issue #34) + # * return child_collection when successful delete + # * return nil if child_collection does not exist in parent_collection + # * raise error for any other problems + + # parent_collection.related_objects.delete child_related_object # TODO Uncomment + + return nil unless Hydra::PCDM::GetRelatedObjectsFromCollection.call( parent_collection ).include? child_related_object # TODO Remove + removed_related_object = parent_collection.related_objects.delete child_related_object # TODO Remove + removed_related_object = removed_related_object.first if removed_related_object.is_a? Array # TODO Remove + removed_related_object # TODO Remove + end + + end +end diff --git a/lib/hydra/pcdm/services/object/get_related_objects.rb b/lib/hydra/pcdm/services/object/get_related_objects.rb index 7c2c2806..13d940c1 100644 --- a/lib/hydra/pcdm/services/object/get_related_objects.rb +++ b/lib/hydra/pcdm/services/object/get_related_objects.rb @@ -10,8 +10,7 @@ class GetRelatedObjectsFromObject def self.call( parent_object ) raise ArgumentError, "parent_object must be a pcdm object" unless Hydra::PCDM.object? parent_object - - parent_object.related_objects + parent_object.related_objects.to_a end end diff --git a/lib/hydra/pcdm/services/object/remove_object.rb b/lib/hydra/pcdm/services/object/remove_object.rb new file mode 100644 index 00000000..63d2af53 --- /dev/null +++ b/lib/hydra/pcdm/services/object/remove_object.rb @@ -0,0 +1,40 @@ +module Hydra::PCDM + class RemoveObjectFromObject + + ## + # Remove an object from an object. + # + # @param [Hydra::PCDM::Object] :parent_object from which to remove object + # @param [Hydra::PCDM::Object] :child_object being removed + # @param [Fixnum] :nth_occurrence remove nth occurrence of this object in the list (default=1) + # + # @return [Hydra::PCDM::Object] the updated pcdm object + + def self.call( parent_object, child_object, nth_occurrence=1 ) + raise ArgumentError, "parent_object must be a pcdm object" unless Hydra::PCDM.object? parent_object + raise ArgumentError, "child_object must be a pcdm object" unless Hydra::PCDM.object? child_object + + + # TODO FIX when members is empty, members.delete raises ActiveFedora::ObjectNotFoundError "Can't reload an object that hasn't been saved" (activefedora-aggregation issue #35) + + # TODO members.delete should... (issue #103)(activefedora-aggregation issue #34) + # * return child_object when successful delete + # * return nil if child_object does not exist in parent_object + # * raise error for any other problems + + # parent_object.members.delete child_object # TODO Uncomment + + return nil unless parent_object.members.include? child_object # TODO Remove + removed_object = parent_object.members.delete child_object # TODO Remove + removed_object = removed_object.first if removed_object.is_a? Array # TODO Remove + removed_object # TODO Remove + + + # TODO -- The same object may be in the list multiple times. (issue #102) + # * How to remove nth occurrence? + # * Default to removing 1st occurrence from the beginning of the list. + + end + + end +end diff --git a/lib/hydra/pcdm/services/object/remove_related_object.rb b/lib/hydra/pcdm/services/object/remove_related_object.rb new file mode 100644 index 00000000..3a57988e --- /dev/null +++ b/lib/hydra/pcdm/services/object/remove_related_object.rb @@ -0,0 +1,33 @@ +module Hydra::PCDM + class RemoveRelatedObjectFromObject + + ## + # Remove an object from an object. + # + # @param [Hydra::PCDM::Object] :parent_object from which to remove the related object + # @param [Hydra::PCDM::Object] :child_related_object being removed + # + # @return [Hydra::PCDM::Collection] the updated pcdm collection + + def self.call( parent_object, child_related_object ) + raise ArgumentError, "parent_object must be a pcdm object" unless Hydra::PCDM.object? parent_object + raise ArgumentError, "child_related_object must be a pcdm object" unless Hydra::PCDM.object? child_related_object + + + # TODO FIX when related_objects is empty, related_objects.delete raises ActiveFedora::ObjectNotFoundError "Can't reload an object that hasn't been saved" (activefedora-aggregation issue #35) + + # TODO members.delete should... (issue #103)(activefedora-aggregation issue #34) + # * return child_related_object when successful delete + # * return nil if child_related_object does not exist in parent_object + # * raise error for any other problems + + # parent_object.related_objects.delete child_related_object # TODO Uncomment + + return nil unless Hydra::PCDM::GetRelatedObjectsFromObject.call( parent_object ).include? child_related_object # TODO Remove + removed_related_object = parent_object.related_objects.delete child_related_object # TODO Remove + removed_related_object = removed_related_object.first if removed_related_object.is_a? Array # TODO Remove + removed_related_object # TODO Remove + end + + end +end diff --git a/spec/hydra/pcdm/services/collection/add_collection_spec.rb b/spec/hydra/pcdm/services/collection/add_collection_spec.rb index 94f9f37c..e9e8f887 100644 --- a/spec/hydra/pcdm/services/collection/add_collection_spec.rb +++ b/spec/hydra/pcdm/services/collection/add_collection_spec.rb @@ -31,13 +31,14 @@ expect( Hydra::PCDM::GetCollectionsFromCollection.call( collection1 ) ).to eq [collection2] end - xit 'should allow collections to repeat' do - # TODO Can collections repeat??? + it 'should allow collections to repeat' do + skip 'skipping this test because issue #94 needs to be addressed' do Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 ) Hydra::PCDM::AddCollectionToCollection.call( subject, collection2 ) Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 ) expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject ) ).to eq [collection1,collection2,collection1] end + end context 'with collections and objects' do before do diff --git a/spec/hydra/pcdm/services/collection/add_related_object_spec.rb b/spec/hydra/pcdm/services/collection/add_related_object_spec.rb index 8293af02..052b661c 100644 --- a/spec/hydra/pcdm/services/collection/add_related_object_spec.rb +++ b/spec/hydra/pcdm/services/collection/add_related_object_spec.rb @@ -85,7 +85,8 @@ let(:object1) { Hydra::PCDM::Object.create } let(:object2) { Hydra::PCDM::Object.create } - xit 'should NOT allow related objects to repeat' do + it 'should NOT allow related objects to repeat' do + skip 'skipping this test because issue #92 needs to be addressed' do Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object1 ) Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object2 ) Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object1 ) @@ -94,6 +95,7 @@ expect( related_objects.include? object2 ).to be true expect( related_objects.size ).to eq 2 end + end end end end diff --git a/spec/hydra/pcdm/services/collection/remove_collection_spec.rb b/spec/hydra/pcdm/services/collection/remove_collection_spec.rb new file mode 100644 index 00000000..f49a7f13 --- /dev/null +++ b/spec/hydra/pcdm/services/collection/remove_collection_spec.rb @@ -0,0 +1,143 @@ +require 'spec_helper' + +describe Hydra::PCDM::RemoveCollectionFromCollection do + + subject { Hydra::PCDM::Collection.create } + + let(:collection1) { Hydra::PCDM::Collection.create } + let(:collection2) { Hydra::PCDM::Collection.create } + let(:collection3) { Hydra::PCDM::Collection.create } + let(:collection4) { Hydra::PCDM::Collection.create } + let(:collection5) { Hydra::PCDM::Collection.create } + + let(:object1) { Hydra::PCDM::Object.create } + let(:object2) { Hydra::PCDM::Object.create } + + + describe '#call' do + context 'when it is the only collection' do + + before do + Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 ) + subject.save + expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject.reload )).to eq [collection1] + end + + it 'should remove collection' do + expect( Hydra::PCDM::RemoveCollectionFromCollection.call( subject, collection1 ) ).to eq collection1 + expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject.reload )).to eq [] + end + + it 'should remove collection only when objects' do + Hydra::PCDM::AddObjectToCollection.call( subject, object1 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object2 ) + expect( Hydra::PCDM::RemoveCollectionFromCollection.call( subject, collection1 ) ).to eq collection1 + expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject.reload )).to eq [] + expect( Hydra::PCDM::GetObjectsFromCollection.call( subject )).to eq [object1,object2] + end + end + + context 'when multiple collections' do + before do + Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 ) + Hydra::PCDM::AddCollectionToCollection.call( subject, collection2 ) + Hydra::PCDM::AddCollectionToCollection.call( subject, collection3 ) + Hydra::PCDM::AddCollectionToCollection.call( subject, collection4 ) + Hydra::PCDM::AddCollectionToCollection.call( subject, collection5 ) + subject.save + expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject.reload )).to eq [collection1,collection2,collection3,collection4,collection5] + end + + it 'should remove first collection' do + expect( Hydra::PCDM::RemoveCollectionFromCollection.call( subject, collection1 ) ).to eq collection1 + expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject.reload )).to eq [collection2,collection3,collection4,collection5] + end + + it 'should remove last collection' do + expect( Hydra::PCDM::RemoveCollectionFromCollection.call( subject, collection5 ) ).to eq collection5 + expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject.reload )).to eq [collection1,collection2,collection3,collection4] + end + + it 'should remove middle collection' do + expect( Hydra::PCDM::RemoveCollectionFromCollection.call( subject, collection3 ) ).to eq collection3 + expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject.reload )).to eq [collection1,collection2,collection4,collection5] + end + end + + context 'when collection is missing' do + it 'should return nil' do + subject.save + expect( Hydra::PCDM::RemoveCollectionFromCollection.call( subject.reload, collection1 ) ).to be nil + end + + it 'should return nil' do + Hydra::PCDM::AddObjectToCollection.call( subject, object1 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object2 ) + subject.save + expect( Hydra::PCDM::RemoveCollectionFromCollection.call( subject.reload, collection1 ) ).to be nil + end + + it 'should return nil' do + Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 ) + Hydra::PCDM::AddCollectionToCollection.call( subject, collection2 ) + Hydra::PCDM::AddCollectionToCollection.call( subject, collection4 ) + Hydra::PCDM::AddCollectionToCollection.call( subject, collection5 ) + subject.save + expect( Hydra::PCDM::RemoveCollectionFromCollection.call( subject.reload, collection3 ) ).to be nil + end + end + end + + context 'with unacceptable collections' do + let(:object1) { Hydra::PCDM::Object.create } + let(:file1) { Hydra::PCDM::File.new } + let(:non_PCDM_object) { "I'm not a PCDM object" } + let(:af_base_object) { ActiveFedora::Base.create } + + let(:error_type) { ArgumentError } + let(:error_message) { 'child_collection must be a pcdm collection' } + + it 'should NOT remove Hydra::PCDM::Objects from collections aggregation' do + expect{ Hydra::PCDM::RemoveCollectionFromCollection.call( subject, object1 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT remove Hydra::PCDM::Files from collections aggregation' do + expect{ Hydra::PCDM::RemoveCollectionFromCollection.call( subject, file1 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT remove non-PCDM objects from collections aggregation' do + expect{ Hydra::PCDM::RemoveCollectionFromCollection.call( subject, non_PCDM_object ) }.to raise_error(error_type,error_message) + end + + it 'should NOT remove AF::Base objects from collections aggregation' do + expect{ Hydra::PCDM::RemoveCollectionFromCollection.call( subject, af_base_object ) }.to raise_error(error_type,error_message) + end + end + + context 'with unacceptable parent collection' do + let(:collection2) { Hydra::PCDM::Collection.create } + let(:object1) { Hydra::PCDM::Object.create } + let(:file1) { Hydra::PCDM::File.new } + let(:non_PCDM_object) { "I'm not a PCDM object" } + let(:af_base_object) { ActiveFedora::Base.create } + + let(:error_type) { ArgumentError } + let(:error_message) { 'parent_collection must be a pcdm collection' } + + it 'should NOT accept Hydra::PCDM::Objects as parent collection' do + expect{ Hydra::PCDM::RemoveCollectionFromCollection.call( object1, collection2 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT accept Hydra::PCDM::Files as parent collection' do + expect{ Hydra::PCDM::RemoveCollectionFromCollection.call( file1, collection2 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT accept non-PCDM objects as parent collection' do + expect{ Hydra::PCDM::RemoveCollectionFromCollection.call( non_PCDM_object, collection2 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT accept AF::Base objects as parent collection' do + expect{ Hydra::PCDM::RemoveCollectionFromCollection.call( af_base_object, collection2 ) }.to raise_error(error_type,error_message) + end + end +end diff --git a/spec/hydra/pcdm/services/collection/remove_object_spec.rb b/spec/hydra/pcdm/services/collection/remove_object_spec.rb new file mode 100644 index 00000000..ac81d9c2 --- /dev/null +++ b/spec/hydra/pcdm/services/collection/remove_object_spec.rb @@ -0,0 +1,180 @@ +require 'spec_helper' + +describe Hydra::PCDM::RemoveObjectFromCollection do + + subject { Hydra::PCDM::Collection.create } + + let(:object1) { Hydra::PCDM::Object.create } + let(:object2) { Hydra::PCDM::Object.create } + let(:object3) { Hydra::PCDM::Object.create } + let(:object4) { Hydra::PCDM::Object.create } + let(:object5) { Hydra::PCDM::Object.create } + + let(:collection1) { Hydra::PCDM::Collection.create } + let(:collection2) { Hydra::PCDM::Collection.create } + + describe '#call' do + context 'when it is the only object' do + before do + Hydra::PCDM::AddObjectToCollection.call( subject, object1 ) + subject.save + expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1] + end + + it 'should remove object' do + expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject, object1 ) ).to eq object1 + expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [] + end + + it 'should remove object only when collections' do + Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 ) + Hydra::PCDM::AddCollectionToCollection.call( subject, collection2 ) + expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject, object1 ) ).to eq object1 + expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [] + expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject )).to eq [collection1,collection2] + end + end + + context 'when multiple objects' do + before do + Hydra::PCDM::AddObjectToCollection.call( subject, object1 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object2 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object3 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object4 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object5 ) + subject.save + expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object3,object4,object5] + end + + it 'should remove first object' do + expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject, object1 ) ).to eq object1 + expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object2,object3,object4,object5] + end + + it 'should remove last object' do + expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject, object5 ) ).to eq object5 + expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object3,object4] + end + + it 'should remove middle object' do + expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject, object3 ) ).to eq object3 + expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object4,object5] + end + end + + context 'when object repeats' do + before do + Hydra::PCDM::AddObjectToCollection.call( subject, object1 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object2 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object3 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object2 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object4 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object2 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object5 ) + subject.save + end + + # TODO pending implementation of multiple objects + + it 'should remove first occurrence' do + skip 'skipping this test because issue #102 needs to be addressed' do + expect(Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object3,object2,object4,object2,object5] + expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject, object2 ) ).to eq object2 + expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object3,object2,object4,object2,object5] + end + end + + it 'should remove last occurrence' do + skip 'skipping this test because issue #102 needs to be addressed' do + expect(Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object3,object2,object4,object2,object5] + expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject, object2, -1 ) ).to eq object2 + expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object3,object2,object4,object5] + end + end + + it 'should remove nth occurrence' do + skip 'skipping this test because issue #102 needs to be addressed' do + expect(Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object3,object2,object4,object2,object5] + expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject, object2, 2 ) ).to eq object2 + expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object3,object4,object2,object5] + end + end + end + + context 'when object is missing' do + it 'should return nil' do + subject.save + expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject.reload, object1 )).to be nil + end + + it 'should return nil' do + Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 ) + Hydra::PCDM::AddCollectionToCollection.call( subject, collection2 ) + subject.save + expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject.reload, object1 )).to be nil + end + + it 'should return nil' do + Hydra::PCDM::AddObjectToCollection.call( subject, object1 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object2 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object4 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object5 ) + subject.save + expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject.reload, object3 )).to be nil + end + end + end + + context 'with unacceptable objects' do + let(:collection1) { Hydra::PCDM::Collection.create } + let(:file1) { Hydra::PCDM::File.new } + let(:non_PCDM_object) { "I'm not a PCDM object" } + let(:af_base_object) { ActiveFedora::Base.create } + + let(:error_type) { ArgumentError } + let(:error_message) { 'child_object must be a pcdm object' } + + it 'should NOT remove Hydra::PCDM::Collections from objects aggregation' do + expect{ Hydra::PCDM::RemoveObjectFromCollection.call( subject, collection1 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT remove Hydra::PCDM::Files from objects aggregation' do + expect{ Hydra::PCDM::RemoveObjectFromCollection.call( subject, file1 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT remove non-PCDM objects from objects aggregation' do + expect{ Hydra::PCDM::RemoveObjectFromCollection.call( subject, non_PCDM_object ) }.to raise_error(error_type,error_message) + end + + it 'should NOT remove AF::Base objects from objects aggregation' do + expect{ Hydra::PCDM::RemoveObjectFromCollection.call( subject, af_base_object ) }.to raise_error(error_type,error_message) + end + end + + context 'with unacceptable parent collection' do + let(:collection2) { Hydra::PCDM::Collection.create } + let(:object1) { Hydra::PCDM::Object.create } + let(:file1) { Hydra::PCDM::File.new } + let(:non_PCDM_object) { "I'm not a PCDM object" } + let(:af_base_object) { ActiveFedora::Base.create } + + let(:error_type) { ArgumentError } + let(:error_message) { 'parent_collection must be a pcdm collection' } + + it 'should NOT accept Hydra::PCDM::Objects as parent collection' do + expect{ Hydra::PCDM::RemoveObjectFromCollection.call( object1, collection2 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT accept Hydra::PCDM::Files as parent collection' do + expect{ Hydra::PCDM::RemoveObjectFromCollection.call( file1, collection2 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT accept non-PCDM objects as parent collection' do + expect{ Hydra::PCDM::RemoveObjectFromCollection.call( non_PCDM_object, collection2 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT accept AF::Base objects as parent collection' do + expect{ Hydra::PCDM::RemoveObjectFromCollection.call( af_base_object, collection2 ) }.to raise_error(error_type,error_message) + end + end +end diff --git a/spec/hydra/pcdm/services/collection/remove_related_object_spec.rb b/spec/hydra/pcdm/services/collection/remove_related_object_spec.rb new file mode 100644 index 00000000..40c9ee7b --- /dev/null +++ b/spec/hydra/pcdm/services/collection/remove_related_object_spec.rb @@ -0,0 +1,146 @@ +require 'spec_helper' + +describe Hydra::PCDM::RemoveRelatedObjectFromCollection do + + subject { Hydra::PCDM::Collection.create } + + let(:object1) { Hydra::PCDM::Object.create } + let(:object2) { Hydra::PCDM::Object.create } + let(:object3) { Hydra::PCDM::Object.create } + let(:object4) { Hydra::PCDM::Object.create } + let(:object5) { Hydra::PCDM::Object.create } + + let(:collection1) { Hydra::PCDM::Collection.create } + let(:collection2) { Hydra::PCDM::Collection.create } + + describe '#call' do + context 'when it is the only related object' do + before do + Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object1 ) + subject.save + expect( Hydra::PCDM::GetRelatedObjectsFromCollection.call( subject.reload )).to eq [object1] + end + + it 'should remove related object' do + expect( Hydra::PCDM::RemoveRelatedObjectFromCollection.call( subject, object1 ) ).to eq object1 + expect( Hydra::PCDM::GetRelatedObjectsFromCollection.call( subject.reload )).to eq [] + end + + it 'should remove related object only when objects & collections' do + Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 ) + Hydra::PCDM::AddCollectionToCollection.call( subject, collection2 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object3 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object2 ) + expect( Hydra::PCDM::RemoveRelatedObjectFromCollection.call( subject, object1 ) ).to eq object1 + expect( Hydra::PCDM::GetRelatedObjectsFromCollection.call( subject.reload )).to eq [] + expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject )).to eq [collection1,collection2] + expect( Hydra::PCDM::GetObjectsFromCollection.call( subject )).to eq [object3,object2] + end + end + + context 'when multiple related objects' do + before do + Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object1 ) + Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object2 ) + Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object3 ) + Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object4 ) + Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object5 ) + subject.save + expect( Hydra::PCDM::GetRelatedObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object3,object4,object5] + end + + it 'should remove first related object' do + expect( Hydra::PCDM::RemoveRelatedObjectFromCollection.call( subject, object1 ) ).to eq object1 + expect( Hydra::PCDM::GetRelatedObjectsFromCollection.call( subject.reload )).to eq [object2,object3,object4,object5] + end + + it 'should remove last related object' do + expect( Hydra::PCDM::RemoveRelatedObjectFromCollection.call( subject, object5 ) ).to eq object5 + expect( Hydra::PCDM::GetRelatedObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object3,object4] + end + + it 'should remove middle related object' do + expect( Hydra::PCDM::RemoveRelatedObjectFromCollection.call( subject, object3 ) ).to eq object3 + expect( Hydra::PCDM::GetRelatedObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object4,object5] + end + end + + context 'when related object is missing' do + it 'should return nil' do + subject.save + expect( Hydra::PCDM::RemoveRelatedObjectFromCollection.call( subject.reload, object1 )).to be nil + end + + it 'should return nil' do + Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 ) + Hydra::PCDM::AddCollectionToCollection.call( subject, collection2 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object1 ) + Hydra::PCDM::AddObjectToCollection.call( subject, object2 ) + subject.save + expect( Hydra::PCDM::RemoveRelatedObjectFromCollection.call( subject.reload, object1 )).to be nil + end + + it 'should return nil' do + Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object1 ) + Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object2 ) + Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object4 ) + Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object5 ) + subject.save + expect( Hydra::PCDM::RemoveRelatedObjectFromCollection.call( subject.reload, object3 )).to be nil + end + end + end + + context 'with unacceptable related objects' do + let(:collection1) { Hydra::PCDM::Collection.create } + let(:file1) { Hydra::PCDM::File.new } + let(:non_PCDM_object) { "I'm not a PCDM object" } + let(:af_base_object) { ActiveFedora::Base.create } + + let(:error_type) { ArgumentError } + let(:error_message) { 'child_related_object must be a pcdm object' } + + it 'should NOT remove Hydra::PCDM::Collections from related_objects aggregation' do + expect{ Hydra::PCDM::RemoveRelatedObjectFromCollection.call( subject, collection1 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT remove Hydra::PCDM::Files from related_objects aggregation' do + expect{ Hydra::PCDM::RemoveRelatedObjectFromCollection.call( subject, file1 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT remove non-PCDM objects from related_objects aggregation' do + expect{ Hydra::PCDM::RemoveRelatedObjectFromCollection.call( subject, non_PCDM_object ) }.to raise_error(error_type,error_message) + end + + it 'should NOT remove AF::Base objects from related_objects aggregation' do + expect{ Hydra::PCDM::RemoveRelatedObjectFromCollection.call( subject, af_base_object ) }.to raise_error(error_type,error_message) + end + end + + context 'with unacceptable parent collection' do + let(:object2) { Hydra::PCDM::Object.create } + let(:object1) { Hydra::PCDM::Object.create } + let(:file1) { Hydra::PCDM::File.new } + let(:non_PCDM_object) { "I'm not a PCDM object" } + let(:af_base_object) { ActiveFedora::Base.create } + + let(:error_type) { ArgumentError } + let(:error_message) { 'parent_collection must be a pcdm collection' } + + it 'should NOT accept Hydra::PCDM::Objects as parent collection' do + expect{ Hydra::PCDM::RemoveRelatedObjectFromCollection.call( object1, object2 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT accept Hydra::PCDM::Files as parent collection' do + expect{ Hydra::PCDM::RemoveRelatedObjectFromCollection.call( file1, object2 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT accept non-PCDM objects as parent collection' do + expect{ Hydra::PCDM::RemoveRelatedObjectFromCollection.call( non_PCDM_object, object2 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT accept AF::Base objects as parent collection' do + expect{ Hydra::PCDM::RemoveRelatedObjectFromCollection.call( af_base_object, object2 ) }.to raise_error(error_type,error_message) + end + end +end diff --git a/spec/hydra/pcdm/services/object/add_related_object_spec.rb b/spec/hydra/pcdm/services/object/add_related_object_spec.rb index 1127ea86..58d2fb03 100644 --- a/spec/hydra/pcdm/services/object/add_related_object_spec.rb +++ b/spec/hydra/pcdm/services/object/add_related_object_spec.rb @@ -86,7 +86,8 @@ let(:object1) { Hydra::PCDM::Object.create } let(:object2) { Hydra::PCDM::Object.create } - xit 'should NOT allow related objects to repeat' do + it 'should NOT allow related objects to repeat' do + skip 'skipping this test because issue #92 needs to be addressed' do Hydra::PCDM::AddRelatedObjectToObject.call( subject, object1 ) Hydra::PCDM::AddRelatedObjectToObject.call( subject, object2 ) Hydra::PCDM::AddRelatedObjectToObject.call( subject, object1 ) @@ -95,6 +96,7 @@ expect( related_objects.include? object2 ).to be true expect( related_objects.size ).to eq 2 end + end end end end diff --git a/spec/hydra/pcdm/services/object/remove_object_spec.rb b/spec/hydra/pcdm/services/object/remove_object_spec.rb new file mode 100644 index 00000000..47b36bd8 --- /dev/null +++ b/spec/hydra/pcdm/services/object/remove_object_spec.rb @@ -0,0 +1,158 @@ +require 'spec_helper' + +describe Hydra::PCDM::RemoveObjectFromObject do + + subject { Hydra::PCDM::Object.create } + + let(:object1) { Hydra::PCDM::Object.create } + let(:object2) { Hydra::PCDM::Object.create } + let(:object3) { Hydra::PCDM::Object.create } + let(:object4) { Hydra::PCDM::Object.create } + let(:object5) { Hydra::PCDM::Object.create } + + describe '#call' do + context 'when it is the only object' do + before do + Hydra::PCDM::AddObjectToObject.call( subject, object1 ) + subject.save + expect( Hydra::PCDM::GetObjectsFromObject.call( subject.reload )).to eq [object1] + end + + it 'should remove object' do + expect( Hydra::PCDM::RemoveObjectFromObject.call( subject, object1 ) ).to eq object1 + expect( Hydra::PCDM::GetObjectsFromObject.call( subject.reload )).to eq [] + end + end + + context 'when multiple objects' do + before do + Hydra::PCDM::AddObjectToObject.call( subject, object1 ) + Hydra::PCDM::AddObjectToObject.call( subject, object2 ) + Hydra::PCDM::AddObjectToObject.call( subject, object3 ) + Hydra::PCDM::AddObjectToObject.call( subject, object4 ) + Hydra::PCDM::AddObjectToObject.call( subject, object5 ) + subject.save + expect( Hydra::PCDM::GetObjectsFromObject.call( subject.reload )).to eq [object1,object2,object3,object4,object5] + end + + it 'should remove first object' do + expect( Hydra::PCDM::RemoveObjectFromObject.call( subject, object1 ) ).to eq object1 + expect( Hydra::PCDM::GetObjectsFromObject.call( subject.reload )).to eq [object2,object3,object4,object5] + end + + it 'should remove last object' do + expect( Hydra::PCDM::RemoveObjectFromObject.call( subject, object5 ) ).to eq object5 + expect( Hydra::PCDM::GetObjectsFromObject.call( subject.reload )).to eq [object1,object2,object3,object4] + end + + it 'should remove middle object' do + expect( Hydra::PCDM::RemoveObjectFromObject.call( subject, object3 ) ).to eq object3 + expect( Hydra::PCDM::GetObjectsFromObject.call( subject.reload )).to eq [object1,object2,object4,object5] + end + end + + context 'when object repeats' do + before do + Hydra::PCDM::AddObjectToObject.call( subject, object1 ) + Hydra::PCDM::AddObjectToObject.call( subject, object2 ) + Hydra::PCDM::AddObjectToObject.call( subject, object3 ) + Hydra::PCDM::AddObjectToObject.call( subject, object2 ) + Hydra::PCDM::AddObjectToObject.call( subject, object4 ) + Hydra::PCDM::AddObjectToObject.call( subject, object2 ) + Hydra::PCDM::AddObjectToObject.call( subject, object5 ) + subject.save + expect(Hydra::PCDM::GetObjectsFromObject.call( subject )).to eq [object1,object2,object3,object2,object4,object2,object5] + end + + it 'should remove first occurrence' do + skip 'skipping this test because issue #102 needs to be addressed' do + expect( Hydra::PCDM::RemoveObjectFromObject.call( subject, object2 ) ).to eq object2 + expect( Hydra::PCDM::GetObjectsFromObject.call( subject.reload )).to eq [object1,object3,object2,object4,object2,object5] + end + end + + it 'should remove last occurrence' do + skip 'skipping this test because issue #102 needs to be addressed' do + expect( Hydra::PCDM::RemoveObjectFromObject.call( subject, object2, -1 ) ).to eq object2 + expect( Hydra::PCDM::GetObjectsFromObject.call( subject.reload )).to eq [object1,object2,object3,object2,object4,object5] + end + end + + it 'should remove nth occurrence' do + skip 'skipping this test because issue #102 needs to be addressed' do + expect( Hydra::PCDM::RemoveObjectFromObject.call( subject, object2, 2 ) ).to eq object2 + expect( Hydra::PCDM::GetObjectsFromObject.call( subject.reload )).to eq [object1,object2,object3,object4,object2,object5] + end + end + end + + context 'when object is missing' do + it 'should return nil' do + subject.save + expect( Hydra::PCDM::RemoveObjectFromObject.call( subject.reload, object1 )).to be nil + end + + it 'should return nil' do + Hydra::PCDM::AddObjectToObject.call( subject, object1 ) + Hydra::PCDM::AddObjectToObject.call( subject, object2 ) + Hydra::PCDM::AddObjectToObject.call( subject, object4 ) + Hydra::PCDM::AddObjectToObject.call( subject, object5 ) + subject.save + expect( Hydra::PCDM::RemoveObjectFromObject.call( subject.reload, object3 )).to be nil + end + end + end + + context 'with unacceptable objects' do + let(:collection1) { Hydra::PCDM::Collection.create } + let(:file1) { Hydra::PCDM::File.new } + let(:non_PCDM_object) { "I'm not a PCDM object" } + let(:af_base_object) { ActiveFedora::Base.create } + + let(:error_type) { ArgumentError } + let(:error_message) { 'child_object must be a pcdm object' } + + it 'should NOT remove Hydra::PCDM::Collections from objects aggregation' do + expect{ Hydra::PCDM::RemoveObjectFromObject.call( subject, collection1 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT remove Hydra::PCDM::Files from objects aggregation' do + expect{ Hydra::PCDM::RemoveObjectFromObject.call( subject, file1 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT remove non-PCDM objects from objects aggregation' do + expect{ Hydra::PCDM::RemoveObjectFromObject.call( subject, non_PCDM_object ) }.to raise_error(error_type,error_message) + end + + it 'should NOT remove AF::Base objects from objects aggregation' do + expect{ Hydra::PCDM::RemoveObjectFromObject.call( subject, af_base_object ) }.to raise_error(error_type,error_message) + end + end + + context 'with unacceptable parent object' do + let(:object2) { Hydra::PCDM::Object.create } + let(:collection1) { Hydra::PCDM::Collection.create } + let(:file1) { Hydra::PCDM::File.new } + let(:non_PCDM_object) { "I'm not a PCDM object" } + let(:af_base_object) { ActiveFedora::Base.create } + + let(:error_type) { ArgumentError } + let(:error_message) { 'parent_object must be a pcdm object' } + + it 'should NOT accept Hydra::PCDM::Collections as parent object' do + expect{ Hydra::PCDM::RemoveObjectFromObject.call( collection1, object2 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT accept Hydra::PCDM::Files as parent object' do + expect{ Hydra::PCDM::RemoveObjectFromObject.call( file1, object2 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT accept non-PCDM objects as parent object' do + expect{ Hydra::PCDM::RemoveObjectFromObject.call( non_PCDM_object, object2 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT accept AF::Base objects as parent object' do + expect{ Hydra::PCDM::RemoveObjectFromObject.call( af_base_object, object2 ) }.to raise_error(error_type,error_message) + end + end +end diff --git a/spec/hydra/pcdm/services/object/remove_related_object_spec.rb b/spec/hydra/pcdm/services/object/remove_related_object_spec.rb new file mode 100644 index 00000000..16eb0a8b --- /dev/null +++ b/spec/hydra/pcdm/services/object/remove_related_object_spec.rb @@ -0,0 +1,126 @@ +require 'spec_helper' + +describe Hydra::PCDM::RemoveRelatedObjectFromObject do + + subject { Hydra::PCDM::Object.create } + + let(:object1) { Hydra::PCDM::Object.create } + let(:object2) { Hydra::PCDM::Object.create } + let(:object3) { Hydra::PCDM::Object.create } + let(:object4) { Hydra::PCDM::Object.create } + let(:object5) { Hydra::PCDM::Object.create } + + let(:file1) { Hydra::PCDM::File.new } + let(:file2) { Hydra::PCDM::File.new } + + describe '#call' do + context 'when it is the only related object' do + before do + Hydra::PCDM::AddRelatedObjectToObject.call( subject, object1 ) + subject.save + expect( Hydra::PCDM::GetRelatedObjectsFromObject.call( subject.reload )).to eq [object1] + end + + it 'should remove related object' do + expect( Hydra::PCDM::RemoveRelatedObjectFromObject.call( subject, object1 ) ).to eq object1 + expect( Hydra::PCDM::GetRelatedObjectsFromObject.call( subject.reload )).to eq [] + end + end + + context 'when multiple related objects' do + before do + Hydra::PCDM::AddRelatedObjectToObject.call( subject, object1 ) + Hydra::PCDM::AddRelatedObjectToObject.call( subject, object2 ) + Hydra::PCDM::AddRelatedObjectToObject.call( subject, object3 ) + Hydra::PCDM::AddRelatedObjectToObject.call( subject, object4 ) + Hydra::PCDM::AddRelatedObjectToObject.call( subject, object5 ) + subject.save + expect( Hydra::PCDM::GetRelatedObjectsFromObject.call( subject.reload )).to eq [object1,object2,object3,object4,object5] + end + + it 'should remove first related object' do + expect( Hydra::PCDM::RemoveRelatedObjectFromObject.call( subject, object1 ) ).to eq object1 + expect( Hydra::PCDM::GetRelatedObjectsFromObject.call( subject.reload )).to eq [object2,object3,object4,object5] + end + + it 'should remove last related object' do + expect( Hydra::PCDM::RemoveRelatedObjectFromObject.call( subject, object5 ) ).to eq object5 + expect( Hydra::PCDM::GetRelatedObjectsFromObject.call( subject.reload )).to eq [object1,object2,object3,object4] + end + + it 'should remove middle related object' do + expect( Hydra::PCDM::RemoveRelatedObjectFromObject.call( subject, object3 ) ).to eq object3 + expect( Hydra::PCDM::GetRelatedObjectsFromObject.call( subject.reload )).to eq [object1,object2,object4,object5] + end + end + + context 'when related object is missing' do + it 'should return nil' do + subject.save + expect( Hydra::PCDM::RemoveRelatedObjectFromObject.call( subject.reload, object1 )).to be nil + end + + it 'should return nil' do + Hydra::PCDM::AddRelatedObjectToObject.call( subject, object1 ) + Hydra::PCDM::AddRelatedObjectToObject.call( subject, object2 ) + Hydra::PCDM::AddRelatedObjectToObject.call( subject, object4 ) + Hydra::PCDM::AddRelatedObjectToObject.call( subject, object5 ) + subject.save + expect( Hydra::PCDM::RemoveRelatedObjectFromObject.call( subject.reload, object3 )).to be nil + end + end + end + + context 'with unacceptable related objects' do + let(:collection1) { Hydra::PCDM::Collection.create } + let(:file1) { Hydra::PCDM::File.new } + let(:non_PCDM_object) { "I'm not a PCDM object" } + let(:af_base_object) { ActiveFedora::Base.create } + + let(:error_type) { ArgumentError } + let(:error_message) { 'child_related_object must be a pcdm object' } + + it 'should NOT remove Hydra::PCDM::Collections from related_objects aggregation' do + expect{ Hydra::PCDM::RemoveRelatedObjectFromObject.call( subject, collection1 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT remove Hydra::PCDM::Files from related_objects aggregation' do + expect{ Hydra::PCDM::RemoveRelatedObjectFromObject.call( subject, file1 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT remove non-PCDM objects from related_objects aggregation' do + expect{ Hydra::PCDM::RemoveRelatedObjectFromObject.call( subject, non_PCDM_object ) }.to raise_error(error_type,error_message) + end + + it 'should NOT remove AF::Base objects from related_objects aggregation' do + expect{ Hydra::PCDM::RemoveRelatedObjectFromObject.call( subject, af_base_object ) }.to raise_error(error_type,error_message) + end + end + + context 'with unacceptable parent object' do + let(:object2) { Hydra::PCDM::Object.create } + let(:collection1) { Hydra::PCDM::Collection.create } + let(:file1) { Hydra::PCDM::File.new } + let(:non_PCDM_object) { "I'm not a PCDM object" } + let(:af_base_object) { ActiveFedora::Base.create } + + let(:error_type) { ArgumentError } + let(:error_message) { 'parent_object must be a pcdm object' } + + it 'should NOT accept Hydra::PCDM::Objects as parent object' do + expect{ Hydra::PCDM::RemoveRelatedObjectFromObject.call( collection1, object2 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT accept Hydra::PCDM::Files as parent object' do + expect{ Hydra::PCDM::RemoveRelatedObjectFromObject.call( file1, object2 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT accept non-PCDM objects as parent object' do + expect{ Hydra::PCDM::RemoveRelatedObjectFromObject.call( non_PCDM_object, object2 ) }.to raise_error(error_type,error_message) + end + + it 'should NOT accept AF::Base objects as parent object' do + expect{ Hydra::PCDM::RemoveRelatedObjectFromObject.call( af_base_object, object2 ) }.to raise_error(error_type,error_message) + end + end +end