hydra-works 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +72 -0
  4. data/Gemfile +5 -4
  5. data/README.md +17 -11
  6. data/Rakefile +18 -8
  7. data/config/solrconfig.xml +223 -0
  8. data/hydra-works.gemspec +15 -15
  9. data/lib/hydra/works.rb +28 -17
  10. data/lib/hydra/works/errors/full_text_extraction_error.rb +5 -0
  11. data/lib/hydra/works/models/concerns/block_child_objects.rb +12 -6
  12. data/lib/hydra/works/models/concerns/collection_behavior.rb +44 -6
  13. data/lib/hydra/works/models/concerns/generic_file/contained_files.rb +3 -3
  14. data/lib/hydra/works/models/concerns/generic_file/derivatives.rb +2 -4
  15. data/lib/hydra/works/models/concerns/generic_file/mime_types.rb +1 -3
  16. data/lib/hydra/works/models/concerns/generic_file/versioned_content.rb +4 -6
  17. data/lib/hydra/works/models/concerns/generic_file/virus_check.rb +13 -14
  18. data/lib/hydra/works/models/concerns/generic_file_behavior.rb +13 -3
  19. data/lib/hydra/works/models/concerns/generic_work_behavior.rb +34 -9
  20. data/lib/hydra/works/models/generic_file.rb +0 -3
  21. data/lib/hydra/works/services/generic_file/add_file_to_generic_file.rb +14 -16
  22. data/lib/hydra/works/services/generic_file/full_text_extraction_service.rb +57 -0
  23. data/lib/hydra/works/services/generic_file/generate_thumbnail.rb +13 -0
  24. data/lib/hydra/works/services/generic_file/persist_derivative.rb +3 -5
  25. data/lib/hydra/works/services/generic_file/{upload_file.rb → upload_file_to_generic_file.rb} +1 -3
  26. data/lib/hydra/works/version.rb +1 -1
  27. data/lib/hydra/works/vocab/works_terms.rb +9 -9
  28. data/lib/tasks/hydra-works_tasks.rake +80 -0
  29. data/lib/tasks/jetty.rake +15 -0
  30. data/spec/hydra/works/models/collection_spec.rb +258 -246
  31. data/spec/hydra/works/models/concerns/block_child_objects_spec.rb +6 -8
  32. data/spec/hydra/works/models/concerns/generic_file/contained_files_spec.rb +40 -48
  33. data/spec/hydra/works/models/concerns/generic_file/mime_types_spec.rb +16 -18
  34. data/spec/hydra/works/models/concerns/generic_file/versioned_content_spec.rb +11 -11
  35. data/spec/hydra/works/models/concerns/generic_file/virus_check_spec.rb +11 -8
  36. data/spec/hydra/works/models/concerns/generic_file_behavior_spec.rb +1 -1
  37. data/spec/hydra/works/models/generic_file_spec.rb +87 -85
  38. data/spec/hydra/works/models/generic_work_spec.rb +167 -169
  39. data/spec/hydra/works/services/full_text_extraction_service_spec.rb +89 -0
  40. data/spec/hydra/works/services/generic_file/add_file_to_generic_file_spec.rb +36 -38
  41. data/spec/hydra/works/services/generic_file/generate/thumbnail_spec.rb +10 -12
  42. data/spec/hydra/works/services/generic_file/upload_file_spec.rb +39 -42
  43. data/spec/hydra/works/services/persist_derivatives_spec.rb +2 -3
  44. data/spec/hydra/works_spec.rb +57 -61
  45. data/spec/spec_helper.rb +2 -4
  46. metadata +23 -15
  47. data/lib/hydra/works/services/generic_file/generate/thumbnail.rb +0 -18
@@ -0,0 +1,57 @@
1
+ module Hydra::Works
2
+ # Extract the full text from the content using Solr's extract handler
3
+ class FullTextExtractionService
4
+ def self.run(generic_file)
5
+ new(generic_file).extract
6
+ end
7
+
8
+ delegate :original_file, :id, to: :@generic_file
9
+
10
+ def initialize(generic_file)
11
+ @generic_file = generic_file
12
+ end
13
+
14
+ ##
15
+ # Extract full text from the content using Solr's extract handler.
16
+ # This will extract text from the file uploaded to generic_file.
17
+ # The file uploaded to @generic_file can be accessed via :original_file.
18
+ #
19
+ # @return [String] The extracted text
20
+ def extract
21
+ JSON.parse(fetch)[''].rstrip
22
+ rescue Hydra::Works::FullTextExtractionError => e
23
+ raise e
24
+ rescue => e
25
+ raise Hydra::Works::FullTextExtractionError.new, "Error extracting content from #{id}: #{e.inspect}"
26
+ end
27
+
28
+ # send the request to the extract service and return the response if it was successful.
29
+ # TODO: this pulls the whole file into memory. We should stream it from Fedora instead
30
+ # @return [String] the result of calling the extract service
31
+ def fetch
32
+ req = Net::HTTP.new(uri.host, uri.port)
33
+ resp = req.post(uri.to_s, original_file.content, request_headers)
34
+ raise Hydra::Works::FullTextExtractionError.new, "Solr Extract service was unsuccessful. '#{uri}' returned code #{resp.code} for #{id}\n#{resp.body}" unless resp.code == '200'
35
+ original_file.content.rewind if original_file.content.respond_to?(:rewind)
36
+
37
+ resp.body
38
+ end
39
+
40
+ # @return [Hash] the request headers to send to the Solr extract service
41
+ def request_headers
42
+ { Faraday::Request::UrlEncoded::CONTENT_TYPE => "#{original_file.mime_type};charset=utf-8",
43
+ Faraday::Adapter::CONTENT_LENGTH => original_file.size.to_s }
44
+ end
45
+
46
+ # @returns [URI] path to the extract service
47
+ def uri
48
+ @uri ||= URI("#{connection_url}/update/extract?extractOnly=true&wt=json&extractFormat=text")
49
+ end
50
+
51
+ private
52
+
53
+ def connection_url
54
+ ActiveFedora.solr_config[:url]
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,13 @@
1
+ module Hydra::Works
2
+ class GenerateThumbnail
3
+ def self.call(object, content: :original_file)
4
+ fail ArgumentError, "object has no content at #{content} from which to generate a thumbnail" if object.send(content).nil?
5
+
6
+ # Always replace the thumbnail with whatever is from the original file
7
+ object.build_thumbnail if object.thumbnail.nil?
8
+
9
+ object.create_derivatives
10
+ object
11
+ end
12
+ end
13
+ end
@@ -2,21 +2,19 @@ require 'hydra/derivatives'
2
2
 
