active-fedora 3.1.0.pre2 → 3.1.0.pre3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -203,19 +203,16 @@ describe ActiveFedora::Base do
203
203
 
204
204
  describe '#add_relationship' do
205
205
  it 'should call #add_relationship on the rels_ext datastream' do
206
- mock_relationship = mock("relationship")
207
- mock_rels_ext = mock("rels-ext", :add_relationship)
206
+ mock_rels_ext = mock("rels-ext")#, :add_relationship)
208
207
  mock_rels_ext.expects(:dirty=).with(true)
209
208
  @test_object.expects(:relationship_exists?).returns(false).once()
210
- @test_object.expects(:rels_ext).returns(mock_rels_ext).times(2)
209
+ @test_object.expects(:rels_ext).returns(mock_rels_ext)
211
210
  @test_object.add_relationship("predicate", "object")
212
211
  end
213
212
 
214
213
  it "should update the RELS-EXT datastream and set the datastream as dirty when relationships are added" do
215
214
  mock_ds = mock("Rels-Ext")
216
- mock_ds.expects(:add_relationship).times(2)
217
215
  mock_ds.expects(:dirty=).with(true).times(2)
218
- @test_object.expects(:relationship_exists?).returns(false).times(2)
219
216
  @test_object.datastreams["RELS-EXT"] = mock_ds
220
217
  test_relationships = [ActiveFedora::Relationship.new(:subject => :self, :predicate => :is_member_of, :object => "info:fedora/demo:5"),
221
218
  ActiveFedora::Relationship.new(:subject => :self, :predicate => :is_member_of, :object => "info:fedora/demo:10")]
@@ -229,15 +226,15 @@ describe ActiveFedora::Base do
229
226
  @test_object3 = ActiveFedora::Base.new
230
227
  @test_object.add_relationship(:has_part,@test_object3)
231
228
  r = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>@test_object3)
232
- @test_object.relationships.should == {:self=>{:has_part=>[r.object]}}
229
+ @test_object.ids_for_outbound(:has_part).should == [@test_object3.pid]
233
230
  #try adding again and make sure not there twice
234
231
  @test_object.add_relationship(:has_part,@test_object3)
235
- @test_object.relationships.should == {:self=>{:has_part=>[r.object]}}
232
+ @test_object.ids_for_outbound(:has_part).should == [@test_object3.pid]
236
233
  end
237
234
 
238
235
  it 'should add literal relationships if requested' do
239
236
  @test_object.add_relationship(:conforms_to,"AnInterface",true)
240
- @test_object.relationships[:self][:conforms_to].should == ["AnInterface"]
237
+ @test_object.ids_for_outbound(:conforms_to).should == ["AnInterface"]
241
238
  end
242
239
  end
243
240
 
@@ -253,16 +250,14 @@ describe ActiveFedora::Base do
253
250
  @test_object4 = ActiveFedora::Base.new
254
251
  @test_object.add_relationship(:has_part,@test_object3)
255
252
  @test_object.add_relationship(:has_part,@test_object4)
256
- r = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>@test_object3)
257
- r2 = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>@test_object4)
258
253
  #check both are there
259
- @test_object.relationships.should == {:self=>{:has_part=>[r.object,r2.object]}}
254
+ @test_object.ids_for_outbound(:has_part).should == [@test_object3.pid,@test_object4.pid]
260
255
  @test_object.remove_relationship(:has_part,@test_object3)
261
256
  #check only one item removed
262
- @test_object.relationships.should == {:self=>{:has_part=>[r2.object]}}
257
+ @test_object.ids_for_outbound(:has_part).should == [@test_object4.pid]
263
258
  @test_object.remove_relationship(:has_part,@test_object4)
264
259
  #check last item removed and predicate removed since now emtpy
265
- @test_object.relationships.should == {:self=>{}}
260
+ @test_object.relationships.size.should == 0
266
261
  end
267
262
  end
268
263
 
@@ -271,9 +266,9 @@ describe ActiveFedora::Base do
271
266
  end
272
267
 
273
268
  describe '#relationships' do
274
- it 'should call #relationships on the rels_ext datastream and return that' do
275
- @test_object.expects(:rels_ext).returns(mock("rels-ext", :relationships))
276
- @test_object.relationships
269
+ it 'should return a graph' do
270
+ @test_object.relationships.kind_of?(RDF::Graph).should be_true
271
+ @test_object.relationships.size.should == 0
277
272
  end
278
273
  end
279
274
 
@@ -384,6 +379,7 @@ describe ActiveFedora::Base do
384
379
  dirty_ds = ActiveFedora::MetadataDatastream.new(@test_object.inner_object, 'ds1')
385
380
  rels_ds = ActiveFedora::RelsExtDatastream.new(@test_object.inner_object, 'RELS-EXT')
386
381
  rels_ds.expects(:new?).returns(false)
382
+ rels_ds.model = @test_object
387
383
  mock2 = mock("ds2")
388
384
  mock2.stubs(:changed? => false)
389
385
  mock2.expects(:serialize!)
@@ -405,6 +401,7 @@ describe ActiveFedora::Base do
405
401
  mock_rels_ext.stubs(:dsid=>"RELS-EXT", :relationships=>{}, :add_relationship=>nil, :dirty= => nil)
406
402
  mock_rels_ext.expects( :changed?).returns(false).at_least_once
407
403
  mock_rels_ext.expects(:serialize!)
