ddr-models 2.8.0 → 2.9.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 +55 -0
- data/app/models/component.rb +23 -13
- data/app/models/item.rb +28 -0
- data/config/initializers/active_fedora_base.rb +8 -0
- data/lib/ddr/datastreams.rb +2 -0
- data/lib/ddr/datastreams/administrative_metadata_datastream.rb +3 -0
- data/lib/ddr/datastreams/caption_datastream.rb +5 -0
- data/lib/ddr/index/fields.rb +2 -0
- data/lib/ddr/models.rb +27 -5
- data/lib/ddr/models/base.rb +15 -2
- data/lib/ddr/models/captionable.rb +37 -0
- data/lib/ddr/models/has_children.rb +0 -28
- data/lib/ddr/models/has_intermediate_file.rb +23 -0
- data/lib/ddr/models/indexing.rb +2 -0
- data/lib/ddr/models/solr_document.rb +99 -0
- data/lib/ddr/models/streamable.rb +15 -0
- data/lib/ddr/models/version.rb +1 -1
- data/lib/ddr/vocab/asset.rb +4 -0
- data/spec/fixtures/abcd1234.vtt +38 -0
- data/spec/models/active_fedora_base_spec.rb +3 -0
- data/spec/models/collection_spec.rb +152 -0
- data/spec/models/component_spec.rb +32 -2
- data/spec/models/has_children_spec.rb +0 -51
- data/spec/models/indexing_spec.rb +8 -0
- data/spec/models/item_spec.rb +64 -0
- data/spec/models/solr_document_spec.rb +131 -0
- data/spec/support/shared_examples_for_captionable.rb +23 -0
- data/spec/support/shared_examples_for_streamable_media.rb +1 -0
- metadata +10 -4
data/lib/ddr/models/indexing.rb
CHANGED
@@ -128,6 +128,8 @@ module Ddr::Models
|
|
128
128
|
if is_a? Item
|
129
129
|
fields[ADMIN_SET_FACET] = admin_set_facet
|
130
130
|
fields[COLLECTION_FACET] = collection_facet
|
131
|
+
fields[NESTED_PATH] = nested_path
|
132
|
+
fields[NESTED_PATH_TEXT] = nested_path
|
131
133
|
fields[ALL_TEXT] = all_text
|
132
134
|
end
|
133
135
|
fields
|
@@ -141,6 +141,10 @@ module Ddr::Models
|
|
141
141
|
has_datastream?(Ddr::Datastreams::CONTENT)
|
142
142
|
end
|
143
143
|
|
144
|
+
def has_intermediate_file?
|
145
|
+
has_datastream?(Ddr::Datastreams::INTERMEDIATE_FILE)
|
146
|
+
end
|
147
|
+
|
144
148
|
def has_extracted_text?
|
145
149
|
has_datastream?(Ddr::Datastreams::EXTRACTED_TEXT)
|
146
150
|
end
|
@@ -233,10 +237,77 @@ module Ddr::Models
|
|
233
237
|
end
|
234
238
|
end
|
235
239
|
|
240
|
+
def intermediate_type
|
241
|
+
if has_intermediate_file?
|
242
|
+
datastreams[Ddr::Datastreams::INTERMEDIATE_FILE]["dsMIME"]
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
def intermediate_path
|
247
|
+
if has_intermediate_file?
|
248
|
+
Ddr::Utils.path_from_uri(datastreams[Ddr::Datastreams::INTERMEDIATE_FILE]["dsLocation"])
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
def intermediate_extension
|
253
|
+
if has_intermediate_file?
|
254
|
+
extensions = Ddr::Models.preferred_file_extensions
|
255
|
+
if extensions.include? intermediate_type
|
256
|
+
extensions[intermediate_type]
|
257
|
+
else
|
258
|
+
intermediate_extension_default
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
def captionable?
|
264
|
+
has_datastream?(Ddr::Datastreams::CAPTION)
|
265
|
+
end
|
266
|
+
|
267
|
+
def caption_type
|
268
|
+
if captionable?
|
269
|
+
datastreams[Ddr::Datastreams::CAPTION]["dsMIME"]
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
def caption_extension
|
274
|
+
if captionable?
|
275
|
+
extensions = Ddr::Models.preferred_file_extensions
|
276
|
+
if extensions.include? caption_type
|
277
|
+
extensions[caption_type]
|
278
|
+
else
|
279
|
+
caption_extension_default
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
def caption_path
|
285
|
+
if captionable?
|
286
|
+
Ddr::Utils.path_from_uri(datastreams[Ddr::Datastreams::CAPTION]["dsLocation"])
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
236
290
|
def streamable?
|
237
291
|
has_datastream?(Ddr::Datastreams::STREAMABLE_MEDIA)
|
238
292
|
end
|
239
293
|
|
294
|
+
def streamable_media_extension
|
295
|
+
if streamable?
|
296
|
+
extensions = Ddr::Models.preferred_file_extensions
|
297
|
+
if extensions.include? streamable_media_type
|
298
|
+
extensions[streamable_media_type]
|
299
|
+
else
|
300
|
+
streamable_media_extension_default
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
def streamable_media_type
|
306
|
+
if streamable?
|
307
|
+
datastreams[Ddr::Datastreams::STREAMABLE_MEDIA]["dsMIME"]
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
240
311
|
def streamable_media_path
|
241
312
|
if streamable?
|
242
313
|
Ddr::Utils.path_from_uri(datastreams[Ddr::Datastreams::STREAMABLE_MEDIA]["dsLocation"])
|
@@ -248,6 +319,10 @@ module Ddr::Models
|
|
248
319
|
self["rights_tesim"]
|
249
320
|
end
|
250
321
|
|
322
|
+
def children
|
323
|
+
children_query.docs rescue []
|
324
|
+
end
|
325
|
+
|
251
326
|
private
|
252
327
|
|
253
328
|
def targets_query
|
@@ -296,5 +371,29 @@ module Ddr::Models
|
|
296
371
|
structure['default'] || structure.values.first
|
297
372
|
end
|
298
373
|
|
374
|
+
def intermediate_extension_default
|
375
|
+
datastreams[Ddr::Datastreams::INTERMEDIATE_FILE].default_file_extension
|
376
|
+
end
|
377
|
+
|
378
|
+
def caption_extension_default
|
379
|
+
datastreams[Ddr::Datastreams::CAPTION].default_file_extension
|
380
|
+
end
|
381
|
+
|
382
|
+
def streamable_media_extension_default
|
383
|
+
datastreams[Ddr::Datastreams::STREAMABLE_MEDIA].default_file_extension
|
384
|
+
end
|
385
|
+
|
386
|
+
def children_query
|
387
|
+
case self[Ddr::Index::Fields::ACTIVE_FEDORA_MODEL]
|
388
|
+
when 'Collection'
|
389
|
+
Ddr::Index::Query.build(self) do |parent|
|
390
|
+
is_member_of_collection parent.id
|
391
|
+
end
|
392
|
+
when 'Item'
|
393
|
+
Ddr::Index::Query.build(self) do |parent|
|
394
|
+
is_part_of parent.id
|
395
|
+
end
|
396
|
+
end
|
397
|
+
end
|
299
398
|
end
|
300
399
|
end
|
@@ -14,9 +14,24 @@ module Ddr::Models
|
|
14
14
|
datastreams[Ddr::Datastreams::STREAMABLE_MEDIA].mimeType
|
15
15
|
end
|
16
16
|
|
17
|
+
def streamable_media_extension
|
18
|
+
extensions = Ddr::Models.preferred_file_extensions
|
19
|
+
if extensions.include? streamable_media_type
|
20
|
+
extensions[streamable_media_type]
|
21
|
+
else
|
22
|
+
streamable_media_extension_default
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
17
26
|
def streamable_media_path
|
18
27
|
datastreams[Ddr::Datastreams::STREAMABLE_MEDIA].file_path
|
19
28
|
end
|
20
29
|
|
30
|
+
private
|
31
|
+
|
32
|
+
def streamable_media_extension_default
|
33
|
+
datastreams[Ddr::Datastreams::STREAMABLE_MEDIA].default_file_extension
|
34
|
+
end
|
35
|
+
|
21
36
|
end
|
22
37
|
end
|
data/lib/ddr/models/version.rb
CHANGED
data/lib/ddr/vocab/asset.rb
CHANGED
@@ -43,5 +43,9 @@ module Ddr::Vocab
|
|
43
43
|
label: "Affiliation",
|
44
44
|
comment: "An organizational entity associated with the object content."
|
45
45
|
|
46
|
+
property "nestedPath",
|
47
|
+
label: "Nested Path",
|
48
|
+
comment: "The nested/tree path to the object to be reflected in structural metadata."
|
49
|
+
|
46
50
|
end
|
47
51
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
WEBVTT
|
2
|
+
|
3
|
+
00:01.835 --> 00:02.736
|
4
|
+
Lorem ipsum dolor sit amet.
|
5
|
+
|
6
|
+
00:02.736 --> 00:03.837
|
7
|
+
Vestibulum pretium ligula quis nunc commodo dictum.
|
8
|
+
|
9
|
+
00:03.837 --> 00:04.637
|
10
|
+
Donec sit amet eros rutrum, elementum neque vitae, volutpat sapien.
|
11
|
+
|
12
|
+
00:04.637 --> 00:05.939
|
13
|
+
Vivamus sed turpis ut nisi cursus volutpat in non arcu.
|
14
|
+
|
15
|
+
00:05.939 --> 00:07.574
|
16
|
+
Praesent dignissim lectus sed dignissim ultricies.
|
17
|
+
|
18
|
+
00:07.574 --> 00:08.942
|
19
|
+
>> ♪ Quisque eget neque maximus, lobortis sem quis, dapibus ipsum.
|
20
|
+
|
21
|
+
00:08.942 --> 00:09.542
|
22
|
+
Pellentesque eu risus id tellus placerat maximus.
|
23
|
+
|
24
|
+
00:09.542 --> 00:11.778
|
25
|
+
♪ Proin dapibus purus et magna euismod, non vestibulum ligula pellentesque.
|
26
|
+
|
27
|
+
00:11.778 --> 00:13.980
|
28
|
+
Vivamus porttitor nibh eget nunc semper, ac tristique arcu scelerisque.
|
29
|
+
|
30
|
+
00:13.980 --> 00:15.882
|
31
|
+
♪ Maecenas gravida justo sit amet urna scelerisque, eget porttitor mauris interdum.
|
32
|
+
|
33
|
+
00:15.882 --> 00:18.752
|
34
|
+
Pellentesque consectetur lacus eget bibendum rutrum.
|
35
|
+
|
36
|
+
00:18.752 --> 00:20.387
|
37
|
+
♪ Quisque semper magna ultrices libero iaculis fermentum.
|
38
|
+
|
@@ -101,4 +101,156 @@ RSpec.describe Collection, type: :model do
|
|
101
101
|
}
|
102
102
|
end
|
103
103
|
|
104
|
+
describe "#default_structure" do
|
105
|
+
before do
|
106
|
+
allow(SecureRandom).to receive(:uuid).and_return("abc-def", "ghi-jkl", "mno-pqr", "stu-vwx", "yza-bcd", "efg-hij")
|
107
|
+
end
|
108
|
+
describe "when the collection has no items" do
|
109
|
+
let(:expected) do
|
110
|
+
xml = <<-EOS
|
111
|
+
<mets xmlns="http://www.loc.gov/METS/" xmlns:xlink="http://www.w3.org/1999/xlink">
|
112
|
+
<metsHdr>
|
113
|
+
<agent ROLE="#{Ddr::Models::Structures::Agent::ROLE_CREATOR}">
|
114
|
+
<name>#{Ddr::Models::Structures::Agent::NAME_REPOSITORY_DEFAULT}</name>
|
115
|
+
</agent>
|
116
|
+
</metsHdr>
|
117
|
+
<structMap TYPE="#{Ddr::Models::Structure::TYPE_DEFAULT}" />
|
118
|
+
</mets>
|
119
|
+
EOS
|
120
|
+
xml
|
121
|
+
end
|
122
|
+
it "should be the appropriate structure" do
|
123
|
+
expect(subject.default_structure.to_xml).to be_equivalent_to(expected)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
describe "when the collection has items" do
|
127
|
+
let(:item1) { FactoryGirl.create(:item) }
|
128
|
+
let(:item2) { FactoryGirl.create(:item) }
|
129
|
+
before do
|
130
|
+
item1.local_id = "test002"
|
131
|
+
item1.permanent_id = "ark:/99999/fk4aaa"
|
132
|
+
item1.save!
|
133
|
+
item2.local_id = "test001"
|
134
|
+
item2.permanent_id = "ark:/99999/fk4bbb"
|
135
|
+
item2.save!
|
136
|
+
subject.children << item1
|
137
|
+
subject.children << item2
|
138
|
+
subject.save!
|
139
|
+
end
|
140
|
+
after do
|
141
|
+
item1.destroy
|
142
|
+
item2.destroy
|
143
|
+
end
|
144
|
+
describe "without nested paths" do
|
145
|
+
let(:expected) do
|
146
|
+
xml = <<-EOS
|
147
|
+
<mets xmlns="http://www.loc.gov/METS/" xmlns:xlink="http://www.w3.org/1999/xlink">
|
148
|
+
<metsHdr>
|
149
|
+
<agent ROLE="#{Ddr::Models::Structures::Agent::ROLE_CREATOR}">
|
150
|
+
<name>#{Ddr::Models::Structures::Agent::NAME_REPOSITORY_DEFAULT}</name>
|
151
|
+
</agent>
|
152
|
+
</metsHdr>
|
153
|
+
<structMap TYPE="#{Ddr::Models::Structure::TYPE_DEFAULT}">
|
154
|
+
<div ORDER="1">
|
155
|
+
<mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4bbb" />
|
156
|
+
</div>
|
157
|
+
<div ORDER="2">
|
158
|
+
<mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4aaa" />
|
159
|
+
</div>
|
160
|
+
</structMap>
|
161
|
+
</mets>
|
162
|
+
EOS
|
163
|
+
xml
|
164
|
+
end
|
165
|
+
it "should be the appropriate structure" do
|
166
|
+
expect(subject.default_structure.to_xml).to be_equivalent_to(expected)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
describe "with nested paths" do
|
170
|
+
let(:item3) { FactoryGirl.create(:item) }
|
171
|
+
let(:item4) { FactoryGirl.create(:item) }
|
172
|
+
let(:item5) { FactoryGirl.create(:item) }
|
173
|
+
let(:item6) { FactoryGirl.create(:item) }
|
174
|
+
let(:expected) do
|
175
|
+
xml = <<-EOS
|
176
|
+
<mets xmlns="http://www.loc.gov/METS/" xmlns:xlink="http://www.w3.org/1999/xlink">
|
177
|
+
<metsHdr>
|
178
|
+
<agent ROLE="#{Ddr::Models::Structures::Agent::ROLE_CREATOR}">
|
179
|
+
<name>#{Ddr::Models::Structures::Agent::NAME_REPOSITORY_DEFAULT}</name>
|
180
|
+
</agent>
|
181
|
+
</metsHdr>
|
182
|
+
<structMap TYPE="#{Ddr::Models::Structure::TYPE_DEFAULT}">
|
183
|
+
<div LABEL="foo" ORDER="1" TYPE="Directory">
|
184
|
+
<div LABEL="b&apos;a&quot;r&quot;" ORDER="1" TYPE="Directory">
|
185
|
+
<div ORDER="1">
|
186
|
+
<mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4aaa" />
|
187
|
+
</div>
|
188
|
+
<div ORDER="2">
|
189
|
+
<mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4bbb" />
|
190
|
+
</div>
|
191
|
+
</div>
|
192
|
+
<div LABEL="baz" ORDER="2" TYPE="Directory">
|
193
|
+
<div ORDER="1">
|
194
|
+
<mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4ddd" />
|
195
|
+
</div>
|
196
|
+
<div ORDER="2">
|
197
|
+
<mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4ccc" />
|
198
|
+
</div>
|
199
|
+
</div>
|
200
|
+
<div ORDER="3">
|
201
|
+
<mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4fff" />
|
202
|
+
</div>
|
203
|
+
<div ORDER="4">
|
204
|
+
<mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4eee" />
|
205
|
+
</div>
|
206
|
+
</div>
|
207
|
+
</structMap>
|
208
|
+
</mets>
|
209
|
+
EOS
|
210
|
+
xml
|
211
|
+
end
|
212
|
+
before do
|
213
|
+
item3.local_id = "test003"
|
214
|
+
item3.permanent_id = "ark:/99999/fk4ccc"
|
215
|
+
item3.save!
|
216
|
+
item4.local_id = "test004"
|
217
|
+
item4.permanent_id = "ark:/99999/fk4ddd"
|
218
|
+
item4.save!
|
219
|
+
item5.local_id = "test005"
|
220
|
+
item5.permanent_id = "ark:/99999/fk4eee"
|
221
|
+
item5.save!
|
222
|
+
item6.local_id = "test006"
|
223
|
+
item6.permanent_id = "ark:/99999/fk4fff"
|
224
|
+
item6.save!
|
225
|
+
subject.children << item3
|
226
|
+
subject.children << item4
|
227
|
+
subject.children << item5
|
228
|
+
subject.children << item6
|
229
|
+
subject.save!
|
230
|
+
item1.nested_path = %Q[foo/b'a"r"/a.doc]
|
231
|
+
item1.save!
|
232
|
+
item2.nested_path = %Q[foo/b'a"r"/b.txt]
|
233
|
+
item2.save!
|
234
|
+
item3.nested_path = %Q[foo/baz/d.pdf]
|
235
|
+
item3.save!
|
236
|
+
item4.nested_path = %Q[foo/baz/c.txt]
|
237
|
+
item4.save!
|
238
|
+
item5.nested_path = %Q[foo/f.doc]
|
239
|
+
item5.save!
|
240
|
+
item6.nested_path = %Q[foo/e.pdf]
|
241
|
+
item6.save!
|
242
|
+
end
|
243
|
+
after do
|
244
|
+
item3.destroy
|
245
|
+
item4.destroy
|
246
|
+
item5.destroy
|
247
|
+
item6.destroy
|
248
|
+
end
|
249
|
+
it "should be the appropriate structure" do
|
250
|
+
expect(subject.default_structure.to_xml).to be_equivalent_to(expected)
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
104
256
|
end
|
@@ -6,6 +6,7 @@ RSpec.describe Component, type: :model, components: true do
|
|
6
6
|
it_behaves_like "it has an association", :belongs_to, :target, :has_external_target, "Target"
|
7
7
|
it_behaves_like "a non-collection model"
|
8
8
|
it_behaves_like "a potentially publishable object"
|
9
|
+
it_behaves_like "an object that can be captioned"
|
9
10
|
it_behaves_like "an object that can have an intermediate file"
|
10
11
|
it_behaves_like "an object that can be streamable"
|
11
12
|
|
@@ -19,8 +20,21 @@ RSpec.describe Component, type: :model, components: true do
|
|
19
20
|
|
20
21
|
describe "default structure" do
|
21
22
|
describe "no content" do
|
22
|
-
|
23
|
-
|
23
|
+
let(:expected) do
|
24
|
+
xml = <<-EOS
|
25
|
+
<mets xmlns="http://www.loc.gov/METS/" xmlns:xlink="http://www.w3.org/1999/xlink">
|
26
|
+
<metsHdr>
|
27
|
+
<agent ROLE="#{Ddr::Models::Structures::Agent::ROLE_CREATOR}">
|
28
|
+
<name>#{Ddr::Models::Structures::Agent::NAME_REPOSITORY_DEFAULT}</name>
|
29
|
+
</agent>
|
30
|
+
</metsHdr>
|
31
|
+
<structMap TYPE="#{Ddr::Models::Structure::TYPE_DEFAULT}" />
|
32
|
+
</mets>
|
33
|
+
EOS
|
34
|
+
xml
|
35
|
+
end
|
36
|
+
it "should be the appropriate structure" do
|
37
|
+
expect(described_class.new.default_structure.to_xml).to be_equivalent_to(expected)
|
24
38
|
end
|
25
39
|
end
|
26
40
|
describe "has content" do
|
@@ -80,6 +94,22 @@ RSpec.describe Component, type: :model, components: true do
|
|
80
94
|
end
|
81
95
|
end
|
82
96
|
end
|
97
|
+
describe "transcript" do
|
98
|
+
describe "with caption file" do
|
99
|
+
before do
|
100
|
+
allow(subject).to receive(:captioned?) { true }
|
101
|
+
end
|
102
|
+
it "has the correct structure file" do
|
103
|
+
expect(struct.uses[Ddr::Models::Structure::USE_TRANSCRIPT].first.href)
|
104
|
+
.to eq(Ddr::Datastreams::CAPTION)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
describe "without caption file" do
|
108
|
+
it "has the correct structure file" do
|
109
|
+
expect(struct.uses[Ddr::Models::Structure::USE_TRANSCRIPT]).to be nil
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
83
113
|
it "has the correct thumbnail image" do
|
84
114
|
expect(struct.uses[Ddr::Models::Structure::USE_THUMBNAIL_IMAGE].first.href).to eq(Ddr::Datastreams::THUMBNAIL)
|
85
115
|
end
|
@@ -27,56 +27,5 @@ module Ddr::Models
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
describe "#default_structure" do
|
31
|
-
describe "when the object has no children" do
|
32
|
-
it "should be nil" do
|
33
|
-
expect(subject.default_structure).to be_nil
|
34
|
-
end
|
35
|
-
end
|
36
|
-
describe "when the object has children" do
|
37
|
-
let(:child1) { FactoryGirl.create(:item) }
|
38
|
-
let(:child2) { FactoryGirl.create(:item) }
|
39
|
-
let(:expected) do
|
40
|
-
xml = <<-EOS
|
41
|
-
<mets xmlns="http://www.loc.gov/METS/" xmlns:xlink="http://www.w3.org/1999/xlink">
|
42
|
-
<metsHdr>
|
43
|
-
<agent ROLE="#{Ddr::Models::Structures::Agent::ROLE_CREATOR}">
|
44
|
-
<name>#{Ddr::Models::Structures::Agent::NAME_REPOSITORY_DEFAULT}</name>
|
45
|
-
</agent>
|
46
|
-
</metsHdr>
|
47
|
-
<structMap TYPE="#{Ddr::Models::Structure::TYPE_DEFAULT}">
|
48
|
-
<div ORDER="1">
|
49
|
-
<mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4bbb" />
|
50
|
-
</div>
|
51
|
-
<div ORDER="2">
|
52
|
-
<mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4aaa" />
|
53
|
-
</div>
|
54
|
-
</structMap>
|
55
|
-
</mets>
|
56
|
-
EOS
|
57
|
-
xml
|
58
|
-
end
|
59
|
-
before do
|
60
|
-
child1.local_id = "test002"
|
61
|
-
child1.permanent_id = "ark:/99999/fk4aaa"
|
62
|
-
child1.save!
|
63
|
-
child2.local_id = "test001"
|
64
|
-
child2.permanent_id = "ark:/99999/fk4bbb"
|
65
|
-
child2.save!
|
66
|
-
subject.children << child1
|
67
|
-
subject.children << child2
|
68
|
-
subject.save!
|
69
|
-
allow(SecureRandom).to receive(:uuid).and_return("abc-def", "ghi-jkl")
|
70
|
-
end
|
71
|
-
after do
|
72
|
-
child1.destroy
|
73
|
-
child2.destroy
|
74
|
-
end
|
75
|
-
it "should be the appropriate structure" do
|
76
|
-
expect(subject.default_structure.to_xml).to be_equivalent_to(expected)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
30
|
end
|
82
31
|
end
|