hydra-pcdm 0.0.1

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 (65) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +26 -0
  4. data/.travis.yml +14 -0
  5. data/CONTRIBUTING.md +115 -0
  6. data/Gemfile +13 -0
  7. data/LICENSE +12 -0
  8. data/README.md +87 -0
  9. data/Rakefile +20 -0
  10. data/config/jetty.yml +6 -0
  11. data/hydra-pcdm.gemspec +30 -0
  12. data/lib/hydra/pcdm/collection_indexer.rb +12 -0
  13. data/lib/hydra/pcdm/models/collection.rb +6 -0
  14. data/lib/hydra/pcdm/models/concerns/collection_behavior.rb +79 -0
  15. data/lib/hydra/pcdm/models/concerns/object_behavior.rb +104 -0
  16. data/lib/hydra/pcdm/models/file.rb +20 -0
  17. data/lib/hydra/pcdm/models/object.rb +6 -0
  18. data/lib/hydra/pcdm/object_indexer.rb +10 -0
  19. data/lib/hydra/pcdm/services/collection/add_collection.rb +20 -0
  20. data/lib/hydra/pcdm/services/collection/add_object.rb +19 -0
  21. data/lib/hydra/pcdm/services/collection/add_related_object.rb +21 -0
  22. data/lib/hydra/pcdm/services/collection/get_collections.rb +18 -0
  23. data/lib/hydra/pcdm/services/collection/get_objects.rb +18 -0
  24. data/lib/hydra/pcdm/services/collection/get_related_objects.rb +17 -0
  25. data/lib/hydra/pcdm/services/collection/remove_collection.rb +36 -0
  26. data/lib/hydra/pcdm/services/collection/remove_object.rb +43 -0
  27. data/lib/hydra/pcdm/services/collection/remove_related_object.rb +36 -0
  28. data/lib/hydra/pcdm/services/file/add_type.rb +20 -0
  29. data/lib/hydra/pcdm/services/file/get_mime_type.rb +11 -0
  30. data/lib/hydra/pcdm/services/object/add_object.rb +20 -0
  31. data/lib/hydra/pcdm/services/object/add_related_object.rb +21 -0
  32. data/lib/hydra/pcdm/services/object/get_objects.rb +18 -0
  33. data/lib/hydra/pcdm/services/object/get_related_objects.rb +17 -0
  34. data/lib/hydra/pcdm/services/object/remove_object.rb +43 -0
  35. data/lib/hydra/pcdm/services/object/remove_related_object.rb +36 -0
  36. data/lib/hydra/pcdm/version.rb +5 -0
  37. data/lib/hydra/pcdm/vocab/ebucore_terms.rb +33 -0
  38. data/lib/hydra/pcdm/vocab/pcdm_terms.rb +87 -0
  39. data/lib/hydra/pcdm/vocab/sweetjpl_terms.rb +10 -0
  40. data/lib/hydra/pcdm.rb +69 -0
  41. data/spec/hydra/pcdm/collection_indexer_spec.rb +26 -0
  42. data/spec/hydra/pcdm/models/collection_spec.rb +82 -0
  43. data/spec/hydra/pcdm/models/file_spec.rb +56 -0
  44. data/spec/hydra/pcdm/models/object_spec.rb +141 -0
  45. data/spec/hydra/pcdm/object_indexer_spec.rb +20 -0
  46. data/spec/hydra/pcdm/services/collection/add_collection_spec.rb +197 -0
  47. data/spec/hydra/pcdm/services/collection/add_object_spec.rb +132 -0
  48. data/spec/hydra/pcdm/services/collection/add_related_object_spec.rb +94 -0
  49. data/spec/hydra/pcdm/services/collection/get_collections_spec.rb +40 -0
  50. data/spec/hydra/pcdm/services/collection/get_objects_spec.rb +40 -0
  51. data/spec/hydra/pcdm/services/collection/get_related_objects_spec.rb +37 -0
  52. data/spec/hydra/pcdm/services/collection/remove_collection_spec.rb +143 -0
  53. data/spec/hydra/pcdm/services/collection/remove_object_spec.rb +180 -0
  54. data/spec/hydra/pcdm/services/collection/remove_related_object_spec.rb +146 -0
  55. data/spec/hydra/pcdm/services/file/add_type_spec.rb +19 -0
  56. data/spec/hydra/pcdm/services/file/get_mime_type_spec.rb +24 -0
  57. data/spec/hydra/pcdm/services/object/add_object_spec.rb +186 -0
  58. data/spec/hydra/pcdm/services/object/add_related_object_spec.rb +94 -0
  59. data/spec/hydra/pcdm/services/object/get_objects_spec.rb +33 -0
  60. data/spec/hydra/pcdm/services/object/get_related_objects_spec.rb +39 -0
  61. data/spec/hydra/pcdm/services/object/remove_object_spec.rb +158 -0
  62. data/spec/hydra/pcdm/services/object/remove_related_object_spec.rb +126 -0
  63. data/spec/hydra/pcdm_spec.rb +56 -0
  64. data/spec/spec_helper.rb +34 -0
  65. metadata +215 -0