3
3
  module Hydra::Works
4
4
  class PersistDerivative < Hydra::Derivatives::PersistOutputFileService
5
-
6
5
  ##
7
6
  # Persists a derivative to a GenericFile
8
- # This Service conforms to the signature of `Hydra::Derivatives::PersistOutputFileService`.
7
+ # This Service conforms to the signature of `Hydra::Derivatives::PersistOutputFileService`.
9
8
  # The purpose of this Service is for use as an alternative to the default Hydra::Derivatives::PersistOutputFileService. It's necessary because the default behavior in Hydra::Derivatives assumes that you're using LDP Basic Containment. Hydra::Works::GenericFiles use IndirectContainment. This Service handles that case.
10
9
  # This service will always update existing and does not do versioning of persisted files.
11
- #
10
+ #
12
11
  # @param [Hydra::Works::GenericFile::Base] object the file will be added to
13
- # @param [#read or String] file the derivative filestream optionally responds to :mime_type
12
+ # @param [Hydra::Derivatives::IoDecorator] file the derivative filestream
14
13
  # @param [String] extract file type symbol (e.g. :thumbnail) from Hydra::Derivatives created destination_name
15
14
 
16
15
  def self.call(object, file, destination_name)
17
16
  type = destination_name.gsub(/^original_file_/, '').to_sym
18
17
  Hydra::Works::AddFileToGenericFile.call(object, file, type, update_existing: true, versioning: false)
19
18
  end
20
-
21
19
  end
22
20
  end
@@ -1,6 +1,5 @@
1
1
  module Hydra::Works
2
2
  class UploadFileToGenericFile
3
-
4
3
  # Sets a file as the primary file (original_file) of the generic_file
5
4
  # @param [Hydra::PCDM::GenericFile::Base] generic_file the file will be added to
6
5
  # @param [IO,File,Rack::Multipart::UploadedFile, #read] object that will be the contents. If file responds to :mime_type or :original_name, those will be called to provide technical metadata.
@@ -8,7 +7,7 @@ module Hydra::Works
8
7
  # @param [Boolean] update_existing whether to update an existing file if there is one. When set to true, performs a create_or_update. When set to false, always creates a new file within generic_file.files.
9
8
  # @param [Boolean] versioning whether to create new version entries (only applicable if +type+ corresponds to a versionable file)
10
9
 
11
- def self.call(generic_file, file, additional_services: [], update_existing: true, versioning: true)
10
+ def self.call(generic_file, file, additional_services: [], update_existing: true, versioning: true)
12
11
  Hydra::Works::AddFileToGenericFile.call(generic_file, file, :original_file, update_existing: update_existing, versioning: versioning)
13
12
 
14
13
  # Call any additional services
@@ -19,6 +18,5 @@ module Hydra::Works
19
18
  generic_file.save
20
19
  generic_file
21
20
  end
22
-
23
21
  end
24
22
  end
@@ -1,5 +1,5 @@
1
1
  module Hydra
2
2
  module Works
3
- VERSION = "0.1.0"
3
+ VERSION = '0.2.0'
4
4
  end
5
5
  end
@@ -1,12 +1,12 @@
1
1
  require 'rdf'
2
- module WorksVocabularies
3
- class WorksTerms < RDF::Vocabulary("http://projecthydra.org/works/models#")
4
-
5
- # Class definitions
6
- term :Collection
7
- term :GenericWork
8
- term :GenericFile
9
- term :File
10
-
2
+ module Hydra::Works
3
+ module Vocab
4
+ class WorksTerms < RDF::Vocabulary('http://projecthydra.org/works/models#')
5
+ # Class definitions
6
+ term :Collection
7
+ term :GenericWork
8
+ term :GenericFile
9
+ term :File
10
+ end
11
11
  end
12
12
  end
@@ -0,0 +1,80 @@
1
+ require 'net/http'
2
+
3
+ namespace :hydra_works do
4
+ namespace :jetty do
5
+
6
+ FULLTEXT_JARS = %w(
7
+ org/apache/james/apache-mime4j-core/0.7.2/apache-mime4j-core-0.7.2.jar
8
+ org/apache/james/apache-mime4j-dom/0.7.2/apache-mime4j-dom-0.7.2.jar
9
+ org/apache/solr/solr-cell/4.0.0/solr-cell-4.0.0.jar
10
+ org/bouncycastle/bcmail-jdk15/1.45/bcmail-jdk15-1.45.jar
11
+ org/bouncycastle/bcprov-jdk15/1.45/bcprov-jdk15-1.45.jar
12
+ de/l3s/boilerpipe/boilerpipe/1.1.0/boilerpipe-1.1.0.jar
13
+ org/apache/commons/commons-compress/1.4.1/commons-compress-1.4.1.jar
14
+ dom4j/dom4j/1.6.1/dom4j-1.6.1.jar
15
+ org/apache/pdfbox/fontbox/1.7.0/fontbox-1.7.0.jar
16
+ com/ibm/icu/icu4j/49.1/icu4j-49.1.jar
17
+ com/googlecode/mp4parser/isoparser/1.0-RC-1/isoparser-1.0-RC-1.jar
18
+ jdom/jdom/1.0/jdom-1.0.jar
19
+ org/apache/pdfbox/jempbox/1.7.0/jempbox-1.7.0.jar
20
+ com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar
21
+ com/drewnoakes/metadata-extractor/2.4.0-beta-1/metadata-extractor-2.4.0-beta-1.jar
22
+ edu/ucar/netcdf/4.2-min/netcdf-4.2-min.jar
23
+ org/apache/pdfbox/pdfbox/1.7.0/pdfbox-1.7.0.jar
24
+ org/apache/poi/poi/3.8/poi-3.8.jar
25
+ org/apache/poi/poi-ooxml/3.8/poi-ooxml-3.8.jar
26
+ org/apache/poi/poi-ooxml-schemas/3.8/poi-ooxml-schemas-3.8.jar
27
+ org/apache/poi/poi-scratchpad/3.8/poi-scratchpad-3.8.jar
28
+ rome/rome/0.9/rome-0.9.jar
29
+ org/ccil/cowan/tagsoup/tagsoup/1.2.1/tagsoup-1.2.1.jar
30
+ org/apache/tika/tika-core/1.2/tika-core-1.2.jar
31
+ org/apache/tika/tika-parsers/1.2/tika-parsers-1.2.jar
32
+ org/gagravarr/vorbis-java-core/0.1/vorbis-java-core-0.1.jar
33
+ org/gagravarr/vorbis-java-tika/0.1/vorbis-java-tika-0.1.jar
34
+ xerces/xercesImpl/2.9.1/xercesImpl-2.9.1.jar
35
+ org/apache/xmlbeans/xmlbeans/2.3.0/xmlbeans-2.3.0.jar
36
+ org/tukaani/xz/1.0/xz-1.0.jar
37
+ org/aspectj/aspectjrt/1.8.5/aspectjrt-1.8.5.jar
38
+ )
39
+
40
+ desc 'Configure jetty with full-text indexing'
41
+ task config: :download_jars do
42
+ Rake::Task['jetty:config'].invoke
43
+ end
44
+
45
+ desc 'Download Solr full-text extraction jars'
46
+ task :download_jars do
47
+ puts "Copying new solrconfig.xml"
48
+ source = File.join(File.dirname(__FILE__), '..', '..', 'config', 'solrconfig.xml')
49
+ dest = File.join('solr_conf','conf')
50
+ FileUtils.mkdir_p(dest) unless File.directory?(dest)
51
+ cp source, dest
52
+ puts "Downloading full-text jars from maven.org ..."
53
+ fulltext_dir = 'jetty/solr/lib/contrib/extraction/lib'
54
+ FileUtils.mkdir_p(fulltext_dir) unless File.directory?(fulltext_dir)
55
+ Dir.chdir(fulltext_dir) do
56
+ FULLTEXT_JARS.each do |jar|
57
+ destination = jar.split('/').last
58
+ download_from_maven(jar, destination) unless File.exists?(destination)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ def download_from_maven url, dst
66
+ full_url = '/remotecontent?filepath=' + url
67
+ file = File.open(dst, "wb")
68
+ endpoint = Net::HTTP.new('search.maven.org', 443)
69
+ endpoint.use_ssl = true
70
+ endpoint.start do |http|
71
+ puts "Fetching #{full_url}"
72
+ begin
73
+ http.request_get(full_url) do |resp|
74
+ resp.read_body { |segment| file.write(segment) }
75
+ end
76
+ ensure
77
+ file.close
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,15 @@
1
+ namespace :jetty do
2
+ desc "Copies the default Solr & Fedora configs into the bundled Hydra Testing Server"
3
+ task :config do
4
+ Rake::Task['hydra_works:jetty:download_jars'].invoke
5
+ Rake::Task["jetty:config_solr"].invoke
6
+ end
7
+
8
+ desc "Copies the contents of solr_conf into the Solr development-core and test-core of Testing Server"
9
+ task :config_solr do
10
+ FileList['solr_conf/conf/*'].each do |f|
11
+ cp("#{f}", 'jetty/solr/development-core/conf/', verbose: true)
12
+ cp("#{f}", 'jetty/solr/test-core/conf/', verbose: true)
13
+ end
14
+ end
15
+ end
@@ -1,51 +1,52 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Hydra::Works::Collection do
4
+ subject { described_class.new }
4
5
 
