active-fedora 3.1.6 → 3.2.0.pre1

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.
Files changed (44) hide show
  1. data/.gitignore +1 -0
  2. data/Gemfile.lock +22 -22
  3. data/History.txt +9 -3
  4. data/active-fedora.gemspec +3 -3
  5. data/config/predicate_mappings.yml +1 -0
  6. data/config/service_mappings.yml +9 -0
  7. data/lib/active_fedora.rb +7 -1
  8. data/lib/active_fedora/base.rb +84 -30
  9. data/lib/active_fedora/datastream.rb +4 -1
  10. data/lib/active_fedora/datastream_collections.rb +304 -293
  11. data/lib/active_fedora/metadata_datastream.rb +2 -24
  12. data/lib/active_fedora/metadata_datastream_helper.rb +32 -5
  13. data/lib/active_fedora/named_relationships.rb +95 -0
  14. data/lib/active_fedora/nested_attributes.rb +1 -1
  15. data/lib/active_fedora/predicates.rb +76 -0
  16. data/lib/active_fedora/reflection.rb +9 -1
  17. data/lib/active_fedora/relationship.rb +1 -0
  18. data/lib/active_fedora/relationship_graph.rb +152 -0
  19. data/lib/active_fedora/relationships_helper.rb +32 -41
  20. data/lib/active_fedora/rels_ext_datastream.rb +3 -10
  21. data/lib/active_fedora/semantic_node.rb +47 -203
  22. data/lib/active_fedora/service_definitions.rb +89 -0
  23. data/lib/active_fedora/unsaved_digital_object.rb +40 -0
  24. data/lib/active_fedora/version.rb +1 -1
  25. data/spec/integration/base_spec.rb +106 -309
  26. data/spec/integration/datastream_collections_spec.rb +135 -0
  27. data/spec/integration/rels_ext_datastream_spec.rb +14 -35
  28. data/spec/integration/semantic_node_spec.rb +6 -10
  29. data/spec/unit/base_datastream_management_spec.rb +0 -3
  30. data/spec/unit/base_extra_spec.rb +5 -9
  31. data/spec/unit/base_spec.rb +103 -57
  32. data/spec/unit/{base_named_datastream_spec.rb → datastream_collections_spec.rb} +107 -150
  33. data/spec/unit/metadata_datastream_spec.rb +0 -1
  34. data/spec/unit/nokogiri_datastream_spec.rb +0 -1
  35. data/spec/unit/predicates_spec.rb +64 -0
  36. data/spec/unit/qualified_dublin_core_datastream_spec.rb +0 -7
  37. data/spec/unit/relationship_graph_spec.rb +95 -0
  38. data/spec/unit/relationship_spec.rb +4 -4
  39. data/spec/unit/relationships_helper_spec.rb +43 -104
  40. data/spec/unit/rels_ext_datastream_spec.rb +6 -6
  41. data/spec/unit/semantic_node_spec.rb +27 -116
  42. data/spec/unit/service_definitions_spec.rb +52 -0
  43. data/spec/unit/solr_config_options_spec.rb +1 -1
  44. metadata +35 -17
