hydra-works 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.travis.yml +2 -5
  4. data/Gemfile +1 -3
  5. data/README.md +28 -13
  6. data/hydra-works.gemspec +4 -3
  7. data/lib/hydra/works.rb +7 -57
  8. data/lib/hydra/works/models/concerns/block_child_objects.rb +16 -0
  9. data/lib/hydra/works/models/concerns/collection_behavior.rb +27 -2
  10. data/lib/hydra/works/models/concerns/generic_file/contained_files.rb +5 -13
  11. data/lib/hydra/works/models/concerns/generic_file/derivatives.rb +9 -13
  12. data/lib/hydra/works/models/concerns/generic_file/mime_types.rb +14 -9
  13. data/lib/hydra/works/models/concerns/generic_file/versioned_content.rb +18 -0
  14. data/lib/hydra/works/models/concerns/generic_file/virus_check.rb +48 -0
  15. data/lib/hydra/works/models/concerns/generic_file_behavior.rb +24 -1
  16. data/lib/hydra/works/models/concerns/generic_work_behavior.rb +32 -3
  17. data/lib/hydra/works/models/generic_file.rb +3 -0
  18. data/lib/hydra/works/services/generic_file/add_file_to_generic_file.rb +127 -0
  19. data/lib/hydra/works/services/generic_file/generate/thumbnail.rb +1 -2
  20. data/lib/hydra/works/services/generic_file/persist_derivative.rb +22 -0
  21. data/lib/hydra/works/services/generic_file/upload_file.rb +11 -19
  22. data/lib/hydra/works/version.rb +1 -1
  23. data/lib/hydra/works/vocab/works_terms.rb +1 -1
  24. data/spec/fixtures/Example.ogg +0 -0
  25. data/spec/fixtures/charter.docx +0 -0
  26. data/spec/fixtures/countdown.avi +0 -0
  27. data/spec/fixtures/image.jp2 +0 -0
  28. data/spec/fixtures/piano_note.wav +0 -0
  29. data/spec/fixtures/test5.mp3 +0 -0
  30. data/spec/fixtures/world.png +0 -0
  31. data/spec/hydra/works/models/collection_spec.rb +499 -16
  32. data/spec/hydra/works/models/concerns/block_child_objects_spec.rb +19 -0
  33. data/spec/hydra/works/models/concerns/{file → generic_file}/contained_files_spec.rb +20 -17
  34. data/spec/hydra/works/models/concerns/generic_file/mime_types_spec.rb +76 -0
  35. data/spec/hydra/works/models/concerns/generic_file/versioned_content_spec.rb +32 -0
  36. data/spec/hydra/works/models/concerns/generic_file/virus_check_spec.rb +50 -0
  37. data/spec/hydra/works/models/concerns/generic_file_behavior_spec.rb +1 -1
  38. data/spec/hydra/works/models/generic_file_spec.rb +201 -14
  39. data/spec/hydra/works/models/generic_work_spec.rb +530 -14
  40. data/spec/hydra/works/services/generic_file/add_file_to_generic_file_spec.rb +110 -0
  41. data/spec/hydra/works/services/generic_file/upload_file_spec.rb +45 -28
  42. data/spec/hydra/works/services/persist_derivatives_spec.rb +93 -0
  43. data/spec/hydra/works_spec.rb +35 -35
  44. data/spec/spec_helper.rb +6 -0
  45. metadata +56 -95
  46. data/lib/hydra/works/models/concerns/aggregates_collections.rb +0 -16
  47. data/lib/hydra/works/models/concerns/aggregates_generic_files.rb +0 -20
  48. data/lib/hydra/works/models/concerns/aggregates_generic_works.rb +0 -20
  49. data/lib/hydra/works/processor.rb +0 -9
  50. data/lib/hydra/works/services/collection/add_collection.rb +0 -19
  51. data/lib/hydra/works/services/collection/add_generic_work.rb +0 -19
  52. data/lib/hydra/works/services/collection/add_related_object.rb +0 -19
  53. data/lib/hydra/works/services/collection/get_collections.rb +0 -17
  54. data/lib/hydra/works/services/collection/get_generic_works.rb +0 -17
  55. data/lib/hydra/works/services/collection/get_related_objects.rb +0 -17
  56. data/lib/hydra/works/services/collection/remove_collection.rb +0 -19
  57. data/lib/hydra/works/services/collection/remove_generic_work.rb +0 -20
  58. data/lib/hydra/works/services/collection/remove_related_object.rb +0 -19
  59. data/lib/hydra/works/services/generic_file/add_file.rb +0 -55
  60. data/lib/hydra/works/services/generic_file/add_generic_file.rb +0 -19
  61. data/lib/hydra/works/services/generic_file/add_original_file.rb +0 -11
  62. data/lib/hydra/works/services/generic_file/add_related_object.rb +0 -19
  63. data/lib/hydra/works/services/generic_file/add_versioned_original_file.rb +0 -10
  64. data/lib/hydra/works/services/generic_file/get_generic_files.rb +0 -17
  65. data/lib/hydra/works/services/generic_file/get_related_objects.rb +0 -17
  66. data/lib/hydra/works/services/generic_file/remove_generic_file.rb +0 -20
  67. data/lib/hydra/works/services/generic_file/remove_related_object.rb +0 -19
  68. data/lib/hydra/works/services/generic_work/add_generic_file.rb +0 -19
  69. data/lib/hydra/works/services/generic_work/add_generic_work.rb +0 -19
  70. data/lib/hydra/works/services/generic_work/add_related_object.rb +0 -19
  71. data/lib/hydra/works/services/generic_work/get_generic_files.rb +0 -17
  72. data/lib/hydra/works/services/generic_work/get_generic_works.rb +0 -17
  73. data/lib/hydra/works/services/generic_work/get_related_objects.rb +0 -17
  74. data/lib/hydra/works/services/generic_work/move_generic_file.rb +0 -19
  75. data/lib/hydra/works/services/generic_work/remove_generic_file.rb +0 -20
  76. data/lib/hydra/works/services/generic_work/remove_generic_work.rb +0 -20
  77. data/lib/hydra/works/services/generic_work/remove_related_object.rb +0 -19
  78. data/spec/hydra/works/services/collection/add_collection_spec.rb +0 -166
  79. data/spec/hydra/works/services/collection/add_generic_work_spec.rb +0 -155
  80. data/spec/hydra/works/services/collection/add_related_object_spec.rb +0 -149
  81. data/spec/hydra/works/services/collection/get_collections_spec.rb +0 -35
  82. data/spec/hydra/works/services/collection/get_generic_works_spec.rb +0 -35
  83. data/spec/hydra/works/services/collection/get_related_objects_spec.rb +0 -49
  84. data/spec/hydra/works/services/collection/remove_collection_spec.rb +0 -133
  85. data/spec/hydra/works/services/collection/remove_generic_work_spec.rb +0 -133
  86. data/spec/hydra/works/services/collection/remove_related_object_spec.rb +0 -128
  87. data/spec/hydra/works/services/generic_file/add_file_spec.rb +0 -28
  88. data/spec/hydra/works/services/generic_file/add_generic_file_spec.rb +0 -174
  89. data/spec/hydra/works/services/generic_file/add_related_object_spec.rb +0 -150
  90. data/spec/hydra/works/services/generic_file/get_generic_files_spec.rb +0 -19
  91. data/spec/hydra/works/services/generic_file/get_related_objects_spec.rb +0 -45
  92. data/spec/hydra/works/services/generic_file/remove_generic_file_spec.rb +0 -124
  93. data/spec/hydra/works/services/generic_file/remove_related_object_spec.rb +0 -123
  94. data/spec/hydra/works/services/generic_work/add_generic_file_spec.rb +0 -156
  95. data/spec/hydra/works/services/generic_work/add_generic_work_spec.rb +0 -157
  96. data/spec/hydra/works/services/generic_work/add_related_object_spec.rb +0 -148
  97. data/spec/hydra/works/services/generic_work/get_generic_files_spec.rb +0 -35
  98. data/spec/hydra/works/services/generic_work/get_generic_works_spec.rb +0 -35
  99. data/spec/hydra/works/services/generic_work/get_related_objects_spec.rb +0 -46
  100. data/spec/hydra/works/services/generic_work/move_generic_file_spec.rb +0 -21
  101. data/spec/hydra/works/services/generic_work/remove_generic_file_spec.rb +0 -132
  102. data/spec/hydra/works/services/generic_work/remove_generic_work_spec.rb +0 -133
  103. data/spec/hydra/works/services/generic_work/remove_related_object_spec.rb +0 -128
