rubydora 0.0.2
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.
- data/Gemfile +25 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +77 -0
- data/Rakefile +54 -0
- data/VERSION +1 -0
- data/lib/rubydora/array_with_callback.rb +34 -0
- data/lib/rubydora/callbacks.rb +49 -0
- data/lib/rubydora/datastream.rb +152 -0
- data/lib/rubydora/digital_object.rb +190 -0
- data/lib/rubydora/ext/solr.rb +103 -0
- data/lib/rubydora/ext.rb +5 -0
- data/lib/rubydora/extension_parameters.rb +40 -0
- data/lib/rubydora/models_mixin.rb +28 -0
- data/lib/rubydora/relationships_mixin.rb +101 -0
- data/lib/rubydora/repository.rb +82 -0
- data/lib/rubydora/resource_index.rb +43 -0
- data/lib/rubydora/rest_api_client/v33.rb +36 -0
- data/lib/rubydora/rest_api_client.rb +267 -0
- data/lib/rubydora.rb +46 -0
- data/rubydora.gemspec +104 -0
- data/spec/datastream_spec.rb +100 -0
- data/spec/digital_object_spec.rb +260 -0
- data/spec/ext_solr_spec.rb +70 -0
- data/spec/integration_test_spec.rb +93 -0
- data/spec/repository_spec.rb +85 -0
- data/spec/resource_index_spec.rb +28 -0
- data/spec/rest_api_client_spec.rb +146 -0
- data/spec/spec_helper.rb +4 -0
- metadata +245 -0
@@ -0,0 +1,260 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rubydora::DigitalObject do
|
4
|
+
describe "new" do
|
5
|
+
it "should load a DigitalObject instance" do
|
6
|
+
Rubydora::DigitalObject.new("pid").should be_a_kind_of(Rubydora::DigitalObject)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "profile" do
|
11
|
+
before(:each) do
|
12
|
+
@mock_repository = mock(Rubydora::Repository)
|
13
|
+
@object = Rubydora::DigitalObject.new 'pid', @mock_repository
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should convert object profile to a simple hash" do
|
17
|
+
@mock_repository.should_receive(:object).with(:pid => 'pid').and_return("<objectProfile><a>1</a><b>2</b><objModels><model>3</model><model>4</model></objectProfile>")
|
18
|
+
h = @object.profile
|
19
|
+
|
20
|
+
h.should have_key("a")
|
21
|
+
h['a'].should == '1'
|
22
|
+
h.should have_key("b")
|
23
|
+
h['b'].should == '2'
|
24
|
+
h.should have_key("objModels")
|
25
|
+
h['objModels'].should == ['3', '4']
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "new" do
|
31
|
+
before(:each) do
|
32
|
+
@mock_repository = mock(Rubydora::Repository)
|
33
|
+
@mock_repository.should_receive(:object).any_number_of_times.and_raise ""
|
34
|
+
@object = Rubydora::DigitalObject.new 'pid', @mock_repository
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should be new" do
|
38
|
+
@object.new?.should == true
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should call ingest on save" do
|
42
|
+
@object.should_receive(:datastreams).and_return({})
|
43
|
+
@mock_repository.should_receive(:ingest).with(hash_including(:pid => 'pid'))
|
44
|
+
@object.save
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "create" do
|
49
|
+
it "should call the Fedora REST API to create a new object" do
|
50
|
+
@mock_repository = mock(Rubydora::Repository)
|
51
|
+
@mock_repository.should_receive(:ingest).with(instance_of(Hash)).and_return(nil)
|
52
|
+
obj = Rubydora::DigitalObject.create "pid", { :a => 1, :b => 2}, @mock_repository
|
53
|
+
obj.should be_a_kind_of(Rubydora::DigitalObject)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "retreive" do
|
58
|
+
before(:each) do
|
59
|
+
@mock_repository = mock(Rubydora::Repository)
|
60
|
+
@object = Rubydora::DigitalObject.new 'pid', @mock_repository
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "datastreams" do
|
64
|
+
it "should provide a hash populated by the existing datastreams" do
|
65
|
+
@mock_repository.should_receive(:datastreams).with(:pid => 'pid').and_return("<objectDatastreams><datastream dsid='a'></datastream>><datastream dsid='b'></datastream>><datastream dsid='c'></datastream></objectDatastreams>")
|
66
|
+
|
67
|
+
@object.datastreams.should have_key("a")
|
68
|
+
@object.datastreams.should have_key("b")
|
69
|
+
@object.datastreams.should have_key("c")
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should allow other datastreams to be added" do
|
73
|
+
@mock_repository.should_receive(:datastreams).with(:pid => 'pid').and_return("<objectDatastreams><datastream dsid='a'></datastream>><datastream dsid='b'></datastream>><datastream dsid='c'></datastream></objectDatastreams>")
|
74
|
+
@mock_repository.should_receive(:datastream).with(:pid => 'pid', :dsid => 'z').and_raise("")
|
75
|
+
|
76
|
+
@object.datastreams.length.should == 3
|
77
|
+
|
78
|
+
ds = @object.datastreams["z"]
|
79
|
+
ds.should be_a_kind_of(Rubydora::Datastream)
|
80
|
+
ds.new?.should == true
|
81
|
+
|
82
|
+
@object.datastreams.length.should == 4
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "retrieve" do
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "save" do
|
94
|
+
before(:each) do
|
95
|
+
@mock_repository = mock(Rubydora::Repository)
|
96
|
+
@mock_repository.should_receive(:object).any_number_of_times.with({:pid => 'pid'}).and_return <<-XML
|
97
|
+
<objectProfile>
|
98
|
+
</objectProfile>
|
99
|
+
XML
|
100
|
+
@object = Rubydora::DigitalObject.new 'pid', @mock_repository
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should save all dirty datastreams" do
|
104
|
+
@ds1 = mock()
|
105
|
+
@ds1.should_receive(:dirty?).and_return(false)
|
106
|
+
@ds1.should_not_receive(:save)
|
107
|
+
@ds2 = mock()
|
108
|
+
@ds2.should_receive(:dirty?).and_return(true)
|
109
|
+
@ds2.should_receive(:new?).and_return(true)
|
110
|
+
@ds2.should_not_receive(:save)
|
111
|
+
@ds3 = mock()
|
112
|
+
@ds3.should_receive(:dirty?).and_return(true)
|
113
|
+
@ds3.should_receive(:new?).and_return(false)
|
114
|
+
@ds3.should_receive(:save)
|
115
|
+
|
116
|
+
@object.should_receive(:datastreams).and_return({:ds1 => @ds1, :ds2 => @ds2, :ds3 => @ds3 })
|
117
|
+
|
118
|
+
@object.save
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should save all dirty attributes" do
|
122
|
+
@object.label = "asdf"
|
123
|
+
@object.should_receive(:datastreams).and_return({})
|
124
|
+
@mock_repository.should_receive(:modify_object).with(hash_including(:pid => 'pid'))
|
125
|
+
@object.save
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe "delete" do
|
130
|
+
before(:each) do
|
131
|
+
@mock_repository = mock()
|
132
|
+
@object = Rubydora::DigitalObject.new 'pid', @mock_repository
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should call the Fedora REST API" do
|
136
|
+
@mock_repository.should_receive(:purge_object).with({:pid => 'pid'})
|
137
|
+
@object.delete
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe "extensions" do
|
142
|
+
module FakeExtension
|
143
|
+
end
|
144
|
+
|
145
|
+
module OtherFakeExtension
|
146
|
+
|
147
|
+
end
|
148
|
+
before(:each) do
|
149
|
+
@mock_repository = mock()
|
150
|
+
end
|
151
|
+
|
152
|
+
after(:each) do
|
153
|
+
Rubydora::DigitalObject.registered_extensions = []
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should be extendable" do
|
157
|
+
Rubydora::DigitalObject.use_extension FakeExtension
|
158
|
+
@object = Rubydora::DigitalObject.new 'pid', @mock_repository
|
159
|
+
@object.is_a?(FakeExtension).should == true
|
160
|
+
end
|
161
|
+
|
162
|
+
it "should be extendable conditionally" do
|
163
|
+
Rubydora::DigitalObject.use_extension(FakeExtension) { |x| true }
|
164
|
+
Rubydora::DigitalObject.use_extension(OtherFakeExtension) { |x| false }
|
165
|
+
@object = Rubydora::DigitalObject.new 'pid', @mock_repository
|
166
|
+
@object.is_a?(FakeExtension).should == true
|
167
|
+
@object.is_a?(OtherFakeExtension).should == false
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should be able to introspect object profiles" do
|
171
|
+
@mock_repository.should_receive(:object).any_number_of_times.with({:pid => 'pid'}).and_return <<-XML
|
172
|
+
<objectProfile>
|
173
|
+
<a>1</a>
|
174
|
+
</objectProfile>
|
175
|
+
XML
|
176
|
+
Rubydora::DigitalObject.use_extension(FakeExtension) { |x| x.profile['a'] == '1' }
|
177
|
+
@object = Rubydora::DigitalObject.new 'pid', @mock_repository
|
178
|
+
@object.is_a?(FakeExtension).should == true
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
182
|
+
|
183
|
+
describe "models" do
|
184
|
+
before(:each) do
|
185
|
+
@mock_repository = mock(Rubydora::Repository)
|
186
|
+
@mock_repository.should_receive(:object).any_number_of_times.with({:pid => 'pid'}).and_return <<-XML
|
187
|
+
<objectProfile>
|
188
|
+
</objectProfile>
|
189
|
+
XML
|
190
|
+
@object = Rubydora::DigitalObject.new 'pid', @mock_repository
|
191
|
+
end
|
192
|
+
|
193
|
+
it "should add models to fedora" do
|
194
|
+
@mock_repository.should_receive(:add_relationship) do |params|
|
195
|
+
params.should have_key(:subject)
|
196
|
+
params[:predicate].should == 'info:fedora/fedora-system:def/model#hasModel'
|
197
|
+
params[:object].should == 'asdf'
|
198
|
+
end
|
199
|
+
@object.models << "asdf"
|
200
|
+
end
|
201
|
+
|
202
|
+
it "should remove models from fedora" do
|
203
|
+
@object.should_receive(:profile).any_number_of_times.and_return({"objModels" => ['asdf']})
|
204
|
+
@mock_repository.should_receive(:purge_relationship) do |params|
|
205
|
+
params.should have_key(:subject)
|
206
|
+
params[:predicate].should == 'info:fedora/fedora-system:def/model#hasModel'
|
207
|
+
params[:object].should == 'asdf'
|
208
|
+
end
|
209
|
+
@object.models.delete("asdf")
|
210
|
+
end
|
211
|
+
|
212
|
+
it "should be able to handle complete model replacemenet" do
|
213
|
+
@object.should_receive(:profile).any_number_of_times.and_return({"objModels" => ['asdf']})
|
214
|
+
@mock_repository.should_receive(:add_relationship).with(instance_of(Hash))
|
215
|
+
@mock_repository.should_receive(:purge_relationship).with(instance_of(Hash))
|
216
|
+
@object.models = '1234'
|
217
|
+
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
describe "relations" do
|
222
|
+
before(:each) do
|
223
|
+
@mock_repository = mock()
|
224
|
+
@mock_repository.should_receive(:object).any_number_of_times.with({:pid => 'pid'}).and_return <<-XML
|
225
|
+
<objectProfile>
|
226
|
+
</objectProfile>
|
227
|
+
XML
|
228
|
+
@object = Rubydora::DigitalObject.new 'pid', @mock_repository
|
229
|
+
end
|
230
|
+
|
231
|
+
it "should fetch related objects using sparql" do
|
232
|
+
@mock_repository.should_receive(:find_by_sparql_relationship).with('info:fedora/pid', 'info:fedora/fedora-system:def/relations-external#hasPart').and_return([1])
|
233
|
+
@object.parts.should == [1]
|
234
|
+
end
|
235
|
+
|
236
|
+
it "should add related objects" do
|
237
|
+
@mock_repository.should_receive(:add_relationship) do |params|
|
238
|
+
params.should have_key(:subject)
|
239
|
+
params[:predicate].should == 'info:fedora/fedora-system:def/relations-external#hasPart'
|
240
|
+
params[:object].should == 'asdf'
|
241
|
+
end
|
242
|
+
@mock_object = mock(Rubydora::DigitalObject)
|
243
|
+
@mock_object.should_receive(:fqpid).and_return('asdf')
|
244
|
+
@mock_repository.should_receive(:find_by_sparql_relationship).with('info:fedora/pid', 'info:fedora/fedora-system:def/relations-external#hasPart').and_return([])
|
245
|
+
@object.parts << @mock_object
|
246
|
+
end
|
247
|
+
|
248
|
+
it "should remove related objects" do
|
249
|
+
@mock_repository.should_receive(:purge_relationship) do |params|
|
250
|
+
params.should have_key(:subject)
|
251
|
+
params[:predicate].should == 'info:fedora/fedora-system:def/relations-external#hasPart'
|
252
|
+
params[:object].should == 'asdf'
|
253
|
+
end
|
254
|
+
@mock_object = mock(Rubydora::DigitalObject)
|
255
|
+
@mock_object.should_receive(:fqpid).and_return('asdf')
|
256
|
+
@mock_repository.should_receive(:find_by_sparql_relationship).with('info:fedora/pid', 'info:fedora/fedora-system:def/relations-external#hasPart').and_return([@mock_object])
|
257
|
+
@object.parts.delete(@mock_object)
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rubydora/ext/solr'
|
3
|
+
|
4
|
+
describe Rubydora::Ext::Solr do
|
5
|
+
describe "load" do
|
6
|
+
it "should load mixins" do
|
7
|
+
Rubydora::Ext::Solr.load
|
8
|
+
@mock_repository = mock(Rubydora::Repository)
|
9
|
+
obj = Rubydora::DigitalObject.new('pid', @mock_repository)
|
10
|
+
obj.should be_a_kind_of(Rubydora::Ext::Solr::DigitalObjectMixin)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "solr_mapping_logic" do
|
15
|
+
class MockSolrMappingClass
|
16
|
+
|
17
|
+
end
|
18
|
+
before(:each) do
|
19
|
+
Rubydora::Ext::Solr.load :digital_object => MockSolrMappingClass
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should provide a class-level step list" do
|
23
|
+
MockSolrMappingClass.solr_mapping_logic.should_not be_empty
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should be overridable on the class level" do
|
27
|
+
expect { MockSolrMappingClass.solr_mapping_logic << :a }.to change{MockSolrMappingClass.solr_mapping_logic.length}.by(1)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should be overridable on the instance level" do
|
31
|
+
MockSolrMappingClass.solr_mapping_logic = []
|
32
|
+
mock = MockSolrMappingClass.new
|
33
|
+
|
34
|
+
mock.solr_mapping_logic.should be_empty
|
35
|
+
mock.solr_mapping_logic << :a
|
36
|
+
mock.solr_mapping_logic.should == [:a]
|
37
|
+
MockSolrMappingClass.solr_mapping_logic.should == []
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "to_solr" do
|
43
|
+
before(:each) do
|
44
|
+
@mock_repository = mock(Rubydora::Repository)
|
45
|
+
@object = Rubydora::DigitalObject.new('pid', @mock_repository)
|
46
|
+
end
|
47
|
+
it "should call the members of solr_mapping_logic" do
|
48
|
+
|
49
|
+
@object.should_receive(:solr_mapping_logic).and_return([:mock_solr_step, :another_mock_solr_step])
|
50
|
+
@object.should_receive(:mock_solr_step)
|
51
|
+
@object.should_receive(:another_mock_solr_step)
|
52
|
+
@object.to_solr
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should allow steps to modify the resulting solr document" do
|
56
|
+
@object.should_receive(:solr_mapping_logic).and_return([:mock_solr_step, :another_mock_solr_step])
|
57
|
+
@object.stub(:mock_solr_step) do |doc|
|
58
|
+
doc[:a] = 'a'
|
59
|
+
doc[:b] = 0
|
60
|
+
end
|
61
|
+
|
62
|
+
@object.stub(:another_mock_solr_step) do |doc|
|
63
|
+
doc[:b] = 'b'
|
64
|
+
end
|
65
|
+
|
66
|
+
@object.to_solr.should == { :a => 'a', :b => 'b'}
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
# These tests require a fedora repository with the resource index enabled (and with syncUpdates = true)
|
5
|
+
describe "Integration testing against a live Fedora repository" do
|
6
|
+
REPOSITORY_CONFIG = { :url => 'http://localhost:8080/fedora', :user => 'fedoraAdmin', :password => 'fedoraAdmin' }
|
7
|
+
before(:all) do
|
8
|
+
@repository = Rubydora.connect REPOSITORY_CONFIG
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should connect" do
|
12
|
+
@repository.ping.should == true
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should create an object" do
|
16
|
+
obj = @repository.find('test:1')
|
17
|
+
obj.new?.should == true
|
18
|
+
obj = obj.save
|
19
|
+
obj.new?.should == false
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should have default datastreams" do
|
23
|
+
obj = @repository.find('test:1')
|
24
|
+
obj.datastreams.keys.should include("DC")
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should list object models" do
|
28
|
+
obj = @repository.find('test:1')
|
29
|
+
obj.models.should include("info:fedora/fedora-system:FedoraObject-3.0")
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should create another object" do
|
33
|
+
obj = @repository.find('test:2')
|
34
|
+
obj.save
|
35
|
+
obj.new?.should == false
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should create parts" do
|
39
|
+
obj = @repository.find('test:1')
|
40
|
+
obj2 = @repository.find('test:2')
|
41
|
+
obj.parts << obj2
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should persist parts" do
|
45
|
+
obj = @repository.find('test:1')
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should have a RELS-EXT datastream" do
|
49
|
+
obj = @repository.find('test:1')
|
50
|
+
obj.datastreams.keys.should include("RELS-EXT")
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should create a managed datastream" do
|
54
|
+
obj = @repository.find('test:1')
|
55
|
+
obj = obj.save
|
56
|
+
ds = obj.datastreams["Test"]
|
57
|
+
|
58
|
+
ds.content = open(__FILE__).read
|
59
|
+
ds.mimeType = 'text/plain'
|
60
|
+
ds.save
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should create a redirect datastream" do
|
64
|
+
obj = @repository.find('test:1')
|
65
|
+
ds = obj.datastreams["Redirect"]
|
66
|
+
ds.controlGroup = "R"
|
67
|
+
ds.dsLocation = "http://example.org"
|
68
|
+
ds.save
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should have datastreams" do
|
72
|
+
obj = @repository.find('test:1')
|
73
|
+
obj.datastreams.keys.should include("Test")
|
74
|
+
obj.datastreams.keys.should include("Redirect")
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should have datastream content" do
|
78
|
+
obj = @repository.find('test:1')
|
79
|
+
obj.datastreams["Test"].content.should match( "Integration testing against a live Fedora repository")
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should delete datastreams" do
|
83
|
+
obj = @repository.find('test:1')
|
84
|
+
ds = obj.datastreams["Test"].delete
|
85
|
+
obj.datastreams.keys.should_not include("Test")
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
after(:all) do
|
90
|
+
@repository.find('test:1').delete rescue nil
|
91
|
+
@repository.find('test:2').delete rescue nil
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rubydora::Repository do
|
4
|
+
before(:each) do
|
5
|
+
@repository = Rubydora::Repository.new
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "client" do
|
9
|
+
it "should return a RestClient resource" do
|
10
|
+
client = @repository.client :url => 'http://example.org', :user => 'fedoraAdmin', :password => 'fedoraAdmin'
|
11
|
+
|
12
|
+
client.should be_a_kind_of(RestClient::Resource)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "find" do
|
17
|
+
|
18
|
+
it "should load objects by pid" do
|
19
|
+
@mock_object = mock(Rubydora::DigitalObject)
|
20
|
+
Rubydora::DigitalObject.should_receive(:find).with("pid", instance_of(Rubydora::Repository)).and_return @mock_object
|
21
|
+
|
22
|
+
@repository.find('pid')
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "sparql" do
|
28
|
+
it "should return csv results for sparql queries" do
|
29
|
+
resource_index_query = ""
|
30
|
+
@repository.should_receive(:risearch).with(resource_index_query).and_return("pid\na\nb\nc\n")
|
31
|
+
|
32
|
+
csv = @repository.sparql(resource_index_query)
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "profile" do
|
36
|
+
it "should map the fedora repository description to a hash" do
|
37
|
+
@mock_response = mock()
|
38
|
+
@mock_client = mock(RestClient::Resource)
|
39
|
+
@mock_response.should_receive(:get).and_return <<-XML
|
40
|
+
<?xml version="1.0" encoding="UTF-8"?><fedoraRepository xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.fedora.info/definitions/1/0/access/ http://www.fedora.info/definitions/1/0/fedoraRepository.xsd"><repositoryName>Fedora Repository</repositoryName><repositoryBaseURL>http://localhost:8983/fedora</repositoryBaseURL><repositoryVersion>3.3</repositoryVersion><repositoryPID> <PID-namespaceIdentifier>changeme</PID-namespaceIdentifier> <PID-delimiter>:</PID-delimiter> <PID-sample>changeme:100</PID-sample> <retainPID>*</retainPID></repositoryPID><repositoryOAI-identifier> <OAI-namespaceIdentifier>example.org</OAI-namespaceIdentifier> <OAI-delimiter>:</OAI-delimiter> <OAI-sample>oai:example.org:changeme:100</OAI-sample></repositoryOAI-identifier><sampleSearch-URL>http://localhost:8983/fedora/search</sampleSearch-URL><sampleAccess-URL>http://localhost:8983/fedora/get/demo:5</sampleAccess-URL><sampleOAI-URL>http://localhost:8983/fedora/oai?verb=Identify</sampleOAI-URL><adminEmail>bob@example.org</adminEmail><adminEmail>sally@example.org</adminEmail></fedoraRepository>
|
41
|
+
XML
|
42
|
+
@mock_client.should_receive(:[]).with('describe?xml=true').and_return(@mock_response)
|
43
|
+
@repository.should_receive(:client).and_return(@mock_client)
|
44
|
+
profile = @repository.profile
|
45
|
+
profile['repositoryVersion'].should == '3.3'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "ping" do
|
50
|
+
it "should raise an error if a connection cannot be established" do
|
51
|
+
@repository.should_receive(:profile).and_return nil
|
52
|
+
lambda { @repository.ping }.should raise_error
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "load_api_abstraction" do
|
60
|
+
class ApiAbstractionTestClass < Rubydora::Repository
|
61
|
+
def version; 3.3; end
|
62
|
+
end
|
63
|
+
it "should load an abstraction layer for relationships for older versions of the fedora rest api" do
|
64
|
+
@mock_repository = ApiAbstractionTestClass.new
|
65
|
+
@mock_repository.should be_a_kind_of(Rubydora::RestApiClient::V33)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "find_by_sparql" do
|
70
|
+
it "should attempt to load objects from the results of a sparql query" do
|
71
|
+
|
72
|
+
resource_index_query = ""
|
73
|
+
@repository.should_receive(:risearch).with(resource_index_query).and_return("pid\na\nb\nc\n")
|
74
|
+
|
75
|
+
@repository.should_receive(:find).with('a').and_return(1)
|
76
|
+
@repository.should_receive(:find).with('b').and_return(1)
|
77
|
+
@repository.should_receive(:find).with('c').and_return(1)
|
78
|
+
|
79
|
+
objects = @repository.find_by_sparql(resource_index_query)
|
80
|
+
|
81
|
+
objects.length.should == 3
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rubydora::ResourceIndex do
|
4
|
+
class MockRepository
|
5
|
+
include Rubydora::ResourceIndex
|
6
|
+
end
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
@mock_repository = MockRepository.new
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should map a simple relationship query into SPARQL" do
|
13
|
+
@mock_repository.should_receive(:find_by_sparql) do |query|
|
14
|
+
query.should match(/\<pid\> \<predicate\> \?pid/)
|
15
|
+
end
|
16
|
+
|
17
|
+
@mock_repository.find_by_sparql_relationship('pid', 'predicate')
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should send sparql queries with appropriate parameters" do
|
21
|
+
@mock_risearch = mock()
|
22
|
+
@mock_client = mock(RestClient::Resource)
|
23
|
+
@mock_risearch.should_receive(:post).with(hash_including(:dt => 'on', :format => 'CSV', :lang => 'sparql', :limit => nil, :query => 'placeholder SPARQL query', :type => 'tuples' ))
|
24
|
+
@mock_client.should_receive(:[]).with('risearch').and_return(@mock_risearch)
|
25
|
+
@mock_repository.should_receive(:client).and_return(@mock_client)
|
26
|
+
@mock_repository.send(:risearch, 'placeholder SPARQL query')
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rubydora::RestApiClient do
|
4
|
+
class MockRepository
|
5
|
+
include Rubydora::RestApiClient
|
6
|
+
|
7
|
+
attr_accessor :config
|
8
|
+
end
|
9
|
+
|
10
|
+
before(:each) do
|
11
|
+
@mock_repository = MockRepository.new
|
12
|
+
@mock_repository.config = { :url => 'http://example.org',:user => 'fedoraAdmin', :password => 'fedoraAdmin'}
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should call nextPID" do
|
16
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/nextPID?format=xml"))
|
17
|
+
@mock_repository.next_pid
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should find objects" do
|
21
|
+
RestClient::Request.should_receive(:execute) do |params|
|
22
|
+
params.should have_key(:url)
|
23
|
+
params[:url].should =~ /^#{Regexp.escape("http://example.org/objects?")}.*query=a/
|
24
|
+
end
|
25
|
+
@mock_repository.find_objects :query => 'a'
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should show object properties" do
|
29
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/z?format=xml"))
|
30
|
+
@mock_repository.object :pid => 'z'
|
31
|
+
end
|
32
|
+
|
33
|
+
it "ingest" do
|
34
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/new"))
|
35
|
+
@mock_repository.ingest
|
36
|
+
end
|
37
|
+
|
38
|
+
it "ingest with pid" do
|
39
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/mypid"))
|
40
|
+
@mock_repository.ingest :pid => 'mypid'
|
41
|
+
end
|
42
|
+
|
43
|
+
it "modify_object" do
|
44
|
+
RestClient::Request.should_receive(:execute) do |params|
|
45
|
+
params.should have_key(:url)
|
46
|
+
params[:url].should =~ /^#{Regexp.escape("http://example.org/objects/mypid?")}.*state=Z/
|
47
|
+
end
|
48
|
+
@mock_repository.modify_object :pid => 'mypid', :state => 'Z'
|
49
|
+
end
|
50
|
+
|
51
|
+
it "purge_object" do
|
52
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/mypid"))
|
53
|
+
@mock_repository.purge_object :pid => 'mypid'
|
54
|
+
end
|
55
|
+
|
56
|
+
it "object_versions" do
|
57
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/mypid/versions?format=xml"))
|
58
|
+
@mock_repository.object_versions :pid => 'mypid'
|
59
|
+
end
|
60
|
+
|
61
|
+
it "object_xml" do
|
62
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/mypid/objectXML?format=xml"))
|
63
|
+
@mock_repository.object_xml :pid => 'mypid'
|
64
|
+
end
|
65
|
+
|
66
|
+
it "datastream" do
|
67
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/mypid/datastreams?format=xml"))
|
68
|
+
@mock_repository.datastream :pid => 'mypid'
|
69
|
+
end
|
70
|
+
|
71
|
+
it "datastream" do
|
72
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/mypid/datastreams/aaa?format=xml"))
|
73
|
+
@mock_repository.datastream :pid => 'mypid', :dsid => 'aaa'
|
74
|
+
end
|
75
|
+
|
76
|
+
it "datastream_dissemination" do
|
77
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/mypid/datastreams/aaa/content"))
|
78
|
+
@mock_repository.datastream_dissemination :pid => 'mypid', :dsid => 'aaa'
|
79
|
+
end
|
80
|
+
|
81
|
+
it "add_datastream" do
|
82
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/mypid/datastreams/aaa"))
|
83
|
+
@mock_repository.add_datastream :pid => 'mypid', :dsid => 'aaa'
|
84
|
+
end
|
85
|
+
|
86
|
+
it "modify_datastream" do
|
87
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/mypid/datastreams/aaa"))
|
88
|
+
@mock_repository.modify_datastream :pid => 'mypid', :dsid => 'aaa'
|
89
|
+
end
|
90
|
+
|
91
|
+
it "purge_datastream" do
|
92
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/mypid/datastreams/aaa"))
|
93
|
+
@mock_repository.purge_datastream :pid => 'mypid', :dsid => 'aaa'
|
94
|
+
end
|
95
|
+
|
96
|
+
it "set_datastream_options" do
|
97
|
+
RestClient::Request.should_receive(:execute) do |params|
|
98
|
+
params.should have_key(:url)
|
99
|
+
params[:url].should =~ /^#{Regexp.escape("http://example.org/objects/mypid/datastreams/aaa?")}.*aparam=true/
|
100
|
+
end
|
101
|
+
@mock_repository.set_datastream_options :pid => 'mypid', :dsid => 'aaa', :aparam => true
|
102
|
+
end
|
103
|
+
|
104
|
+
it "datastream_versions" do
|
105
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/mypid/datastreams/aaa/versions?format=xml"))
|
106
|
+
@mock_repository.datastream_versions :pid => 'mypid', :dsid => 'aaa'
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
it "relationships" do
|
111
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/mypid/relationships?format=xml"))
|
112
|
+
@mock_repository.relationships :pid => 'mypid'
|
113
|
+
end
|
114
|
+
|
115
|
+
it "add_relationship" do
|
116
|
+
RestClient::Request.should_receive(:execute) do |params|
|
117
|
+
params.should have_key(:url)
|
118
|
+
params[:url].should =~ /^#{Regexp.escape("http://example.org/objects/mypid/relationships/new?")}.*subject=z/
|
119
|
+
end
|
120
|
+
@mock_repository.add_relationship :pid => 'mypid', :subject => 'z'
|
121
|
+
end
|
122
|
+
|
123
|
+
it "purge_relationships" do
|
124
|
+
RestClient::Request.should_receive(:execute) do |params|
|
125
|
+
params.should have_key(:url)
|
126
|
+
params[:url].should =~ /^#{Regexp.escape("http://example.org/objects/mypid/relationships?")}.*subject=z/
|
127
|
+
end
|
128
|
+
@mock_repository.purge_relationship :pid => 'mypid', :subject => 'z'
|
129
|
+
end
|
130
|
+
|
131
|
+
it "dissemination" do
|
132
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/mypid/methods?format=xml"))
|
133
|
+
@mock_repository.dissemination :pid => 'mypid'
|
134
|
+
end
|
135
|
+
|
136
|
+
it "dissemination" do
|
137
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/mypid/methods/sdef?format=xml"))
|
138
|
+
@mock_repository.dissemination :pid => 'mypid', :sdef => 'sdef'
|
139
|
+
end
|
140
|
+
|
141
|
+
it "dissemination" do
|
142
|
+
RestClient::Request.should_receive(:execute).with(hash_including(:url => "http://example.org/objects/mypid/methods/sdef/method"))
|
143
|
+
@mock_repository.dissemination :pid => 'mypid', :sdef => 'sdef', :method => 'method'
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
data/spec/spec_helper.rb
ADDED