5
- subject { Hydra::Works::Collection.new }
6
-
7
- let(:collection1) { Hydra::Works::Collection.new }
8
- let(:collection2) { Hydra::Works::Collection.new }
9
- let(:collection3) { Hydra::Works::Collection.new }
6
+ let(:collection1) { described_class.new }
7
+ let(:collection2) { described_class.new }
8
+ let(:collection3) { described_class.new }
9
+ let(:collection4) { described_class.new }
10
10
 
11
11
  let(:generic_work1) { Hydra::Works::GenericWork::Base.new }
12
12
  let(:generic_work2) { Hydra::Works::GenericWork::Base.new }
13
13
  let(:generic_work3) { Hydra::Works::GenericWork::Base.new }
14
+ let(:generic_work4) { Hydra::Works::GenericWork::Base.new }
14
15
 
15
- describe '#child_collections' do
16
- it 'should return empty array when only generic_works are aggregated' do
17
- subject.child_generic_works << generic_work1
18
- subject.child_generic_works << generic_work2
19
- expect(subject.child_collections ).to eq []
16
+ describe '#collections' do
17
+ it 'returns empty array when only generic_works are aggregated' do
18
+ subject.generic_works << generic_work1
19
+ subject.generic_works << generic_work2
20
+ expect(subject.collections).to eq []
20
21
  end
21
22
 
22
- context 'with other collections & generic_works' do
23
- before do
24
- subject.child_collections << collection1
25
- subject.child_collections << collection2
26
- subject.child_generic_works << generic_work1
27
- subject.child_generic_works << generic_work2
23
+ context 'with other collections & generic_works' do
24
+ before do
25
+ subject.collections << collection1
26
+ subject.collections << collection2
27
+ subject.generic_works << generic_work1
28
+ subject.generic_works << generic_work2
28
29
  end
29
30
 
30
- it 'should only return collections' do
31
- expect(subject.child_collections ).to eq [collection1,collection2]
31
+ it 'returns only collections' do
32
+ expect(subject.collections).to eq [collection1, collection2]
32
33
  end
33
- end
34
+ end
34
35
  end
35
36
 
36
- describe '#child_collections <<' do
37
+ describe '#collections <<' do
37
38
  context 'with acceptable collections' do
38
39
  context 'with collections and generic_works' do
39
40
  before do
40
- subject.child_collections << collection1
41
- subject.child_collections << collection2
42
- subject.child_generic_works << generic_work1
43
- subject.child_generic_works << generic_work2
41
+ subject.collections << collection1
42
+ subject.collections << collection2
43
+ subject.generic_works << generic_work1
44
+ subject.generic_works << generic_work2
44
45
  end
45
46
 
46
- it 'should add an generic_work to collection with collections and generic_works' do
47
- subject.child_collections << collection3
48
- expect( subject.child_collections ).to eq [collection1,collection2,collection3]
47
+ it 'adds an generic_work to collection with collections and generic_works' do
48
+ subject.collections << collection3
49
+ expect(subject.collections).to eq [collection1, collection2, collection3]
49
50
  end
50
51
  end
51
52
 
@@ -58,14 +59,14 @@ describe Hydra::Works::Collection do
58
59
  after { Object.send(:remove_const, :Kollection) }
59
60
  let(:kollection1) { Kollection.new }
60
61
 
61
- it 'should accept implementing collection as a child' do
62
- subject.child_collections << kollection1
63
- expect( subject.child_collections ).to eq [kollection1]
62
+ it 'accepts implementing collection as a child' do
63
+ subject.collections << kollection1
64
+ expect(subject.collections).to eq [kollection1]
64
65
  end
65
66
 
66
- it 'should accept implementing collection as a parent' do
67
- subject.child_collections << collection1
68
- expect( subject.child_collections ).to eq [collection1]
67
+ it 'accepts implementing collection as a parent' do
68
+ subject.collections << collection1
69
+ expect(subject.collections).to eq [collection1]
69
70
  end