@@ -2,31 +2,56 @@ require 'spec_helper'
2
2
 
3
3
  describe Hydra::Works::GenericWork do
4
4
 
5
- let(:generic_work1) { Hydra::Works::GenericWork::Base.create }
6
- let(:generic_work2) { Hydra::Works::GenericWork::Base.create }
7
- let(:generic_work3) { Hydra::Works::GenericWork::Base.create }
5
+ subject { Hydra::Works::GenericWork::Base.new }
8
6
 
9
- let(:generic_file1) { Hydra::Works::GenericFile::Base.create }
10
- let(:generic_file2) { Hydra::Works::GenericFile::Base.create }
7
+ let(:generic_work1) { Hydra::Works::GenericWork::Base.new }
8
+ let(:generic_work2) { Hydra::Works::GenericWork::Base.new }
9
+ let(:generic_work3) { Hydra::Works::GenericWork::Base.new }
10
+ let(:generic_work4) { Hydra::Works::GenericWork::Base.new }
11
+ let(:generic_work5) { Hydra::Works::GenericWork::Base.new }
12
+
13
+ let(:generic_file1) { Hydra::Works::GenericFile::Base.new }
14
+ let(:generic_file2) { Hydra::Works::GenericFile::Base.new }
15
+
16
+ let(:object1) { Hydra::PCDM::Object.new }
17
+ let(:object2) { Hydra::PCDM::Object.new }
11
18
 