@@ -0,0 +1,135 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveFedora::DatastreamCollections do
4
+ before(:all) do
5
+ ActiveSupport::Deprecation.expects(:warn).with("Deprecation: DatastreamCollections will not be included by default in the next version. To use has_datastream add 'include ActiveFedora::DatastreamCollections' to your model")
6
+ class MockAFBaseDatastream < ActiveFedora::Base
7
+ has_datastream :name=>"thumbnail",:prefix => "THUMB", :type=>ActiveFedora::Datastream, :mimeType=>"image/jpeg", :controlGroup=>'M'
8
+ has_datastream :name=>"high", :type=>ActiveFedora::Datastream, :mimeType=>"image/jpeg", :controlGroup=>'M'
9
+ end
10
+ end
11
+
12
+ #
13
+ # Named datastream specs
14
+ #
15
+ describe '#add_named_datastream' do
16
+ it 'should add a datastream with the given name to the object in fedora' do
17
+ @test_object2 = MockAFBaseDatastream.new
18
+ # @test_object2.new_object = true
19
+ f = File.open(File.join( File.dirname(__FILE__), "../fixtures/minivan.jpg"), 'rb')
20
+ f2 = File.open(File.join( File.dirname(__FILE__), "../fixtures/dino.jpg" ), 'rb')
21
+ f2.stubs(:original_filename).returns("dino.jpg")
22
+ f.stubs(:content_type).returns("image/jpeg")
23
+ @test_object2.add_named_datastream("thumbnail",{:content_type=>"image/jpeg",:blob=>f, :label=>"testDS"})
24
+ @test_object2.add_named_datastream("high",{:content_type=>"image/jpeg",:blob=>f2})
25
+ ds = @test_object2.thumbnail.first
26
+ ds2 = @test_object2.high.first
27
+ @test_object2.save
28
+ @test_object2 = MockAFBaseDatastream.load_instance(@test_object2.pid)
29
+ @test_object2.named_datastreams.keys.size.should == 2
30
+ @test_object2.named_datastreams.keys.include?("thumbnail").should == true
31
+ @test_object2.named_datastreams.keys.include?("high").should == true
32
+ @test_object2.named_datastreams["thumbnail"].size.should == 1
33
+ @test_object2.named_datastreams["high"].size.should == 1
34
+ t2_thumb1 = @test_object2.named_datastreams["thumbnail"].first
35
+ t2_thumb1.dsid.should == ds.dsid
36
+ t2_thumb1.mimeType.should == ds.mimeType
37
+ t2_thumb1.pid.should == ds.pid
38
+ t2_thumb1.dsLabel.should == ds.dsLabel
39
+ t2_thumb1.controlGroup.should == ds.controlGroup
40
+ t2_high1 = @test_object2.named_datastreams["high"].first
41
+ t2_high1.dsid.should == ds2.dsid
42
+ t2_high1.mimeType.should == ds2.mimeType
43
+ t2_high1.pid.should == ds2.pid
44
+ t2_high1.dsLabel.should == ds2.dsLabel
45
+ t2_high1.controlGroup.should == ds2.controlGroup
46
+ end
47
+ end
48
+
49
+ describe '#add_named_file_datastream' do
50
+ it 'should add a file datastream with the given name to the object in fedora' do
51
+ @test_object2 = MockAFBaseDatastream.new
52
+ # @test_object2.new_object = true
53
+ f = File.open(File.join( File.dirname(__FILE__), "../fixtures/minivan.jpg"), 'rb')
54
+ f.stubs(:content_type).returns("image/jpeg")
55
+ @test_object2.add_named_file_datastream("thumbnail",f)
56
+ ds = @test_object2.thumbnail.first
57
+ @test_object2.save
58
+ @test_object2 = MockAFBaseDatastream.load_instance(@test_object2.pid)
59
+ @test_object2.named_datastreams["thumbnail"].size.should == 1
60
+ t2_thumb1 = @test_object2.named_datastreams["thumbnail"].first
61
+ t2_thumb1.dsid.should == "THUMB1"
62
+ t2_thumb1.mimeType.should == "image/jpeg"
63
+ t2_thumb1.pid.should == @test_object2.pid
64
+ t2_thumb1.dsLabel.should == "minivan.jpg"
65
+ t2_thumb1.controlGroup.should == "M"
66
+
67
+ # .attributes.should == {"label"=>ds.label,"dsid"=>ds.dsid,
68
+ # "mimeType"=>ds.attributes[:mimeType],
69
+ # :controlGroup=>ds.attributes[:controlGroup],
70
+ # :pid=>ds.pid, :dsID=>ds.dsid, :dsLabel=>ds.attributes[:dsLabel]}
71
+ end
72
+ end
73
+
74
+ describe '#update_named_datastream' do
75
+ it 'should update a named datastream to have a new file' do
76
+ @test_object2 = MockAFBaseDatastream.new
77
+ f = File.open(File.join( File.dirname(__FILE__), "../fixtures/minivan.jpg"), 'rb')
78
+ minivan = f.read
79
+ f.rewind
80
+ f2 = File.open(File.join( File.dirname(__FILE__), "../fixtures/dino.jpg" ), 'rb')
81
+ dino = f2.read
82
+ f2.rewind
83
+ f.stubs(:content_type).returns("image/jpeg")
84
+ f.stubs(:original_filename).returns("minivan.jpg")
85
+ f2.stubs(:content_type).returns("image/jpeg")
86
+ f2.stubs(:original_filename).returns("dino.jpg")
87
+ #check raise exception if dsid not supplied
88
+ @test_object2.add_named_datastream("thumbnail",{:file=>f})
89
+ @test_object2.save
90
+ @test_object2 = MockAFBaseDatastream.load_instance(@test_object2.pid)
91
+
92
+ @test_object2.thumbnail.size.should == 1
93
+ @test_object2.thumbnail_ids == ["THUMB1"]
94
+ ds = @test_object2.thumbnail.first
95
+ ds.dsid.should == "THUMB1"
96
+ ds.mimeType.should == "image/jpeg"
97
+ ds.pid.should == @test_object2.pid
98
+ ds.dsLabel.should == "minivan.jpg"
99
+ ds.controlGroup.should == "M"
100
+
101
+ ds.content.should == minivan
102
+ @test_object2.update_named_datastream("thumbnail",{:file=>f2,:dsid=>"THUMB1"})
103
+ @test_object2.save
104
+ @test_object2 = MockAFBaseDatastream.load_instance(@test_object2.pid)
105
+ @test_object2.thumbnail.size.should == 1
106
+ @test_object2.thumbnail_ids == ["THUMB1"]
107
+ ds2 = @test_object2.thumbnail.first
108
+ ds2.dsid.should == "THUMB1"
109
+ ds2.mimeType.should == "image/jpeg"
110
+ ds2.pid.should == @test_object2.pid
111
+ ds2.dsLabel.should == "dino.jpg"
112
+ ds2.controlGroup.should == "M"
113
+ (ds2.content == dino).should be_true
114
+ end
115
+ end
116
+
117
+ describe '#named_datastreams_ids' do
118
+ it 'should return a hash of datastream name to an array of dsids' do
119
+ @test_object2 = MockAFBaseDatastream.new
120
+ # @test_object2.new_object = true
121
+ f = File.open(File.join( File.dirname(__FILE__), "../fixtures/minivan.jpg"), 'rb')
122
+ f2 = File.open(File.join( File.dirname(__FILE__), "../fixtures/dino.jpg" ), 'rb')
123
+ f2.stubs(:original_filename).returns("dino.jpg")
124
+ f.stubs(:content_type).returns("image/jpeg")
125
+ @test_object2.add_named_datastream("thumbnail",{:content_type=>"image/jpeg",:blob=>f, :label=>"testDS"})
126
+ @test_object2.add_named_datastream("thumbnail",{:content_type=>"image/jpeg",:blob=>f2})
127
+ @test_object2.save
128
+ @test_object2 = MockAFBaseDatastream.load_instance(@test_object2.pid)
129
+ @test_object2.named_datastreams_ids.should == {"high"=>[], "thumbnail"=>["THUMB1", "THUMB2"]}
130
+ end
131
+ end
132
+
133
+
134
+
135
+ end
@@ -31,8 +31,6 @@ describe ActiveFedora::RelsExtDatastream do
31
31
  @test_datastream = ActiveFedora::RelsExtDatastream.new(@test_object.inner_object, 'RELS-EXT')
