require 'spec_helper'
describe ActiveFedora::RelsExtDatastream do
before(:all) do
@pid = "test:sample_pid"
@sample_xml = Nokogiri::XML::Document.parse(@sample_xml_string)
end
before(:each) do
mock_inner = double('inner object')
@mock_repo = double('repository')
@mock_repo.stub(:datastream_dissemination=>'My Content', :config=>{})
mock_inner.stub(:repository).and_return(@mock_repo)
mock_inner.stub(:pid).and_return(@pid)
@test_ds = ActiveFedora::RelsExtDatastream.new(mock_inner, "RELS-EXT")
@test_ds.stub(:profile).and_return({})
end
its(:metadata?) { should be_true}
its(:controlGroup) { should == "X"}
describe "#mimeType" do
it 'should use the application/rdf+xml mime type' do
@test_ds.mimeType.should == 'application/rdf+xml'
end
end
describe "#changed?" do
it "should be false when no changes have been made" do
subject.changed?.should == false
end
it "should be true when the model has changes" do
subject.model = double(:relationships_are_dirty=>true)
subject.changed?.should == true
end
end
describe '#serialize!' do
it "should generate new rdf/xml as the datastream content if the object has been changed" do
graph = RDF::Graph.new
subject = RDF::URI.new "info:fedora/test:sample_pid"
graph.insert RDF::Statement.new(subject, ActiveFedora::Predicates.find_graph_predicate(:is_member_of), RDF::URI.new('demo:10'))
@test_ds.stub(:new? => true, :relationships_are_dirty? =>true, :relationships => graph, :model => double(:relationships_are_dirty= => true))
@test_ds.serialize!
EquivalentXml.equivalent?(@test_ds.content, "\n \n \n ").should be_true
end
end
describe '#to_rels_ext' do
before(:all) do
@sample_rels_ext_xml = <<-EOS
EOS
@pid = "test:sample_pid"
end
it 'should serialize the relationships array to Fedora RELS-EXT rdf/xml' do
graph = RDF::Graph.new
subject = RDF::URI.new "info:fedora/test:sample_pid"
graph.insert RDF::Statement.new(subject, ActiveFedora::Predicates.find_graph_predicate(:is_member_of), RDF::URI.new('info:fedora/demo:10'))
graph.insert RDF::Statement.new(subject, ActiveFedora::Predicates.find_graph_predicate(:is_part_of), RDF::URI.new('info:fedora/demo:11'))
graph.insert RDF::Statement.new(subject, ActiveFedora::Predicates.find_graph_predicate(:has_part), RDF::URI.new('info:fedora/demo:12'))
graph.insert RDF::Statement.new(subject, ActiveFedora::Predicates.find_graph_predicate(:has_model), RDF::URI.new("info:fedora/afmodel:OtherModel"))
graph.insert RDF::Statement.new(subject, ActiveFedora::Predicates.find_graph_predicate(:has_model), RDF::URI.new("info:fedora/afmodel:SampleModel"))
@test_ds.should_receive(:model).and_return(double("model", :relationships=>graph, :relationships_are_dirty= => true))
EquivalentXml.equivalent?(@test_ds.to_rels_ext(), @sample_rels_ext_xml).should be_true
end
it 'should use mapped namespace prefixes when given' do
graph = RDF::Graph.new
subject = RDF::URI.new "info:fedora/test:sample_pid"
graph.insert RDF::Statement.new(subject, ActiveFedora::Predicates.find_graph_predicate(:is_member_of), RDF::URI.new('info:fedora/demo:10'))
graph.insert RDF::Statement.new(subject, ActiveFedora::Predicates.find_graph_predicate(:is_part_of), RDF::URI.new('info:fedora/demo:11'))
graph.insert RDF::Statement.new(subject, ActiveFedora::Predicates.find_graph_predicate(:has_part), RDF::URI.new('info:fedora/demo:12'))
graph.insert RDF::Statement.new(subject, ActiveFedora::Predicates.find_graph_predicate(:has_model), RDF::URI.new("info:fedora/afmodel:OtherModel"))
graph.insert RDF::Statement.new(subject, ActiveFedora::Predicates.find_graph_predicate(:has_model), RDF::URI.new("info:fedora/afmodel:SampleModel"))
@test_ds.stub(:model).and_return(double("model", :relationships=>graph, :relationships_are_dirty= => true))
rels = @test_ds.to_rels_ext()
EquivalentXml.equivalent?(rels, @sample_rels_ext_xml).should be_true
rels.should_not =~ /fedora:isMemberOf/
rels.should_not =~ /fedora-model:hasModel/
rels.should =~ /ns\d:isMemberOf/
rels.should =~ /ns\d:hasModel/
ActiveFedora::Predicates.predicate_config[:predicate_namespaces] = {:"fedora-model"=>"info:fedora/fedora-system:def/model#", :fedora=>"info:fedora/fedora-system:def/relations-external#"}
rels = @test_ds.to_rels_ext()
EquivalentXml.equivalent?(rels, @sample_rels_ext_xml).should be_true
rels.should =~ /fedora:isMemberOf/
rels.should =~ /fedora-model:hasModel/
rels.should_not =~ /ns\d:isMemberOf/
rels.should_not =~ /ns\d:hasModel/
ActiveFedora::Predicates.predicate_config[:predicate_namespaces] = nil
end
end
describe "#from_xml" do
before(:all) do
@test_obj = ActiveFedora::Base.new
@test_obj.add_relationship(:is_member_of, "info:fedora/demo:10")
@test_obj.add_relationship(:is_part_of, "info:fedora/demo:11")
@test_obj.add_relationship(:conforms_to, "AnInterface", true)
@test_obj.save
end
after(:all) do
@test_obj.delete
end
it "should handle un-mapped predicates gracefully" do
@test_obj.add_relationship("foo", "info:fedora/foo:bar")
@test_obj.save
@test_obj.relationships.size.should == 5
@test_obj.ids_for_outbound("foo").should == ["foo:bar"]
end
it "should automatically map un-mapped predicates" do
xml = <<-EOS
EOS
model = ActiveFedora::Base.new
new_ds = ActiveFedora::RelsExtDatastream.new
new_ds.model = model
lambda { ActiveFedora::RelsExtDatastream.from_xml(xml, new_ds) }.should_not raise_exception
new_ds.to_rels_ext.should =~ /missing:hasOtherRelationship/
end
it "should handle un-mapped literals" do
xml = "
oai:hull.ac.uk:hull:2708
"
model = ActiveFedora::Base.new
new_ds = ActiveFedora::RelsExtDatastream.new
new_ds.model = model
ActiveFedora::RelsExtDatastream.from_xml(xml, new_ds)
new_ext = new_ds.to_rels_ext()
new_ext.should match "oai:hull.ac.uk:hull:2708"
end
end
end