404
+ mock_rels_ext.expects(:model=).with(@test_object)
408
405
  ActiveFedora::RelsExtDatastream.expects(:new).returns(mock_rels_ext)
409
406
  @test_object.stubs(:datastreams).returns({:ds1 => mock1, :ds2 => mock2})
410
407
  @test_object.expects(:update_index).never
@@ -415,16 +412,16 @@ describe ActiveFedora::Base do
415
412
 
416
413
  @test_object.save
417
414
  end
418
- it "should update solr index if RELS-EXT datastream has changed" do
415
+ it "should update solr index if relationships have changed" do
419
416
  @mock_repo = mock('repository')
420
417
  @mock_repo.expects(:ingest).with(:pid => @test_object.pid)
421
418
  @test_object.inner_object.expects(:repository).returns(@mock_repo).at_least_once
422
419
  @test_object.inner_object.expects(:new?).returns(true).twice
423
420
 
424
421
  rels_ext = ActiveFedora::RelsExtDatastream.new(@test_object.inner_object, 'RELS-EXT')
425
- rels_ext.expects(:relationships_are_dirty).returns(true).at_least_once
422
+ rels_ext.model = @test_object
426
423
  rels_ext.expects(:new?).returns(true)
427
- rels_ext.expects(:save).returns(true)
424
+ rels_ext.expects(:save).returns(true)
428
425
  rels_ext.expects(:serialize!)
429
426
  clean_ds = mock("ds2")
430
427
  clean_ds.stubs(:dirty? => false, :changed? => false, :new? => false)
@@ -55,16 +55,16 @@ describe ActiveFedora::ContentModel do
55
55
 
56
56
  describe "#pid_from_ruby_class" do
57
57
  it "should construct pids" do
58
- ActiveFedora::ContentModel.pid_from_ruby_class(@test_cmodel.class).should == "afmodel:ActiveFedora_ContentModel"
59
- ActiveFedora::ContentModel.pid_from_ruby_class(@test_cmodel.class, :namespace => "foo", :pid_suffix => "BarBar").should == "foo:ActiveFedora_ContentModelBarBar"
58
+ ActiveFedora::ContentModel.pid_from_ruby_class(@test_cmodel.class).should == "info:fedora/afmodel:ActiveFedora_ContentModel"
59
+ ActiveFedora::ContentModel.pid_from_ruby_class(@test_cmodel.class, :namespace => "foo", :pid_suffix => "BarBar").should == "info:fedora/foo:ActiveFedora_ContentModelBarBar"
60
60
  end
61
61
  it "should construct pids with the namespace declared in the model" do
62
62
  ActiveFedora::ContentModel.stubs(:pid_namespace).returns("test-cModel")
63
- ActiveFedora::ContentModel.pid_from_ruby_class(@test_cmodel.class).should == "test-cModel:ActiveFedora_ContentModel"
63
+ ActiveFedora::ContentModel.pid_from_ruby_class(@test_cmodel.class).should == "info:fedora/test-cModel:ActiveFedora_ContentModel"
64
64
  end
65
65
  it "should construct pids with the suffix declared in the model" do
66
66
  ActiveFedora::ContentModel.stubs(:pid_suffix).returns("-TEST-SUFFIX")
67
- ActiveFedora::ContentModel.pid_from_ruby_class(@test_cmodel.class).should == 'afmodel:ActiveFedora_ContentModel-TEST-SUFFIX'
67
+ ActiveFedora::ContentModel.pid_from_ruby_class(@test_cmodel.class).should == 'info:fedora/afmodel:ActiveFedora_ContentModel-TEST-SUFFIX'
68
68
  end
69
69
  end
70
70
 
@@ -6,6 +6,7 @@ require 'xmlsimple'
6
6
  @@last_pid = 0
7
7
 
8
8
  class SpecNamedNode
9
+ include ActiveFedora::SemanticNode
9
10
  include ActiveFedora::RelationshipsHelper
10
11
 
11
12
  attr_accessor :pid
@@ -51,7 +52,10 @@ describe ActiveFedora::RelationshipsHelper do
51
52
  it 'should check if current object is the kind of model class supplied' do
52
53
  #has_model relationship does not get created until save called
53
54
  r = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_model,:object=>ActiveFedora::ContentModel.pid_from_ruby_class(SpecNamedNode)})
54
- @test_object.expects(:relationships).returns({:self=>{:has_model=>[r.object]}}).at_least_once
55
+ graph = RDF::Graph.new
56
+ subject = RDF::URI.new "info:fedora/test:sample_pid"
57
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:has_model), RDF::URI.new(r.object))
58
+ @test_object.expects(:relationships).returns(graph).at_least_once
55
59
  @test_object.conforms_to?(SpecNamedNode).should == true
56
60
  end
57
61
  end
@@ -66,7 +70,10 @@ describe ActiveFedora::RelationshipsHelper do
66
70
  @test_object3.pid = increment_pid
67
71
  #has_model relationship does not get created until save called so need to add the has model rel here, is fine since not testing save
68
72
  r = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_model,:object=>ActiveFedora::ContentModel.pid_from_ruby_class(SpecNamedNode)})
69
- @test_object.expects(:relationships).returns({:self=>{:has_model=>[r.object]}}).at_least_once
73
+ graph = RDF::Graph.new
74
+ subject = RDF::URI.new "info:fedora/test:sample_pid"
75
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:has_model), RDF::URI.new(r.object))
76
+ @test_object.expects(:relationships).returns(graph).at_least_once
70
77
  @test_object3.assert_conforms_to('object',@test_object,SpecNamedNode)