32
32
  @test_datastream.model = @test_object
33
33
  @test_object.save
34
- @test_relationships = [ActiveFedora::Relationship.new(:subject => :self, :predicate => :is_member_of, :object => "info:fedora/demo:5"),
35
- ActiveFedora::Relationship.new(:subject => :self, :predicate => :is_member_of, :object => "info:fedora/demo:10")]
36
34
  end
37
35
 
38
36
  after(:each) do
@@ -63,9 +61,8 @@ describe ActiveFedora::RelsExtDatastream do
63
61
 
64
62
  it "should generate new rdf/xml as the datastream content" do
65
63
  @test_object.add_datastream(@test_datastream)
66
- @test_relationships.each do |rel|
67
- @test_object.add_relationship(rel.predicate, rel.object)
68
- end
64
+ @test_object.add_relationship(:is_member_of, "info:fedora/demo:5")
65
+ @test_object.add_relationship(:is_member_of, "info:fedora/demo:10")
69
66
  rexml1 = REXML::Document.new(@test_datastream.to_rels_ext())
70
67
  @test_datastream.serialize!
71
68
  rexml2 = REXML::Document.new(@test_object.datastreams["RELS-EXT"].content)
@@ -76,7 +73,7 @@ describe ActiveFedora::RelsExtDatastream do
76
73
 
77
74
  it "should load relationships from fedora into parent object" do
78
75
  class SpecNode; include ActiveFedora::SemanticNode; end
79
- SpecNode.predicate_mappings[SpecNode.default_predicate_namespace].each_key do |p|
76
+ ActiveFedora::Predicates.predicate_mappings[ActiveFedora::Predicates.default_predicate_namespace].each_key do |p|
80
77
  @test_object.add_relationship(p, "info:fedora/demo:#{rand(100)}")
81
78
  end
82
79
  @test_object.save
@@ -113,11 +110,7 @@ describe ActiveFedora::RelsExtDatastream do
113
110
  @test_object5.testing2_append(@test_object3)
114
111
  @test_object2.save
115
112
  @test_object5.save
116
- r2 = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>@test_object2)
117
- r3 = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>@test_object3)
118
- r4 = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>@test_object4)
119
- r5 = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>@test_object5)
120
- model_rel = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>ActiveFedora::ContentModel.pid_from_ruby_class(MockAFRelsSolr))
113
+ model_rel = ActiveFedora::ContentModel.pid_from_ruby_class(MockAFRelsSolr)
121
114
  #check inbound correct, testing goes to :has_part and testing2 goes to :has_member
122
115
  #get solr doc for @test_object2
123
116
  solr_doc = MockAFRelsSolr.find_by_solr(@test_object2.pid).hits.first
@@ -133,35 +126,21 @@ describe ActiveFedora::RelsExtDatastream do
133
126
  test_from_solr_object5 = MockAFRelsSolr.new
134
127
  test_from_solr_object5.rels_ext.from_solr(solr_doc)
135
128
 
136
- stmt = test_from_solr_object2.build_statement(test_from_solr_object2.internal_uri, :has_part, r3.object)
137
- test_from_solr_object2.relationships.has_statement?(stmt).should be_true
138
- stmt = test_from_solr_object2.build_statement(test_from_solr_object2.internal_uri, :has_member, r4.object)
139
- test_from_solr_object2.relationships.has_statement?(stmt).should be_true
140
- stmt = test_from_solr_object2.build_statement(test_from_solr_object2.internal_uri, :has_model, model_rel.object)
141
- test_from_solr_object2.relationships.has_statement?(stmt).should be_true
129
+ test_from_solr_object2.object_relations[:has_part].should include @test_object3.internal_uri
130
+ test_from_solr_object2.object_relations[:has_member].should include @test_object4.internal_uri
131
+ test_from_solr_object2.object_relations[:has_model].should include model_rel
142
132
 
143
- # test_from_solr_object2.relationships.should == {:self=>{:has_part=>[r3.object],:has_member=>[r4.object],:has_model=>[model_rel.object]}}
144
- test_from_solr_object2.relationships_by_name.should == {:self=>{"testing"=>[r3.object],"testing2"=>[r4.object], "collection_members"=>[], "part_of"=>[], "parts_outbound"=>[r3.object]}}
145
- #test_from_solr_object3.relationships.should == {:self=>{:has_model=>[model_rel.object]}}
146
- stmt = test_from_solr_object3.build_statement(test_from_solr_object3.internal_uri, :has_model, model_rel.object)
147
- test_from_solr_object3.relationships.has_statement?(stmt).should be_true
133
+ test_from_solr_object2.relationships_by_name.should == {:self=>{"testing"=>[@test_object3.internal_uri],"testing2"=>[@test_object4.internal_uri], "collection_members"=>[], "part_of"=>[], "parts_outbound"=>[@test_object3.internal_uri]}}
134
+ test_from_solr_object3.object_relations[:has_model].should include model_rel
148
135
  test_from_solr_object3.relationships_by_name.should == {:self=>{"testing2"=>[], "collection_members"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[]}}
149
- #test_from_solr_object4.relationships.should == {:self=>{:has_model=>[model_rel.object]}}
150
- stmt = test_from_solr_object4.build_statement(test_from_solr_object4.internal_uri, :has_model, model_rel.object)
151
- test_from_solr_object4.relationships.has_statement?(stmt).should be_true
136
+ test_from_solr_object4.object_relations[:has_model].should include model_rel
152
137
  test_from_solr_object4.relationships_by_name.should == {:self=>{"testing2"=>[], "collection_members"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[]}}
