hydra-works 0.0.1 → 0.1.0

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 (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