71
78
  end
72
79
  end
@@ -101,12 +108,19 @@ describe ActiveFedora::RelationshipsHelper do
101
108
  @test_object3 = MockNamedRelationships3.new
102
109
  @test_object3.pid = increment_pid
103
110
  r = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_model,:object=>ActiveFedora::ContentModel.pid_from_ruby_class(MockNamedRelationships3)})
104
- @test_object2.expects(:relationships).returns({:self=>{:has_model=>[r.object],:has_part=>[],:has_member=>[]},:inbound=>{:has_part=>[]}}).at_least_once
111
+ graph = RDF::Graph.new
112
+ subject = RDF::URI.new "info:fedora/test:sample_pid"
113
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:has_model), RDF::URI.new(r.object))
114
+ @test_object2.expects(:relationships).returns(graph).at_least_once
105
115
  #should return expected named relationships
106
- @test_object2.relationships_by_name.should == {:self=>{"testing"=>[],"testing2"=>[]},:inbound=>{"testing_inbound"=>[]}}
116
+ @test_object2.relationships_by_name.should == {:self=>{"testing"=>[],"testing2"=>[]}}
107
117
  r3 = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_part,:object=>@test_object})
108
- @test_object3.expects(:relationships).returns({:self=>{:has_model=>[r.object],:has_part=>[r3.object],:has_member=>[]},:inbound=>{:has_part=>[]}}).at_least_once
109
- @test_object3.relationships_by_name.should == {:self=>{"testing"=>[r3.object],"testing2"=>[]},:inbound=>{"testing_inbound"=>[]}}
118
+ graph = RDF::Graph.new
119
+ subject = RDF::URI.new "info:fedora/test:sample_pid"
120
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:has_model), RDF::URI.new(r.object))
121
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:has_part), RDF::URI.new(r3.object))
122
+ @test_object3.expects(:relationships).returns(graph).at_least_once
123
+ @test_object3.relationships_by_name.should == {:self=>{"testing"=>[r3.object],"testing2"=>[]}}
110
124
  end
111
125
  end
112
126
 
@@ -171,7 +185,9 @@ describe ActiveFedora::RelationshipsHelper do
171
185
  it 'should return hash of outbound relationship names to arrays of object uri' do
172
186
  @test_object2 = MockRelationshipNames.new
173
187
  @test_object2.pid = increment_pid
174
- @test_object2.expects(:relationships).returns({:self=>{:has_part=>[],:has_member=>[],:inbound=>{:has_part=>[],:has_member=>[]}}}).at_least_once
188
+ graph = RDF::Graph.new
189
+ subject = RDF::URI.new "info:fedora/test:sample_pid"
190
+ @test_object2.expects(:relationships).returns(graph).at_least_once
175
191
  @test_object2.outbound_relationships_by_name.should == {"testing"=>[],
176
192
  "testing2"=>[]}
177
193
  end
@@ -198,7 +214,12 @@ describe ActiveFedora::RelationshipsHelper do
198
214
  #add relationships that mirror 'testing' and 'testing2'
199
215
  r3 = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:has_part, :object=>@test_object3)
200
216
  r4 = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:has_member, :object=>@test_object4)
201
- @test_object2.expects(:relationships).returns({:self=>{:has_part=>[r3.object]},:has_member=>[r4.object],:has_model=>[r.object]}).at_least_once
217
+ graph = RDF::Graph.new
218
+ subject = RDF::URI.new "info:fedora/test:sample_pid"
219
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:has_model), RDF::URI.new(r.object))
220
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:has_member), RDF::URI.new(r4.object))
221
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:has_part), RDF::URI.new(r3.object))
222
+ @test_object2.expects(:relationships).returns(graph).at_least_once
202
223
  @test_object2.find_relationship_by_name("testing").should == [r3.object]
203
224
  end
204
225
  end
@@ -221,18 +242,16 @@ describe ActiveFedora::RelationshipsHelper do
221
242
  end
222
243
 
223
244
  it "should call bidirectional_relationship_query if a bidirectional relationship" do
224
- rels_ids = ["info:fedora/changeme:1","info:fedora/changeme:2","info:fedora/changeme:3","info:fedora/changeme:4"]
225
- @mockrelsquery.expects(:outbound_relationships).returns({:has_part=>rels_ids}).at_least_once
226
245
  ids = ["changeme:1","changeme:2","changeme:3","changeme:4"]
246
+ @mockrelsquery.expects(:ids_for_outbound).with(:has_part).returns(ids).at_least_once
227
247
  @mockrelsquery.expects(:pid).returns("changeme:5")
228
248
  MockNamedRelationshipQuery.expects(:bidirectional_relationship_query).with("changeme:5","testing_bi_query",ids)
229
249
  @mockrelsquery.relationship_query("testing_bi_query")
230
250
  end
231
251
 
232
252
  it "should call outbound_relationship_query if an outbound relationship" do
233
- rels_ids = ["info:fedora/changeme:1","info:fedora/changeme:2","info:fedora/changeme:3","info:fedora/changeme:4"]
234
- @mockrelsquery.expects(:outbound_relationships).returns({:is_part_of=>rels_ids}).at_least_once
235
253
  ids = ["changeme:1","changeme:2","changeme:3","changeme:4"]