153
138
 
154
- stmt = test_from_solr_object5.build_statement(test_from_solr_object5.internal_uri, :has_model, model_rel.object)
155
- test_from_solr_object5.relationships.has_statement?(stmt).should be_true
156
- stmt = test_from_solr_object5.build_statement(test_from_solr_object5.internal_uri, :has_part, r2.object)
157
- test_from_solr_object5.relationships.has_statement?(stmt).should be_true
158
- stmt = test_from_solr_object5.build_statement(test_from_solr_object5.internal_uri, :has_member, r3.object)
159
- test_from_solr_object5.relationships.has_statement?(stmt).should be_true
139
+ test_from_solr_object5.object_relations[:has_model].should include model_rel
140
+ test_from_solr_object5.object_relations[:has_part].should include @test_object2.internal_uri
141
+ test_from_solr_object5.object_relations[:has_member].should include @test_object3.internal_uri
160
142
 
161
- # test_from_solr_object5.relationships.should == {:self=>{:has_model=>[model_rel.object],
162
- # :has_part=>[r2.object],
163
- # :has_member=>[r3.object]}}
164
- test_from_solr_object5.relationships_by_name.should == {:self=>{"testing2"=>[r3.object], "collection_members"=>[], "part_of"=>[], "testing"=>[r2.object], "parts_outbound"=>[r2.object]}}
143
+ test_from_solr_object5.relationships_by_name.should == {:self=>{"testing2"=>[@test_object3.internal_uri], "collection_members"=>[], "part_of"=>[], "testing"=>[@test_object2.internal_uri], "parts_outbound"=>[@test_object2.internal_uri]}}
165
144
  end
166
145
  end
167
146
  end
@@ -150,9 +150,8 @@ describe ActiveFedora::SemanticNode do
150
150
  it "should create useable finders" do
151
151
  spec_node = SNSpecNode.new
152
152
  spec_node.collection_members.should == []
153
- rel = ActiveFedora::Relationship.new(:subject => :self, :predicate => :has_collection_member, :object => @test_object.pid)
154
153
 
155
- spec_node.add_relationship(rel.predicate, rel.object)
154
+ spec_node.add_relationship(:has_collection_member, @test_object.pid)
156
155
  collection_members = spec_node.collection_members
157
156
  collection_members.length.should == 1
158
157
  collection_members.first.pid.should == @test_object.pid
@@ -449,16 +448,13 @@ describe ActiveFedora::SemanticNode do
449
448
 
450
449
  it 'should automatically update the relationships_by_name if relationships has changed (no refresh of relationships_by_name hash unless relationships hash has changed' do
451
450
  @test_object2 = MockSemNamedRelationships.new
452
- r = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_model,:object=>ActiveFedora::ContentModel.pid_from_ruby_class(MockSemNamedRelationships)})
453
- @test_object2.add_relationship(r.predicate, r.object)
451
+ @test_object2.add_relationship(:has_model, ActiveFedora::ContentModel.pid_from_ruby_class(MockSemNamedRelationships))
454
452
  #should return expected named relationships
455
453
  @test_object2.relationships_by_name.should == {:self=>{"testing"=>[],"testing2"=>[], "collection_members"=>[], "part_of"=>[], "parts_outbound"=>[]}}
456
- r3 = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_part,:object=>@test_object})
457
- @test_object2.add_relationship(r3.predicate, r3.object)
458
- @test_object2.relationships_by_name.should == {:self=>{"testing"=>[r3.object],"testing2"=>[], "collection_members"=>[], "part_of"=>[], "parts_outbound"=>[r3.object]}}
459
- r4 = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_member,:object=>"3"})
460
- @test_object2.add_relationship(r4.predicate, r4.object)
461
- @test_object2.relationships_by_name.should == {:self=>{"testing"=>[r3.object],"testing2"=>[r4.object], "collection_members"=>[], "part_of"=>[], "parts_outbound"=>[r3.object]}}
454
+ @test_object2.add_relationship(:has_part, @test_object.internal_uri)
455
+ @test_object2.relationships_by_name.should == {:self=>{"testing"=>[@test_object.internal_uri],"testing2"=>[], "collection_members"=>[], "part_of"=>[], "parts_outbound"=>[@test_object.internal_uri]}}
456
+ @test_object2.add_relationship(:has_member, "3", true)
457
+ @test_object2.relationships_by_name.should == {:self=>{"testing"=>[@test_object.internal_uri],"testing2"=>["3"], "collection_members"=>[], "part_of"=>[], "parts_outbound"=>[@test_object.internal_uri]}}
462
458
  end
463
459
  end
464
460
  end
@@ -3,9 +3,6 @@ require 'spec_helper'
3
3
  describe ActiveFedora::Base do
4
4
 
5
5
  before(:each) do
6
- stub_get('__nextid__')
7
- ActiveFedora::RubydoraConnection.instance.expects(:nextid).returns("__nextid__")
8
- Rubydora::Repository.any_instance.stubs(:client).returns(@mock_client)
9
6
  @test_object = ActiveFedora::Base.new
10
7
  end
11
8
 
@@ -6,9 +6,9 @@ require 'active_fedora/metadata_datastream'
6
6
  describe ActiveFedora::Base do
7
7
 
8
8
  before(:each) do
