hydra-works 0.1.0 → 0.2.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 (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