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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +72 -0
- data/Gemfile +5 -4
- data/README.md +17 -11
- data/Rakefile +18 -8
- data/config/solrconfig.xml +223 -0
- data/hydra-works.gemspec +15 -15
- data/lib/hydra/works.rb +28 -17
- data/lib/hydra/works/errors/full_text_extraction_error.rb +5 -0
- data/lib/hydra/works/models/concerns/block_child_objects.rb +12 -6
- data/lib/hydra/works/models/concerns/collection_behavior.rb +44 -6
- data/lib/hydra/works/models/concerns/generic_file/contained_files.rb +3 -3
- data/lib/hydra/works/models/concerns/generic_file/derivatives.rb +2 -4
- data/lib/hydra/works/models/concerns/generic_file/mime_types.rb +1 -3
- data/lib/hydra/works/models/concerns/generic_file/versioned_content.rb +4 -6
- data/lib/hydra/works/models/concerns/generic_file/virus_check.rb +13 -14
- data/lib/hydra/works/models/concerns/generic_file_behavior.rb +13 -3
- data/lib/hydra/works/models/concerns/generic_work_behavior.rb +34 -9
- data/lib/hydra/works/models/generic_file.rb +0 -3
- data/lib/hydra/works/services/generic_file/add_file_to_generic_file.rb +14 -16
- data/lib/hydra/works/services/generic_file/full_text_extraction_service.rb +57 -0
- data/lib/hydra/works/services/generic_file/generate_thumbnail.rb +13 -0
- data/lib/hydra/works/services/generic_file/persist_derivative.rb +3 -5
- data/lib/hydra/works/services/generic_file/{upload_file.rb → upload_file_to_generic_file.rb} +1 -3
- data/lib/hydra/works/version.rb +1 -1
- data/lib/hydra/works/vocab/works_terms.rb +9 -9
- data/lib/tasks/hydra-works_tasks.rake +80 -0
- data/lib/tasks/jetty.rake +15 -0
- data/spec/hydra/works/models/collection_spec.rb +258 -246
- data/spec/hydra/works/models/concerns/block_child_objects_spec.rb +6 -8
- data/spec/hydra/works/models/concerns/generic_file/contained_files_spec.rb +40 -48
- data/spec/hydra/works/models/concerns/generic_file/mime_types_spec.rb +16 -18
- data/spec/hydra/works/models/concerns/generic_file/versioned_content_spec.rb +11 -11
- data/spec/hydra/works/models/concerns/generic_file/virus_check_spec.rb +11 -8
- data/spec/hydra/works/models/concerns/generic_file_behavior_spec.rb +1 -1
- data/spec/hydra/works/models/generic_file_spec.rb +87 -85
- data/spec/hydra/works/models/generic_work_spec.rb +167 -169
- data/spec/hydra/works/services/full_text_extraction_service_spec.rb +89 -0
- data/spec/hydra/works/services/generic_file/add_file_to_generic_file_spec.rb +36 -38
- data/spec/hydra/works/services/generic_file/generate/thumbnail_spec.rb +10 -12
- data/spec/hydra/works/services/generic_file/upload_file_spec.rb +39 -42
- data/spec/hydra/works/services/persist_derivatives_spec.rb +2 -3
- data/spec/hydra/works_spec.rb +57 -61
- data/spec/spec_helper.rb +2 -4
- metadata +23 -15
- data/lib/hydra/works/services/generic_file/generate/thumbnail.rb +0 -18
@@ -1,19 +1,17 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Hydra::Works::BlockChildObjects do
|
4
|
-
|
5
4
|
subject { Hydra::Works::GenericFile::Base.new }
|
6
5
|
|
7
|
-
describe
|
8
|
-
it
|
9
|
-
expect { subject.
|
6
|
+
describe '#objects=?' do
|
7
|
+
it 'raises an error' do
|
8
|
+
expect { subject.objects = [] }.to raise_error(StandardError, /method `objects=' not allowed for #<Hydra::Works::GenericFile::Base.*/)
|
10
9
|
end
|
11
10
|
end
|
12
11
|
|
13
|
-
describe
|
14
|
-
it
|
15
|
-
expect { subject.
|
12
|
+
describe '#objects' do
|
13
|
+
it 'raises an error' do
|
14
|
+
expect { subject.objects }.to raise_error(StandardError, /method `objects' not allowed for #<Hydra::Works::GenericFile::Base.*/)
|
16
15
|
end
|
17
16
|
end
|
18
|
-
|
19
17
|
end
|
@@ -1,116 +1,108 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Hydra::Works::GenericFile::ContainedFiles do
|
4
|
-
|
5
4
|
let(:generic_file) do
|
6
5
|
Hydra::Works::GenericFile::Base.create
|
7
6
|
end
|
8
7
|
|
9
|
-
let(:thumbnail)
|
8
|
+
let(:thumbnail) do
|
10
9
|
file = generic_file.files.build
|
11
10
|
Hydra::PCDM::AddTypeToFile.call(file, pcdm_thumbnail_uri)
|
12
11
|
end
|
13
12
|
|
14
13
|
let(:file) { generic_file.files.build }
|
15
|
-
let(:pcdm_thumbnail_uri) { ::RDF::URI(
|
14
|
+
let(:pcdm_thumbnail_uri) { ::RDF::URI('http://pcdm.org/use#ThumbnailImage') }
|
16
15
|
|
17
16
|
before do
|
18
17
|
generic_file.files = [file]
|
19
18
|
end
|
20
19
|
|
21
|
-
describe
|
22
|
-
|
23
|
-
context "when a thumbnail is present" do
|
20
|
+
describe '#thumbnail' do
|
21
|
+
context 'when a thumbnail is present' do
|
24
22
|
before do
|
25
23
|
original_file = generic_file.build_thumbnail
|
26
|
-
original_file.content =
|
24
|
+
original_file.content = 'thumbnail'
|
27
25
|
end
|
28
26
|
subject { generic_file.thumbnail }
|
29
|
-
it
|
27
|
+
it 'can be saved without errors' do
|
30
28
|
expect(subject.save).to be_truthy
|
31
29
|
end
|
32
|
-
it
|
33
|
-
expect(subject.content).to eql
|
30
|
+
it 'retrieves content of the thumbnail' do
|
31
|
+
expect(subject.content).to eql 'thumbnail'
|
34
32
|
end
|
35
|
-
it
|
36
|
-
expect(subject.metadata_node.type).to include(
|
37
|
-
expect(subject.metadata_node.type).to include(
|
33
|
+
it 'retains origin pcdm.File RDF type' do
|
34
|
+
expect(subject.metadata_node.type).to include(::RDF::URI('http://pcdm.org/use#ThumbnailImage'))
|
35
|
+
expect(subject.metadata_node.type).to include(Hydra::PCDM::Vocab::PCDMTerms.File)
|
38
36
|
end
|
39
37
|
end
|
40
38
|
|
41
|
-
context
|
39
|
+
context 'when building new thumbnail' do
|
42
40
|
subject { generic_file.build_thumbnail }
|
43
|
-
it
|
41
|
+
it 'initializes an unsaved File object with Thumbnail type' do
|
44
42
|
expect(subject).to be_new_record
|
45
43
|
expect(subject.metadata_node.type).to include(pcdm_thumbnail_uri)
|
46
|
-
expect(subject.metadata_node.type).to include(
|
44
|
+
expect(subject.metadata_node.type).to include(Hydra::PCDM::Vocab::PCDMTerms.File)
|
47
45
|
end
|
48
46
|
end
|
49
|
-
|
50
47
|
end
|
51
48
|
|
52
|
-
describe
|
53
|
-
|
54
|
-
context "when an original file is present" do
|
49
|
+
describe '#original_file' do
|
50
|
+
context 'when an original file is present' do
|
55
51
|
before do
|
56
52
|
original_file = generic_file.build_original_file
|
57
|
-
original_file.content =
|
53
|
+
original_file.content = 'original_file'
|
58
54
|
end
|
59
55
|
subject { generic_file.original_file }
|
60
56
|
|
61
|
-
it
|
57
|
+
it 'can be saved without errors' do
|
62
58
|
expect(subject.save).to be_truthy
|
63
59
|
end
|
64
|
-
it
|
65
|
-
expect(subject.content).to eql
|
60
|
+
it 'retrieves content of the original_file as a PCDM File' do
|
61
|
+
expect(subject.content).to eql 'original_file'
|
66
62
|
expect(subject).to be_instance_of Hydra::PCDM::File
|
67
63
|
end
|
68
|
-
it
|
69
|
-
expect(subject.metadata_node.type).to include(::RDF::URI(
|
70
|
-
expect(generic_file.original_file.metadata_node.type).to include(
|
64
|
+
it 'retains origin pcdm.File RDF type' do
|
65
|
+
expect(subject.metadata_node.type).to include(::RDF::URI('http://pcdm.org/use#OriginalFile'))
|
66
|
+
expect(generic_file.original_file.metadata_node.type).to include(Hydra::PCDM::Vocab::PCDMTerms.File)
|
71
67
|
end
|
72
68
|
end
|
73
69
|
|
74
|
-
context
|
70
|
+
context 'when building original file' do
|
75
71
|
subject { generic_file.build_original_file }
|
76
|
-
it
|
72
|
+
it 'initializes an unsaved File object with OrignalFile type' do
|
77
73
|
expect(subject).to be_new_record
|
78
|
-
expect(subject.metadata_node.type).to include(::RDF::URI(
|
79
|
-
expect(subject.metadata_node.type).to include(
|
74
|
+
expect(subject.metadata_node.type).to include(::RDF::URI('http://pcdm.org/use#OriginalFile'))
|
75
|
+
expect(subject.metadata_node.type).to include(Hydra::PCDM::Vocab::PCDMTerms.File)
|
80
76
|
end
|
81
77
|
end
|
82
|
-
|
83
78
|
end
|
84
79
|
|
85
|
-
describe
|
86
|
-
|
87
|
-
context "when extracted text is present" do
|
80
|
+
describe '#extracted_text' do
|
81
|
+
context 'when extracted text is present' do
|
88
82
|
before do
|
89
83
|
extracted_text = generic_file.build_extracted_text
|
90
|
-
extracted_text.content =
|
84
|
+
extracted_text.content = 'extracted_text'
|
91
85
|
end
|
92
86
|
subject { generic_file.extracted_text }
|
93
|
-
it
|
87
|
+
it 'can be saved without errors' do
|
94
88
|
expect(subject.save).to be_truthy
|
95
89
|
end
|
96
|
-
it
|
97
|
-
expect(subject.content).to eql
|
90
|
+
it 'retrieves content of the extracted_text' do
|
91
|
+
expect(subject.content).to eql 'extracted_text'
|
98
92
|
end
|
99
|
-
it
|
100
|
-
expect(subject.metadata_node.type).to include(::RDF::URI(
|
101
|
-
expect(subject.metadata_node.type).to include(
|
93
|
+
it 'retains origin pcdm.File RDF type' do
|
94
|
+
expect(subject.metadata_node.type).to include(::RDF::URI('http://pcdm.org/use#ExtractedText'))
|
95
|
+
expect(subject.metadata_node.type).to include(Hydra::PCDM::Vocab::PCDMTerms.File)
|
102
96
|
end
|
103
97
|
end
|
104
98
|
|
105
|
-
context
|
99
|
+
context 'when building new extracted text object' do
|
106
100
|
subject { generic_file.build_extracted_text }
|
107
|
-
it
|
101
|
+
it 'initializes an unsaved File object with ExtractedText type' do
|
108
102
|
expect(subject).to be_new_record
|
109
|
-
expect(subject.metadata_node.type).to include(::RDF::URI(
|
110
|
-
expect(subject.metadata_node.type).to include(
|
103
|
+
expect(subject.metadata_node.type).to include(::RDF::URI('http://pcdm.org/use#ExtractedText'))
|
104
|
+
expect(subject.metadata_node.type).to include(Hydra::PCDM::Vocab::PCDMTerms.File)
|
111
105
|
end
|
112
106
|
end
|
113
|
-
|
114
107
|
end
|
115
|
-
|
116
108
|
end
|
@@ -1,76 +1,74 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Hydra::Works::GenericFile::MimeTypes do
|
4
|
-
|
5
4
|
subject { Hydra::Works::GenericFile::Base.new }
|
6
5
|
|
7
|
-
describe
|
6
|
+
describe '#pdf?' do
|
8
7
|
before do
|
9
8
|
allow(subject).to receive(:mime_type).and_return('application/pdf')
|
10
9
|
end
|
11
|
-
it
|
10
|
+
it 'is true' do
|
12
11
|
expect(subject.pdf?).to be true
|
13
12
|
end
|
14
13
|
end
|
15
14
|
|
16
|
-
describe
|
15
|
+
describe '#image?' do
|
17
16
|
before do
|
18
17
|
allow(subject).to receive(:mime_type).and_return('image/jpeg')
|
19
18
|
end
|
20
|
-
it
|
19
|
+
it 'is true' do
|
21
20
|
expect(subject.image?).to be true
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
25
|
-
describe
|
24
|
+
describe '#video?' do
|
26
25
|
before do
|
27
26
|
allow(subject).to receive(:mime_type).and_return('video/mp4')
|
28
27
|
end
|
29
|
-
it
|
28
|
+
it 'is true' do
|
30
29
|
expect(subject.video?).to be true
|
31
30
|
end
|
32
31
|
end
|
33
32
|
|
34
|
-
describe
|
33
|
+
describe '#audio?' do
|
35
34
|
before do
|
36
35
|
allow(subject).to receive(:mime_type).and_return('audio/mp3')
|
37
36
|
end
|
38
|
-
it
|
37
|
+
it 'is true' do
|
39
38
|
expect(subject.audio?).to be true
|
40
39
|
end
|
41
40
|
end
|
42
41
|
|
43
|
-
describe
|
42
|
+
describe '#office_document?' do
|
44
43
|
before do
|
45
44
|
allow(subject).to receive(:mime_type).and_return('application/msword')
|
46
45
|
end
|
47
|
-
it
|
46
|
+
it 'is true' do
|
48
47
|
expect(subject.office_document?).to be true
|
49
48
|
end
|
50
49
|
end
|
51
50
|
|
52
|
-
describe
|
53
|
-
it
|
51
|
+
describe '#collection?' do
|
52
|
+
it 'is false' do
|
54
53
|
expect(subject.collection?).to be false
|
55
54
|
end
|
56
55
|
end
|
57
56
|
|
58
|
-
describe
|
59
|
-
it
|
57
|
+
describe '#file_format?' do
|
58
|
+
it 'handles both mime and format_label' do
|
60
59
|
allow(subject).to receive(:mime_type).and_return('image/png')
|
61
60
|
allow(subject).to receive(:format_label).and_return(['Portable Network Graphics'])
|
62
61
|
expect(subject.file_format).to eq 'png (Portable Network Graphics)'
|
63
62
|
end
|
64
|
-
it
|
63
|
+
it 'handles just mime type' do
|
65
64
|
allow(subject).to receive(:mime_type).and_return('image/png')
|
66
65
|
allow(subject).to receive(:format_label).and_return([])
|
67
66
|
expect(subject.file_format).to eq 'png'
|
68
67
|
end
|
69
|
-
it
|
68
|
+
it 'handles just format_label' do
|
70
69
|
allow(subject).to receive(:mime_type).and_return('')
|
71
70
|
allow(subject).to receive(:format_label).and_return(['Portable Network Graphics'])
|
72
71
|
expect(subject.file_format).to eq ['Portable Network Graphics']
|
73
72
|
end
|
74
73
|
end
|
75
|
-
|
76
74
|
end
|
@@ -1,31 +1,31 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Hydra::Works::GenericFile::VersionedContent do
|
4
|
-
let(:generic_file)
|
4
|
+
let(:generic_file) { Hydra::Works::GenericFile::Base.new }
|
5
5
|
before do
|
6
|
-
Hydra::Works::UploadFileToGenericFile.call(generic_file, File.open(File.join(fixture_path,
|
7
|
-
Hydra::Works::UploadFileToGenericFile.call(generic_file, File.open(File.join(fixture_path,
|
6
|
+
Hydra::Works::UploadFileToGenericFile.call(generic_file, File.open(File.join(fixture_path, 'sample-file.pdf')))
|
7
|
+
Hydra::Works::UploadFileToGenericFile.call(generic_file, File.open(File.join(fixture_path, 'updated-file.txt')))
|
8
8
|
end
|
9
9
|
|
10
|
-
describe
|
11
|
-
subject {generic_file.content_versions}
|
12
|
-
it
|
10
|
+
describe 'content_versions' do
|
11
|
+
subject { generic_file.content_versions }
|
12
|
+
it 'lists all of the versions of original_file' do
|
13
13
|
expect(subject.count).to eq(2)
|
14
|
-
expect(subject.map
|
14
|
+
expect(subject.map(&:uri)).to eq(generic_file.original_file.versions.all.map(&:uri))
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
describe
|
18
|
+
describe 'latest_content_version' do
|
19
19
|
subject { generic_file.latest_content_version }
|
20
|
-
it
|
20
|
+
it 'returns the most recent version entry for original_file' do
|
21
21
|
# Can't use a simple equivalence because they are actually different ResourceVersion objects
|
22
22
|
expect(subject.uri).to eq(generic_file.original_file.versions.last.uri)
|
23
23
|
expect(subject.label).to eq(generic_file.original_file.versions.last.label)
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
describe
|
28
|
-
it
|
27
|
+
describe 'current_content_version_uri' do
|
28
|
+
it 'returns the URI of the most recent version of original_file' do
|
29
29
|
expect(generic_file.current_content_version_uri).to eq(generic_file.original_file.versions.last.uri)
|
30
30
|
end
|
31
31
|
end
|
@@ -7,8 +7,13 @@ describe Hydra::Works::GenericFile::VirusCheck do
|
|
7
7
|
include Hydra::Works::GenericFile::VirusCheck
|
8
8
|
end
|
9
9
|
class ClamAV
|
10
|
-
def self.instance
|
11
|
-
|
10
|
+
def self.instance
|
11
|
+
@instance ||= ClamAV.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def scanfile(path)
|
15
|
+
puts "scanfile: #{path}"
|
16
|
+
end
|
12
17
|
end
|
13
18
|
end
|
14
19
|
after do
|
@@ -25,26 +30,24 @@ describe Hydra::Works::GenericFile::VirusCheck do
|
|
25
30
|
end
|
26
31
|
|
27
32
|
context 'with an infected file' do
|
28
|
-
|
29
33
|
before do
|
30
34
|
expect(ClamAV.instance).to receive(:scanfile).and_return(1)
|
31
35
|
end
|
32
|
-
it
|
36
|
+
it 'fails to save' do
|
33
37
|
expect(subject.save).to eq false
|
34
38
|
end
|
35
|
-
it
|
39
|
+
it 'fails to validate' do
|
36
40
|
expect(subject.validate).to eq false
|
37
41
|
end
|
38
42
|
end
|
39
43
|
|
40
|
-
context
|
44
|
+
context 'with a clean file' do
|
41
45
|
before do
|
42
46
|
expect(ClamAV.instance).to receive(:scanfile).and_return(0)
|
43
47
|
end
|
44
48
|
|
45
|
-
it
|
49
|
+
it 'does not detect viruses' do
|
46
50
|
expect(subject.detect_viruses).to eq true
|
47
51
|
end
|
48
52
|
end
|
49
|
-
|
50
53
|
end
|
@@ -6,7 +6,7 @@ describe Hydra::Works::GenericFileBehavior do
|
|
6
6
|
end
|
7
7
|
subject { IncludesGenericFileBehavior.new }
|
8
8
|
|
9
|
-
it
|
9
|
+
it 'ensures that objects will be recognized as generic_files' do
|
10
10
|
expect(subject).to be_works_generic_file
|
11
11
|
end
|
12
12
|
end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Hydra::Works::GenericFile::Base do
|
4
|
-
|
5
|
-
let(:generic_file1) { Hydra::Works::GenericFile::Base.new }
|
4
|
+
let(:generic_file1) { described_class.new }
|
6
5
|
|
7
6
|
describe 'Related objects' do
|
8
7
|
let(:object1) { Hydra::PCDM::Object.new }
|
@@ -23,7 +22,7 @@ describe Hydra::Works::GenericFile::Base do
|
|
23
22
|
|
24
23
|
before do
|
25
24
|
file1.content = "I'm a file"
|
26
|
-
file2.content =
|
25
|
+
file2.content = 'I am too'
|
27
26
|
object.save!
|
28
27
|
end
|
29
28
|
|
@@ -33,50 +32,48 @@ describe Hydra::Works::GenericFile::Base do
|
|
33
32
|
end
|
34
33
|
|
35
34
|
describe 'add related object' do
|
36
|
-
|
37
|
-
let(:subject) { Hydra::Works::GenericFile::Base.new }
|
35
|
+
let(:subject) { described_class.new }
|
38
36
|
|
39
37
|
describe 'begin test' do
|
40
|
-
|
41
38
|
context 'with acceptable related objects' do
|
42
39
|
let(:object1) { Hydra::PCDM::Object.create }
|
43
40
|
let(:object2) { Hydra::PCDM::Object.new }
|
44
41
|
let(:generic_work1) { Hydra::Works::GenericWork::Base.create }
|
45
42
|
let(:generic_work2) { Hydra::Works::GenericWork::Base.new }
|
46
|
-
let(:generic_file1) {
|
43
|
+
let(:generic_file1) { described_class.create }
|
47
44
|
|
48
|
-
it '
|
45
|
+
it 'adds various types of related objects to generic_file' do
|
49
46
|
subject.related_objects << generic_work1
|
50
47
|
subject.related_objects << generic_file1
|
51
48
|
subject.related_objects << object1
|
52
49
|
subject.save
|
53
50
|
subject.reload
|
54
51
|
related_objects = subject.related_objects
|
55
|
-
expect(
|
56
|
-
expect(
|
57
|
-
expect(
|
58
|
-
expect(
|
52
|
+
expect(related_objects.include? generic_work1).to be true
|
53
|
+
expect(related_objects.include? generic_file1).to be true
|
54
|
+
expect(related_objects.include? object1).to be true
|
55
|
+
expect(related_objects.size).to eq 3
|
59
56
|
end
|
60
57
|
|
61
58
|
context 'with files and generic_files' do
|
62
59
|
let(:file1) { subject.files.build }
|
63
60
|
let(:file2) { subject.files.build }
|
64
|
-
|
61
|
+
|
65
62
|
before do
|
66
63
|
subject.save
|
67
64
|
file1.content = "I'm a file"
|
68
|
-
file2.content =
|
65
|
+
file2.content = 'I am too'
|
69
66
|
subject.related_objects << object1
|
70
67
|
end
|
71
68
|
|
72
|
-
it '
|
73
|
-
subject.related_objects << object2
|
69
|
+
it 'adds a related object to a generic_file with files and generic_files' do
|
70
|
+
subject.related_objects << object2
|
74
71
|
subject.save
|
75
72
|
subject.reload
|
76
73
|
related_objects = subject.related_objects
|
77
|
-
expect(
|
78
|
-
expect(
|
79
|
-
expect(
|
74
|
+
expect(related_objects.include? object1).to be true
|
75
|
+
expect(related_objects.include? object2).to be true
|
76
|
+
expect(related_objects.size).to eq 2
|
80
77
|
end
|
81
78
|
end
|
82
79
|
end
|
@@ -87,146 +84,151 @@ describe Hydra::Works::GenericFile::Base do
|
|
87
84
|
let(:pcdm_file1) { Hydra::PCDM::File.new }
|
88
85
|
let(:non_PCDM_object) { "I'm not a PCDM object" }
|
89
86
|
let(:af_base_object) { ActiveFedora::Base.new }
|
90
|
-
|
87
|
+
|
91
88
|
let(:error_message) { 'child_related_object must be a pcdm object' }
|
92
|
-
|
93
|
-
it '
|
94
|
-
expect{ subject.related_objects << collection1 }.to raise_error(ActiveFedora::AssociationTypeMismatch, /Hydra::Works::Collection:.*> is not a PCDM object./)
|
89
|
+
|
90
|
+
it 'does not aggregate Hydra::Works::Collection in related objects aggregation' do
|
91
|
+
expect { subject.related_objects << collection1 }.to raise_error(ActiveFedora::AssociationTypeMismatch, /Hydra::Works::Collection:.*> is not a PCDM object./)
|
95
92
|
end
|
96
93
|
|
97
|
-
it '
|
98
|
-
expect{ subject.related_objects << pcdm_collection1 }.to raise_error(ActiveFedora::AssociationTypeMismatch, /Hydra::PCDM::Collection:.*> is not a PCDM object./)
|
94
|
+
it 'does not aggregate Hydra::PCDM::Collections in related objects aggregation' do
|
95
|
+
expect { subject.related_objects << pcdm_collection1 }.to raise_error(ActiveFedora::AssociationTypeMismatch, /Hydra::PCDM::Collection:.*> is not a PCDM object./)
|
99
96
|
end
|
100
97
|
|
101
|
-
it '
|
102
|
-
expect{ subject.related_objects << pcdm_file1 }.to raise_error(ActiveFedora::AssociationTypeMismatch, /ActiveFedora::Base.* expected, got Hydra::PCDM::File.*/)
|
98
|
+
it 'does not aggregate Hydra::PCDM::Files in related objects aggregation' do
|
99
|
+
expect { subject.related_objects << pcdm_file1 }.to raise_error(ActiveFedora::AssociationTypeMismatch, /ActiveFedora::Base.* expected, got Hydra::PCDM::File.*/)
|
103
100
|
end
|
104
101
|
|
105
|
-
it '
|
106
|
-
expect{ subject.related_objects << non_PCDM_object }.to raise_error(ActiveFedora::AssociationTypeMismatch, /ActiveFedora::Base.* expected, got String.*/)
|
107
|
-
|
108
|
-
|
109
|
-
it '
|
110
|
-
expect{ subject.related_objects << af_base_object }.to raise_error(ActiveFedora::AssociationTypeMismatch, /ActiveFedora::Base.* is not a PCDM object./)
|
111
|
-
|
102
|
+
it 'does not aggregate non-PCDM objects in related objects aggregation' do
|
103
|
+
expect { subject.related_objects << non_PCDM_object }.to raise_error(ActiveFedora::AssociationTypeMismatch, /ActiveFedora::Base.* expected, got String.*/)
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'does not aggregate AF::Base objects in related objects aggregation' do
|
107
|
+
expect { subject.related_objects << af_base_object }.to raise_error(ActiveFedora::AssociationTypeMismatch, /ActiveFedora::Base.* is not a PCDM object./)
|
112
108
|
end
|
113
109
|
end
|
114
|
-
|
110
|
+
|
115
111
|
context 'with invalid behaviors' do
|
116
112
|
let(:object1) { Hydra::PCDM::Object.new }
|
117
113
|
let(:object2) { Hydra::PCDM::Object.new }
|
118
114
|
|
119
|
-
it '
|
115
|
+
it 'does not allow related objects to repeat' do
|
120
116
|
skip 'skipping this test because issue pcdm#92 needs to be addressed' do
|
121
|
-
subject.related_objects << object1
|
117
|
+
subject.related_objects << object1
|
122
118
|
subject.related_objects << object2
|
123
119
|
subject.related_objects << object1
|
124
120
|
subject.save
|
125
121
|
subject.reload
|
126
122
|
related_objects = subject.related_objects
|
127
|
-
expect(
|
128
|
-
expect(
|
129
|
-
expect(
|
123
|
+
expect(related_objects.include? object1).to be true
|
124
|
+
expect(related_objects.include? object2).to be true
|
125
|
+
expect(related_objects.size).to eq 2
|
130
126
|
end
|
131
127
|
end
|
132
128
|
end
|
133
129
|
end
|
134
130
|
end
|
135
|
-
|
136
|
-
describe 'get related objects from generic file' do
|
137
131
|
|
138
|
-
|
132
|
+
describe 'get related objects from generic file' do
|
133
|
+
subject { described_class.new }
|
139
134
|
|
140
135
|
let(:object1) { Hydra::PCDM::Object.new }
|
141
136
|
let(:object2) { Hydra::PCDM::Object.new }
|
142
137
|
|
143
138
|
let(:generic_work1) { Hydra::Works::GenericWork::Base.new }
|
144
|
-
let(:generic_file1) {
|
139
|
+
let(:generic_file1) { described_class.new }
|
145
140
|
|
146
141
|
context 'with generic files' do
|
147
|
-
it '
|
148
|
-
expect(
|
142
|
+
it 'returns empty array when only generic files are aggregated' do
|
143
|
+
expect(subject.related_objects).to eq []
|
149
144
|
end
|
150
145
|
|
151
|
-
it '
|
152
|
-
subject.related_objects << object2
|
153
|
-
expect(
|
146
|
+
it 'returns related objects' do
|
147
|
+
subject.related_objects << object2
|
148
|
+
expect(subject.related_objects).to eq [object2]
|
154
149
|
end
|
155
150
|
|
156
|
-
it '
|
157
|
-
subject.related_objects << generic_work1
|
158
|
-
subject.related_objects << generic_file1
|
151
|
+
it 'returns related objects of various types' do
|
152
|
+
subject.related_objects << generic_work1
|
153
|
+
subject.related_objects << generic_file1
|
159
154
|
subject.related_objects << object1
|
160
155
|
subject.save
|
161
156
|
subject.reload
|
162
157
|
related_objects = subject.related_objects
|
163
|
-
expect(
|
164
|
-
expect(
|
165
|
-
expect(
|
166
|
-
expect(
|
158
|
+
expect(related_objects.include? object1).to be true
|
159
|
+
expect(related_objects.include? generic_work1).to be true
|
160
|
+
expect(related_objects.include? generic_file1).to be true
|
161
|
+
expect(related_objects.size).to eq 3
|
167
162
|
end
|
168
163
|
end
|
169
164
|
end
|
170
165
|
|
171
166
|
describe 'remove related object from related object' do
|
172
|
-
|
173
|
-
subject { Hydra::Works::GenericFile::Base.new }
|
167
|
+
subject { described_class.new }
|
174
168
|
|
175
169
|
let(:related_object1) { Hydra::PCDM::Object.new }
|
176
170
|
let(:related_work2) { Hydra::Works::GenericWork::Base.new }
|
177
|
-
let(:related_file3) {
|
171
|
+
let(:related_file3) { described_class.new }
|
178
172
|
let(:related_object4) { Hydra::PCDM::Object.new }
|
179
173
|
let(:related_work5) { Hydra::Works::GenericWork::Base.new }
|
180
174
|
|
181
|
-
let(:generic_file1) {
|
182
|
-
let(:generic_file2) {
|
175
|
+
let(:generic_file1) { described_class.new }
|
176
|
+
let(:generic_file2) { described_class.new }
|
183
177
|
|
184
178
|
context 'when multiple related objects' do
|
185
179
|
before do
|
186
|
-
subject.related_objects << related_object1
|
180
|
+
subject.related_objects << related_object1
|
187
181
|
subject.related_objects << related_work2
|
188
182
|
subject.related_objects << related_file3
|
189
|
-
subject.related_objects << related_object4
|
190
|
-
subject.related_objects << related_work5
|
191
|
-
expect(
|
192
|
-
|
183
|
+
subject.related_objects << related_object4
|
184
|
+
subject.related_objects << related_work5
|
185
|
+
expect(subject.related_objects).to eq [related_object1, related_work2, related_file3, related_object4, related_work5]
|
193
186
|
end
|
194
187
|
|
195
|
-
it '
|
196
|
-
expect(
|
197
|
-
expect(
|
188
|
+
it 'removes first related object' do
|
189
|
+
expect(subject.related_objects.delete related_object1).to eq [related_object1]
|
190
|
+
expect(subject.related_objects).to eq [related_work2, related_file3, related_object4, related_work5]
|
198
191
|
end
|
199
192
|
|
200
|
-
it '
|
201
|
-
expect(
|
202
|
-
expect(
|
193
|
+
it 'removes last related object' do
|
194
|
+
expect(subject.related_objects.delete related_work5).to eq [related_work5]
|
195
|
+
expect(subject.related_objects).to eq [related_object1, related_work2, related_file3, related_object4]
|
203
196
|
end
|
204
197
|
|
205
|
-
it '
|
206
|
-
expect(
|
207
|
-
expect(
|
198
|
+
it 'removes middle related object' do
|
199
|
+
expect(subject.related_objects.delete related_file3).to eq [related_file3]
|
200
|
+
expect(subject.related_objects).to eq [related_object1, related_work2, related_object4, related_work5]
|
208
201
|
end
|
209
202
|
end
|
210
203
|
|
211
|
-
#Assuming this context not needed because unacceptable related objects
|
212
|
-
#can't be added.
|
213
|
-
#context 'with unacceptable related object' do
|
214
|
-
|
204
|
+
# Assuming this context not needed because unacceptable related objects
|
205
|
+
# can't be added.
|
206
|
+
# context 'with unacceptable related object' do
|
215
207
|
end
|
216
208
|
|
217
|
-
describe
|
209
|
+
describe 'should have parent work accessors' do
|
218
210
|
let(:generic_work1) { Hydra::Works::GenericWork::Base.create }
|
219
211
|
before do
|
220
212
|
generic_work1.generic_files << generic_file1
|
221
213
|
end
|
222
214
|
|
223
|
-
it '
|
224
|
-
expect(generic_file1.
|
215
|
+
it 'has parents' do
|
216
|
+
expect(generic_file1.member_of).to eq [generic_work1]
|
225
217
|
end
|
226
|
-
it '
|
227
|
-
expect(generic_file1.
|
218
|
+
it 'has a parent work' do
|
219
|
+
expect(generic_file1.in_generic_works).to eq [generic_work1]
|
228
220
|
end
|
229
221
|
end
|
230
222
|
|
231
|
-
|
223
|
+
describe 'make sure deprecated methods still work' do
|
224
|
+
let(:generic_work1) { Hydra::Works::GenericWork::Base.create }
|
225
|
+
before do
|
226
|
+
generic_work1.generic_files << generic_file1
|
227
|
+
generic_work1.save # required until issue AF-Agg-75 is fixed
|
228
|
+
end
|
229
|
+
it 'deprecated methods should pass' do
|
230
|
+
expect(generic_file1.generic_works).to eq [generic_work1]
|
231
|
+
expect(generic_file1.parents).to eq [generic_work1]
|
232
|
+
end
|
233
|
+
end
|
232
234
|
end
|