9
- stub_get('__nextid__')
10
- ActiveFedora::RubydoraConnection.instance.expects(:nextid).returns("__nextid__")
11
- Rubydora::Repository.any_instance.stubs(:client).returns(@mock_client)
9
+ # stub_get('__nextid__')
10
+ # ActiveFedora::RubydoraConnection.instance.expects(:nextid).returns("__nextid__")
11
+ # Rubydora::Repository.any_instance.stubs(:client).returns(@mock_client)
12
12
  @test_object = ActiveFedora::Base.new
13
13
  end
14
14
 
@@ -100,12 +100,8 @@ describe ActiveFedora::Base do
100
100
  end
101
101
 
102
102
  it "should delete object from repository and index" do
103
- @test_object.stubs(:pid).returns("foo")
104
- ActiveFedora::SolrService.instance.conn.expects(:delete).with("foo")
105
- #@test_object.inner_object.stubs(:delete)
106
- mock_repository = mock('repo')
107
- @test_object.inner_object.expects(:repository).returns(mock_repository)
108
- mock_repository.expects :purge_object
103
+ ActiveFedora::SolrService.instance.conn.expects(:delete).with("__DO_NOT_USE__")
104
+ @test_object.inner_object.stubs(:delete)
109
105
  @test_object.expects(:inbound_relationships).returns({})
110
106
  @test_object.delete
111
107
  end
@@ -17,6 +17,8 @@ class FooHistory < ActiveFedora::Base
17
17
  m.field "fubar", :text
18
18
  end
19
19
  end
20
+ class FooAdaptation < ActiveFedora::Base
21
+ end
20
22
 
21
23
  @@last_pid = 0
22
24
 
@@ -33,7 +35,6 @@ describe ActiveFedora::Base do
33
35
  ActiveFedora::RubydoraConnection.instance.stubs(:nextid).returns(@this_pid)
34
36
 
35
37
  @test_object = ActiveFedora::Base.new
36
- @test_history = FooHistory.new
37
38
  end
38
39
 
39
40
  after(:each) do
@@ -47,14 +48,9 @@ describe ActiveFedora::Base do
47
48
  describe '#new' do
48
49
  it "should create a new inner object" do
49
50
  Rubydora::DigitalObject.any_instance.expects(:save).never
50
- #@mock_repo.expects(:datastreams).with(:pid => "test:1").returns("")
51
- @mock_client.stubs(:[]).with("objects/test%3A1/datastreams?format=xml").returns(@getter)
52
- ['someData', 'withText', 'withText2', 'RELS-EXT'].each do |dsid|
53
- @mock_client.stubs(:[]).with {|params| /objects\/test%3A1\/datastreams\/#{dsid}/.match(params)}.returns(@getter)
54
- # @mock_client.stubs(:[]).with {|params| /objects\/test%3A1\/datastreams\/#{dsid}\/content/.match(params)}.returns(stub(:post=>'test:1'))
55
- end
51
+ stub_get_content(@this_pid, ['RELS-EXT', 'someData', 'withText2', 'withText'])
56
52
 
57
- result = ActiveFedora::Base.new(:pid=>"test:1")
53
+ result = ActiveFedora::Base.new(:pid=>@this_pid)
58
54
  result.inner_object.should be_kind_of(Rubydora::DigitalObject)
59
55
  end
60
56
 
@@ -62,7 +58,7 @@ describe ActiveFedora::Base do
62
58
  # for doing AFObject.new(params[:foo]) when nothing is in params[:foo]
63
59
  Rubydora::DigitalObject.any_instance.expects(:save).never
64
60
  result = ActiveFedora::Base.new(nil)
65
- result.inner_object.should be_kind_of(Rubydora::DigitalObject)
61
+ result.inner_object.should be_kind_of(ActiveFedora::UnsavedDigitalObject)
66
62
  end
67
63
 
68
64
  end
@@ -241,6 +237,9 @@ describe ActiveFedora::Base do
241
237
 
242
238
 
243
239
  describe ".datastreams" do
240
+ before do
241
+ @test_history = FooHistory.new
242
+ end
244
243
  it "should create dynamic accessors" do
245
244
  @test_history.withText.should == @test_history.datastreams['withText']
246
245
  end
@@ -320,7 +319,7 @@ describe ActiveFedora::Base do
320
319
  describe '#add_relationship' do
321
320
  it 'should call #add_relationship on the rels_ext datastream' do
322
321
  @test_object.add_relationship("predicate", "info:fedora/object")
323
- pred = @test_object.class.vocabularies["info:fedora/fedora-system:def/relations-external#"]["predicate"]
322
+ pred = ActiveFedora::Predicates.vocabularies["info:fedora/fedora-system:def/relations-external#"]["predicate"]
324
323
  @test_object.relationships.should have_statement(RDF::Statement.new(RDF::URI.new(@test_object.internal_uri), pred, RDF::URI.new("info:fedora/object")))
325
324
  end
326
325
 
@@ -328,11 +327,8 @@ describe ActiveFedora::Base do
328
327
  mock_ds = mock("Rels-Ext")
329
328
  mock_ds.expects(:dirty=).with(true).times(2)
330
329
  @test_object.datastreams["RELS-EXT"] = mock_ds
331
- test_relationships = [ActiveFedora::Relationship.new(:subject => :self, :predicate => :is_member_of, :object => "info:fedora/demo:5"),
332
- ActiveFedora::Relationship.new(:subject => :self, :predicate => :is_member_of, :object => "info:fedora/demo:10")]
333
- test_relationships.each do |rel|
334
- @test_object.add_relationship(rel.predicate, rel.object)
335
- end
330
+ @test_object.add_relationship(:is_member_of, "info:fedora/demo:5")
331
+ @test_object.add_relationship(:is_member_of, "info:fedora/demo:10")
336
332
  end
337
333
 
338
334
  it 'should add a relationship to an object only if it does not exist already' do
@@ -342,7 +338,6 @@ describe ActiveFedora::Base do
342
338
 
343
339
  @test_object3 = ActiveFedora::Base.new
344
340
  @test_object.add_relationship(:has_part,@test_object3)
345
- r = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>@test_object3)
346
341
  @test_object.ids_for_outbound(:has_part).should == [@test_object3.pid]