254
+ @mockrelsquery.expects(:ids_for_outbound).with(:is_part_of).returns(ids).at_least_once
236
255
  MockNamedRelationshipQuery.expects(:outbound_relationship_query).with("testing_outbound_no_solr_fq",ids)
237
256
  @mockrelsquery.relationship_query("testing_outbound_no_solr_fq")
238
257
  end
@@ -1,18 +1,11 @@
1
1
  require File.join( File.dirname(__FILE__), "../spec_helper" )
2
2
 
3
- require 'active_fedora'
4
- require "rexml/document"
5
- require "nokogiri"
6
- require 'ftools'
3
+ require 'equivalent-xml'
7
4
 
8
5
  describe ActiveFedora::RelsExtDatastream do
9
6
 
10
7
  before(:all) do
11
8
  @pid = "test:sample_pid"
12
- @test_relationship1 = ActiveFedora::Relationship.new(:subject => :self, :predicate => :is_member_of, :object => "demo:10")
13
- @test_relationship2 = ActiveFedora::Relationship.new(:subject => :self, :predicate => :is_part_of, :object => "demo:11")
14
- @test_relationship3 = ActiveFedora::Relationship.new(:subject => @pid, :predicate => :has_part, :object => "demo:12")
15
- @test_relationship4 = ActiveFedora::Relationship.new(:subject => @pid, :predicate => :conforms_to, :object => "AnInterface", :is_literal=>true)
16
9
 
17
10
  @sample_xml = Nokogiri::XML::Document.parse(@sample_xml_string)
18
11
  end
@@ -33,36 +26,65 @@ describe ActiveFedora::RelsExtDatastream do
33
26
  describe '#serialize!' do
34
27
 
35
28
  it "should generate new rdf/xml as the datastream content if the object has been changed" do
36
- @test_ds.register_triple(:self, :is_member_of, "demo:10")
29
+ graph = RDF::Graph.new
30
+ subject = RDF::URI.new "info:fedora/test:sample_pid"
31
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:is_member_of), RDF::URI.new('demo:10'))
32
+
33
+ @test_ds.expects(:model).returns(stub("model", :outbound_relationships=>graph, :relationships=>graph, :relationships_are_dirty =>true, :relationships_are_dirty= => true)).times(3)
37
34
  @test_ds.serialize!
38
- @test_ds.content.should == " <rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>\n <rdf:Description rdf:about='info:fedora/test:sample_pid'>\n <isMemberOf rdf:resource='demo:10' xmlns='info:fedora/fedora-system:def/relations-external#'/></rdf:Description>\n </rdf:RDF>\n"
35
+ EquivalentXml.equivalent?(@test_ds.content, "<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>\n <rdf:Description rdf:about='info:fedora/test:sample_pid'>\n <isMemberOf rdf:resource='demo:10' xmlns='info:fedora/fedora-system:def/relations-external#'/></rdf:Description>\n </rdf:RDF>").should be_true
39
36
  end
40
37
 
41
38
  end
39
+
40
+ describe '#to_rels_ext' do
41
+
42
+ before(:all) do
43
+ @sample_rels_ext_xml = <<-EOS
44
+ <rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
45
+ <rdf:Description rdf:about='info:fedora/test:sample_pid'>
46
+ <isMemberOf rdf:resource='info:fedora/demo:10' xmlns='info:fedora/fedora-system:def/relations-external#'/>
47
+ <isPartOf rdf:resource='info:fedora/demo:11' xmlns='info:fedora/fedora-system:def/relations-external#'/>
48
+ <hasPart rdf:resource='info:fedora/demo:12' xmlns='info:fedora/fedora-system:def/relations-external#'/>
49
+ <hasModel rdf:resource='info:fedora/afmodel:OtherModel' xmlns='info:fedora/fedora-system:def/model#'/>
50
+ <hasModel rdf:resource='info:fedora/afmodel:SampleModel' xmlns='info:fedora/fedora-system:def/model#'/>
51
+ </rdf:Description>
52
+ </rdf:RDF>
53
+ EOS
54
+ @pid = "test:sample_pid"
55
+ end
56
+
57
+ it 'should serialize the relationships array to Fedora RELS-EXT rdf/xml' do
58
+ graph = RDF::Graph.new
59
+ subject = RDF::URI.new "info:fedora/test:sample_pid"
60
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:is_member_of), RDF::URI.new('info:fedora/demo:10'))
61
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:is_part_of), RDF::URI.new('info:fedora/demo:11'))
62
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:has_part), RDF::URI.new('info:fedora/demo:12'))
63
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:has_model), RDF::URI.new("info:fedora/afmodel:OtherModel"))
64
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:has_model), RDF::URI.new("info:fedora/afmodel:SampleModel"))
65
+
66
+ @test_ds.expects(:model).returns(stub("model", :relationships=>graph, :relationships_are_dirty= => true))
67
+ EquivalentXml.equivalent?(@test_ds.to_rels_ext(), @sample_rels_ext_xml).should be_true
68
+ end
69
+
70
+ end
42
71
 
43
72
  describe "#from_xml" do
44
73
  before(:all) do
45
74
  @test_obj = ActiveFedora::Base.new
46
- @test_obj.add_relationship(:is_member_of, "demo:10")
47
- @test_obj.add_relationship(:is_part_of, "demo:11")
75
+ @test_obj.add_relationship(:is_member_of, "info:fedora/demo:10")
76
+ @test_obj.add_relationship(:is_part_of, "info:fedora/demo:11")
48
77
  @test_obj.add_relationship(:conforms_to, "AnInterface", true)