70
71
  end
71
72
 
@@ -77,137 +78,135 @@ describe Hydra::Works::Collection do
77
78
  after { Object.send(:remove_const, :Cullection) }
78
79
  let(:cullection1) { Cullection.new }
79
80
 
80
- it 'should accept extending collection as a child' do
81
- subject.child_collections << cullection1
82
- expect( subject.child_collections ).to eq [cullection1]
81
+ it 'accepts extending collection as a child' do
82
+ subject.collections << cullection1
83
+ expect(subject.collections).to eq [cullection1]
83
84
  end
84
85
 
85
- it 'should accept extending collection as a parent' do
86
- subject.child_collections << collection1
87
- expect( subject.child_collections ).to eq [collection1]
86
+ it 'accepts extending collection as a parent' do
87
+ subject.collections << collection1
88
+ expect(subject.collections).to eq [collection1]
88
89
  end
89
90
  end
90
91
  end
91
92
 
92
93
  context 'with unacceptable inputs' do
93
94
  before(:all) do
94
- @works_collection101 = Hydra::Works::Collection.new
95
+ @works_collection101 = described_class.new
95
96
  @generic_work101 = Hydra::Works::GenericWork::Base.new
96
97
  @generic_file101 = Hydra::Works::GenericFile::Base.new
97
98
  @pcdm_collection101 = Hydra::PCDM::Collection.new
98
99
  @pcdm_object101 = Hydra::PCDM::Object.new
99
100
  @pcdm_file101 = Hydra::PCDM::File.new
100
- @non_PCDM_object = "I'm not a PCDM object"
101
+ @non_pcdm_object = "I'm not a PCDM object"
101
102
  @af_base_object = ActiveFedora::Base.new
102
103
  end
103
104
 
104
105
  context 'that are unacceptable child collections' do
105
-
106
106
  let(:error_type1) { ArgumentError }
107
107
  let(:error_message1) { /Hydra::Works::Generic(Work|File)::Base with ID: was expected to works_collection\?, but it was false/ }
108
108
  let(:error_type2) { NoMethodError }