347
342
  #try adding again and make sure not there twice
348
343
  @test_object.add_relationship(:has_part,@test_object3)
@@ -364,11 +359,11 @@ describe ActiveFedora::Base do
364
359
  next_pid = increment_pid.to_s
365
360
  ActiveFedora::RubydoraConnection.instance.stubs(:nextid).returns(next_pid)
366
361
  stub_get(next_pid)
367
- @test_object3 = ActiveFedora::Base.new
362
+ @test_object3 = ActiveFedora::Base.new(:pid=>next_pid)
368
363
  next_pid = increment_pid.to_s
369
364
  ActiveFedora::RubydoraConnection.instance.stubs(:nextid).returns(next_pid)
370
365
  stub_get(next_pid)
371
- @test_object4 = ActiveFedora::Base.new
366
+ @test_object4 = ActiveFedora::Base.new(:pid=>next_pid)
372
367
  @test_object.add_relationship(:has_part,@test_object3)
373
368
  @test_object.add_relationship(:has_part,@test_object4)
374
369
  #check both are there
@@ -426,8 +421,8 @@ describe ActiveFedora::Base do
426
421
  end
427
422
 
428
423
  it "should call .save on any datastreams that are dirty" do
429
- stub_ingest(@test_object.pid)
430
- stub_add_ds(@test_object.pid, ['withText2', 'withText', 'RELS-EXT'])
424
+ stub_ingest(@this_pid)
425
+ stub_add_ds(@this_pid, ['withText2', 'withText', 'RELS-EXT'])
431
426
  to = FooHistory.new
432
427
  to.expects(:update_index)
433
428
 
@@ -438,8 +433,8 @@ describe ActiveFedora::Base do
438
433
  to.save
439
434
  end
440
435
  it "should call .save on any datastreams that are new" do
441
- stub_ingest(@test_object.pid)
442
- stub_add_ds(@test_object.pid, ['RELS-EXT'])
436
+ stub_ingest(@this_pid)
437
+ stub_add_ds(@this_pid, ['RELS-EXT'])
443
438
  ds = ActiveFedora::Datastream.new(@test_object.inner_object, 'ds_to_add')
444
439
  ds.content = "DS CONTENT"
445
440
  @test_object.add_datastream(ds)
@@ -450,7 +445,7 @@ describe ActiveFedora::Base do
450
445
  @test_object.save
451
446
  end
452
447
  it "should not call .save on any datastreams that are not dirty" do
453
- stub_ingest(@test_object.pid)
448
+ stub_ingest(@this_pid)
454
449
  @test_object = FooHistory.new
455
450
  @test_object.expects(:update_index)
456
451
  @test_object.expects(:refresh)
@@ -465,9 +460,8 @@ describe ActiveFedora::Base do
465
460
  @test_object.save
466
461
  end
467
462
  it "should update solr index with all metadata if any MetadataDatastreams have changed" do
468
- # rels_ds.expects(:new?).returns(false).twice
469
- stub_ingest(@test_object.pid)
470
- stub_add_ds(@test_object.pid, ['ds1', 'RELS-EXT'])
463
+ stub_ingest(@this_pid)
464
+ stub_add_ds(@this_pid, ['ds1', 'RELS-EXT'])
471
465
 
472
466
  dirty_ds = ActiveFedora::MetadataDatastream.new(@test_object.inner_object, 'ds1')
473
467
  rels_ds = ActiveFedora::RelsExtDatastream.new(@test_object.inner_object, 'RELS-EXT')
@@ -495,20 +489,20 @@ describe ActiveFedora::Base do
495
489
  @test_object.save
496
490
  end
497
491
  it "should update solr index if relationships have changed" do
498
- @mock_repo.expects(:ingest).with(:pid => @test_object.pid)
499
- @test_object.inner_object.expects(:repository).returns(@mock_repo).at_least_once
500
- @test_object.inner_object.expects(:new?).returns(true).twice
492
+ stub_ingest(@this_pid)
501
493
 
502
494
  rels_ext = ActiveFedora::RelsExtDatastream.new(@test_object.inner_object, 'RELS-EXT')
503
495
  rels_ext.model = @test_object
504
- rels_ext.expects(:changed?).returns(true).twice
496
+ rels_ext.expects(:changed?).returns(true).twice
505
497
  rels_ext.expects(:save).returns(true)
506
498
  rels_ext.expects(:serialize!)
507
- clean_ds = mock("ds2")
499
+ clean_ds = mock("ds2", :digital_object=)
508
500
  clean_ds.stubs(:dirty? => false, :changed? => false, :new? => false)
509
501
  clean_ds.expects(:serialize!)
510
- @test_object.inner_object.stubs(:datastreams).returns({"RELS-EXT" => rels_ext, :clean_ds => clean_ds})
511
- @test_object.stubs(:datastreams).returns({"RELS-EXT" => rels_ext, :clean_ds => clean_ds})
502
+ @test_object.datastreams["RELS-EXT"] = rels_ext
503
+ @test_object.datastreams[:clean_ds] = clean_ds
504
+ # @test_object.inner_object.stubs(:datastreams).returns({"RELS-EXT" => rels_ext, :clean_ds => clean_ds})
505
+ # @test_object.stubs(:datastreams).returns({"RELS-EXT" => rels_ext, :clean_ds => clean_ds})
512
506
  @test_object.instance_variable_set(:@new_object, false)