12
19
  let(:pcdm_file1) { Hydra::PCDM::File.new }
13
20
 
14
- describe '#generic_works=' do
21
+ describe '#child_generic_works=' do
15
22
  it 'should aggregate generic_works' do
16
- generic_work1.generic_works = [generic_work2, generic_work3]
17
- generic_work1.save
18
- expect(generic_work1.generic_works).to eq [generic_work2, generic_work3]
23
+ generic_work1.child_generic_works = [generic_work2, generic_work3]
24
+ expect(generic_work1.child_generic_works).to eq [generic_work2, generic_work3]
19
25
  end
20
26
  end
21
27
 
22
28
  describe '#generic_files=' do
23
29
  it 'should aggregate generic_files' do
24
30
  generic_work1.generic_files = [generic_file1, generic_file2]
25
- generic_work1.save
26
31
  expect(generic_work1.generic_files).to eq [generic_file1, generic_file2]
27
32
  end
28
33
  end
29
34
 
35
+ describe '#generic_file_ids' do
36
+ it 'should list child generic_file ids' do
37
+ generic_work1.generic_files = [generic_file1, generic_file2]
38
+ expect(generic_work1.generic_file_ids).to eq [generic_file1.id, generic_file2.id]
39
+ end
40
+ end
41
+
42
+ context "sub-class" do
43
+ before do
44
+ class TestWork < Hydra::Works::GenericWork::Base
45
+ end
46
+ end
47
+
48
+ subject { TestWork.new(generic_files: [generic_file1]) }
49
+
50
+ it "should have many generic files" do
51
+ expect(subject.generic_files).to eq [generic_file1]
52
+ end
53
+ end
54
+
30
55
  describe '#contains' do
31
56
  it 'should present as a missing method' do
32
57
  expect{ generic_work1.contains = [pcdm_file1] }.to raise_error(NoMethodError,"works can not directly contain files. You must add a GenericFile to the work's members and add files to that GenericFile.")
@@ -34,17 +59,508 @@ describe Hydra::Works::GenericWork do
34
59
  end
35
60
 
36
61
  describe 'Related objects' do
37
- let(:generic_work1) { Hydra::Works::GenericWork::Base.create }
38
- let(:object1) { Hydra::PCDM::Object.create }
62
+ let(:generic_work1) { Hydra::Works::GenericWork::Base.new }
63
+ let(:object1) { Hydra::PCDM::Object.new }
39
64
 
40
65
  before do
41
66
  generic_work1.related_objects = [object1]
42
- generic_work1.save
43
67
  end
44
68
 
45
69
  it 'persists' do