49
78
  @test_obj.save
50
79
  end
51
80
  after(:all) do
52
81
  @test_obj.delete
53
82
  end
54
- it "should load RELS-EXT relationships into relationships hash" do
55
- @test_obj.relationships.should == {:self=>{:is_member_of=>["info:fedora/demo:10"], :is_part_of=>["info:fedora/demo:11"], :has_model=>["info:fedora/afmodel:ActiveFedora_Base"], :conforms_to=>["AnInterface"]}}
56
- new_ds = ActiveFedora::RelsExtDatastream.new(nil, nil)
57
- new_ds.relationships.should == {:self=>{}}
58
- ActiveFedora::RelsExtDatastream.from_xml(@test_obj.rels_ext.content,new_ds)
59
- new_ds.relationships.should == @test_obj.relationships
60
- end
61
83
  it "should handle un-mapped predicates gracefully" do
62
- @test_obj.relationships.should == {:self=>{:is_member_of=>["info:fedora/demo:10"], :is_part_of=>["info:fedora/demo:11"], :has_model=>["info:fedora/afmodel:ActiveFedora_Base"], :conforms_to=>["AnInterface"]}}
63
84
  @test_obj.add_relationship("foo", "foo:bar")
64
85
  @test_obj.save
65
- @test_obj.relationships.should == {:self=>{:is_part_of=>["info:fedora/demo:11"], "foo"=>["info:fedora/foo:bar"], :has_model=>["info:fedora/afmodel:ActiveFedora_Base"], :is_member_of=>["info:fedora/demo:10"], :conforms_to=>["AnInterface"]}}
86
+ @test_obj.relationships.size.should == 5
87
+ @test_obj.ids_for_outbound("foo").should == ["foo:bar"]
66
88
  end
67
89
  it "should handle un-mapped literals" do
68
90
  pending
@@ -93,15 +115,23 @@ describe ActiveFedora::RelsExtDatastream do
93
115
  describe ".to_solr" do
94
116
 
95
117
  it "should provide .to_solr and return a SolrDocument" do
118
+ graph = RDF::Graph.new
119
+ subject = RDF::URI.new "info:fedora/test:sample_pid"
120
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:is_member_of), RDF::URI.new('demo:10'))
96
121
  @test_ds.should respond_to(:to_solr)
122
+ @test_ds.expects(:model).returns(stub("model", :relationships=>graph, :relationships_are_dirty= => true))
97
123
  @test_ds.to_solr.should be_kind_of(Hash)
98
124
  end
99
125
 
100
126
  it "should serialize the relationships into a Hash" do
101
- @test_ds.add_relationship(@test_relationship1)
102
- @test_ds.add_relationship(@test_relationship2)
103
- @test_ds.add_relationship(@test_relationship3)
104
- @test_ds.add_relationship(@test_relationship4)
127
+ graph = RDF::Graph.new
128
+ subject = RDF::URI.new "info:fedora/test:sample_pid"
129
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:is_member_of), RDF::URI.new('info:fedora/demo:10'))
130
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:is_part_of), RDF::URI.new('info:fedora/demo:11'))
131
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:has_part), RDF::URI.new('info:fedora/demo:12'))
132
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:conforms_to), "AnInterface")
133
+
134
+ @test_ds.expects(:model).returns(stub("model", :relationships=>graph, :relationships_are_dirty= => true))
105
135
  solr_doc = @test_ds.to_solr
106
136
  solr_doc["is_member_of_s"].should == ["info:fedora/demo:10"]
107
137
  solr_doc["is_part_of_s"].should == ["info:fedora/demo:11"]
@@ -156,13 +156,13 @@ describe ActiveFedora::SemanticNode do
156
156
  it "should add a subject and predicate to the relationships array" do
157
157
  SpecNode.has_relationship("parents", :is_part_of)
158
158
  SpecNode.relationships.should have_key(:self)
159
- @node.relationships[:self].should have_key(:is_part_of)
159
+ SpecNode.relationships[:self].should have_key(:is_part_of)
160
160
  end
161
161
 
162
162
  it "should use :inbound as the subject if :inbound => true" do
163
163
  SpecNode.has_relationship("parents", :is_part_of, :inbound => true)
164
164
  SpecNode.relationships.should have_key(:inbound)
165
- @node.relationships[:inbound].should have_key(:is_part_of)
165
+ SpecNode.relationships[:inbound].should have_key(:is_part_of)
166
166
  end
167
167
 
168
168
  it 'should create inbound relationship finders' do
@@ -181,8 +181,12 @@ describe ActiveFedora::SemanticNode do
181
181
  local_node = SpecNode.new
182
182
  local_node.internal_uri = "info:fedora/#{@pid}"
183
183
 
184
- local_node.add_relationship(ActiveFedora::Relationship.new(:subject => :self, :predicate => :is_member_of, :object => "info:fedora/container:A") )
185
- local_node.add_relationship(ActiveFedora::Relationship.new(:subject => :self, :predicate => :is_member_of, :object => "info:fedora/container:B") )
184
+ # local_node.add_relationship(ActiveFedora::Relationship.new(:subject => :self, :predicate => :is_member_of, :object => "info:fedora/container:A") )
185
+ # local_node.add_relationship(ActiveFedora::Relationship.new(:subject => :self, :predicate => :is_member_of, :object => "info:fedora/container:B") )
186
+ local_node.expects(:rels_ext).returns(stub("rels_ext", :dirty= => true)).twice
187
+ local_node.add_relationship(:is_member_of, "info:fedora/container:A")
188
+ local_node.add_relationship(:is_member_of, "info:fedora/container:B")
189
+
186
190
  containers_result = local_node.containers_ids