513
507
  @test_object.expects(:refresh)
514
508
  @test_object.expects(:update_index)
@@ -517,6 +511,24 @@ describe ActiveFedora::Base do
517
511
  end
518
512
  end
519
513
 
514
+ describe "#create_datastream" do
515
+ it 'should create a datastream object using the type of object supplied in the string (does reflection)' do
516
+ f = File.new(File.join( File.dirname(__FILE__), "../fixtures/minivan.jpg"))
517
+ f.stubs(:content_type).returns("image/jpeg")
518
+ f.stubs(:original_filename).returns("minivan.jpg")
519
+ ds = @test_object.create_datastream("ActiveFedora::Datastream", 'NAME', {:blob=>f})
520
+ ds.class.should == ActiveFedora::Datastream
521
+ ds.dsLabel.should == "minivan.jpg"
522
+ ds.mimeType.should == "image/jpeg"
523
+ end
524
+ it 'should create a datastream object from a string' do
525
+ ds = @test_object.create_datastream("ActiveFedora::Datastream", 'NAME', {:blob=>"My file data"})
526
+ ds.class.should == ActiveFedora::Datastream
527
+ ds.dsLabel.should == nil
528
+ ds.mimeType.should == "application/octet-stream"
529
+ end
530
+ end
531
+
520
532
  describe ".add_file_datastream" do
521
533
  before do
522
534
  @mock_file = mock('file')
@@ -541,6 +553,47 @@ describe ActiveFedora::Base do
541
553
  end
542
554
  end
543
555
 
556
+ describe ".adapt_to" do
557
+ before(:each) do
558
+ @mock_client.stubs(:[]).with("objects/monkey%3A99/datastreams?format=xml").returns(@getter)
559
+ @mock_client.stubs(:[]).with("objects/monkey%3A99/datastreams/MY_DSID?format=xml").returns(@getter)
560
+ @mock_client.stubs(:[]).with("objects/monkey%3A99/datastreams/RELS-EXT/content").returns(@getter)
561
+ @mock_client.stubs(:[]).with("objects/monkey%3A99/datastreams/MY_DSID/content").returns("XXX")
562
+ #Update record
563
+ @mock_client.stubs(:[]).with("objects/monkey%3A99").returns(stub('post', :post=>'monkey:99'))
564
+ #Update datastream
565
+ ['someData', 'withText', 'withText2', 'RELS-EXT'].each do |dsid|
566
+ @mock_client.stubs(:[]).with {|params| /objects\/monkey%3A99\/datastreams\/#{dsid}/.match(params)}.returns(stub('post', :post=>'monkey:99', :get=>''))
567
+ end
568
+ @mock_file = mock('file')
569
+ end
570
+ it "should return an adapted object of the requested type" do
571
+ @test_object = FooHistory.new(:pid=>"monkey:99")
572
+ @test_object.adapt_to(FooAdaptation).class.should == FooAdaptation
573
+ end
574
+ it "should not make an additional call to fedora to create the adapted object" do
575
+ @mock_client.stubs(:[]).with("objects/monkey%3A99/datastreams?format=xml").returns(@getter).once
576
+ @test_object = FooHistory.new(:pid=>"monkey:99")
577
+ adapted = @test_object.adapt_to(FooAdaptation)
578
+ end
579
+ it "should propagate new datastreams to the adapted object" do
580
+ @test_object = FooHistory.new(:pid=>"monkey:99")
581
+ @test_object.add_file_datastream("XXX", :dsid=>'MY_DSID')
582
+ adapted = @test_object.adapt_to(FooAdaptation)
583
+ adapted.datastreams.keys.should include 'MY_DSID'
584
+ adapted.datastreams['MY_DSID'].content.should == "XXX"
585
+ adapted.datastreams['MY_DSID'].changed?.should be_true
586
+ end
587
+ it "should propagate modified datastreams to the adapted object" do
588
+ @test_object = FooHistory.new(:pid=>"monkey:99")
589
+ @test_object.datastreams['someData'].content="YYY"
590
+ adapted = @test_object.adapt_to(FooAdaptation)
591
+ adapted.datastreams.keys.should include 'someData'
592
+ adapted.datastreams['someData'].content.should == "YYY"
593
+ adapted.datastreams['someData'].changed?.should be_true
594
+ end
595
+ end
596
+
544
597
  describe ".to_xml" do
545
598
  it "should provide .to_xml" do
546
599
  @test_object.should respond_to(:to_xml)
@@ -594,7 +647,9 @@ describe ActiveFedora::Base do
594
647
  end
595
648
 
596
649
  it "should add self.class as the :active_fedora_model" do
597
- stub_get_content(@this_pid, ['someData', 'withText2', 'withText'])
650
+ stub_get(@this_pid)
651
+ stub_get_content(@this_pid, ['RELS-EXT', 'someData', 'withText2', 'withText'])
652
+ @test_history = FooHistory.new(:pid=>@this_pid)
598
653
  solr_doc = @test_history.to_solr
599
654
  solr_doc["active_fedora_model_s"].should eql("FooHistory")
600
655
  end
@@ -664,16 +719,10 @@ describe ActiveFedora::Base do
664
719
  end
665
720
  end
666
721
 
667
- it "should get a pid but not save on init" do
722
+ it "should not save or get an pid on init" do
668
723
  Rubydora::DigitalObject.any_instance.expects(:save).never
669
- ActiveFedora::RubydoraConnection.instance.stubs(:nextid).returns('mooshoo:24')
670
- @mock_client.stubs(:[]).with("objects/mooshoo%3A24/datastreams?format=xml").returns(@getter)
671
- ['someData', 'withText', 'withText2', 'RELS-EXT'].each do |dsid|
672
- @mock_client.stubs(:[]).with {|params| /objects\/mooshoo%3A24\/datastreams\/#{dsid}/.match(params)}.returns(@getter)
673
- end
724
+ ActiveFedora::RubydoraConnection.instance.expects(:nextid).never
674
725
  f = FooHistory.new
675
- f.pid.should_not be_nil
676
- f.pid.should == 'mooshoo:24'
677
726
  end
678
727
  it "should not clobber a pid if i'm creating!" do
679
728
  @mock_client.stubs(:[]).with("objects/numbnuts%3A1/datastreams?format=xml").returns(@getter)
@@ -746,10 +795,9 @@ describe ActiveFedora::Base do
746
795
  end
747
796
  it "should take a :datastreams argument" do
748
797
  att= {"fubar"=>{"-1"=>"mork", "0"=>"york", "1"=>"mangle"}}
749
- m = FooHistory.new
750
- ['withText', 'someData', 'withText2'].each do |dsid|
751
- @mock_client.stubs(:[]).with {|params| /objects\/#{@this_pid}\/datastreams\/#{dsid}\/content/.match(params)}.returns(stub('getter/setter', :get=>'', :post=>@this_pid))
752
- end
798
+ stub_get(@this_pid)
799
+ stub_get_content(@this_pid, ['RELS-EXT', 'someData', 'withText2', 'withText'])
800
+ m = FooHistory.new(:pid=>@this_pid)
753
801
  m.update_indexed_attributes(att, :datastreams=>"withText")
754
802
  m.should_not be_nil
755
803
  m.datastreams['someData'].fubar_values.should == []
@@ -804,9 +852,8 @@ describe ActiveFedora::Base do
804
852
  #should return expected named relationships
805
853
  @test_object2.relationships_by_name
806
854
  @test_object2.relationships_by_name.should == {:self=>{"testing2"=>[], "collection_members"=>[], "part_of"=>[], "testing"=>[], "parts_outbound"=>[]}}
807
- r = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:dummy,:object=>@test_object})
808
855
  @test_object2.add_relationship_by_name("testing",@test_object)
809
- @test_object2.relationships_by_name.should == {:self=>{"testing"=>[r.object],"testing2"=>[],"part_of"=>[], "parts_outbound"=>[r.object], "collection_members"=>[]}}
856
+ @test_object2.relationships_by_name.should == {:self=>{"testing"=>[@test_object.internal_uri],"testing2"=>[],"part_of"=>[], "parts_outbound"=>[@test_object.internal_uri], "collection_members"=>[]}}
810
857
  end
811
858
  end
812
859
 
@@ -825,13 +872,12 @@ describe ActiveFedora::Base do
825
872
  @test_object2.should respond_to(:testing_append)
826
873
  @test_object2.should respond_to(:testing_remove)
827
874
  #test executing each one to make sure code added is correct
828
- r = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>:has_model,:object=>ActiveFedora::ContentModel.pid_from_ruby_class(ActiveFedora::Base)})
829
- @test_object.add_relationship(r.predicate,r.object)
830
- @test_object2.add_relationship(r.predicate,r.object)
875
+ model_pid = ActiveFedora::ContentModel.pid_from_ruby_class(ActiveFedora::Base)
876
+ @test_object.add_relationship(:has_model,model_pid)
877
+ @test_object2.add_relationship(:has_model,model_pid)
831
878
  @test_object2.testing_append(@test_object)