46
- expect(generic_work1.reload.related_objects).to eq [object1]
70
+ expect(generic_work1.related_objects).to eq [object1]
71
+ end
72
+ end
73
+
74
+ describe '#child_generic_works' do
75
+ context 'with acceptable generic_works' do
76
+
77
+ context 'with generic_files and generic_works' do
78
+ before do
79
+ subject.generic_files << generic_file1
80
+ subject.generic_files << generic_file2
81
+ subject.child_generic_works << generic_work1
82
+ subject.child_generic_works << generic_work2
83
+ end
84
+
85
+ it 'should add generic_work to generic_work with generic_files and generic_works' do
86
+ subject.child_generic_works << generic_work3
87
+ expect(subject.child_generic_works).to eq [generic_work1,generic_work2,generic_work3]
88
+ end
89
+ end
90
+
91
+ describe 'aggregates generic_works that implement Hydra::Works::GenericWorkBehavior' do
92
+ before do
93
+ class DummyIncWork < ActiveFedora::Base
94
+ include Hydra::Works::GenericWorkBehavior
95
+ end
96
+ end
97
+ after { Object.send(:remove_const, :DummyIncWork) }
98
+ let(:iwork1) { DummyIncWork.new }
99
+
100
+ it 'should accept implementing generic_work as a child' do
101
+ subject.child_generic_works << iwork1
102
+ expect(subject.child_generic_works).to eq [iwork1]
103
+ end
104
+ end
105
+
106
+ describe 'aggregates generic_works that extend Hydra::Works::GenericWork::Base' do
107
+ before do
108
+ class DummyExtWork < Hydra::Works::GenericWork::Base
109
+ end
110
+ end
111
+ after { Object.send(:remove_const, :DummyExtWork) }
112
+ let(:ework1) { DummyExtWork.new }
113
+
114
+ it 'should accept extending generic_work as a child' do
115
+ subject.child_generic_works << ework1
116
+ expect(subject.child_generic_works).to eq [ework1]
117
+ end
118
+ end
119
+ end
120
+
121
+ context 'with unacceptable inputs' do
122
+ before(:all) do
123
+ @generic_work102 = Hydra::Works::GenericWork::Base.new
124
+
125
+ @works_collection101 = Hydra::Works::Collection.new
126
+ @generic_file101 = Hydra::Works::GenericFile::Base.new
127
+ @pcdm_collection101 = Hydra::PCDM::Collection.new
128
+ @pcdm_object101 = Hydra::PCDM::Object.new
129
+ @pcdm_file101 = Hydra::PCDM::File.new
130
+ @non_PCDM_object = "I'm not a PCDM object"
131
+ @af_base_object = ActiveFedora::Base.new
132
+ end
133
+
134
+ context 'that are unacceptable child generic works' do
135
+
136
+ let(:error_type1) { ArgumentError }
137
+ let(:error_message1) { /Hydra::Works::(GenericFile::Base|Collection) with ID: was expected to works_generic_work\?, but it was false/ }
138
+ let(:error_type2) { NoMethodError }
139
+ let(:error_message2) { /undefined method `works_generic_work\?' for .*/ }
140
+
141
+ it 'should NOT aggregate Hydra::Works::Collection in generic works aggregation' do
142
+ expect{ subject.child_generic_works << @works_collection101 }.to raise_error(error_type1,error_message1)
143
+ end
144
+
145
+ it 'should NOT aggregate Hydra::Works::GenericFile in generic works aggregation' do
146
+ expect{ subject.child_generic_works << @generic_file101 }.to raise_error(error_type1,error_message1)
147
+ end
148
+
149
+ it 'should NOT aggregate Hydra::PCDM::Collections in generic works aggregation' do
150
+ expect{ subject.child_generic_works << @pcdm_collection101 }.to raise_error(error_type2,error_message2)
151
+ end
152
+
153
+ it 'should NOT aggregate Hydra::PCDM::Objects in generic works aggregation' do
154
+ expect{ subject.child_generic_works << @pcdm_object101 }.to raise_error(error_type2,error_message2)
155
+ end
156
+
157
+ it 'should NOT aggregate Hydra::PCDM::Files in generic works aggregation' do
158
+ expect{ subject.child_generic_works << @pcdm_file101 }.to raise_error(error_type2,error_message2)
159
+ end
160
+
161
+ it 'should NOT aggregate non-PCDM objects in generic works aggregation' do
162
+ expect{ subject.child_generic_works << @non_PCDM_object }.to raise_error(error_type2,error_message2)
163
+ end
164
+
165
+ it 'should NOT aggregate AF::Base objects in generic works aggregation' do
166
+ expect{ subject.child_generic_works << @af_base_object }.to raise_error(error_type2,error_message2)
167
+ end
168
+ end
169
+ end
170
+ end
171
+
172
+ describe '#generic_files <<' do
173
+ it 'should return empty array when only generic_files are aggregated' do
174
+ subject.generic_files << generic_file1
175
+ subject.generic_files << generic_file2
176
+ expect(subject.child_generic_works).to eq []
177
+ end
178
+
179
+ context 'with generic_files and generic_works' do
180
+ before do
181
+ subject.generic_files << generic_file1
182
+ subject.generic_files << generic_file2
183
+ subject.child_generic_works << generic_work1
184
+ subject.child_generic_works << generic_work2
185
+ end
186
+
187
+ it 'should only return generic_works' do
188
+ expect(subject.child_generic_works).to eq [generic_work1,generic_work2]
189
+ end
190
+ end
191
+ end
192
+
193
+ describe '#child_generic_works.delete' do
194
+ context 'when multiple collections' do
195
+ before do
196
+ subject.child_generic_works << generic_work1
197
+ subject.child_generic_works << generic_work2
198
+ subject.generic_files << generic_file2
199
+ subject.child_generic_works << generic_work3
200
+ subject.child_generic_works << generic_work4
201
+ subject.generic_files << generic_file1
202
+ subject.child_generic_works << generic_work5
203
+ expect(subject.child_generic_works).to eq [generic_work1,generic_work2,generic_work3,generic_work4,generic_work5]
204
+ end
205
+
206
+ it 'should remove first collection' do
207
+ expect(subject.child_generic_works.delete generic_work1).to eq [generic_work1]
208
+ expect(subject.child_generic_works).to eq [generic_work2,generic_work3,generic_work4,generic_work5]
209
+ expect(subject.generic_files).to eq [generic_file2,generic_file1]
210
+ end
211
+
212
+ it 'should remove last collection' do
213
+ expect(subject.child_generic_works.delete generic_work5).to eq [generic_work5]
214
+ expect(subject.child_generic_works).to eq [generic_work1,generic_work2,generic_work3,generic_work4]
215
+ expect(subject.generic_files).to eq [generic_file2,generic_file1]
216
+ end
217
+
218
+ it 'should remove middle collection' do
219
+ expect(subject.child_generic_works.delete generic_work3).to eq [generic_work3]
220
+ expect(subject.child_generic_works).to eq [generic_work1,generic_work2,generic_work4,generic_work5]
221
+ expect(subject.generic_files).to eq [generic_file2,generic_file1]
222
+ end
223
+ end
224
+ end
225
+
226
+ describe '#child_generic_works <<' do
227
+ context 'with acceptable generic_works' do
228
+ context 'with generic_files and generic_works' do
229
+ let(:generic_file3) { Hydra::Works::GenericFile::Base.new }
230
+ before do
231
+ subject.generic_files << generic_file1
232
+ subject.generic_files << generic_file2
233
+ subject.child_generic_works << generic_work1
234
+ subject.child_generic_works << generic_work2
235
+ end
236
+
237
+ it 'should add generic_file to generic_work with generic_files and generic_works' do
238
+ subject.generic_files << generic_file3
239
+ expect(subject.generic_files).to eq [generic_file1,generic_file2,generic_file3]
240
+ end
241
+ end
242
+
243
+ describe 'aggregates generic_files that implement Hydra::Works::GenericFileBehavior' do
244
+ before do
245
+ class DummyIncFile < ActiveFedora::Base
246
+ include Hydra::Works::GenericFileBehavior
247
+ end
248
+ end
249
+ after { Object.send(:remove_const, :DummyIncFile) }
250
+ let(:ifile1) { DummyIncFile.new }
251
+
252
+ it 'should accept implementing generic_file as a child' do
253
+ subject.generic_files << ifile1
254
+ expect(subject.generic_files).to eq [ifile1]
255
+ end
256
+
257
+ end
258
+
259
+ describe 'aggregates generic_files that extend Hydra::Works::GenericFile::Base' do
260
+ before do
261
+ class DummyExtFile < Hydra::Works::GenericFile::Base
262
+ end
263
+ end
264
+ after { Object.send(:remove_const, :DummyExtFile) }
265
+ let(:efile1) { DummyExtFile.new }
266
+
267
+ it 'should accept extending generic_file as a child' do
268
+ subject.generic_files << efile1
269
+ expect(subject.generic_files).to eq [efile1]
270
+ end
271
+ end
272
+ end
273
+
274
+ context 'with unacceptable inputs' do
275
+ before(:all) do
276
+ @generic_work102 = Hydra::Works::GenericWork::Base.new
277
+
278
+ @works_collection101 = Hydra::Works::Collection.new
279
+ @generic_work101 = Hydra::Works::GenericWork::Base.new
280
+ @generic_file101 = Hydra::Works::GenericFile::Base.new
281
+ @pcdm_collection101 = Hydra::PCDM::Collection.new
282
+ @pcdm_object101 = Hydra::PCDM::Object.new
283
+ @pcdm_file101 = Hydra::PCDM::File.new
284
+ @non_PCDM_object = "I'm not a PCDM object"
285
+ @af_base_object = ActiveFedora::Base.new
286
+ end
287
+
288
+ context 'that are unacceptable child generic files' do
289
+
290
+ let(:error_type1) { ArgumentError }
291
+ let(:error_message1) { /Hydra::Works::(GenericWork::Base|Collection) with ID: was expected to works_generic_file\?, but it was false/ }
292
+ let(:error_type2) { NoMethodError }
293
+ let(:error_message2) { /undefined method `works_generic_file\?' for .*/ }
294
+
295
+ it 'should NOT aggregate Hydra::Works::Collection in generic files aggregation' do
296
+ expect{ subject.generic_files << @works_collection101 }.to raise_error(error_type1,error_message1)
297
+ end
298
+
299
+ it 'should NOT aggregate Hydra::Works::GenericWork in generic files aggregation' do
300
+ expect{ subject.generic_files << @generic_work101 }.to raise_error(error_type1,error_message1)
301
+ end
302
+
303
+ it 'should NOT aggregate Hydra::PCDM::Collections in generic files aggregation' do
304
+ expect{ subject.generic_files << @pcdm_collection101 }.to raise_error(error_type2,error_message2)
305
+ end
306
+
307
+ it 'should NOT aggregate Hydra::PCDM::Objects in generic files aggregation' do
308
+ expect{ subject.generic_files << @pcdm_object101 }.to raise_error(error_type2,error_message2)
309
+ end
310
+
311
+ it 'should NOT aggregate Hydra::PCDM::Files in generic files aggregation' do
312
+ expect{ subject.generic_files << @pcdm_file101 }.to raise_error(error_type2,error_message2)
313
+ end
314
+
315
+ it 'should NOT aggregate non-PCDM objects in generic files aggregation' do
316
+ expect{ subject.generic_files << @non_PCDM_object }.to raise_error(error_type2,error_message2)
317
+ end
318
+
319
+ it 'should NOT aggregate AF::Base objects in generic files aggregation' do
320
+ expect{ subject.generic_files << @af_base_object }.to raise_error(error_type2,error_message2)
321
+ end
322
+ end
323
+ end
324
+ end
325
+
326
+ context "move generic file" do
327
+ before do
328
+ subject.generic_files << generic_file1
329
+ subject.generic_files << generic_file2
330
+ end
331
+ it "moves file from one work to another" do
332
+ expect(subject.generic_files).to eq([generic_file1, generic_file2])
333
+ expect(generic_work1.generic_files).to eq([])
334
+ generic_work1.generic_files << subject.generic_files.delete(generic_file1)
335
+ expect(subject.generic_files).to eq([generic_file2])
336
+ expect(generic_work1.generic_files).to eq([generic_file1])
337
+ end
338
+ end
339
+
340
+ describe '#generic_files' do
341
+ it 'should return empty array when only generic_works are aggregated' do
342
+ subject.child_generic_works << generic_work1
343
+ subject.child_generic_works << generic_work2
344
+ expect(subject.generic_files).to eq []
345
+ end
346
+
347
+ context 'with generic_files and generic_works' do
348
+ before do
349
+ subject.generic_files << generic_file1
350
+ subject.generic_files << generic_file2
351
+ subject.child_generic_works << generic_work1
352
+ subject.child_generic_works << generic_work2
353
+ end
354
+
355
+ it 'should only return generic_files' do
356
+ expect(subject.generic_files).to eq [generic_file1,generic_file2]
357
+ end
358
+ end
359
+ end
360
+
361
+ describe '#generic_files.delete' do
362
+ context 'when multiple collections' do
363
+ let(:generic_file3) { Hydra::Works::GenericFile::Base.new }
364
+ let(:generic_file4) { Hydra::Works::GenericFile::Base.new }
365
+ let(:generic_file5) { Hydra::Works::GenericFile::Base.new }
366
+ before do
367
+ subject.generic_files << generic_file1
368
+ subject.generic_files << generic_file2
369
+ subject.child_generic_works << generic_work2
370
+ subject.generic_files << generic_file3
371
+ subject.generic_files << generic_file4
372
+ subject.child_generic_works << generic_work1
373
+ subject.generic_files << generic_file5
374
+ expect(subject.generic_files).to eq [generic_file1,generic_file2,generic_file3,generic_file4,generic_file5]
375
+ end
376
+
377
+ it 'should remove first collection' do
378
+ expect(subject.generic_files.delete generic_file1).to eq [generic_file1]
379
+ expect(subject.generic_files).to eq [generic_file2,generic_file3,generic_file4,generic_file5]
380
+ expect(subject.child_generic_works).to eq [generic_work2,generic_work1]
381
+ end
382
+
383
+ it 'should remove last collection' do
384
+ expect(subject.generic_files.delete generic_file5).to eq [generic_file5]
385
+ expect(subject.generic_files).to eq [generic_file1,generic_file2,generic_file3,generic_file4]
386
+ expect(subject.child_generic_works).to eq [generic_work2,generic_work1]
387
+ end
388
+
389
+ it 'should remove middle collection' do
390
+ expect(subject.generic_files.delete generic_file3).to eq [generic_file3]
391
+ expect(subject.generic_files).to eq [generic_file1,generic_file2,generic_file4,generic_file5]
392
+ expect(subject.child_generic_works).to eq [generic_work2,generic_work1]
393
+ end
394
+ end
395
+ end
396
+
397
+ describe '#related_objects' do
398
+
399
+ context 'with acceptable related objects' do
400
+
401
+ it 'should add various types of related objects to generic_work' do
402
+ subject.related_objects << generic_work1
403
+ subject.related_objects << generic_file1
404
+ subject.related_objects << object1
405
+ subject.save
406
+ subject.reload
407
+ expect(subject.related_objects.include? generic_work1).to be true
408
+ expect(subject.related_objects.include? generic_file1).to be true
409
+ expect(subject.related_objects.include? object1).to be true
410
+ expect(subject.related_objects.size).to eq 3
411
+ end
412
+
413
+ context 'with generic_works and generic_files' do
414
+ before do
415
+ subject.generic_files << generic_file1
416
+ subject.generic_files << generic_file2
417
+ subject.child_generic_works << generic_work1
418
+ subject.child_generic_works << generic_work2
419
+ subject.related_objects << object1
420
+ end
421
+
422
+ it 'should add a related object to generic_work with generic_works and generic_files' do
423
+ subject.related_objects << object2
424
+ subject.save
425
+ subject.reload
426
+ expect(subject.related_objects.include? object1).to be true
427
+ expect(subject.related_objects.include? object2).to be true
428
+ expect(subject.related_objects.size).to eq 2
429
+ end
430
+ end
431
+ end
432
+
433
+ context 'with unacceptable child related objects' do
434
+ let(:collection1) { Hydra::Works::Collection.new }
435
+ let(:pcdm_collection1) { Hydra::PCDM::Collection.new }
436
+ let(:pcdm_file1) { Hydra::PCDM::File.new }
437
+ let(:non_PCDM_object) { "I'm not a PCDM object" }
438
+ let(:af_base_object) { ActiveFedora::Base.new }
439
+
440
+ let(:error_message) { 'child_related_object must be a pcdm object' }
441
+
442
+ it 'should NOT aggregate Hydra::Works::Collection in related objects aggregation' do
443
+ expect{ subject.related_objects << collection1 }.to raise_error(ActiveFedora::AssociationTypeMismatch, /Hydra::Works::Collection:.*> is not a PCDM object./)
444
+ end
445
+
446
+ it 'should NOT aggregate Hydra::PCDM::Collections in related objects aggregation' do
447
+ expect{ subject.related_objects << pcdm_collection1 }.to raise_error(ActiveFedora::AssociationTypeMismatch, /Hydra::PCDM::Collection:.*> is not a PCDM object./)
448
+ end
449
+
450
+ it 'should NOT aggregate Hydra::PCDM::Files in related objects aggregation' do
451
+ expect{ subject.related_objects << pcdm_file1 }.to raise_error(ActiveFedora::AssociationTypeMismatch, /ActiveFedora::Base.* expected, got Hydra::PCDM::File.*/)
452
+ end
453
+
454
+ it 'should NOT aggregate non-PCDM objects in related objects aggregation' do
455
+ expect{ subject.related_objects << non_PCDM_object }.to raise_error(ActiveFedora::AssociationTypeMismatch, /ActiveFedora::Base.* expected, got String.*/)
456
+ end
457
+
458
+ it 'should NOT aggregate AF::Base objects in related objects aggregation' do
459
+ expect{ subject.related_objects << af_base_object }.to raise_error(ActiveFedora::AssociationTypeMismatch, /ActiveFedora::Base:.*> is not a PCDM object./)
460
+ end
461
+ end
462
+
463
+ context 'with invalid bahaviors' do
464
+ it 'should NOT allow related objects to repeat' do
465
+ skip 'skipping this test because issue pcdm#92 needs to be addressed' do
466
+ subject.related_objects << object1
467
+ subject.related_objects << object2
468
+ subject.related_objects << object1
469
+ expect(subject.related_objects.include? object1).to be true
470
+ expect(subject.related_objects.include? object2).to be true
471
+ expect(subject.related_objects.size).to eq 2
472
+ end
473
+ end
474
+ end
475
+ end
476
+
477
+ describe '#related_objects <<' do
478
+ context 'with generic files and works' do
479
+ before do
480
+ subject.child_generic_works << generic_work1
481
+ subject.child_generic_works << generic_work1
482
+ subject.generic_files << generic_file1
483
+ end
484
+
485
+ it 'should return empty array when only generic files and generic works are aggregated' do
486
+ expect(subject.related_objects).to eq []
487
+ end
488
+
489
+ it 'should only return related objects' do
490
+ subject.related_objects << object2
491
+ expect(subject.related_objects).to eq [object2]
492
+ end
493
+
494
+ it 'should return related objects of various types' do
495
+ subject.related_objects << generic_work2
496
+ subject.related_objects << generic_file1
497
+ subject.related_objects << object1
498
+ expect(subject.related_objects).to eq [generic_work2,generic_file1,object1]
499
+ expect(subject.related_objects.size).to eq 3
500
+ end
501
+ end
502
+ end
503
+
504
+ describe '#related_objects.delete' do
505
+ context 'when multiple related objects' do
506
+ let(:related_object1) { Hydra::PCDM::Object.new }
507
+ let(:related_work2) { Hydra::Works::GenericWork::Base.new }
508
+ let(:related_file3) { Hydra::Works::GenericFile::Base.new }
509
+ let(:related_object4) { Hydra::PCDM::Object.new }
510
+ let(:related_work5) { Hydra::Works::GenericWork::Base.new }
511
+ before do
512
+ subject.related_objects << related_object1
513
+ subject.related_objects << related_work2
514
+ subject.child_generic_works << generic_work2
515
+ subject.generic_files << generic_file1
516
+ subject.related_objects << related_file3
517
+ subject.related_objects << related_object4
518
+ subject.child_generic_works << generic_work1
519
+ subject.related_objects << related_work5
520
+ expect(subject.related_objects).to eq [related_object1,related_work2,related_file3,related_object4,related_work5]
521
+ end
522
+
523
+ it 'should remove first related object' do
524
+ expect(subject.related_objects.delete related_object1).to eq [related_object1]
525
+ expect(subject.related_objects).to eq [related_work2,related_file3,related_object4,related_work5]
526
+ expect(subject.child_generic_works).to eq [generic_work2,generic_work1]
527
+ expect(subject.generic_files).to eq [generic_file1]
528
+ end
529
+
530
+ it 'should remove last related object' do
531
+ expect(subject.related_objects.delete related_work5).to eq [related_work5]
532
+ expect(subject.related_objects).to eq [related_object1,related_work2,related_file3,related_object4]
533
+ expect(subject.child_generic_works).to eq [generic_work2,generic_work1]
534
+ expect(subject.generic_files).to eq [generic_file1]
535
+ end
536
+
537
+ it 'should remove middle related object' do
538
+ expect(subject.related_objects.delete related_file3).to eq [related_file3]
539
+ expect(subject.related_objects).to eq [related_object1,related_work2,related_object4,related_work5]
540
+ expect(subject.child_generic_works).to eq [generic_work2,generic_work1]
541
+ expect(subject.generic_files).to eq [generic_file1]
542
+ end
47
543
  end
48
544
  end
49
545
 
546
+ describe "should have parent work and collection accessors" do
547
+ let(:collection1) { Hydra::Works::Collection.new }
548
+ before do
549
+ collection1.child_generic_works << generic_work2
550
+ generic_work1.child_generic_works << generic_work2
551
+ collection1.save
552
+ generic_work1.save
553
+ generic_work2.save
554
+ end
555
+
556
+ it 'should have parents' do
557
+ expect(generic_work2.parents).to eq [collection1,generic_work1]
558
+ end
559
+ it 'should have a parent collection' do
560
+ expect(generic_work2.parent_collections).to eq [collection1]
561
+ end
562
+ it 'should have a parent generic_work' do
563
+ expect(generic_work2.parent_generic_works).to eq [generic_work1]
564
+ end
565
+ end
50
566
  end