187
191
  containers_result.should be_instance_of(Array)
188
192
  containers_result.should include("container:A")
@@ -227,8 +231,8 @@ describe ActiveFedora::SemanticNode do
227
231
  @test_object2 = MockHasRelationship.new
228
232
  @test_object2.pid = increment_pid
229
233
  @test_object2.stubs(:testing_inbound).returns({})
230
- r = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_model,:object=>ActiveFedora::ContentModel.pid_from_ruby_class(SpecNode2)})
231
- @test_object2.add_relationship(r)
234
+ @test_object2.expects(:rels_ext).returns(stub("rels_ext", :dirty= => true))
235
+ @test_object2.add_relationship(:has_model, ActiveFedora::ContentModel.pid_from_ruby_class(SpecNode2))
232
236
  @test_object2.should respond_to(:testing_append)
233
237
  @test_object2.should respond_to(:testing_remove)
234
238
  @test_object2.should respond_to(:testing2_append)
@@ -343,7 +347,7 @@ describe ActiveFedora::SemanticNode do
343
347
  it "should read from relationships array and use Repository.find_model to build an array of objects" do
344
348
  SpecNode.create_outbound_relationship_finders("containers", :is_member_of)
345
349
  local_node = SpecNode.new
346
- local_node.expects(:outbound_relationships).returns({:is_member_of => ["my:_PID1_", "my:_PID2_", "my:_PID3_"]}).times(2)
350
+ local_node.expects(:ids_for_outbound).with(:is_member_of).returns(["my:_PID1_", "my:_PID2_", "my:_PID3_"])
347
351
  mock_repo = mock("repo")
348
352
  solr_result = mock("solr result", :is_a? => true)
349
353
  solr_result.expects(:hits).returns(
@@ -369,14 +373,15 @@ describe ActiveFedora::SemanticNode do
369
373
  it "(:response_format => :id_array) should read from relationships array" do
370
374
  SpecNode.create_outbound_relationship_finders("containers", :is_member_of)
371
375
  local_node = SpecNode.new
372
- local_node.expects(:outbound_relationships).returns({:is_member_of => []}).times(2)
376
+ local_node.expects(:ids_for_outbound).with(:is_member_of).returns([])
373
377
  local_node.containers_ids
374
378
  end
375
379
 
376
380
  it "(:response_format => :id_array) should return an array of fedora PIDs" do
377
381
  SpecNode.create_outbound_relationship_finders("containers", :is_member_of)
378
382
  local_node = SpecNode.new
379
- local_node.add_relationship(@test_relationship1)
383
+ local_node.expects(:rels_ext).returns(stub("rels_ext", :dirty= => true))
384
+ local_node.add_relationship(@test_relationship1.predicate, @test_relationship1.object)
380
385
  result = local_node.containers_ids
381
386
  result.should be_instance_of(Array)
382
387
  result.should include("demo:10")
@@ -433,8 +438,8 @@ describe ActiveFedora::SemanticNode do
433
438
  end
434
439
 
435
440
  it "should register both inbound and outbound predicate components" do
436
- @local_node.relationships[:inbound].has_key?(:is_part_of).should == true
437
- @local_node.relationships[:self].has_key?(:has_part).should == true
441
+ @local_node.class.relationships[:inbound].has_key?(:is_part_of).should == true
442
+ @local_node.class.relationships[:self].has_key?(:has_part).should == true
438
443
  end
439
444
 
440
445
  it "should register relationship names for inbound, outbound" do
@@ -470,35 +475,38 @@ describe ActiveFedora::SemanticNode do
470
475
  @local_node2 = SpecNode.new
471
476
  @local_node2.pid = "mypid2"
472
477
  r = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_model,:object=>ActiveFedora::ContentModel.pid_from_ruby_class(SpecNode)})
473
- @local_node.add_relationship(r)
474
- @local_node2.add_relationship(r)
478
+ @local_node.expects(:rels_ext).returns(stub("rels_ext", :dirty= => true)).twice
479
+ @local_node.add_relationship(r.predicate, r.object)
480
+ @local_node2.expects(:rels_ext).returns(stub("rels_ext", :dirty= => true)).twice
481
+ @local_node2.add_relationship(r.predicate, r.object)
475
482
  r2 = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_part,:object=>@local_node2})
476
- @local_node.add_relationship(r2)
483
+ @local_node.add_relationship(r2.predicate, r2.object)
477
484
  r3 = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_part,:object=>@local_node})
