require 'spec_helper' describe "A base object with metadata" do before :all do class MockAFBaseRelationship < ActiveFedora::Base has_metadata :name=>'foo', :type=>Hydra::ModsArticleDatastream end end after :all do Object.send(:remove_const, :MockAFBaseRelationship) end describe "a new document" do before do @obj = MockAFBaseRelationship.new @obj.foo.person = "bob" @obj.save end it "should save the datastream." do obj = ActiveFedora::Base.find(@obj.pid, :cast=>true) obj.foo.should_not be_new obj.foo.person.should == ['bob'] ActiveFedora::SolrService.query("id:#{@obj.pid.gsub(":", "\\:")}", :fl=>'id person_t').first.should == {"id"=>@obj.pid, 'person_t'=>['bob']} end end describe "that already exists in the repo" do before do @release = MockAFBaseRelationship.create() @release.add_relationship(:is_governed_by, 'info:fedora/narmdemo:catalog-fixture') @release.add_relationship(:is_part_of, 'info:fedora/narmdemo:777') @release.foo.person = "test foo content" @release.save end describe "and has been changed" do before do @release.foo.person = 'frank' @release.save! end it "should save the datastream." do MockAFBaseRelationship.find(@release.pid).foo.person.should == ['frank'] ActiveFedora::SolrService.query("id:#{@release.pid.gsub(":", "\\:")}", :fl=>'id person_t').first.should == {"id"=>@release.pid, 'person_t'=>['frank']} end end describe "clone_into a new object" do before do begin new_object = MockAFBaseRelationship.find('narm:999') new_object.delete rescue ActiveFedora::ObjectNotFoundError end new_object = MockAFBaseRelationship.create(:pid => 'narm:999') @release.clone_into(new_object) @new_object = MockAFBaseRelationship.find('narm:999') end it "should have all the assertions" do @new_object.rels_ext.content.should be_equivalent_to ' ' end it "should have the other datastreams too" do @new_object.datastreams.keys.should include "foo" @new_object.foo.content.should be_equivalent_to @release.foo.content end end describe "clone" do before do @new_object = @release.clone end it "should have all the assertions" do @new_object.rels_ext.content.should be_equivalent_to ' ' end it "should have the other datastreams too" do @new_object.datastreams.keys.should include "foo" @new_object.foo.content.should be_equivalent_to @release.foo.content end end end describe '#reload' do before(:each) do @object = MockAFBaseRelationship.new @object.foo.person = 'bob' @object.save @object2 = @object.class.find(@object.pid) @object2.foo.person = 'dave' @object2.save end it 'should requery Fedora' do @object.reload @object.foo.person.should == ['dave'] end it 'should raise an error if not persisted' do @object = MockAFBaseRelationship.new # You will want this stub or else it will be really chatty in your STDERR @object.inner_object.logger.stub(:error) expect { @object.reload }.to raise_error(ActiveFedora::ObjectNotFoundError) end end end describe "Datastreams synched together" do before do class DSTest < ActiveFedora::Base def load_datastreams super unless self.datastreams.keys.include? 'test_ds' add_file_datastream("XXX",:dsid=>'test_ds', :mimeType=>'text/html') end end end end it "Should update datastream" do @nc = DSTest.new @nc.save @nc.test_ds.content.should == 'XXX' ds = @nc.datastreams['test_ds'] ds.content = "Foobar" @nc.save DSTest.find(@nc.pid).datastreams['test_ds'].content.should == 'Foobar' DSTest.find(@nc.pid).test_ds.content.should == 'Foobar' end end describe ActiveFedora::Base do before(:all) do @behavior = ActiveFedora::Relationships.deprecation_behavior @c_behavior = ActiveFedora::Relationships::ClassMethods.deprecation_behavior ActiveFedora::Relationships.deprecation_behavior = :silence ActiveFedora::Relationships::ClassMethods.deprecation_behavior = :silence end after :all do ActiveFedora::Relationships.deprecation_behavior = @behavior ActiveFedora::Relationships::ClassMethods.deprecation_behavior = @c_behavior end before :all do class MockAFBaseRelationship < ActiveFedora::Base include ActiveFedora::FileManagement has_relationship "testing", :has_part, :type=>MockAFBaseRelationship has_relationship "testing2", :has_member, :type=>MockAFBaseRelationship has_relationship "testing_inbound", :has_part, :type=>MockAFBaseRelationship, :inbound=>true has_relationship "testing_inbound2", :has_member, :type=>MockAFBaseRelationship, :inbound=>true has_bidirectional_relationship "testing_bidirectional", :has_collection_member, :is_member_of_collection #next 2 used to test objects on opposite end of bidirectional relationship has_relationship "testing_inbound3", :has_collection_member, :inbound=>true has_relationship "testing3", :is_member_of_collection end class MockAFBaseFromSolr < ActiveFedora::Base include ActiveFedora::Relationships has_relationship "testing", :has_part, :type=>MockAFBaseFromSolr has_relationship "testing2", :has_member, :type=>MockAFBaseFromSolr has_relationship "testing_inbound", :has_part, :type=>MockAFBaseFromSolr, :inbound=>true has_relationship "testing_inbound2", :has_member, :type=>MockAFBaseFromSolr, :inbound=>true has_metadata :name => "properties", :type => ActiveFedora::SimpleDatastream do |m| m.field "holding_id", :string end has_metadata :name => "descMetadata", :type => ActiveFedora::QualifiedDublinCoreDatastream do |m| m.field "created", :date, :xml_node => "created" m.field "language", :string, :xml_node => "language" m.field "creator", :string, :xml_node => "creator" # Created remaining fields m.field "geography", :string, :xml_node => "geography" m.field "title", :string, :xml_node => "title" end end end before(:all) do ActiveFedora::SolrService.register(ActiveFedora.solr_config[:url]) end after :all do Object.send(:remove_const, :MockAFBaseRelationship) end before(:each) do @test_object = ActiveFedora::Base.new @test_object.save end after(:each) do begin @test_object.delete rescue end begin @test_object2.delete rescue end begin @test_object3.delete rescue end begin @test_object4.delete rescue end begin @test_object5.delete rescue end end describe ".initialize" do it "calling constructor should create a new Fedora Object" do @test_object.should have(0).errors @test_object.pid.should_not be_nil end end describe '.assign_pid' do it "should get nextid" do one = ActiveFedora::Base.assign_pid(ActiveFedora::UnsavedDigitalObject.new(ActiveFedora::Base, 'changeme')) two = ActiveFedora::Base.assign_pid(ActiveFedora::UnsavedDigitalObject.new(ActiveFedora::Base, 'changeme')) one = one.gsub('changeme:', '').to_i two = two.gsub('changeme:', '').to_i two.should == one + 1 end end describe "#save" do before(:each) do @test_object2 = ActiveFedora::Base.new end after(:each) do @test_object2.delete end it "passing namespace to constructor with no pid should generate a pid with the supplied namespace" do @test_object2 = ActiveFedora::Base.new({:namespace=>"randomNamespace"}) # will be nil if match failed, otherwise will equal pid @test_object2.save @test_object2.pid.match('randomNamespace:\d+').to_a.first.should == @test_object2.pid end it "should set the CMA hasModel relationship in the Rels-EXT" do @test_object2.save rexml = REXML::Document.new(@test_object2.datastreams["RELS-EXT"].content) # Purpose: confirm that the isMemberOf entries exist and have real RDF in them rexml.root.elements["rdf:Description/ns0:hasModel"].attributes["rdf:resource"].should == 'info:fedora/afmodel:ActiveFedora_Base' end it "should merge attributes from fedora into attributes hash" do @test_object2.save inner_object = @test_object2.inner_object inner_object.pid.should == @test_object2.pid inner_object.should respond_to(:state) inner_object.should respond_to(:lastModifiedDate) inner_object.should respond_to(:ownerId) inner_object.state.should == "A" inner_object.ownerId.should == "fedoraAdmin" end end describe ".datastreams" do it "should return a Hash of datastreams from fedora" do datastreams = @test_object.datastreams datastreams.should be_a_kind_of(Hash) datastreams.each_value do |ds| ds.should be_a_kind_of(ActiveFedora::Datastream) end @test_object.datastreams["DC"].should be_an_instance_of(ActiveFedora::Datastream) datastreams["DC"].should_not be_nil datastreams["DC"].should be_an_instance_of(ActiveFedora::Datastream) end it "should initialize the datastream pointers with @new_object=false" do datastreams = @test_object.datastreams datastreams.each_value do |ds| ds.should_not be_new end end end describe ".metadata_streams" do it "should return all of the datastreams from the object that are kinds of NokogiriDatastream " do mds1 = ActiveFedora::SimpleDatastream.new(@test_object.inner_object, "md1") mds2 = ActiveFedora::QualifiedDublinCoreDatastream.new(@test_object.inner_object, "qdc") fds = ActiveFedora::Datastream.new(@test_object.inner_object, "fds") @test_object.add_datastream(mds1) @test_object.add_datastream(mds2) @test_object.add_datastream(fds) result = @test_object.metadata_streams result.length.should == 2 result.should include(mds1) result.should include(mds2) end end describe ".dc" do it "should expose the DC datastream" do dc = @test_object.dc dc.should be_a_kind_of(ActiveFedora::Datastream) rexml = REXML::Document.new(dc.content) rexml.root.elements["dc:identifier"].get_text.should_not be_nil end end describe '.rels_ext' do it "should retrieve RelsExtDatastream object via rels_ext method" do @test_object.rels_ext.should be_instance_of(ActiveFedora::RelsExtDatastream) end it 'should create the RELS-EXT datastream if it doesnt exist' do test_object = ActiveFedora::Base.new #test_object.datastreams["RELS-EXT"].should == nil test_object.rels_ext test_object.datastreams["RELS-EXT"].should_not == nil test_object.datastreams["RELS-EXT"].class.should == ActiveFedora::RelsExtDatastream end end describe '.add_relationship' do it "should update the RELS-EXT datastream and relationships should end up in Fedora when the object is saved" do @test_object.add_relationship(:is_member_of, "info:fedora/demo:5") @test_object.add_relationship(:is_member_of, "info:fedora/demo:10") @test_object.add_relationship(:conforms_to, "info:fedora/afmodel:OralHistory") @test_object.save rexml = REXML::Document.new(@test_object.datastreams["RELS-EXT"].content) # Purpose: confirm that the isMemberOf entries exist and have real RDF in them rexml.root.attributes["xmlns:ns1"].should == 'info:fedora/fedora-system:def/relations-external#' rexml.root.elements["rdf:Description/ns1:isMemberOf[@rdf:resource='info:fedora/demo:5']"].should_not be_nil rexml.root.elements["rdf:Description/ns1:isMemberOf[@rdf:resource='info:fedora/demo:10']"].should_not be_nil end end describe '.add_file_datastream' do it "should set the correct mimeType if :mime_type, :mimeType, or :content_type passed in and path does not contain correct extension" do f = File.new(File.join( File.dirname(__FILE__), "../fixtures/dino_jpg_no_file_ext" )) @test_object.add_file_datastream(f) @test_object.save test_obj = ActiveFedora::Base.find(@test_object.pid) #check case where nothing passed in does not have correct mime type test_obj.datastreams["DS1"].mimeType.should == "application/octet-stream" @test_object2 = ActiveFedora::Base.new f = File.new(File.join( File.dirname(__FILE__), "../fixtures/dino_jpg_no_file_ext" )) @test_object2.add_file_datastream(f,{:mimeType=>"image/jpeg"}) @test_object2.save test_obj = ActiveFedora::Base.find(@test_object2.pid) test_obj.datastreams["DS1"].mimeType.should == "image/jpeg" @test_object3 = ActiveFedora::Base.new f = File.new(File.join( File.dirname(__FILE__), "../fixtures/dino_jpg_no_file_ext" )) @test_object3.add_file_datastream(f,{:mime_type=>"image/jpeg"}) @test_object3.save test_obj = ActiveFedora::Base.find(@test_object3.pid) test_obj.datastreams["DS1"].mimeType.should == "image/jpeg" @test_object4 = ActiveFedora::Base.new f = File.new(File.join( File.dirname(__FILE__), "../fixtures/dino_jpg_no_file_ext" )) @test_object4.add_file_datastream(f,{:content_type=>"image/jpeg"}) @test_object4.save test_obj = ActiveFedora::Base.find(@test_object4.pid) test_obj.datastreams["DS1"].mimeType.should == "image/jpeg" end end describe '.add_datastream' do it "should be able to add datastreams" do ds = ActiveFedora::Datastream.new(@test_object.inner_object, 'DS1') # ds = ActiveFedora::Datastream.new(:dsID => 'DS1', :dsLabel => 'hello', :altIDs => '3333', # :controlGroup => 'M', :blob => fixture('dino.jpg')) @test_object.add_datastream(ds).should be_true end it "adding and saving should add the datastream to the datastreams array" do ds = ActiveFedora::Datastream.new(@test_object.inner_object, 'DS1') ds.content = fixture('dino.jpg').read # ds = ActiveFedora::Datastream.new(:dsid => 'DS1', :dsLabel => 'hello', :altIDs => '3333', # :controlGroup => 'M', :blob => fixture('dino.jpg')) @test_object.datastreams.should_not have_key("DS1") @test_object.add_datastream(ds) ds.save @test_object.datastreams.should have_key("DS1") end end it "should retrieve blobs that match the saved blobs" do ds = ActiveFedora::Datastream.new(@test_object.inner_object, 'DS1') ds.content = "foo" new_ds = ds.save @test_object.add_datastream(new_ds) @test_object.class.find(@test_object.pid).datastreams["DS1"].content.should == new_ds.content end describe ".create_date" do it "should return W3C date" do @test_object.create_date.should_not be_nil end end describe ".modified_date" do it "should return nil before saving and a W3C date after saving" do @test_object.modified_date.should_not be_nil end end describe "delete" do it "should delete the object from Fedora and Solr" do @test_object.save ActiveFedora::Base.find_with_conditions(:id=>@test_object.pid).first["id"].should == @test_object.pid pid = @test_object.pid # store so we can access it after deletion @test_object.delete ActiveFedora::Base.find_with_conditions(:id=>pid).should be_empty end describe '#delete' do before do @test_object2 = MockAFBaseRelationship.create @test_object3 = MockAFBaseRelationship.create @test_object4 = MockAFBaseRelationship.create @test_object5 = MockAFBaseRelationship.create Deprecation.stub(:warn) #append to relationship by 'testing' @test_object2.add_relationship_by_name("testing",@test_object3) @test_object2.add_relationship_by_name("testing2",@test_object4) @test_object5.add_relationship_by_name("testing",@test_object2) #@test_object5.add_relationship_by_name("testing2",@test_object3) @test_object2.save @test_object5.save #check that the inbound relationships on test_object3 and test_object4 were eliminated #testing goes to :has_part and testing2 goes to :has_member @test_object2.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object5.internal_uri] @test_object2.relationships_by_name(false)[:self]["parts_outbound"].should == [@test_object3.internal_uri] @test_object2.relationships_by_name(false)[:self]["testing"].should == [@test_object3.internal_uri] @test_object3.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object2.internal_uri] @test_object4.relationships_by_name(false)[:inbound]["testing_inbound2"].should == [@test_object2.internal_uri] @test_object5.relationships_by_name(false)[:self]["testing"].should == [@test_object2.internal_uri] end it 'if inbound relationships exist should remove relationships from those inbound targets as well when deleting this object' do @test_object2.delete #need to reload since removed from rels_ext in memory @test_object5 = MockAFBaseRelationship.find(@test_object5.pid) #check any test_object2 inbound rels gone from source @test_object3.relationships_by_name(false)[:inbound]["testing_inbound"].should == [] @test_object4.relationships_by_name(false)[:inbound]["testing_inbound2"].should == [] @test_object5.relationships_by_name(false)[:self]["testing"].should == [] end end end describe '#remove_relationship' do it 'should remove a relationship from an object after a save' do @test_object2 = ActiveFedora::Base.new @test_object2.save @test_object.add_relationship(:has_part,@test_object2) @test_object.save @pid = @test_object.pid begin @test_object = ActiveFedora::Base.find(@pid) rescue => e puts "#{e.message}\n#{e.backtrace}" raise e end @test_object.object_relations[:has_part].should include @test_object2.internal_uri @test_object.remove_relationship(:has_part,@test_object2) @test_object.save @test_object = ActiveFedora::Base.find(@pid) @test_object.object_relations[:has_part].should be_empty end end describe '#relationships' do it 'should return internal relationships with no parameters and include inbound if false passed in' do @test_object2 = MockAFBaseRelationship.new @test_object2.save @test_object3 = MockAFBaseRelationship.new @test_object3.save @test_object4 = MockAFBaseRelationship.new @test_object4.save @test_object5 = MockAFBaseRelationship.new @test_object5.save #append to named relationship 'testing' @test_object2.testing_append(@test_object3) @test_object2.testing2_append(@test_object4) @test_object2.testing3_append(@test_object5) @test_object5.testing_append(@test_object2) @test_object5.testing2_append(@test_object3) @test_object5.testing_bidirectional_append(@test_object4) @test_object2.save @test_object5.save model_rel = MockAFBaseRelationship.to_class_uri #check inbound correct, testing goes to :has_part and testing2 goes to :has_member @test_object2.object_relations[:has_model].should include model_rel @test_object2.object_relations[:has_part].should include @test_object3 @test_object2.object_relations[:has_member].should include @test_object4 @test_object2.object_relations[:is_member_of_collection].should include @test_object5 @test_object2.inbound_relationships.should == {:has_part=>[@test_object5.internal_uri]} @test_object3.object_relations[:has_model].should include model_rel @test_object3.inbound_relationships.should == {:has_part=>[@test_object2.internal_uri], :has_member=>[@test_object5.internal_uri]} @test_object4.object_relations[:has_model].should include model_rel @test_object4.inbound_relationships.should == {:has_member=>[@test_object2.internal_uri],:has_collection_member=>[@test_object5.internal_uri]} @test_object5.object_relations[:has_model].should include model_rel @test_object5.object_relations[:has_part].should include @test_object2 @test_object5.object_relations[:has_member].should include @test_object3 @test_object5.object_relations[:has_collection_member].should include @test_object4 @test_object5.inbound_relationships.should == {:is_member_of_collection=>[@test_object2.internal_uri]} end end describe '#inbound_relationships' do it 'should return a hash of inbound relationships' do @test_object2 = MockAFBaseRelationship.new @test_object2.save @test_object3 = MockAFBaseRelationship.new @test_object3.save @test_object4 = MockAFBaseRelationship.new @test_object4.save @test_object5 = MockAFBaseRelationship.new @test_object5.save #append to named relationship 'testing' @test_object2.testing_append(@test_object3) @test_object2.testing2_append(@test_object4) @test_object5.testing_append(@test_object2) @test_object5.testing2_append(@test_object3) #@test_object5.testing_bidirectional_append(@test_object4) @test_object2.save @test_object5.save #check inbound correct, testing goes to :has_part and testing2 goes to :has_member @test_object2.inbound_relationships.should == {:has_part=>[@test_object5.internal_uri]} @test_object3.inbound_relationships.should == {:has_part=>[@test_object2.internal_uri],:has_member=>[@test_object5.internal_uri]} @test_object4.inbound_relationships.should == {:has_member=>[@test_object2.internal_uri]} @test_object5.inbound_relationships.should == {} end end describe '#inbound_relationships_by_name' do it 'should return a hash of inbound relationship names to array of objects' do @test_object2 = MockAFBaseRelationship.new @test_object2.save @test_object3 = MockAFBaseRelationship.new @test_object3.save @test_object4 = MockAFBaseRelationship.new @test_object4.save @test_object5 = MockAFBaseRelationship.new @test_object5.save #append to named relationship 'testing' @test_object2.testing_append(@test_object3) @test_object2.testing2_append(@test_object4) @test_object5.testing_append(@test_object2) @test_object5.testing2_append(@test_object3) @test_object2.save @test_object5.save #check inbound correct, testing goes to :has_part and testing2 goes to :has_member @test_object2.inbound_relationships_by_name.should == {"testing_inbound"=>[@test_object5.internal_uri],"testing_inbound2"=>[], "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[], "parts_inbound" => []} @test_object3.inbound_relationships_by_name.should == {"testing_inbound"=>[@test_object2.internal_uri],"testing_inbound2"=>[@test_object5.internal_uri], "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[], "parts_inbound" => []} @test_object4.inbound_relationships_by_name.should == {"testing_inbound"=>[],"testing_inbound2"=>[@test_object2.internal_uri], "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[], "parts_inbound" => []} @test_object5.inbound_relationships_by_name.should == {"testing_inbound"=>[],"testing_inbound2"=>[], "testing_bidirectional_inbound"=>[],"testing_inbound3"=>[], "parts_inbound" => []} end end describe '#relationships_by_name' do it '' do @test_object2 = MockAFBaseRelationship.new @test_object2.save @test_object3 = MockAFBaseRelationship.new @test_object3.save @test_object4 = MockAFBaseRelationship.new @test_object4.save @test_object5 = MockAFBaseRelationship.new @test_object5.save #append to named relationship 'testing' @test_object2.testing_append(@test_object3) @test_object2.testing2_append(@test_object4) @test_object5.testing_append(@test_object2) @test_object5.testing2_append(@test_object3) @test_object2.save @test_object5.save #check inbound correct, testing goes to :has_part and testing2 goes to :has_member @test_object2.relationships_by_name(false)[:self]["testing"].should == [@test_object3.internal_uri] @test_object2.relationships_by_name(false)[:self]["testing2"].should == [@test_object4.internal_uri] @test_object2.relationships_by_name(false)[:self]["parts_outbound"].should == [@test_object3.internal_uri] @test_object2.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object5.internal_uri] @test_object3.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object2.internal_uri] @test_object3.relationships_by_name(false)[:inbound]["testing_inbound2"].should == [@test_object5.internal_uri] @test_object4.relationships_by_name(false)[:inbound]["testing_inbound2"].should == [@test_object2.internal_uri] @test_object5.relationships_by_name(false)[:self]["testing"].should == [@test_object2.internal_uri] @test_object5.relationships_by_name(false)[:self]["testing2"].should == [@test_object3.internal_uri] @test_object5.relationships_by_name(false)[:self]["parts_outbound"].should == [@test_object2.internal_uri] #all inbound should now be empty if no parameter supplied to relationships @test_object2.relationships_by_name[:self]["testing"].should == [@test_object3.internal_uri] @test_object2.relationships_by_name[:self]["testing2"].should == [@test_object4.internal_uri] @test_object2.relationships_by_name[:self]["parts_outbound"].should == [@test_object3.internal_uri] @test_object2.relationships_by_name.should_not have_key :inbound @test_object3.relationships_by_name.should_not have_key :inbound @test_object4.relationships_by_name.should_not have_key :inbound @test_object5.relationships_by_name[:self]["testing"].should == [@test_object2.internal_uri] @test_object5.relationships_by_name[:self]["testing2"].should == [@test_object3.internal_uri] @test_object5.relationships_by_name[:self]["parts_outbound"].should == [@test_object2.internal_uri] @test_object5.relationships_by_name.should_not have_key :inbound # @test_object2.relationships_by_name.should == {:self=>{"testing2"=>[@test_object4.internal_uri], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[@test_object3.internal_uri], "parts_outbound"=>[@test_object3.internal_uri], "testing_bidirectional_outbound"=>[]}} # @test_object3.relationships_by_name.should == {:self=>{"testing2"=>[], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}} # @test_object4.relationships_by_name.should == {:self=>{"testing2"=>[], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[], "testing_bidirectional_outbound"=>[]}} # @test_object5.relationships_by_name.should == {:self=>{"testing2"=>[@test_object3.internal_uri], "collection_members"=>[], "testing3"=>[], "part_of"=>[], "testing"=>[@test_object2.internal_uri], "parts_outbound"=>[@test_object2.internal_uri], "testing_bidirectional_outbound"=>[]}} end end describe '#add_relationship_by_name' do it 'should add a named relationship to an object' do @test_object2 = MockAFBaseRelationship.new #@test_object2.new_object = true @test_object2.save @test_object3 = MockAFBaseRelationship.new #@test_object3.new_object = true @test_object3.save @test_object4 = MockAFBaseRelationship.new #@test_object4.new_object = true @test_object4.save @test_object5 = MockAFBaseRelationship.new #@test_object5.new_object = true @test_object5.save #append to named relationship 'testing' @test_object2.add_relationship_by_name("testing",@test_object3) @test_object2.add_relationship_by_name("testing2",@test_object4) @test_object5.add_relationship_by_name("testing",@test_object2) @test_object5.add_relationship_by_name("testing2",@test_object3) @test_object2.save @test_object5.save #check inbound correct, testing goes to :has_part and testing2 goes to :has_member @test_object2.relationships_by_name(false)[:self]["testing"].should == [@test_object3.internal_uri] @test_object2.relationships_by_name(false)[:self]["testing2"].should == [@test_object4.internal_uri] @test_object2.relationships_by_name(false)[:self]["parts_outbound"].should == [@test_object3.internal_uri] @test_object2.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object5.internal_uri] @test_object3.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object2.internal_uri] @test_object3.relationships_by_name(false)[:inbound]["testing_inbound2"].should == [@test_object5.internal_uri] @test_object4.relationships_by_name(false)[:inbound]["testing_inbound2"].should == [@test_object2.internal_uri] @test_object5.relationships_by_name(false)[:self]["testing"].should == [@test_object2.internal_uri] @test_object5.relationships_by_name(false)[:self]["testing2"].should == [@test_object3.internal_uri] @test_object5.relationships_by_name(false)[:self]["parts_outbound"].should == [@test_object2.internal_uri] end end describe '#remove_named_relationship' do it 'should remove an existing relationship from an object' do @test_object2 = MockAFBaseRelationship.new #@test_object2.new_object = true @test_object2.save @test_object3 = MockAFBaseRelationship.new #@test_object3.new_object = true @test_object3.save @test_object4 = MockAFBaseRelationship.new #@test_object4.new_object = true @test_object4.save @test_object5 = MockAFBaseRelationship.new #@test_object5.new_object = true @test_object5.save #append to named relationship 'testing' @test_object2.add_relationship_by_name("testing",@test_object3) @test_object2.add_relationship_by_name("testing2",@test_object4) @test_object5.add_relationship_by_name("testing",@test_object2) @test_object5.add_relationship_by_name("testing2",@test_object3) @test_object2.save @test_object5.save #check inbound correct, testing goes to :has_part and testing2 goes to :has_member @test_object2.relationships_by_name(false)[:self]["testing"].should == [@test_object3.internal_uri] @test_object2.relationships_by_name(false)[:self]["testing2"].should == [@test_object4.internal_uri] @test_object2.relationships_by_name(false)[:self]["parts_outbound"].should == [@test_object3.internal_uri] @test_object2.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object5.internal_uri] @test_object3.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object2.internal_uri] @test_object3.relationships_by_name(false)[:inbound]["testing_inbound2"].should == [@test_object5.internal_uri] @test_object4.relationships_by_name(false)[:inbound]["testing_inbound2"].should == [@test_object2.internal_uri] @test_object5.relationships_by_name(false)[:self]["testing"].should == [@test_object2.internal_uri] @test_object5.relationships_by_name(false)[:self]["testing2"].should == [@test_object3.internal_uri] @test_object5.relationships_by_name(false)[:self]["parts_outbound"].should == [@test_object2.internal_uri] @test_object2.remove_relationship_by_name("testing",@test_object3.internal_uri) @test_object2.save #check now removed for both outbound and inbound @test_object2.relationships_by_name(false)[:self]["testing"].should == [] @test_object2.relationships_by_name(false)[:self]["testing2"].should == [@test_object4.internal_uri] @test_object2.relationships_by_name(false)[:self]["parts_outbound"].should == [] @test_object2.relationships_by_name(false)[:inbound]["testing_inbound"].should == [@test_object5.internal_uri] @test_object3.relationships_by_name(false)[:inbound]["testing_inbound"].should == [] @test_object3.relationships_by_name(false)[:inbound]["testing_inbound2"].should == [@test_object5.internal_uri] end end describe '#find_relationship_by_name' do it 'should find relationships based on name passed in for inbound or outbound' do @test_object2 = MockAFBaseRelationship.new @test_object2.save @test_object3 = MockAFBaseRelationship.new @test_object3.save @test_object4 = MockAFBaseRelationship.new @test_object4.save @test_object5 = MockAFBaseRelationship.new @test_object5.save #append to named relationship 'testing' @test_object2.add_relationship_by_name("testing",@test_object3) @test_object2.add_relationship_by_name("testing2",@test_object4) @test_object5.add_relationship_by_name("testing",@test_object2) @test_object5.add_relationship_by_name("testing2",@test_object3) @test_object2.save @test_object5.save @test_object2.find_relationship_by_name("testing").should == [@test_object3.internal_uri] @test_object2.find_relationship_by_name("testing2").should == [@test_object4.internal_uri] @test_object2.find_relationship_by_name("testing_inbound").should == [@test_object5.internal_uri] @test_object2.find_relationship_by_name("testing_inbound2").should == [] @test_object3.find_relationship_by_name("testing").should == [] @test_object3.find_relationship_by_name("testing2").should == [] @test_object3.find_relationship_by_name("testing_inbound").should == [@test_object2.internal_uri] @test_object3.find_relationship_by_name("testing_inbound2").should == [@test_object5.internal_uri] @test_object4.find_relationship_by_name("testing").should == [] @test_object4.find_relationship_by_name("testing2").should == [] @test_object4.find_relationship_by_name("testing_inbound").should == [] @test_object4.find_relationship_by_name("testing_inbound2").should == [@test_object2.internal_uri] @test_object5.find_relationship_by_name("testing").should == [@test_object2.internal_uri] @test_object5.find_relationship_by_name("testing2").should == [@test_object3.internal_uri] @test_object5.find_relationship_by_name("testing_inbound").should == [] @test_object5.find_relationship_by_name("testing_inbound2").should == [] end end describe "#exists?" do it "should return true for objects that exist" do ActiveFedora::Base.exists?('hydrangea:fixture_mods_article1').should be_true end it "should return false for objects that dont exist" do ActiveFedora::Base.exists?('nil:object').should be_false end end end