@@ -0,0 +1,94 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hydra::PCDM::AddRelatedObjectToCollection do
4
+
5
+ let(:subject) { Hydra::PCDM::Collection.create }
6
+
7
+ describe '#call' do
8
+
9
+ context 'with acceptable collections' do
10
+ let(:object1) { Hydra::PCDM::Object.create }
11
+ let(:object2) { Hydra::PCDM::Object.create }
12
+ let(:object3) { Hydra::PCDM::Object.create }
13
+ let(:object4) { Hydra::PCDM::Object.create }
14
+ let(:collection1) { Hydra::PCDM::Collection.create }
15
+ let(:collection2) { Hydra::PCDM::Collection.create }
16
+
17
+ it 'should add a related object to empty collection' do
18
+ Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object1 )
19
+ expect( Hydra::PCDM::GetRelatedObjectsFromCollection.call( subject ) ).to eq [object1]
20
+ end
21
+
22
+ it 'should add a related object to collection with related objects' do
23
+ Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object1 )
24
+ Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object2 )
25
+ related_objects = Hydra::PCDM::GetRelatedObjectsFromCollection.call( subject )
26
+ expect( related_objects.include? object1 ).to be true
27
+ expect( related_objects.include? object2 ).to be true
28
+ expect( related_objects.size ).to eq 2
29
+ end
30
+
31
+ context 'with collections and objects' do
32
+ before do
33
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 )
34
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection2 )
35
+ Hydra::PCDM::AddObjectToCollection.call( subject, object1 )
36
+ Hydra::PCDM::AddObjectToCollection.call( subject, object2 )
37
+ Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object3 )
38
+ subject.save
39
+ end
40
+
41
+ it 'should add an object to collection with collections and objects' do
42
+ Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object4 )
43
+ related_objects = Hydra::PCDM::GetRelatedObjectsFromCollection.call( subject )
44
+ expect( related_objects.include? object3 ).to be true
45
+ expect( related_objects.include? object4 ).to be true
46
+ expect( related_objects.size ).to eq 2
47
+ end
48
+ end
49
+ end
50
+
51
+ context 'with unacceptable objects' do
52
+ let(:collection1) { Hydra::PCDM::Collection.create }
53
+ let(:file1) { Hydra::PCDM::File.new }
54
+ let(:non_PCDM_object) { "I'm not a PCDM object" }
55
+ let(:af_base_object) { ActiveFedora::Base.create }
56
+
57
+ let(:error_message) { 'child_related_object must be a pcdm object' }
58
+
59
+ it 'should NOT aggregate Hydra::PCDM::Collection in related objects aggregation' do
60
+ expect{ Hydra::PCDM::AddRelatedObjectToCollection.call( subject, collection1 ) }.to raise_error(ArgumentError,error_message)
61
+ end
62
+
63
+ it 'should NOT aggregate Hydra::PCDM::Files in related objects aggregation' do
64
+ expect{ Hydra::PCDM::AddRelatedObjectToCollection.call( subject, file1 ) }.to raise_error(ArgumentError,error_message)
65
+ end
66
+
67
+ it 'should NOT aggregate non-PCDM objects in related objects aggregation' do
68
+ expect{ Hydra::PCDM::AddRelatedObjectToCollection.call( subject, non_PCDM_object ) }.to raise_error(ArgumentError,error_message)
69
+ end
70
+
71
+ it 'should NOT aggregate AF::Base objects in related objects aggregation' do
72
+ expect{ Hydra::PCDM::AddRelatedObjectToCollection.call( subject, af_base_object ) }.to raise_error(ArgumentError,error_message)
73
+ end
74
+
75
+ end
76
+
77
+ context 'with invalid bahaviors' do
78
+ let(:object1) { Hydra::PCDM::Object.create }
79
+ let(:object2) { Hydra::PCDM::Object.create }
80
+
81
+ it 'should NOT allow related objects to repeat' do
82
+ skip 'skipping this test because issue #92 needs to be addressed' do
83
+ Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object1 )
84
+ Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object2 )
85
+ Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object1 )
86
+ related_objects = Hydra::PCDM::GetRelatedObjectsFromCollection.call( subject )
87
+ expect( related_objects.include? object1 ).to be true
88
+ expect( related_objects.include? object2 ).to be true
89
+ expect( related_objects.size ).to eq 2
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hydra::PCDM::GetCollectionsFromCollection do
4
+
5
+ subject { Hydra::PCDM::Collection.create }
6
+
7
+ let(:collection1) { Hydra::PCDM::Collection.create }
8
+ let(:collection2) { Hydra::PCDM::Collection.create }
9
+
10
+ let(:object1) { Hydra::PCDM::Object.create }
11
+ let(:object2) { Hydra::PCDM::Object.create }
12
+
13
+ describe '#call' do
14
+ it 'should return empty array when no members' do
15
+ subject.save
16
+ expect(Hydra::PCDM::GetCollectionsFromCollection.call( subject )).to eq []
17
+ end
18
+
19
+ it 'should return empty array when only objects are aggregated' do
20
+ Hydra::PCDM::AddObjectToCollection.call( subject, object1 )
21
+ Hydra::PCDM::AddObjectToCollection.call( subject, object2 )
22
+ subject.save
23
+ expect(Hydra::PCDM::GetCollectionsFromCollection.call( subject )).to eq []
24
+ end
25
+
26
+ context 'with other collections & objects' do
27
+ before do
28
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 )
29
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection2 )
30
+ Hydra::PCDM::AddObjectToCollection.call( subject, object1 )
31
+ Hydra::PCDM::AddObjectToCollection.call( subject, object2 )
32
+ subject.save
33
+ end
34
+
35
+ it 'should only return collections' do
36
+ expect(Hydra::PCDM::GetCollectionsFromCollection.call( subject )).to eq [collection1,collection2]
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hydra::PCDM::GetObjectsFromCollection do
4
+
5
+ subject { Hydra::PCDM::Collection.create }
6
+
7
+ let(:collection1) { Hydra::PCDM::Collection.create }
8
+ let(:collection2) { Hydra::PCDM::Collection.create }
9
+
10
+ let(:object1) { Hydra::PCDM::Object.create }
11
+ let(:object2) { Hydra::PCDM::Object.create }
12
+
13
+ describe '#call' do
14
+ it 'should return empty array when no members' do
15
+ subject.save
16
+ expect(Hydra::PCDM::GetObjectsFromCollection.call( subject )).to eq []
17
+ end
18
+
19
+ it 'should return empty array when only collections are aggregated' do
20
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 )
21
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection2 )
22
+ subject.save
23
+ expect(Hydra::PCDM::GetObjectsFromCollection.call( subject )).to eq []
24
+ end
25
+
26
+ context 'with collections and objects' do
27
+ before do
28
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 )
29
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection2 )
30
+ Hydra::PCDM::AddObjectToCollection.call( subject, object1 )
31
+ Hydra::PCDM::AddObjectToCollection.call( subject, object2 )
32
+ subject.save
33
+ end
34
+
35
+ it 'should only return related objects' do
36
+ expect(Hydra::PCDM::GetObjectsFromCollection.call( subject )).to eq [object1,object2]
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hydra::PCDM::GetRelatedObjectsFromCollection do
4
+
5
+ subject { Hydra::PCDM::Collection.create }
6
+
7
+ let(:collection1) { Hydra::PCDM::Collection.create }
8
+ let(:collection2) { Hydra::PCDM::Collection.create }
9
+
10
+ let(:object1) { Hydra::PCDM::Object.create }
11
+ let(:object2) { Hydra::PCDM::Object.create }
12
+
13
+ describe '#call' do
14
+ it 'should return empty array when no related object' do
15
+ subject.save
16
+ expect(Hydra::PCDM::GetRelatedObjectsFromCollection.call( subject )).to eq []
17
+ end
18
+
19
+ context 'with collections and objects' do
20
+ before do
21
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 )
22
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection2 )
23
+ Hydra::PCDM::AddObjectToCollection.call( subject, object1 )
24
+ subject.save
25
+ end
26
+
27
+ it 'should return empty array when only collections and object are aggregated' do
28
+ expect(Hydra::PCDM::GetRelatedObjectsFromCollection.call( subject )).to eq []
29
+ end
30
+
31
+ it 'should only return related objects' do
32
+ Hydra::PCDM::AddRelatedObjectToCollection.call( subject, object2 )
33
+ expect(Hydra::PCDM::GetRelatedObjectsFromCollection.call( subject )).to eq [object2]
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,143 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hydra::PCDM::RemoveCollectionFromCollection do
4
+
5
+ subject { Hydra::PCDM::Collection.create }
6
+
7
+ let(:collection1) { Hydra::PCDM::Collection.create }
8
+ let(:collection2) { Hydra::PCDM::Collection.create }
9
+ let(:collection3) { Hydra::PCDM::Collection.create }
10
+ let(:collection4) { Hydra::PCDM::Collection.create }
11
+ let(:collection5) { Hydra::PCDM::Collection.create }
12
+
13
+ let(:object1) { Hydra::PCDM::Object.create }
14
+ let(:object2) { Hydra::PCDM::Object.create }
15
+
16
+
17
+ describe '#call' do
18
+ context 'when it is the only collection' do
19
+
20
+ before do
21
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 )
22
+ subject.save
23
+ expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject.reload )).to eq [collection1]
24
+ end
25
+
26
+ it 'should remove collection' do
27
+ expect( Hydra::PCDM::RemoveCollectionFromCollection.call( subject, collection1 ) ).to eq collection1
28
+ expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject.reload )).to eq []
29
+ end
30
+
31
+ it 'should remove collection only when objects' do
32
+ Hydra::PCDM::AddObjectToCollection.call( subject, object1 )
33
+ Hydra::PCDM::AddObjectToCollection.call( subject, object2 )
34
+ expect( Hydra::PCDM::RemoveCollectionFromCollection.call( subject, collection1 ) ).to eq collection1
35
+ expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject.reload )).to eq []
36
+ expect( Hydra::PCDM::GetObjectsFromCollection.call( subject )).to eq [object1,object2]
37
+ end
38
+ end
39
+
40
+ context 'when multiple collections' do
41
+ before do
42
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 )
43
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection2 )
44
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection3 )
45
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection4 )
46
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection5 )
47
+ subject.save
48
+ expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject.reload )).to eq [collection1,collection2,collection3,collection4,collection5]
49
+ end
50
+
51
+ it 'should remove first collection' do
52
+ expect( Hydra::PCDM::RemoveCollectionFromCollection.call( subject, collection1 ) ).to eq collection1
53
+ expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject.reload )).to eq [collection2,collection3,collection4,collection5]
54
+ end
55
+
56
+ it 'should remove last collection' do
57
+ expect( Hydra::PCDM::RemoveCollectionFromCollection.call( subject, collection5 ) ).to eq collection5
58
+ expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject.reload )).to eq [collection1,collection2,collection3,collection4]
59
+ end
60
+
61
+ it 'should remove middle collection' do
62
+ expect( Hydra::PCDM::RemoveCollectionFromCollection.call( subject, collection3 ) ).to eq collection3
63
+ expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject.reload )).to eq [collection1,collection2,collection4,collection5]
64
+ end
65
+ end
66
+
67
+ context 'when collection is missing' do
68
+ it 'should return nil' do
69
+ subject.save
70
+ expect( Hydra::PCDM::RemoveCollectionFromCollection.call( subject.reload, collection1 ) ).to be nil
71
+ end
72
+
73
+ it 'should return nil' do
74
+ Hydra::PCDM::AddObjectToCollection.call( subject, object1 )
75
+ Hydra::PCDM::AddObjectToCollection.call( subject, object2 )
76
+ subject.save
77
+ expect( Hydra::PCDM::RemoveCollectionFromCollection.call( subject.reload, collection1 ) ).to be nil
78
+ end
79
+
80
+ it 'should return nil' do
81
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 )
82
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection2 )
83
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection4 )
84
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection5 )
85
+ subject.save
86
+ expect( Hydra::PCDM::RemoveCollectionFromCollection.call( subject.reload, collection3 ) ).to be nil
87
+ end
88
+ end
89
+ end
90
+
91
+ context 'with unacceptable collections' do
92
+ let(:object1) { Hydra::PCDM::Object.create }
93
+ let(:file1) { Hydra::PCDM::File.new }
94
+ let(:non_PCDM_object) { "I'm not a PCDM object" }
95
+ let(:af_base_object) { ActiveFedora::Base.create }
96
+
97
+ let(:error_type) { ArgumentError }
98
+ let(:error_message) { 'child_collection must be a pcdm collection' }
99
+
100
+ it 'should NOT remove Hydra::PCDM::Objects from collections aggregation' do
101
+ expect{ Hydra::PCDM::RemoveCollectionFromCollection.call( subject, object1 ) }.to raise_error(error_type,error_message)
102
+ end
103
+
104
+ it 'should NOT remove Hydra::PCDM::Files from collections aggregation' do
105
+ expect{ Hydra::PCDM::RemoveCollectionFromCollection.call( subject, file1 ) }.to raise_error(error_type,error_message)
106
+ end
107
+
108
+ it 'should NOT remove non-PCDM objects from collections aggregation' do
109
+ expect{ Hydra::PCDM::RemoveCollectionFromCollection.call( subject, non_PCDM_object ) }.to raise_error(error_type,error_message)
110
+ end
111
+
112
+ it 'should NOT remove AF::Base objects from collections aggregation' do
113
+ expect{ Hydra::PCDM::RemoveCollectionFromCollection.call( subject, af_base_object ) }.to raise_error(error_type,error_message)
114
+ end
115
+ end
116
+
117
+ context 'with unacceptable parent collection' do
118
+ let(:collection2) { Hydra::PCDM::Collection.create }
119
+ let(:object1) { Hydra::PCDM::Object.create }
120
+ let(:file1) { Hydra::PCDM::File.new }
121
+ let(:non_PCDM_object) { "I'm not a PCDM object" }
122
+ let(:af_base_object) { ActiveFedora::Base.create }
123
+
124
+ let(:error_type) { ArgumentError }
125
+ let(:error_message) { 'parent_collection must be a pcdm collection' }
126
+
127
+ it 'should NOT accept Hydra::PCDM::Objects as parent collection' do
128
+ expect{ Hydra::PCDM::RemoveCollectionFromCollection.call( object1, collection2 ) }.to raise_error(error_type,error_message)
129
+ end
130
+
131
+ it 'should NOT accept Hydra::PCDM::Files as parent collection' do
132
+ expect{ Hydra::PCDM::RemoveCollectionFromCollection.call( file1, collection2 ) }.to raise_error(error_type,error_message)
133
+ end
134
+
135
+ it 'should NOT accept non-PCDM objects as parent collection' do
136
+ expect{ Hydra::PCDM::RemoveCollectionFromCollection.call( non_PCDM_object, collection2 ) }.to raise_error(error_type,error_message)
137
+ end
138
+
139
+ it 'should NOT accept AF::Base objects as parent collection' do
140
+ expect{ Hydra::PCDM::RemoveCollectionFromCollection.call( af_base_object, collection2 ) }.to raise_error(error_type,error_message)
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,180 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hydra::PCDM::RemoveObjectFromCollection do
4
+
5
+ subject { Hydra::PCDM::Collection.create }
6
+
7
+ let(:object1) { Hydra::PCDM::Object.create }
8
+ let(:object2) { Hydra::PCDM::Object.create }
9
+ let(:object3) { Hydra::PCDM::Object.create }
10
+ let(:object4) { Hydra::PCDM::Object.create }
11
+ let(:object5) { Hydra::PCDM::Object.create }
12
+
13
+ let(:collection1) { Hydra::PCDM::Collection.create }
14
+ let(:collection2) { Hydra::PCDM::Collection.create }
15
+
16
+ describe '#call' do
17
+ context 'when it is the only object' do
18
+ before do
19
+ Hydra::PCDM::AddObjectToCollection.call( subject, object1 )
20
+ subject.save
21
+ expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1]
22
+ end
23
+
24
+ it 'should remove object' do
25
+ expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject, object1 ) ).to eq object1
26
+ expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq []
27
+ end
28
+
29
+ it 'should remove object only when collections' do
30
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 )
31
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection2 )
32
+ expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject, object1 ) ).to eq object1
33
+ expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq []
34
+ expect( Hydra::PCDM::GetCollectionsFromCollection.call( subject )).to eq [collection1,collection2]
35
+ end
36
+ end
37
+
38
+ context 'when multiple objects' do
39
+ before do
40
+ Hydra::PCDM::AddObjectToCollection.call( subject, object1 )
41
+ Hydra::PCDM::AddObjectToCollection.call( subject, object2 )
42
+ Hydra::PCDM::AddObjectToCollection.call( subject, object3 )
43
+ Hydra::PCDM::AddObjectToCollection.call( subject, object4 )
44
+ Hydra::PCDM::AddObjectToCollection.call( subject, object5 )
45
+ subject.save
46
+ expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object3,object4,object5]
47
+ end
48
+
49
+ it 'should remove first object' do
50
+ expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject, object1 ) ).to eq object1
51
+ expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object2,object3,object4,object5]
52
+ end
53
+
54
+ it 'should remove last object' do
55
+ expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject, object5 ) ).to eq object5
56
+ expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object3,object4]
57
+ end
58
+
59
+ it 'should remove middle object' do
60
+ expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject, object3 ) ).to eq object3
61
+ expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object4,object5]
62
+ end
63
+ end
64
+
65
+ context 'when object repeats' do
66
+ before do
67
+ Hydra::PCDM::AddObjectToCollection.call( subject, object1 )
68
+ Hydra::PCDM::AddObjectToCollection.call( subject, object2 )
69
+ Hydra::PCDM::AddObjectToCollection.call( subject, object3 )
70
+ Hydra::PCDM::AddObjectToCollection.call( subject, object2 )
71
+ Hydra::PCDM::AddObjectToCollection.call( subject, object4 )
72
+ Hydra::PCDM::AddObjectToCollection.call( subject, object2 )
73
+ Hydra::PCDM::AddObjectToCollection.call( subject, object5 )
74
+ subject.save
75
+ end
76
+
77
+ # TODO pending implementation of multiple objects
78
+
79
+ it 'should remove first occurrence' do
80
+ skip 'skipping this test because issue #102 needs to be addressed' do
81
+ expect(Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object3,object2,object4,object2,object5]
82
+ expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject, object2 ) ).to eq object2
83
+ expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object3,object2,object4,object2,object5]
84
+ end
85
+ end
86
+
87
+ it 'should remove last occurrence' do
88
+ skip 'skipping this test because issue #102 needs to be addressed' do
89
+ expect(Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object3,object2,object4,object2,object5]
90
+ expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject, object2, -1 ) ).to eq object2
91
+ expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object3,object2,object4,object5]
92
+ end
93
+ end
94
+
95
+ it 'should remove nth occurrence' do
96
+ skip 'skipping this test because issue #102 needs to be addressed' do
97
+ expect(Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object3,object2,object4,object2,object5]
98
+ expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject, object2, 2 ) ).to eq object2
99
+ expect( Hydra::PCDM::GetObjectsFromCollection.call( subject.reload )).to eq [object1,object2,object3,object4,object2,object5]
100
+ end
101
+ end
102
+ end
103
+
104
+ context 'when object is missing' do
105
+ it 'should return nil' do
106
+ subject.save
107
+ expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject.reload, object1 )).to be nil
108
+ end
109
+
110
+ it 'should return nil' do
111
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection1 )
112
+ Hydra::PCDM::AddCollectionToCollection.call( subject, collection2 )
113
+ subject.save
114
+ expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject.reload, object1 )).to be nil
115
+ end
116
+
117
+ it 'should return nil' do
118
+ Hydra::PCDM::AddObjectToCollection.call( subject, object1 )
119
+ Hydra::PCDM::AddObjectToCollection.call( subject, object2 )
120
+ Hydra::PCDM::AddObjectToCollection.call( subject, object4 )
121
+ Hydra::PCDM::AddObjectToCollection.call( subject, object5 )
122
+ subject.save
123
+ expect( Hydra::PCDM::RemoveObjectFromCollection.call( subject.reload, object3 )).to be nil
124
+ end
125
+ end
126
+ end
127
+
128
+ context 'with unacceptable objects' do
129
+ let(:collection1) { Hydra::PCDM::Collection.create }
130
+ let(:file1) { Hydra::PCDM::File.new }
131
+ let(:non_PCDM_object) { "I'm not a PCDM object" }
132
+ let(:af_base_object) { ActiveFedora::Base.create }
133
+
134
+ let(:error_type) { ArgumentError }
135
+ let(:error_message) { 'child_object must be a pcdm object' }
136
+
137
+ it 'should NOT remove Hydra::PCDM::Collections from objects aggregation' do
138
+ expect{ Hydra::PCDM::RemoveObjectFromCollection.call( subject, collection1 ) }.to raise_error(error_type,error_message)
139
+ end
140
+
141
+ it 'should NOT remove Hydra::PCDM::Files from objects aggregation' do
142
+ expect{ Hydra::PCDM::RemoveObjectFromCollection.call( subject, file1 ) }.to raise_error(error_type,error_message)
143
+ end
144
+
145
+ it 'should NOT remove non-PCDM objects from objects aggregation' do
146
+ expect{ Hydra::PCDM::RemoveObjectFromCollection.call( subject, non_PCDM_object ) }.to raise_error(error_type,error_message)
147
+ end
148
+
149
+ it 'should NOT remove AF::Base objects from objects aggregation' do
150
+ expect{ Hydra::PCDM::RemoveObjectFromCollection.call( subject, af_base_object ) }.to raise_error(error_type,error_message)
151
+ end
152
+ end
153
+
154
+ context 'with unacceptable parent collection' do
155
+ let(:collection2) { Hydra::PCDM::Collection.create }
156
+ let(:object1) { Hydra::PCDM::Object.create }
157
+ let(:file1) { Hydra::PCDM::File.new }
158
+ let(:non_PCDM_object) { "I'm not a PCDM object" }
159
+ let(:af_base_object) { ActiveFedora::Base.create }
160
+
161
+ let(:error_type) { ArgumentError }
162
+ let(:error_message) { 'parent_collection must be a pcdm collection' }
163
+
164
+ it 'should NOT accept Hydra::PCDM::Objects as parent collection' do
165
+ expect{ Hydra::PCDM::RemoveObjectFromCollection.call( object1, collection2 ) }.to raise_error(error_type,error_message)
166
+ end
167
+
168
+ it 'should NOT accept Hydra::PCDM::Files as parent collection' do
169
+ expect{ Hydra::PCDM::RemoveObjectFromCollection.call( file1, collection2 ) }.to raise_error(error_type,error_message)
170
+ end
171
+
172
+ it 'should NOT accept non-PCDM objects as parent collection' do
173
+ expect{ Hydra::PCDM::RemoveObjectFromCollection.call( non_PCDM_object, collection2 ) }.to raise_error(error_type,error_message)
174
+ end
175
+
176
+ it 'should NOT accept AF::Base objects as parent collection' do
177
+ expect{ Hydra::PCDM::RemoveObjectFromCollection.call( af_base_object, collection2 ) }.to raise_error(error_type,error_message)
178
+ end
179
+ end
180
+ end