832
879
  #create relationship to access generate_uri method for an object
833
- r = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>:dummy, :object=>@test_object)
834
- @test_object2.relationships_by_name.should == {:self=>{"testing"=>[r.object],"collection_members"=>[], "part_of"=>[r.object], "parts_outbound"=>[]}}
880
+ @test_object2.relationships_by_name.should == {:self=>{"testing"=>[@test_object.internal_uri],"collection_members"=>[], "part_of"=>[@test_object.internal_uri], "parts_outbound"=>[]}}
835
881
  @test_object2.testing_remove(@test_object)
836
882
  @test_object2.relationships_by_name.should == {:self=>{"testing"=>[],"collection_members"=>[], "part_of"=>[], "parts_outbound"=>[]}}
837
883
  end
@@ -841,10 +887,10 @@ describe ActiveFedora::Base do
841
887
  it "should serialize the relationships into a Hash" do
842
888
  graph = RDF::Graph.new
843
889
  subject = RDF::URI.new "info:fedora/test:sample_pid"
844
- graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:is_member_of), RDF::URI.new('info:fedora/demo:10'))
845
- graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:is_part_of), RDF::URI.new('info:fedora/demo:11'))
846
- graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:has_part), RDF::URI.new('info:fedora/demo:12'))
847
- graph.insert RDF::Statement.new(subject, ActiveFedora::Base.new.find_graph_predicate(:conforms_to), "AnInterface")
890
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Predicates.find_graph_predicate(:is_member_of), RDF::URI.new('info:fedora/demo:10'))
891
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Predicates.find_graph_predicate(:is_part_of), RDF::URI.new('info:fedora/demo:11'))
892
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Predicates.find_graph_predicate(:has_part), RDF::URI.new('info:fedora/demo:12'))
893
+ graph.insert RDF::Statement.new(subject, ActiveFedora::Predicates.find_graph_predicate(:conforms_to), "AnInterface")
848
894
 
849
895
  @test_object.expects(:relationships).returns(graph)
850
896
  solr_doc = @test_object.solrize_relationships