478
- @local_node2.add_relationship(r3)
479
- @local_node.relationships.should == {:self=>{:has_model=>[r.object],:has_part=>[r2.object]},:inbound=>{:is_part_of=>[]}}
480
- @local_node2.relationships.should == {:self=>{:has_model=>[r.object],:has_part=>[r3.object]},:inbound=>{:is_part_of=>[]}}
481
- @local_node.relationships_by_name.should == {:self=>{"all_parts_outbound"=>[r2.object]},:inbound=>{"all_parts_inbound"=>[]}}
482
- @local_node2.relationships_by_name.should == {:self=>{"all_parts_outbound"=>[r3.object]},:inbound=>{"all_parts_inbound"=>[]}}
485
+ @local_node2.add_relationship(r3.predicate, r3.object)
486
+ @local_node.ids_for_outbound(:has_part).should == [@local_node2.pid]
487
+ @local_node.ids_for_outbound(:has_model).should == ['afmodel:SpecNode']
488
+ @local_node2.ids_for_outbound(:has_part).should == [@local_node.pid]
489
+ @local_node2.ids_for_outbound(:has_model).should == ['afmodel:SpecNode']
490
+ @local_node.relationships_by_name(false).should == {:self=>{"all_parts_outbound"=>[r2.object]},:inbound=>{"all_parts_inbound"=>[]}}
491
+ @local_node2.relationships_by_name(false).should == {:self=>{"all_parts_outbound"=>[r3.object]},:inbound=>{"all_parts_inbound"=>[]}}
483
492
  end
484
493
  end
485
494
 
486
495
  describe ".add_relationship" do
487
496
  it "should add relationship to the relationships hash" do
488
- @node.add_relationship(@test_relationship)
489
- @node.relationships.should have_key(@test_relationship.subject)
490
- @node.relationships[@test_relationship.subject].should have_key(@test_relationship.predicate)
491
- @node.relationships[@test_relationship.subject][@test_relationship.predicate].should include(@test_relationship.object)
497
+ @node.expects(:rels_ext).returns(stub("rels_ext", :dirty= => true))
498
+ @node.add_relationship(@test_relationship.predicate, @test_relationship.object)
499
+ @node.ids_for_outbound("isMemberOf").should == ['demo:9']
492
500
  end
493
501
 
494
502
  it "adding relationship to an instance should not affect class-level relationships hash" do
495
503
  local_test_node1 = SpecNode.new
496
504
  local_test_node2 = SpecNode.new
497
- local_test_node1.add_relationship(@test_relationship1)
498
- #local_test_node2.add_relationship(@test_relationship2)
505
+ local_test_node1.expects(:rels_ext).returns(stub("rels_ext", :dirty= => true))
506
+ local_test_node1.add_relationship(@test_relationship1.predicate, @test_relationship1.object)
499
507
 
500
- local_test_node1.relationships[:self][:is_member_of].should == ["info:fedora/demo:10"]
501
- local_test_node2.relationships[:self][:is_member_of].should be_nil
508
+ local_test_node1.ids_for_outbound(:is_member_of).should == ["demo:10"]
509
+ local_test_node2.ids_for_outbound(:is_member_of).should == []
502
510
  end
503
511
 
504
512
  end
@@ -518,12 +526,10 @@ describe ActiveFedora::SemanticNode do
518
526
 
519
527
  describe '.register_triple' do
520
528
  it 'should add triples to the relationships hash' do
521
- @node.register_triple(:self, :is_part_of, "info:fedora/demo:10")
522
- @node.register_triple(:self, :is_member_of, "info:fedora/demo:11")
523
- @node.relationships[:self].should have_key(:is_part_of)
524
- @node.relationships[:self].should have_key(:is_member_of)
525
- @node.relationships[:self][:is_part_of].should include("info:fedora/demo:10")
526
- @node.relationships[:self][:is_member_of].should include("info:fedora/demo:11")
529
+ @node.register_triple(@node.internal_uri, :is_part_of, "info:fedora/demo:10")
530
+ @node.register_triple(@node.internal_uri, :is_member_of, "info:fedora/demo:11")
531
+ @node.ids_for_outbound(:is_part_of).should == ['demo:10']
532
+ @node.ids_for_outbound(:is_member_of).should == ['demo:11']
527
533
  end
528
534
 
529
535
  it "should not be a class level method"
@@ -541,121 +547,46 @@ describe ActiveFedora::SemanticNode do
541
547
  lambda { SpecNode.predicate_lookup(:has_foo) }.should raise_error ActiveFedora::UnregisteredPredicateError
542
548
  end
543
549
 
544
- it 'should provide #relationships_to_rels_ext' do
545
- SpecNode.should respond_to(:relationships_to_rels_ext)
546
- @node.should respond_to(:to_rels_ext)
547
- end
548
-
549
- describe '#relationships_to_rels_ext' do
550
-
551
- before(:all) do
552
- @sample_rels_ext_xml = <<-EOS
553
- <rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
554
- <rdf:Description rdf:about='info:fedora/test:sample_pid'>
555
- <isMemberOf rdf:resource='info:fedora/demo:10' xmlns='info:fedora/fedora-system:def/relations-external#'/>
556
- <isPartOf rdf:resource='info:fedora/demo:11' xmlns='info:fedora/fedora-system:def/relations-external#'/>
557
- <hasPart rdf:resource='info:fedora/demo:12' xmlns='info:fedora/fedora-system:def/relations-external#'/>
558
- <hasModel rdf:resource='info:fedora/afmodel:OtherModel' xmlns='info:fedora/fedora-system:def/model#'/>
559
- <hasModel rdf:resource='info:fedora/afmodel:SampleModel' xmlns='info:fedora/fedora-system:def/model#'/>
560
- </rdf:Description>
561
- </rdf:RDF>
562
- EOS
563
- end
564
-
565
- it 'should serialize the relationships array to Fedora RELS-EXT rdf/xml' do
566
- @node.add_relationship(@test_relationship1)
567
- @node.add_relationship(@test_relationship2)
568
- @node.add_relationship(@test_relationship3)
569
- @node.add_relationship(@test_cmodel_relationship1)
570
- @node.add_relationship(@test_cmodel_relationship2)
571
- @node.internal_uri = @uri
572
- # returned_xml = XmlSimple.xml_in(@node.to_rels_ext(@pid))
573
- # returned_xml.should == XmlSimple.xml_in(@sample_rels_ext_xml)
574
- EquivalentXml.equivalent?(@node.to_rels_ext(@pid), @sample_rels_ext_xml).should be_true
575
- end
576
-
577
- it "should treat :self and self.pid as equivalent subjects"
578
- end
579
-
580
- it 'should provide #relationships_to_rdf_xml'
581
-
582
- describe '#relationships_to_rdf_xml' do
583
- it 'should serialize the relationships array to rdf/xml'
584
- end
585
550
 
