require 'spec_helper' describe Rubydora::DigitalObject do describe "new" do it "should load a DigitalObject instance" do Rubydora::DigitalObject.new("pid").should be_a_kind_of(Rubydora::DigitalObject) end end describe "profile" do before(:each) do @mock_repository = mock(Rubydora::Repository) @object = Rubydora::DigitalObject.new 'pid', @mock_repository end it "should convert object profile to a simple hash" do @mock_repository.should_receive(:object).with(:pid => 'pid').and_return("1234") h = @object.profile h.should have_key("a") h['a'].should == '1' h.should have_key("b") h['b'].should == '2' h.should have_key("objModels") h['objModels'].should == ['3', '4'] end end describe "new" do before(:each) do @mock_repository = mock(Rubydora::Repository) @mock_repository.should_receive(:object).any_number_of_times.and_raise "" @object = Rubydora::DigitalObject.new 'pid', @mock_repository end it "should be new" do @object.new?.should == true end it "should call ingest on save" do @object.should_receive(:datastreams).and_return({}) @mock_repository.should_receive(:ingest).with(hash_including(:pid => 'pid')).and_return('pid') @object.save end it "should create a new Fedora object with a generated PID if no PID is provided" do object = Rubydora::DigitalObject.new nil, @mock_repository @mock_repository.should_receive(:ingest).with(hash_including(:pid => nil)).and_return('pid') @mock_repository.should_receive(:datastreams).with(hash_including(:pid => 'pid')).and_raise(RestClient::ResourceNotFound) object.save object.pid.should == 'pid' end end describe "create" do it "should call the Fedora REST API to create a new object" do @mock_repository = mock(Rubydora::Repository) @mock_repository.should_receive(:ingest).with(instance_of(Hash)).and_return("pid") obj = Rubydora::DigitalObject.create "pid", { :a => 1, :b => 2}, @mock_repository obj.should be_a_kind_of(Rubydora::DigitalObject) end it "should return a new object with the Fedora response pid when no pid is provided" do @mock_repository = mock(Rubydora::Repository) @mock_repository.should_receive(:ingest).with(instance_of(Hash)).and_return("pid") obj = Rubydora::DigitalObject.create "new", { :a => 1, :b => 2}, @mock_repository obj.should be_a_kind_of(Rubydora::DigitalObject) obj.pid.should == "pid" end end describe "retreive" do before(:each) do @mock_repository = mock(Rubydora::Repository) @object = Rubydora::DigitalObject.new 'pid', @mock_repository end describe "datastreams" do it "should provide a hash populated by the existing datastreams" do @mock_repository.should_receive(:datastreams).with(:pid => 'pid').and_return(">>") @object.datastreams.should have_key("a") @object.datastreams.should have_key("b") @object.datastreams.should have_key("c") end it "should allow other datastreams to be added" do @mock_repository.should_receive(:datastreams).with(:pid => 'pid').and_return(">>") @mock_repository.should_receive(:datastream).with(:pid => 'pid', :dsid => 'z').and_raise(RestClient::ResourceNotFound) @object.datastreams.length.should == 3 ds = @object.datastreams["z"] ds.should be_a_kind_of(Rubydora::Datastream) ds.new?.should == true @object.datastreams.length.should == 4 end it "should let datastreams be accessed via hash notation" do @mock_repository.should_receive(:datastreams).with(:pid => 'pid').and_return(">>") @object['a'].should be_a_kind_of(Rubydora::Datastream) @object['a'].should == @object.datastreams['a'] end end end describe "retrieve" do end describe "save" do before(:each) do @mock_repository = mock(Rubydora::Repository) @mock_repository.should_receive(:object).any_number_of_times.with({:pid => 'pid'}).and_return <<-XML empty XML @object = Rubydora::DigitalObject.new 'pid', @mock_repository end it "should save all changed datastreams" do @ds1 = mock() @ds1.should_receive(:changed?).and_return(false) @ds1.should_not_receive(:save) @ds2 = mock() @ds2.should_receive(:changed?).and_return(true) @ds2.should_receive(:new?).and_return(true) @ds2.should_not_receive(:save) @ds3 = mock() @ds3.should_receive(:changed?).and_return(true) @ds3.should_receive(:new?).and_return(false) @ds3.should_receive(:save) @object.should_receive(:datastreams).and_return({:ds1 => @ds1, :ds2 => @ds2, :ds3 => @ds3 }) @object.save end it "should save all changed attributes" do @object.label = "asdf" @object.should_receive(:datastreams).and_return({}) @mock_repository.should_receive(:modify_object).with(hash_including(:pid => 'pid')) @object.save end it "should reset the object state on save" do @object.label = "asdf" @object.should_receive(:datastreams).and_return({}) @mock_repository.should_receive(:modify_object).with(hash_including(:pid => 'pid')) @object.profile.should_not be_nil expect { @object.save }.to change { @object.instance_variable_get('@profile') }.to nil end end describe "delete" do before(:each) do @mock_repository = mock() @object = Rubydora::DigitalObject.new 'pid', @mock_repository end it "should call the Fedora REST API" do @mock_repository.should_receive(:purge_object).with({:pid => 'pid'}) @object.delete end end describe "models" do before(:each) do @mock_repository = mock(Rubydora::Repository) @mock_repository.should_receive(:object).any_number_of_times.with({:pid => 'pid'}).and_return <<-XML XML @object = Rubydora::DigitalObject.new 'pid', @mock_repository end it "should add models to fedora" do @mock_repository.should_receive(:add_relationship) do |params| params.should have_key(:subject) params[:predicate].should == 'info:fedora/fedora-system:def/model#hasModel' params[:object].should == 'asdf' end @object.models << "asdf" end it "should remove models from fedora" do @object.should_receive(:profile).any_number_of_times.and_return({"objModels" => ['asdf']}) @mock_repository.should_receive(:purge_relationship) do |params| params.should have_key(:subject) params[:predicate].should == 'info:fedora/fedora-system:def/model#hasModel' params[:object].should == 'asdf' end @object.models.delete("asdf") end it "should be able to handle complete model replacemenet" do @object.should_receive(:profile).any_number_of_times.and_return({"objModels" => ['asdf']}) @mock_repository.should_receive(:add_relationship).with(instance_of(Hash)) @mock_repository.should_receive(:purge_relationship).with(instance_of(Hash)) @object.models = '1234' end end describe "relations" do before(:each) do @mock_repository = mock() @mock_repository.should_receive(:object).any_number_of_times.with({:pid => 'pid'}).and_return <<-XML XML @object = Rubydora::DigitalObject.new 'pid', @mock_repository end it "should fetch related objects using sparql" do @mock_repository.should_receive(:find_by_sparql_relationship).with('info:fedora/pid', 'info:fedora/fedora-system:def/relations-external#hasPart').and_return([1]) @object.parts.should == [1] end it "should add related objects" do @mock_repository.should_receive(:add_relationship) do |params| params.should have_key(:subject) params[:predicate].should == 'info:fedora/fedora-system:def/relations-external#hasPart' params[:object].should == 'asdf' end @mock_object = mock(Rubydora::DigitalObject) @mock_object.should_receive(:fqpid).and_return('asdf') @mock_repository.should_receive(:find_by_sparql_relationship).with('info:fedora/pid', 'info:fedora/fedora-system:def/relations-external#hasPart').and_return([]) @object.parts << @mock_object end it "should remove related objects" do @mock_repository.should_receive(:purge_relationship) do |params| params.should have_key(:subject) params[:predicate].should == 'info:fedora/fedora-system:def/relations-external#hasPart' params[:object].should == 'asdf' end @mock_object = mock(Rubydora::DigitalObject) @mock_object.should_receive(:fqpid).and_return('asdf') @mock_repository.should_receive(:find_by_sparql_relationship).with('info:fedora/pid', 'info:fedora/fedora-system:def/relations-external#hasPart').and_return([@mock_object]) @object.parts.delete(@mock_object) end end end