ddr-models 2.7.6 → 2.8.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/models/collection.rb +1 -1
- data/app/models/component.rb +22 -31
- data/config/initializers/active_fedora_base.rb +8 -0
- data/config/locales/ddr-models.en.yml +4 -0
- data/lib/ddr/datastreams.rb +12 -10
- data/lib/ddr/datastreams/administrative_metadata_datastream.rb +6 -0
- data/lib/ddr/datastreams/streamable_media_datastream.rb +5 -0
- data/lib/ddr/index/fields.rb +7 -5
- data/lib/ddr/managers/derivatives_manager.rb +12 -7
- data/lib/ddr/models.rb +19 -9
- data/lib/ddr/models/base.rb +10 -3
- data/lib/ddr/models/file_management.rb +1 -1
- data/lib/ddr/models/has_admin_metadata.rb +8 -9
- data/lib/ddr/models/indexing.rb +18 -3
- data/lib/ddr/models/language.rb +31 -0
- data/lib/ddr/models/media_type.rb +22 -0
- data/lib/ddr/models/{licenses/license.rb → rights_statement.rb} +3 -7
- data/lib/ddr/models/solr_document.rb +22 -2
- data/lib/ddr/models/streamable.rb +22 -0
- data/lib/ddr/models/version.rb +1 -1
- data/lib/ddr/utils.rb +4 -4
- data/lib/ddr/vocab/asset.rb +8 -0
- data/spec/factories/collection_factories.rb +1 -0
- data/spec/index/fields_spec.rb +18 -0
- data/spec/managers/derivatives_manager_spec.rb +2 -5
- data/spec/models/active_fedora_base_spec.rb +3 -0
- data/spec/models/admin_set_spec.rb +2 -1
- data/spec/models/attachment_spec.rb +1 -0
- data/spec/models/collection_spec.rb +4 -7
- data/spec/models/component_spec.rb +20 -5
- data/spec/models/has_struct_metadata_spec.rb +0 -1
- data/spec/models/indexing_spec.rb +91 -44
- data/spec/models/item_spec.rb +1 -0
- data/spec/models/language_spec.rb +59 -0
- data/spec/models/media_type_spec.rb +46 -0
- data/spec/models/{license_spec.rb → rights_statement_spec.rb} +9 -12
- data/spec/models/solr_document_spec.rb +57 -2
- data/spec/models/target_spec.rb +1 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/support/shared_examples_for_ddr_models.rb +12 -0
- data/spec/support/shared_examples_for_governables.rb +2 -1
- data/spec/support/shared_examples_for_streamable_media.rb +22 -0
- metadata +17 -13
- data/lib/ddr/models/licenses/admin_policy_license.rb +0 -11
- data/lib/ddr/models/licenses/effective_license.rb +0 -9
- data/lib/ddr/models/licenses/inherited_license.rb +0 -9
- data/lib/ddr/models/licenses/parent_license.rb +0 -11
- data/spec/models/effective_license_spec.rb +0 -74
@@ -0,0 +1,31 @@
|
|
1
|
+
require "active_resource"
|
2
|
+
|
3
|
+
module Ddr::Models
|
4
|
+
class Language < ActiveResource::Base
|
5
|
+
|
6
|
+
self.site = ENV["DDR_AUX_API_URL"]
|
7
|
+
|
8
|
+
def self.call(obj)
|
9
|
+
obj.language.map do |lang|
|
10
|
+
find_by_code(lang)
|
11
|
+
end
|
12
|
+
rescue ActiveResource::ResourceNotFound => e
|
13
|
+
raise Ddr::Models::NotFoundError, e
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.find_by_code(code)
|
17
|
+
return unless code
|
18
|
+
new get(:find, code: code)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.codes
|
22
|
+
all.map(&:code)
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_s
|
26
|
+
label
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Ddr::Models
|
2
|
+
class MediaType
|
3
|
+
|
4
|
+
def self.call(file_or_path)
|
5
|
+
path = file_or_path.respond_to?(:path) ? file_or_path.path : file_or_path
|
6
|
+
# Use preferred media type, if available
|
7
|
+
media_type = Ddr::Models.preferred_media_types[File.extname(path)]
|
8
|
+
if !media_type
|
9
|
+
if file_or_path.respond_to?(:content_type)
|
10
|
+
# Rails ActionDispatch::Http::UploadedFile
|
11
|
+
media_type = file_or_path.content_type
|
12
|
+
else
|
13
|
+
# Fall back to first MIME type or default
|
14
|
+
mime_types = MIME::Types.of(path)
|
15
|
+
media_type = mime_types.empty? ? Ddr::Models.default_mime_type : mime_types.first.content_type
|
16
|
+
end
|
17
|
+
end
|
18
|
+
media_type
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -1,17 +1,13 @@
|
|
1
1
|
require "active_resource"
|
2
2
|
|
3
3
|
module Ddr::Models
|
4
|
-
class
|
4
|
+
class RightsStatement < ActiveResource::Base
|
5
5
|
|
6
6
|
self.site = ENV["DDR_AUX_API_URL"]
|
7
7
|
|
8
|
-
attr_accessor :pid
|
9
|
-
|
10
8
|
def self.call(obj)
|
11
|
-
if obj.
|
12
|
-
|
13
|
-
license.pid = obj.pid
|
14
|
-
license
|
9
|
+
if obj.rights.present?
|
10
|
+
new get(:find, url: obj.rights.first)
|
15
11
|
end
|
16
12
|
rescue ActiveResource::ResourceNotFound => e
|
17
13
|
raise Ddr::Models::NotFoundError, e
|
@@ -3,6 +3,9 @@ require 'json'
|
|
3
3
|
module Ddr::Models
|
4
4
|
module SolrDocument
|
5
5
|
extend ActiveSupport::Concern
|
6
|
+
extend Deprecation
|
7
|
+
|
8
|
+
self.deprecation_horizon = 'ddr-models v3.0'
|
6
9
|
|
7
10
|
included do
|
8
11
|
alias_method :pid, :id
|
@@ -176,9 +179,11 @@ module Ddr::Models
|
|
176
179
|
active_fedora_model.tableize
|
177
180
|
end
|
178
181
|
|
179
|
-
def
|
180
|
-
@
|
182
|
+
def rights_statement
|
183
|
+
@rights_statement ||= RightsStatement.call(self)
|
181
184
|
end
|
185
|
+
alias_method :effective_license, :rights_statement
|
186
|
+
deprecation_deprecate :effective_license
|
182
187
|
|
183
188
|
def roles
|
184
189
|
@roles ||= Ddr::Auth::Roles::DetachedRoleSet.from_json(access_role)
|
@@ -228,6 +233,21 @@ module Ddr::Models
|
|
228
233
|
end
|
229
234
|
end
|
230
235
|
|
236
|
+
def streamable?
|
237
|
+
has_datastream?(Ddr::Datastreams::STREAMABLE_MEDIA)
|
238
|
+
end
|
239
|
+
|
240
|
+
def streamable_media_path
|
241
|
+
if streamable?
|
242
|
+
Ddr::Utils.path_from_uri(datastreams[Ddr::Datastreams::STREAMABLE_MEDIA]["dsLocation"])
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
# FIXME - Probably need a more general solution mapping object reader methods to index field names.
|
247
|
+
def rights
|
248
|
+
self["rights_tesim"]
|
249
|
+
end
|
250
|
+
|
231
251
|
private
|
232
252
|
|
233
253
|
def targets_query
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Ddr::Models
|
2
|
+
module Streamable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
has_file_datastream name: Ddr::Datastreams::STREAMABLE_MEDIA,
|
7
|
+
type: Ddr::Datastreams::StreamableMediaDatastream,
|
8
|
+
versionable: true,
|
9
|
+
label: "Streamable media file for this object",
|
10
|
+
control_group: "E"
|
11
|
+
end
|
12
|
+
|
13
|
+
def streamable_media_type
|
14
|
+
datastreams[Ddr::Datastreams::STREAMABLE_MEDIA].mimeType
|
15
|
+
end
|
16
|
+
|
17
|
+
def streamable_media_path
|
18
|
+
datastreams[Ddr::Datastreams::STREAMABLE_MEDIA].file_path
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
data/lib/ddr/models/version.rb
CHANGED
data/lib/ddr/utils.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'openssl'
|
2
2
|
|
3
3
|
module Ddr::Utils
|
4
|
+
extend Deprecation
|
4
5
|
|
5
6
|
def self.digest content, algorithm
|
6
7
|
raise TypeError, "Algorithm must be a string: #{algorithm.inspect}" unless algorithm.is_a?(String)
|
@@ -14,10 +15,9 @@ module Ddr::Utils
|
|
14
15
|
# file can be a File object or file path (String)
|
15
16
|
# @return [String] the mime type or default
|
16
17
|
def self.mime_type_for(file, file_name=nil)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
mime_types.empty? ? Ddr::Models.default_mime_type : mime_types.first.content_type
|
18
|
+
Deprecation.warn(self, "`Ddr::Utils.mime_type_for` is deprecated and will be removed in ddr-models 3.0." \
|
19
|
+
" Use `Ddr::Models::MediaType.call(file)` instead. (called from #{caller.first})")
|
20
|
+
Ddr::Models::MediaType.call(file_name || file)
|
21
21
|
end
|
22
22
|
|
23
23
|
def self.file_or_path?(file)
|
data/lib/ddr/vocab/asset.rb
CHANGED
@@ -35,5 +35,13 @@ module Ddr::Vocab
|
|
35
35
|
label: "Rights Note",
|
36
36
|
comment: "Free-text statement about the rights status of the resource."
|
37
37
|
|
38
|
+
property "alephId",
|
39
|
+
label: "Aleph ID",
|
40
|
+
comment: "The Aleph identifier for a catalog record corresponding to the object."
|
41
|
+
|
42
|
+
property "affiliation",
|
43
|
+
label: "Affiliation",
|
44
|
+
comment: "An organizational entity associated with the object content."
|
45
|
+
|
38
46
|
end
|
39
47
|
end
|
data/spec/index/fields_spec.rb
CHANGED
@@ -141,6 +141,18 @@ module Ddr::Index
|
|
141
141
|
its(:heading) { is_expected.to eq "interviewer_name_facet" }
|
142
142
|
end
|
143
143
|
|
144
|
+
describe "LANGUAGE_FACET" do
|
145
|
+
subject { Fields::LANGUAGE_FACET }
|
146
|
+
its(:label) { is_expected.to eq "Language Facet" }
|
147
|
+
its(:heading) { is_expected.to eq "language_facet" }
|
148
|
+
end
|
149
|
+
|
150
|
+
describe "LANGUAGE_NAME" do
|
151
|
+
subject { Fields::LANGUAGE_NAME }
|
152
|
+
its(:label) { is_expected.to eq "Language Name" }
|
153
|
+
its(:heading) { is_expected.to eq "language_name" }
|
154
|
+
end
|
155
|
+
|
144
156
|
describe "LITHOGRAPHER_FACET" do
|
145
157
|
subject { Fields::LITHOGRAPHER_FACET }
|
146
158
|
its(:label) { is_expected.to eq "Lithographer Facet" }
|
@@ -225,6 +237,12 @@ module Ddr::Index
|
|
225
237
|
its(:heading) { is_expected.to eq "setting_facet" }
|
226
238
|
end
|
227
239
|
|
240
|
+
describe "STREAMABLE_MEDIA_TYPE" do
|
241
|
+
subject { Fields::STREAMABLE_MEDIA_TYPE }
|
242
|
+
its(:label) { is_expected.to eq "Streamable Media Type" }
|
243
|
+
its(:heading) { is_expected.to eq "streamable_media_type" }
|
244
|
+
end
|
245
|
+
|
228
246
|
describe "SUBSERIES_FACET" do
|
229
247
|
subject { Fields::SUBSERIES_FACET }
|
230
248
|
its(:label) { is_expected.to eq "Subseries Facet" }
|
@@ -101,15 +101,12 @@ module Ddr::Managers
|
|
101
101
|
object.reload
|
102
102
|
end
|
103
103
|
it "uses the intermediate file as the derivative source" do
|
104
|
-
expect(object.
|
105
|
-
expect(object.content).to_not receive(:content)
|
106
|
-
object.derivatives.generate_derivative! Ddr::Derivatives::DERIVATIVES[:multires_image]
|
104
|
+
expect(object.derivatives.source_datastream).to equal(object.datastreams[Ddr::Datastreams::INTERMEDIATE_FILE])
|
107
105
|
end
|
108
106
|
end
|
109
107
|
describe "object does not have intermediate file" do
|
110
108
|
it "uses the content file as the derivative source" do
|
111
|
-
expect(object.
|
112
|
-
object.derivatives.generate_derivative! Ddr::Derivatives::DERIVATIVES[:multires_image]
|
109
|
+
expect(object.derivatives.source_datastream).to equal(object.datastreams[Ddr::Datastreams::CONTENT])
|
113
110
|
end
|
114
111
|
end
|
115
112
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Ddr::Models
|
2
|
-
RSpec.describe AdminSet, ddr_aux: true do
|
2
|
+
RSpec.describe AdminSet, ddr_aux: true, admin_set: true do
|
3
3
|
|
4
4
|
describe ".call" do
|
5
5
|
let(:obj) { Item.new }
|
@@ -30,6 +30,7 @@ module Ddr::Models
|
|
30
30
|
|
31
31
|
describe "when the object does not have an admin set" do
|
32
32
|
it "returns nil" do
|
33
|
+
expect(described_class).to receive(:find_by_code).and_call_original
|
33
34
|
expect(described_class.call(obj)).to be_nil
|
34
35
|
end
|
35
36
|
end
|
@@ -5,5 +5,6 @@ RSpec.describe Attachment, type: :model, attachments: true do
|
|
5
5
|
it_behaves_like "it has an association", :belongs_to, :attached_to, :is_attached_to, "ActiveFedora::Base"
|
6
6
|
it_behaves_like "a non-collection model"
|
7
7
|
it_behaves_like "an unpublishable object"
|
8
|
+
it_behaves_like "an object that cannot be streamable"
|
8
9
|
|
9
10
|
end
|
@@ -1,22 +1,19 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
1
|
RSpec.describe Collection, type: :model do
|
4
2
|
|
5
|
-
subject { described_class.new(title: ["Test Collection"]) }
|
3
|
+
subject { described_class.new(title: ["Test Collection"], admin_set: "foo") }
|
6
4
|
|
7
5
|
it_behaves_like "a DDR model"
|
8
6
|
it_behaves_like "it has an association", :has_many, :children, :is_member_of_collection, "Item"
|
9
7
|
it_behaves_like "it has an association", :has_many, :targets, :is_external_target_for, "Target"
|
10
8
|
it_behaves_like "a publishable object"
|
9
|
+
it_behaves_like "an object that cannot be streamable"
|
11
10
|
|
12
11
|
describe "admin set" do
|
13
|
-
let(:admin_set) { Ddr::Models::AdminSet.new(code: "foobar", title: "FooBar") }
|
14
12
|
before do
|
15
|
-
|
16
|
-
subject.admin_set = "foobar"
|
13
|
+
subject.admin_set = "foo"
|
17
14
|
end
|
18
15
|
it "indexes the admin set title" do
|
19
|
-
expect(subject.to_solr[Ddr::Index::Fields::ADMIN_SET_TITLE]).to eq("
|
16
|
+
expect(subject.to_solr[Ddr::Index::Fields::ADMIN_SET_TITLE]).to eq("Foo Admin Set")
|
20
17
|
end
|
21
18
|
end
|
22
19
|
|
@@ -7,6 +7,7 @@ RSpec.describe Component, type: :model, components: true do
|
|
7
7
|
it_behaves_like "a non-collection model"
|
8
8
|
it_behaves_like "a potentially publishable object"
|
9
9
|
it_behaves_like "an object that can have an intermediate file"
|
10
|
+
it_behaves_like "an object that can be streamable"
|
10
11
|
|
11
12
|
describe "indexing" do
|
12
13
|
subject { FactoryGirl.build(:component) }
|
@@ -50,18 +51,32 @@ RSpec.describe Component, type: :model, components: true do
|
|
50
51
|
end
|
51
52
|
end
|
52
53
|
describe "service file" do
|
53
|
-
|
54
|
+
let(:service_files) { struct.uses[Ddr::Models::Structure::USE_SERVICE_FILE].map(&:href) }
|
55
|
+
describe "with multires image but not streamable media" do
|
56
|
+
before { allow(subject).to receive(:has_multires_image?) { true } }
|
57
|
+
it "has the correct structure file" do
|
58
|
+
expect(service_files).to contain_exactly(Ddr::Datastreams::MULTIRES_IMAGE)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
describe "with streamable media but not multires image" do
|
62
|
+
before { allow(subject).to receive(:streamable?) { true } }
|
63
|
+
it "has the correct structure file" do
|
64
|
+
expect(service_files).to contain_exactly(Ddr::Datastreams::STREAMABLE_MEDIA)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
describe "with both multires image and streamable media" do
|
54
68
|
before do
|
55
69
|
allow(subject).to receive(:has_multires_image?) { true }
|
70
|
+
allow(subject).to receive(:streamable?) { true }
|
56
71
|
end
|
57
72
|
it "has the correct structure file" do
|
58
|
-
expect(
|
59
|
-
|
73
|
+
expect(service_files).to contain_exactly(Ddr::Datastreams::MULTIRES_IMAGE,
|
74
|
+
Ddr::Datastreams::STREAMABLE_MEDIA)
|
60
75
|
end
|
61
76
|
end
|
62
|
-
describe "
|
77
|
+
describe "with neither multires image nor streamable media" do
|
63
78
|
it "has the correct structure file" do
|
64
|
-
expect(
|
79
|
+
expect(service_files).to contain_exactly(Ddr::Datastreams::CONTENT)
|
65
80
|
end
|
66
81
|
end
|
67
82
|
end
|
@@ -33,7 +33,6 @@ module Ddr::Models
|
|
33
33
|
end
|
34
34
|
it "should index the JSON representation of the structures" do
|
35
35
|
indexing = item.to_solr
|
36
|
-
expect(indexing[Ddr::Index::Fields::STRUCT]).to eq(expected_json)
|
37
36
|
expect(indexing[Ddr::Index::Fields::STRUCTURE]).to eq(expected_json)
|
38
37
|
end
|
39
38
|
describe "structure source" do
|
@@ -13,6 +13,8 @@ module Ddr::Models
|
|
13
13
|
|
14
14
|
before do
|
15
15
|
obj.adminMetadata.doi << "http://doi.org/10.1000/182"
|
16
|
+
obj.affiliation << "Talk to me in the back alley."
|
17
|
+
obj.aleph_id = "lkheajklfwbsef"
|
16
18
|
obj.aspace_id = "aspace_dccea43034e1b8261e14cf999e86449d"
|
17
19
|
obj.display_format = "Image"
|
18
20
|
obj.ingested_by = "foo@bar.com"
|
@@ -52,47 +54,53 @@ module Ddr::Models
|
|
52
54
|
obj.set_desc_metadata_values(:volume, "100")
|
53
55
|
end
|
54
56
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
57
|
+
specify {
|
58
|
+
expect(subject[Indexing::ACCESS_ROLE]).to eq(obj.roles.to_json)
|
59
|
+
expect(subject[Indexing::ADMIN_SET_TITLE]).to be_nil
|
60
|
+
expect(subject[Indexing::AFFILIATION]).to eq(["Talk to me in the back alley."])
|
61
|
+
expect(subject[Indexing::AFFILIATION_FACET]).to eq(["Talk to me in the back alley."])
|
62
|
+
expect(subject[Indexing::ALEPH_ID]).to eq "lkheajklfwbsef"
|
63
|
+
expect(subject[Indexing::ARRANGER_FACET]).to eq(["Arranger Value"])
|
64
|
+
expect(subject[Indexing::ASPACE_ID]).to eq("aspace_dccea43034e1b8261e14cf999e86449d")
|
65
|
+
expect(subject[Indexing::CATEGORY_FACET]).to eq(["Category Value"])
|
66
|
+
expect(subject[Indexing::COMPANY_FACET]).to eq(["Company Value"])
|
67
|
+
expect(subject[Indexing::COMPOSER_FACET]).to eq(["Composer Value"])
|
68
|
+
expect(subject[Indexing::DC_IS_PART_OF]).to eq(["RL10059CS1010"])
|
69
|
+
expect(subject[Indexing::DISPLAY_FORMAT]).to eq("Image")
|
70
|
+
expect(subject[Indexing::DOI]).to eq(["http://doi.org/10.1000/182"])
|
71
|
+
expect(subject[Indexing::ENGRAVER_FACET]).to eq(["Engraver Value"])
|
72
|
+
expect(subject[Indexing::FOLDER_FACET]).to eq(["Folder Value"])
|
73
|
+
expect(subject[Indexing::GENRE_FACET]).to eq(["Genre Value"])
|
74
|
+
expect(subject[Indexing::ILLUSTRATED_FACET]).to eq(["Illustrated Value"])
|
75
|
+
expect(subject[Indexing::ILLUSTRATOR_FACET]).to eq(["Illustrator Value"])
|
76
|
+
expect(subject[Indexing::INGESTED_BY]).to eq("foo@bar.com")
|
77
|
+
expect(subject[Indexing::INGESTION_DATE]).to eq("2017-01-13T18:55:29Z")
|
78
|
+
expect(subject[Indexing::INSTRUMENTATION_FACET]).to eq(["Instrumentation Value"])
|
79
|
+
expect(subject[Indexing::INTERVIEWER_NAME_FACET]).to eq(["Interviewer Name Value"])
|
80
|
+
expect(subject[Indexing::IS_FORMAT_OF]).to eq(["ark:/99999/fk4aaa"])
|
81
|
+
expect(subject[Indexing::LICENSE]).to eq("cc-by-nc-nd-40")
|
82
|
+
expect(subject[Indexing::LITHOGRAPHER_FACET]).to eq(["Lithographer Value"])
|
83
|
+
expect(subject[Indexing::LOCAL_ID]).to eq("foo")
|
84
|
+
expect(subject[Indexing::LYRICIST_FACET]).to eq(["Lyricist Value"])
|
85
|
+
expect(subject[Indexing::MEDIUM_FACET]).to eq(["Medium Value"])
|
86
|
+
expect(subject[Indexing::PERFORMER_FACET]).to eq(["Performer Value"])
|
87
|
+
expect(subject[Indexing::PERMANENT_ID]).to eq("ark:/99999/fk4zzz")
|
88
|
+
expect(subject[Indexing::PERMANENT_URL]).to eq("http://id.library.duke.edu/ark:/99999/fk4zzz")
|
89
|
+
expect(subject[Indexing::PLACEMENT_COMPANY_FACET]).to eq(["Placement Company Value"])
|
90
|
+
expect(subject[Indexing::POLICY_ROLE]).to contain_exactly(role2.agent.first, role3.agent.first, role4.agent.first)
|
91
|
+
expect(subject[Indexing::PRODUCER_FACET]).to eq(["Producer Value"])
|
92
|
+
expect(subject[Indexing::PRODUCT_FACET]).to eq(["Product Value"])
|
93
|
+
expect(subject[Indexing::PUBLICATION_FACET]).to eq(["Publication Value"])
|
94
|
+
expect(subject[Indexing::RESOURCE_ROLE]).to contain_exactly(role1.agent.first)
|
95
|
+
expect(subject[Indexing::RIGHTS_NOTE]).to eq(["Public domain"])
|
96
|
+
expect(subject[Indexing::ROLL_NUMBER_FACET]).to eq(["10"])
|
97
|
+
expect(subject[Indexing::SETTING_FACET]).to eq(["Setting Value"])
|
98
|
+
expect(subject[Indexing::STREAMABLE_MEDIA_TYPE]).to be_nil
|
99
|
+
expect(subject[Indexing::SUBSERIES_FACET]).to eq(["Subseries Value"])
|
100
|
+
expect(subject[Indexing::TEMPORAL_FACET]).to eq(["Temporal Value"])
|
101
|
+
expect(subject[Indexing::TONE_FACET]).to eq(["Tone Value"])
|
102
|
+
expect(subject[Indexing::VOLUME_FACET]).to eq(["100"])
|
103
|
+
}
|
96
104
|
end
|
97
105
|
|
98
106
|
describe "content-bearing object indexing" do
|
@@ -102,9 +110,48 @@ module Ddr::Models
|
|
102
110
|
allow(obj.content).to receive(:createDate) { create_date }
|
103
111
|
}
|
104
112
|
|
105
|
-
|
106
|
-
|
107
|
-
|
113
|
+
specify {
|
114
|
+
expect(subject[Indexing::CONTENT_CREATE_DATE]).to eq "2016-01-22T21:50:33Z"
|
115
|
+
expect(subject[Indexing::ATTACHED_FILES_HAVING_CONTENT]).to contain_exactly("content", "RELS-EXT", "descMetadata", "adminMetadata")
|
116
|
+
expect(subject[Indexing::CONTENT_SIZE]).to eq 230714
|
117
|
+
expect(subject[Indexing::CONTENT_SIZE_HUMAN]).to eq "225 KB"
|
118
|
+
expect(subject[Indexing::MEDIA_TYPE]).to eq "image/tiff"
|
119
|
+
expect(subject[Indexing::MEDIA_MAJOR_TYPE]).to eq "image"
|
120
|
+
expect(subject[Indexing::MEDIA_SUB_TYPE]).to eq "tiff"
|
121
|
+
}
|
122
|
+
|
123
|
+
describe "streamable object indexing" do
|
124
|
+
before {
|
125
|
+
obj.add_file(fixture_file_upload('bird.jpg', 'image/jpeg'), 'streamableMedia')
|
126
|
+
obj.save!
|
127
|
+
}
|
128
|
+
specify {
|
129
|
+
expect(subject[Indexing::STREAMABLE_MEDIA_TYPE]).to eq "image/jpeg"
|
130
|
+
}
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe "admin set title" do
|
135
|
+
subject { FactoryGirl.build(:item) }
|
136
|
+
let(:coll) { FactoryGirl.create(:collection) }
|
137
|
+
before do
|
138
|
+
subject.parent = coll
|
139
|
+
subject.admin_policy = coll
|
140
|
+
end
|
141
|
+
specify {
|
142
|
+
expect(subject.index_fields[Indexing::ADMIN_SET_TITLE]).to eq "Foo Admin Set"
|
143
|
+
}
|
144
|
+
end
|
145
|
+
|
146
|
+
describe "language name" do
|
147
|
+
subject { FactoryGirl.build(:item) }
|
148
|
+
before do
|
149
|
+
subject.language = ["cym", "Not a Code"]
|
150
|
+
subject.save!
|
151
|
+
end
|
152
|
+
specify {
|
153
|
+
expect(subject.index_fields[Indexing::LANGUAGE_FACET]).to eq ["Welsh", "Not a Code"]
|
154
|
+
expect(subject.index_fields[Indexing::LANGUAGE_NAME]).to eq ["Welsh", "Not a Code"]
|
108
155
|
}
|
109
156
|
end
|
110
157
|
|