586
551
  it "should provide .outbound_relationships" do
587
552
  @node.should respond_to(:outbound_relationships)
588
553
  end
589
554
 
590
555
 
591
- it 'should provide #unregister_triple' do
592
- @test_object.should respond_to(:unregister_triple)
593
- end
594
-
595
- describe '#unregister_triple' do
596
- it 'should remove a triple from the relationships hash' do
597
- r = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_part,:object=>"info:fedora/3"})
598
- r2 = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_part,:object=>"info:fedora/4"})
599
- @test_object.add_relationship(r)
600
- @test_object.add_relationship(r2)
601
- #check both are there
602
- @test_object.relationships.should == {:self=>{:has_part=>[r.object,r2.object]}}
603
- @test_object.unregister_triple(r.subject,r.predicate,r.object)
604
- #check returns false if relationship does not exist and does nothing
605
- @test_object.unregister_triple(:self,:has_member,r2.object).should == false
606
- #check only one item removed
607
- @test_object.relationships.should == {:self=>{:has_part=>[r2.object]}}
608
- @test_object.unregister_triple(r2.subject,r2.predicate,r2.object)
609
- #check last item removed and predicate removed since now emtpy
610
- @test_object.relationships.should == {:self=>{}}
611
-
612
- end
613
- end
614
-
615
- it 'should provide #remove_relationship' do
616
- @test_object.should respond_to(:remove_relationship)
617
- end
618
-
619
556
  describe '#remove_relationship' do
620
557
  it 'should remove a relationship from the relationships hash' do
621
558
  r = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_part,:object=>"info:fedora/3"})
622
559
  r2 = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_part,:object=>"info:fedora/4"})
623
- @test_object.add_relationship(r)
624
- @test_object.add_relationship(r2)
560
+ @test_object.expects(:rels_ext).returns(stub("rels_ext", :dirty= => true)).times(5)
561
+ @test_object.add_relationship(r.predicate, r.object)
562
+ @test_object.add_relationship(r2.predicate, r2.object)
625
563
  #check both are there
626
- @test_object.relationships.should == {:self=>{:has_part=>[r.object,r2.object]}}
627
- @test_object.remove_relationship(r)
564
+ @test_object.ids_for_outbound(:has_part).should include "3", "4"
565
+ @test_object.remove_relationship(r.predicate, r.object)
628
566
  #check returns false if relationship does not exist and does nothing with different predicate
629
567
  rBad = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_member,:object=>"info:fedora/4"})
630
- @test_object.remove_relationship(rBad).should == false
568
+ @test_object.remove_relationship(rBad.predicate, rBad.object)
631
569
  #check only one item removed
632
- @test_object.relationships.should == {:self=>{:has_part=>[r2.object]}}
633
- @test_object.remove_relationship(r2)
570
+ @test_object.ids_for_outbound(:has_part).should == ['4']
571
+ @test_object.remove_relationship(r2.predicate, r2.object)
634
572
  #check last item removed and predicate removed since now emtpy
635
- @test_object.relationships.should == {:self=>{}}
573
+ @test_object.ids_for_outbound(:has_part).should == []
636
574
 
637
575
  end
638
576
  end
639
577
 
640
- it 'should provide #relationship_exists?' do
641
- @test_object.should respond_to(:relationship_exists?)
642
- end
643
-
644
578
  describe '#relationship_exists?' do
645
579
  it 'should return true if a relationship does exist' do
646
580
  @test_object3 = SpecNode2.new
647
581
  @test_object3.pid = increment_pid
648
582
  r = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_member,:object=>@test_object3})
649
- @test_object.relationship_exists?(r.subject,r.predicate,r.object).should == false
650
- @test_object.add_relationship(r)
651
- @test_object.relationship_exists?(r.subject,r.predicate,r.object).should == true
583
+ @test_object.relationship_exists?(@test_object.internal_uri,r.predicate,r.object).should == false
584
+ @test_object.expects(:rels_ext).returns(stub("rels_ext", :dirty= => true))
585
+ @test_object.add_relationship(r.predicate, r.object)
586
+ @test_object.relationship_exists?(@test_object.internal_uri,r.predicate,r.object).should == true
652
587
  end
653
588
  end
654
589
 
655
- it 'should provide #assert_kind_of' do
656
- @test_object.should respond_to(:assert_kind_of)
657
- end
658
-
659
590
  describe '#assert_kind_of' do
660
591
  it 'should raise an exception if object supplied is not the correct type' do
661
592
  had_exception = false