109
109
  let(:error_message2) { /undefined method `works_collection\?' for .*/ }
110
110
 
111
- it 'should NOT aggregate Hydra::Works::GenericWork in collections aggregation' do
112
- expect{ subject.child_collections << @generic_work101 }.to raise_error(error_type1,error_message1)
111
+ it 'does not aggregate Hydra::Works::GenericWork in collections aggregation' do
112
+ expect { subject.collections << @generic_work101 }.to raise_error(error_type1, error_message1)
113
113
  end
114
114
 
115
- it 'should NOT aggregate Hydra::Works::GenericFile in collections aggregation' do
116
- expect{ subject.child_collections << @generic_file101 }.to raise_error(error_type1,error_message1)
115
+ it 'does not aggregate Hydra::Works::GenericFile in collections aggregation' do
116
+ expect { subject.collections << @generic_file101 }.to raise_error(error_type1, error_message1)
117
117
  end
118
118
 
119
- it 'should NOT aggregate Hydra::PCDM::Collections in collections aggregation' do
120
- expect{ subject.child_collections << @pcdm_collection101 }.to raise_error(error_type2,error_message2)
119
+ it 'does not aggregate Hydra::PCDM::Collections in collections aggregation' do
120
+ expect { subject.collections << @pcdm_collection101 }.to raise_error(error_type2, error_message2)
121
121
  end
122
122
 
123
- it 'should NOT aggregate Hydra::PCDM::Objects in collections aggregation' do
124
- expect{ subject.child_collections << @pcdm_object101 }.to raise_error(error_type2,error_message2)
123
+ it 'does not aggregate Hydra::PCDM::Objects in collections aggregation' do
124
+ expect { subject.collections << @pcdm_object101 }.to raise_error(error_type2, error_message2)
125
125
  end
126
126
 
127
- it 'should NOT aggregate Hydra::PCDM::Files in collections aggregation' do
128
- expect{ subject.child_collections << @pcdm_file101 }.to raise_error(error_type2,error_message2)
127
+ it 'does not aggregate Hydra::PCDM::Files in collections aggregation' do
128
+ expect { subject.collections << @pcdm_file101 }.to raise_error(error_type2, error_message2)
129
129
  end
130
130
 
131
- it 'should NOT aggregate non-PCDM objects in collections aggregation' do
132
- expect{ subject.child_collections << @non_PCDM_object }.to raise_error(error_type2,error_message2)
131
+ it 'does not aggregate non-PCDM objects in collections aggregation' do
132
+ expect { subject.collections << @non_pcdm_object }.to raise_error(error_type2, error_message2)
133
133
  end
134
134
 
135
- it 'should NOT aggregate AF::Base objects in collections aggregation' do
136
- expect{ subject.child_collections << @af_base_object }.to raise_error(error_type2,error_message2)
135
+ it 'does not aggregate AF::Base objects in collections aggregation' do
136
+ expect { subject.collections << @af_base_object }.to raise_error(error_type2, error_message2)
137
137
  end
138
138
  end
139
139
  end
140
140
  end
141
141
 
142
- describe 'child_collections.delete' do
142
+ describe 'collections.delete' do
143
143
  context 'when multiple collections' do
144
144
  before do
145
- subject.child_collections << collection1
146
- subject.child_collections << collection2
147
- subject.child_generic_works << generic_work2
148
- subject.child_collections << collection3
149
- subject.child_generic_works << generic_work1
150
- expect( subject.child_collections ).to eq [collection1,collection2,collection3]
151
- end
152
-
153
- it 'should remove first collection' do
154
- expect( subject.child_collections.delete collection1 ).to eq [collection1]
155
- expect( subject.child_collections ).to eq [collection2,collection3]
156
- expect( subject.child_generic_works ).to eq [generic_work2,generic_work1]
157
- end
158
-
159
- it 'should remove last collection' do
160
- expect( subject.child_collections.delete collection3 ).to eq [collection3]
161
- expect( subject.child_collections ).to eq [collection1,collection2]
162
- expect( subject.child_generic_works). to eq [generic_work2,generic_work1]
163
- end
164
-
165
- it 'should remove middle collection' do
166
- expect( subject.child_collections.delete collection2 ).to eq [collection2]
167
- expect( subject.child_collections ).to eq [collection1,collection3]
168
- expect( subject.child_generic_works). to eq [generic_work2,generic_work1]
169
- end
170
- end
171
- end
172
-
173
- describe '#child_generic_works' do
174
- it 'should return empty array when only collections are aggregated' do
175
- subject.child_collections << collection1
176
- subject.child_collections << collection2
177
- expect(subject.child_generic_works). to eq []
145
+ subject.collections << collection1
146
+ subject.collections << collection2
147
+ subject.generic_works << generic_work2
148
+ subject.collections << collection3
149
+ subject.generic_works << generic_work1
150
+ expect(subject.collections).to eq [collection1, collection2, collection3]
151
+ end
152
+
153
+ it 'removes first collection' do
154
+ expect(subject.collections.delete collection1).to eq [collection1]
155
+ expect(subject.collections).to eq [collection2, collection3]
156
+ expect(subject.generic_works).to eq [generic_work2, generic_work1]
157
+ end
158
+
159
+ it 'removes last collection' do
160
+ expect(subject.collections.delete collection3).to eq [collection3]
161
+ expect(subject.collections).to eq [collection1, collection2]
162
+ expect(subject.generic_works). to eq [generic_work2, generic_work1]
163
+ end
164
+
165
+ it 'removes middle collection' do
166
+ expect(subject.collections.delete collection2).to eq [collection2]
167
+ expect(subject.collections).to eq [collection1, collection3]
168
+ expect(subject.generic_works). to eq [generic_work2, generic_work1]
169
+ end
170
+ end
171
+ end
172
+
173
+ describe '#generic_works' do
174
+ it 'returns empty array when only collections are aggregated' do
175
+ subject.collections << collection1
176
+ subject.collections << collection2
177
+ expect(subject.generic_works). to eq []
178
178
  end
179
179
 
180
180
  context 'with collections and generic works' do
181
- before do
182
- subject.child_collections << collection1
183
- subject.child_collections << collection2
184
- subject.child_generic_works << generic_work1
185
- subject.child_generic_works << generic_work2
181
+ before do
182
+ subject.collections << collection1
183
+ subject.collections << collection2
184
+ subject.generic_works << generic_work1
185
+ subject.generic_works << generic_work2
186
186
  end
187
187
 
188
- it 'should only return generic works' do
189
- expect(subject.child_generic_works). to eq [generic_work1,generic_work2]
188
+ it 'returns only generic works' do
189
+ expect(subject.generic_works). to eq [generic_work1, generic_work2]
190
190
  end
191
191
  end
192
- end
192
+ end
193
193
 
194
- describe '#child_generic_works <<' do
195
-
194
+ describe '#generic_works <<' do
196
195
  context 'with acceptable generic_works' do
197
196
  context 'with collections and generic_works' do
198
197
  before do
199
- subject.child_collections << collection1
200
- subject.child_collections << collection2
201
- subject.child_generic_works << generic_work1
202
- subject.child_generic_works << generic_work2
198
+ subject.collections << collection1
199
+ subject.collections << collection2
200
+ subject.generic_works << generic_work1
201
+ subject.generic_works << generic_work2
203
202
  end
204
203
 
205
- it 'should add generic_work to collection with collections and generic_works' do
206
- subject.child_generic_works << generic_work3
207
- expect( subject.child_generic_works ).to eq [generic_work1,generic_work2,generic_work3]
204
+ it 'adds generic_work to collection with collections and generic_works' do
205
+ subject.generic_works << generic_work3
206
+ expect(subject.generic_works).to eq [generic_work1, generic_work2, generic_work3]
208
207
  end
209
208
  end
210
-
209
+
211
210
  describe 'aggregates generic_works that implement Hydra::Works' do
212
211
  before do
213
212
  class DummyIncWork < ActiveFedora::Base
@@ -216,12 +215,12 @@ describe Hydra::Works::Collection do
216
215
  end
217
216
  after { Object.send(:remove_const, :DummyIncWork) }
218
217
  let(:iwork1) { DummyIncWork.new }
219
-
220
- it 'should accept implementing generic_work as a child' do
221
- subject.child_generic_works << iwork1
222
- expect( subject.child_generic_works ).to eq [iwork1]
218
+
219
+ it 'accepts implementing generic_work as a child' do
220
+ subject.generic_works << iwork1
221
+ expect(subject.generic_works).to eq [iwork1]
223
222
  end
224
- end
223
+ end
225
224
 
226
225
  describe 'aggregates generic_works that extend Hydra::Works' do
227
226
  before do
@@ -231,93 +230,92 @@ describe Hydra::Works::Collection do
231
230
  after { Object.send(:remove_const, :DummyExtWork) }
232
231
  let(:ework1) { DummyExtWork.new }
233
232
 
234
- it 'should accept extending generic_work as a child' do
235
- subject.child_generic_works << ework1
236
- expect( subject.child_generic_works ).to eq [ework1]
233
+ it 'accepts extending generic_work as a child' do
234
+ subject.generic_works << ework1
235
+ expect(subject.generic_works).to eq [ework1]
237
236
  end
238
237
  end
239
238
  end
240
239
 
241
240
  context 'with unacceptable inputs' do
242
241
  before(:all) do
243
- @works_collection101 = Hydra::Works::Collection.new
244
- @works_collection102 = Hydra::Works::Collection.new
242
+ @works_collection101 = described_class.new
243
+ @works_collection102 = described_class.new
245
244
  @generic_file101 = Hydra::Works::GenericFile::Base.new
246
245
  @pcdm_collection101 = Hydra::PCDM::Collection.new
247
246
  @pcdm_object101 = Hydra::PCDM::Object.new
248
247
  @pcdm_file101 = Hydra::PCDM::File.new
249
- @non_PCDM_object = "I'm not a PCDM object"
248
+ @non_pcdm_object = "I'm not a PCDM object"
250
249
  @af_base_object = ActiveFedora::Base.new
251
250
  end
252
251
 
253
252
  context 'that are unacceptable child generic works' do
254
-
255
253
  let(:error_type1) { ArgumentError }
256
254
  let(:error_message1) { /Hydra::Works::(GenericFile::Base|Collection) with ID: was expected to works_generic_work\?, but it was false/ }
257
255
  let(:error_type2) { NoMethodError }
258
256
  let(:error_message2) { /undefined method `works_generic_work\?' for .*/ }
259
257
 
260
- it 'should NOT aggregate Hydra::Works::Collection in generic works aggregation' do
261
- expect{ subject.child_generic_works << @works_collection101 }.to raise_error(error_type1,error_message1)
258
+ it 'does not aggregate Hydra::Works::Collection in generic works aggregation' do
259
+ expect { subject.generic_works << @works_collection101 }.to raise_error(error_type1, error_message1)
262
260
  end
263
261
 
264
- it 'should NOT aggregate Hydra::Works::GenericFile in generic works aggregation' do
265
- expect{ subject.child_generic_works << @generic_file101 }.to raise_error(error_type1,error_message1)
262
+ it 'does not aggregate Hydra::Works::GenericFile in generic works aggregation' do
263
+ expect { subject.generic_works << @generic_file101 }.to raise_error(error_type1, error_message1)
266
264
  end
267
265
 
268
- it 'should NOT aggregate Hydra::PCDM::Collections in generic works aggregation' do
269
- expect{ subject.child_generic_works << @pcdm_collection101 }.to raise_error(error_type2,error_message2)
266
+ it 'does not aggregate Hydra::PCDM::Collections in generic works aggregation' do
267
+ expect { subject.generic_works << @pcdm_collection101 }.to raise_error(error_type2, error_message2)
270
268
  end
271
269
 
272
- it 'should NOT aggregate Hydra::PCDM::Objects in generic works aggregation' do
273
- expect{ subject.child_generic_works << @pcdm_object101 }.to raise_error(error_type2,error_message2)
270
+ it 'does not aggregate Hydra::PCDM::Objects in generic works aggregation' do
271
+ expect { subject.generic_works << @pcdm_object101 }.to raise_error(error_type2, error_message2)
274
272
  end
275
273
 
276
- it 'should NOT aggregate Hydra::PCDM::Files in generic works aggregation' do
277
- expect{ subject.child_generic_works << @pcdm_file101 }.to raise_error(error_type2,error_message2)
274
+ it 'does not aggregate Hydra::PCDM::Files in generic works aggregation' do
275
+ expect { subject.generic_works << @pcdm_file101 }.to raise_error(error_type2, error_message2)
278
276
  end
279
277
 
280
- it 'should NOT aggregate non-PCDM objects in generic works aggregation' do
281
- expect{ subject.child_generic_works << @non_PCDM_object }.to raise_error(error_type2,error_message2)
278
+ it 'does not aggregate non-PCDM objects in generic works aggregation' do
279
+ expect { subject.generic_works << @non_pcdm_object }.to raise_error(error_type2, error_message2)
282
280
  end
283
281
 
284
- it 'should NOT aggregate AF::Base objects in generic works aggregation' do
285
- expect{ subject.child_generic_works << @af_base_object }.to raise_error(error_type2,error_message2)
282
+ it 'does not aggregate AF::Base objects in generic works aggregation' do
283
+ expect { subject.generic_works << @af_base_object }.to raise_error(error_type2, error_message2)
286
284
  end
287
285
  end
288
286
  end
289
287
  end
290
288
 
291
- describe '#child_generic_works.delete' do
289
+ describe '#generic_works.delete' do
292
290
  context 'when multiple generic works' do
293
291
  before do
294
- subject.child_generic_works << generic_work1
295
- subject.child_generic_works << generic_work2
296
- subject.child_collections << collection2
297
- subject.child_generic_works << generic_work3
298
- subject.child_collections << collection1
299
- expect( subject.child_generic_works). to eq [generic_work1,generic_work2,generic_work3]
300
- end
301
-
302
- it 'should remove first generic work' do
303
- expect( subject.child_generic_works.delete generic_work1 ).to eq [generic_work1]
304
- expect( subject.child_generic_works). to eq [generic_work2,generic_work3]
305
- expect( subject.child_collections ).to eq [collection2,collection1]
306
- end
307
-
308
- it 'should remove last generic work' do
309
- expect( subject.child_generic_works.delete generic_work3 ).to eq [generic_work3]
310
- expect( subject.child_generic_works). to eq [generic_work1,generic_work2]
311
- expect( subject.child_collections ).to eq [collection2,collection1]
312
- end
313
-
314
- it 'should remove middle generic work' do
315
- expect( subject.child_generic_works.delete generic_work2 ).to eq [generic_work2]
316
- expect( subject.child_generic_works). to eq [generic_work1,generic_work3]
317
- expect( subject.child_collections ).to eq [collection2,collection1]
318
- end
319
- end
320
- end
292
+ subject.generic_works << generic_work1
293
+ subject.generic_works << generic_work2
294
+ subject.collections << collection2
295
+ subject.generic_works << generic_work3
296
+ subject.collections << collection1
297
+ expect(subject.generic_works). to eq [generic_work1, generic_work2, generic_work3]
298
+ end
299
+
300
+ it 'removes first generic work' do
301
+ expect(subject.generic_works.delete generic_work1).to eq [generic_work1]
302
+ expect(subject.generic_works). to eq [generic_work2, generic_work3]
303
+ expect(subject.collections).to eq [collection2, collection1]
304
+ end
305
+
306
+ it 'removes last generic work' do
307
+ expect(subject.generic_works.delete generic_work3).to eq [generic_work3]
308
+ expect(subject.generic_works). to eq [generic_work1, generic_work2]
309
+ expect(subject.collections).to eq [collection2, collection1]
310
+ end
311
+
312
+ it 'removes middle generic work' do
313
+ expect(subject.generic_works.delete generic_work2).to eq [generic_work2]
314
+ expect(subject.generic_works). to eq [generic_work1, generic_work3]
315
+ expect(subject.collections).to eq [collection2, collection1]
316
+ end
317
+ end
318
+ end
321
319
 
322
320
  describe '#related_objects' do
323
321
  let(:generic_file1) { Hydra::Works::GenericFile::Base.new }
@@ -326,69 +324,68 @@ describe Hydra::Works::Collection do
326
324
 
327
325
  context 'with collections and generic works' do
328
326
  before do
329
- subject.child_collections << collection1
330
- subject.child_collections << collection2
331
- subject.child_generic_works << generic_work1
327
+ subject.collections << collection1
328
+ subject.collections << collection2
329
+ subject.generic_works << generic_work1
332
330
  end
333
-
334
- it 'should return empty array when only collections and generic works are aggregated' do
335
- expect(subject.related_objects ).to eq []
331
+
332
+ it 'returns empty array when only collections and generic works are aggregated' do
333
+ expect(subject.related_objects).to eq []
336
334
  end
337
-
338
- it 'should only return related objects' do
335
+
336
+ it 'returns only related objects' do
339
337
  subject.related_objects << object2
340
- expect(subject.related_objects ).to eq [object2]
338
+ expect(subject.related_objects).to eq [object2]
341
339
  end
342
-
343
- it 'should return related objects of various types' do
340
+
341
+ it 'returns related objects of various types' do
344
342
  subject.related_objects << generic_work2
345
343
  subject.related_objects << generic_file1
346
344
  subject.related_objects << object1
347
345
  subject.save
348
346
  subject.reload
349
- expect( subject.related_objects.include? object1 ).to be true
350
- expect( subject.related_objects.include? generic_work2 ).to be true
351
- expect( subject.related_objects.include? generic_file1 ).to be true
352
- expect( subject.related_objects.size ).to eq 3
347
+ expect(subject.related_objects.include? object1).to be true
348
+ expect(subject.related_objects.include? generic_work2).to be true
349
+ expect(subject.related_objects.include? generic_file1).to be true
350
+ expect(subject.related_objects.size).to eq 3
353
351
  end
354
352
  end
355
353
  end
356
354
 
357
355
  describe '#related_objects <<' do
358
-
359
356
  context 'with acceptable related objects' do
360
357
  let(:object1) { Hydra::PCDM::Object.new }
361
358
  let(:object2) { Hydra::PCDM::Object.new }
362
359
  let(:generic_file1) { Hydra::Works::GenericFile::Base.new }
363
360
 
364
- it 'should add various types of related objects to collection' do
361
+ it 'adds various types of related objects to collection' do
365
362
  subject.related_objects << generic_work1
366
363
  subject.related_objects << generic_file1
367
364
  subject.related_objects << object1
368
365
  subject.save
369
366
  subject.reload
370
- expect( subject.related_objects.include? generic_work1 ).to be true
371
- expect( subject.related_objects.include? generic_file1 ).to be true
372
- expect( subject.related_objects.include? object1 ).to be true
373
- expect( subject.related_objects.size ).to eq 3
367
+ expect(subject.related_objects.include? generic_work1).to be true
368
+ expect(subject.related_objects.include? generic_file1).to be true
369
+ expect(subject.related_objects.include? object1).to be true
370
+ expect(subject.related_objects.size).to eq 3
374
371
  end
375
372
 
376
373
  context 'with collections and generic_works' do
377
374
  before do
378
- subject.child_collections << collection1
379
- subject.child_collections << collection2
380
- subject.child_generic_works << generic_work1
381
- subject.child_generic_works << generic_work2
375
+ subject.collections << collection1
376
+ subject.collections << collection2
377
+ subject.generic_works << generic_work1
378
+ subject.generic_works << generic_work2
382
379
  subject.related_objects << object1
383
380
  end
384
381
 
385
- it 'should add a related object to collection with collections and generic_works' do
382
+ it 'adds a related object to collection with collections and generic_works' do
386
383
  subject.related_objects << object2
387
384
  subject.save
388
385
  subject.reload
389
- expect( subject.related_objects.include? object1 ).to be true
390
- expect( subject.related_objects.include? object2 ).to be true
391
- expect( subject.related_objects.size ).to eq 2
386
+ expect(subject.related_objects.include? object1).to be true
387
+ expect(subject.related_objects.include? object2).to be true
388
+ expect(subject.related_objects.size).to eq 2
392
389
  end
393
390
  end
394
391
  end
@@ -399,24 +396,24 @@ describe Hydra::Works::Collection do
399
396
  let(:non_PCDM_object) { "I'm not a PCDM object" }
400
397
  let(:af_base_object) { ActiveFedora::Base.new }
401
398
 
402
- it 'should NOT aggregate Hydra::Works::Collection in related objects aggregation' do
403
- expect{ subject.related_objects << collection1 }.to raise_error(ActiveFedora::AssociationTypeMismatch, /Hydra::Works::Collection:.*> is not a PCDM object./)
399
+ it 'does not aggregate Hydra::Works::Collection in related objects aggregation' do
400
+ expect { subject.related_objects << collection1 }.to raise_error(ActiveFedora::AssociationTypeMismatch, /Hydra::Works::Collection:.*> is not a PCDM object./)
404
401
  end
405
402
 
406
- it 'should NOT aggregate Hydra::PCDM::Collections in related objects aggregation' do
407
- expect{ subject.related_objects << pcdm_collection1 }.to raise_error(ActiveFedora::AssociationTypeMismatch, /Hydra::PCDM::Collection:.* is not a PCDM object./)
403
+ it 'does not aggregate Hydra::PCDM::Collections in related objects aggregation' do
404
+ expect { subject.related_objects << pcdm_collection1 }.to raise_error(ActiveFedora::AssociationTypeMismatch, /Hydra::PCDM::Collection:.* is not a PCDM object./)
408
405
  end
409
406
 
410
- it 'should NOT aggregate Hydra::PCDM::Files in related objects aggregation' do
411
- expect{ subject.related_objects << pcdm_file1 }.to raise_error(ActiveFedora::AssociationTypeMismatch, /ActiveFedora::Base.* expected, got Hydra::PCDM::File.*/)
407
+ it 'does not aggregate Hydra::PCDM::Files in related objects aggregation' do
408
+ expect { subject.related_objects << pcdm_file1 }.to raise_error(ActiveFedora::AssociationTypeMismatch, /ActiveFedora::Base.* expected, got Hydra::PCDM::File.*/)
412
409
  end
413
410
 
414
- it 'should NOT aggregate non-PCDM objects in related objects aggregation' do
415
- expect{ subject.related_objects << non_PCDM_object }.to raise_error(ActiveFedora::AssociationTypeMismatch, /ActiveFedora::Base.* expected, got String.*/)
411
+ it 'does not aggregate non-PCDM objects in related objects aggregation' do
412
+ expect { subject.related_objects << non_PCDM_object }.to raise_error(ActiveFedora::AssociationTypeMismatch, /ActiveFedora::Base.* expected, got String.*/)
416
413
  end
417
414
 
418
- it 'should NOT aggregate AF::Base objects in related objects aggregation' do
419
- expect{ subject.related_objects << af_base_object }.to raise_error(ActiveFedora::AssociationTypeMismatch, /ActiveFedora::Base.* is not a PCDM object./)
415
+ it 'does not aggregate AF::Base objects in related objects aggregation' do
416
+ expect { subject.related_objects << af_base_object }.to raise_error(ActiveFedora::AssociationTypeMismatch, /ActiveFedora::Base.* is not a PCDM object./)
420
417
  end
421
418
  end
422
419
 
@@ -424,16 +421,16 @@ describe Hydra::Works::Collection do
424
421
  let(:object1) { Hydra::PCDM::Object.new }
425
422
  let(:object2) { Hydra::PCDM::Object.new }
426
423
 
427
- it 'should NOT allow related objects to repeat' do
424
+ it 'does not allow related objects to repeat' do
428
425
  skip 'skipping this test because issue pcdm#92 needs to be addressed' do
429
- subject.related_objects << object1
430
- subject.related_objects << object2
431
- subject.related_objects << object1
432
- related_objects = subject.related_objects
433
- expect( related_objects.include? object1 ).to be true
434
- expect( related_objects.include? object2 ).to be true
435
- expect( related_objects.size ).to eq 2
436
- end
426
+ subject.related_objects << object1
427
+ subject.related_objects << object2
428
+ subject.related_objects << object1
429
+ related_objects = subject.related_objects
430
+ expect(related_objects.include? object1).to be true
431
+ expect(related_objects.include? object2).to be true
432
+ expect(related_objects.size).to eq 2
433
+ end
437
434
  end
438
435
  end
439
436
  end
@@ -449,55 +446,55 @@ describe Hydra::Works::Collection do
449
446
  before do
450
447
  subject.related_objects << related_object1
451
448
  subject.related_objects << related_work2
452
- subject.child_collections << collection2
453
- subject.child_generic_works << generic_work1
449
+ subject.collections << collection2
450
+ subject.generic_works << generic_work1
454
451
  subject.related_objects << related_file3
455
452
  subject.related_objects << related_object4
456
- subject.child_collections << collection1
453
+ subject.collections << collection1
457
454
  subject.related_objects << related_work5
458
- expect( subject.related_objects ).to eq [related_object1,related_work2,related_file3,related_object4,related_work5]
455
+ expect(subject.related_objects).to eq [related_object1, related_work2, related_file3, related_object4, related_work5]
459
456
  end
460
-
461
- it 'should remove first related object' do
462
- expect( subject.related_objects.delete related_object1 ).to eq [related_object1]
463
- expect( subject.related_objects ).to eq [related_work2,related_file3,related_object4,related_work5]
464
- expect( subject.child_collections ).to eq [collection2,collection1]
465
- expect( subject.child_generic_works). to eq [generic_work1]
457
+
458
+ it 'removes first related object' do
459
+ expect(subject.related_objects.delete related_object1).to eq [related_object1]
460
+ expect(subject.related_objects).to eq [related_work2, related_file3, related_object4, related_work5]
461
+ expect(subject.collections).to eq [collection2, collection1]
462
+ expect(subject.generic_works). to eq [generic_work1]
466
463
  end
467
464
 
468
- it 'should remove last related object' do
469
- expect( subject.related_objects.delete related_work5 ).to eq [related_work5]
470
- expect( subject.related_objects ).to eq [related_object1,related_work2,related_file3,related_object4]
471
- expect( subject.child_collections ).to eq [collection2,collection1]
472
- expect( subject.child_generic_works). to eq [generic_work1]
465
+ it 'removes last related object' do
466
+ expect(subject.related_objects.delete related_work5).to eq [related_work5]
467
+ expect(subject.related_objects).to eq [related_object1, related_work2, related_file3, related_object4]
468
+ expect(subject.collections).to eq [collection2, collection1]
469
+ expect(subject.generic_works). to eq [generic_work1]
473
470
  end
474
-
475
- it 'should remove middle related object' do
476
- expect( subject.related_objects.delete related_file3 ).to eq [related_file3]
477
- expect( subject.related_objects ).to eq [related_object1,related_work2,related_object4,related_work5]
478
- expect( subject.child_collections ).to eq [collection2,collection1]
479
- expect( subject.child_generic_works). to eq [generic_work1]
471
+
472
+ it 'removes middle related object' do
473
+ expect(subject.related_objects.delete related_file3).to eq [related_file3]
474
+ expect(subject.related_objects).to eq [related_object1, related_work2, related_object4, related_work5]
475
+ expect(subject.collections).to eq [collection2, collection1]
476
+ expect(subject.generic_works). to eq [generic_work1]
480
477
  end
481
- end
482
- end
478
+ end
479
+ end
483
480
 
484
481
  describe '#collections=' do
485
- it 'should aggregate collections' do
486
- collection1.child_collections = [collection2, collection3]
487
- expect(collection1.child_collections).to eq [collection2, collection3]
482
+ it 'aggregates collections' do
483
+ collection1.collections = [collection2, collection3]
484
+ expect(collection1.collections).to eq [collection2, collection3]
488
485
  end
489
486
  end
490
487
 
491
- describe '#child_generic_works=' do
492
- it 'should aggregate generic_works' do
493
- collection1.child_generic_works = [generic_work1,generic_work2]
494
- expect(collection1.child_generic_works).to eq [generic_work1,generic_work2]
488
+ describe '#generic_works=' do
489
+ it 'aggregates generic_works' do
490
+ collection1.generic_works = [generic_work1, generic_work2]
491
+ expect(collection1.generic_works).to eq [generic_work1, generic_work2]
495
492
  end
496
493
  end
497
494
 
498
495
  describe 'Related objects' do
499
496
  let(:object) { Hydra::PCDM::Object.new }
500
- let(:collection) { Hydra::Works::Collection.new }
497
+ let(:collection) { described_class.new }
501
498
 
502
499
  before do
503
500
  collection.related_objects = [object]
@@ -508,17 +505,32 @@ describe Hydra::Works::Collection do
508
505
  end
509
506
  end
510
507
 
511
- describe "should have parent collection accessors" do
508
+ describe 'should have parent collection accessors' do
512
509
  before do
513
- collection1.child_collections << collection2
510
+ collection1.collections << collection2
514
511
  collection1.save
515
512
  end
516
513
 
517
- it 'should have parents' do
518
- expect(collection2.parents).to eq [collection1]
514
+ it 'has parents' do
515
+ expect(collection2.member_of).to eq [collection1]
516
+ end
517
+ it 'has a parent collection' do
518
+ expect(collection2.in_collections).to eq [collection1]
519
519
  end
520
- it 'should have a parent collection' do
520
+ end
521
+
522
+ describe 'make sure deprecated methods still work' do
523
+ it 'deprecated methods should pass' do
524
+ expect(collection1.child_collections = [collection2]).to eq [collection2]
525
+ expect(collection1.child_collections << collection3).to eq [collection2, collection3]
526
+ expect(collection1.child_collections += [collection4]).to eq [collection2, collection3, collection4]
527
+ expect(collection1.child_generic_works = [generic_work1]).to eq [generic_work1]
528
+ expect(collection1.child_generic_works << generic_work2).to eq [generic_work1, generic_work2]
529
+ expect(collection1.child_generic_works += [generic_work3]).to eq [generic_work1, generic_work2, generic_work3]
530
+ collection1.save # required until issue AF-Agg-75 is fixed
521
531
  expect(collection2.parent_collections).to eq [collection1]
532
+ expect(collection2.parents).to eq [collection1]
533
+ expect(collection2.parent_collection_ids).to eq [collection1.id]
522
534
  end
523
535
  end
524
536
  end