ddr-models 2.11.0 → 3.0.0.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (268) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/.travis.yml +7 -6
  4. data/Gemfile +2 -3
  5. data/Rakefile +5 -5
  6. data/app/controllers/users/sessions_controller.rb +5 -0
  7. data/app/helpers/models_helper.rb +7 -0
  8. data/app/models/attachment.rb +3 -5
  9. data/app/models/collection.rb +12 -79
  10. data/app/models/component.rb +8 -67
  11. data/app/models/item.rb +8 -73
  12. data/app/models/target.rb +6 -5
  13. data/config/initializers/active_fedora_base.rb +11 -30
  14. data/config/initializers/{active_fedora_datastream.rb → active_fedora_file.rb} +1 -1
  15. data/config/initializers/devise.rb +2 -3
  16. data/config/initializers/subscriptions.rb +2 -19
  17. data/ddr-models.gemspec +10 -14
  18. data/lib/ddr/actions/fixity_check.rb +1 -1
  19. data/lib/ddr/actions/virus_check.rb +17 -10
  20. data/lib/ddr/auth.rb +6 -38
  21. data/lib/ddr/auth/ability.rb +1 -5
  22. data/lib/ddr/auth/ability_definitions/collection_ability_definitions.rb +0 -16
  23. data/lib/ddr/auth/ability_definitions/datastream_ability_definitions.rb +10 -4
  24. data/lib/ddr/auth/ability_definitions/role_based_ability_definitions.rb +16 -9
  25. data/lib/ddr/auth/ability_factory.rb +25 -2
  26. data/lib/ddr/auth/abstract_ability.rb +1 -2
  27. data/lib/ddr/auth/auth_context.rb +0 -18
  28. data/lib/ddr/auth/auth_context_factory.rb +2 -0
  29. data/lib/ddr/auth/group.rb +0 -6
  30. data/lib/ddr/auth/grouper_gateway.rb +0 -24
  31. data/lib/ddr/auth/permissions.rb +1 -12
  32. data/lib/ddr/auth/role_based_access_controls_enforcement.rb +5 -5
  33. data/lib/ddr/auth/roles.rb +1 -11
  34. data/lib/ddr/auth/roles/role_set.rb +0 -7
  35. data/lib/ddr/auth/roles/roles_datastream.rb +9 -0
  36. data/lib/ddr/contacts.rb +25 -0
  37. data/lib/ddr/datastreams.rb +10 -28
  38. data/lib/ddr/datastreams/datastream_behavior.rb +30 -100
  39. data/lib/ddr/datastreams/descriptive_metadata_datastream.rb +28 -31
  40. data/lib/ddr/datastreams/fits_datastream.rb +9 -22
  41. data/lib/ddr/datastreams/metadata_datastream.rb +17 -31
  42. data/lib/ddr/derivatives.rb +13 -16
  43. data/lib/ddr/derivatives/derivative.rb +68 -0
  44. data/lib/ddr/derivatives/{generator.rb → generators/generator.rb} +11 -7
  45. data/lib/ddr/derivatives/generators/png_generator.rb +23 -0
  46. data/lib/ddr/derivatives/generators/ptif_generator.rb +56 -0
  47. data/lib/ddr/derivatives/multires_image.rb +59 -0
  48. data/lib/ddr/derivatives/thumbnail.rb +36 -0
  49. data/lib/ddr/events.rb +0 -1
  50. data/lib/ddr/events/deletion_event.rb +9 -5
  51. data/lib/ddr/events/event.rb +8 -13
  52. data/lib/ddr/events/fixity_check_event.rb +0 -6
  53. data/lib/ddr/events/ingestion_event.rb +9 -5
  54. data/lib/ddr/events/update_event.rb +4 -17
  55. data/lib/ddr/index.rb +4 -4
  56. data/lib/ddr/index/abstract_query_result.rb +4 -3
  57. data/lib/ddr/index/connection.rb +9 -28
  58. data/lib/ddr/index/csv_query_result.rb +32 -47
  59. data/lib/ddr/index/field.rb +1 -11
  60. data/lib/ddr/index/fields.rb +16 -99
  61. data/lib/ddr/index/filter.rb +30 -103
  62. data/lib/ddr/index/filters.rb +19 -0
  63. data/lib/ddr/index/query.rb +11 -58
  64. data/lib/ddr/index/query_builder.rb +36 -147
  65. data/lib/ddr/index/query_clause.rb +19 -79
  66. data/lib/ddr/index/query_result.rb +4 -36
  67. data/lib/ddr/index/query_value.rb +18 -0
  68. data/lib/ddr/index/response.rb +2 -19
  69. data/lib/ddr/jobs.rb +12 -0
  70. data/lib/ddr/jobs/fits_file_characterization.rb +51 -0
  71. data/lib/ddr/jobs/permanent_id.rb +23 -0
  72. data/lib/ddr/managers.rb +1 -0
  73. data/lib/ddr/managers/derivatives_manager.rb +53 -93
  74. data/lib/ddr/managers/permanent_id_manager.rb +91 -0
  75. data/lib/ddr/managers/technical_metadata_manager.rb +10 -24
  76. data/lib/ddr/managers/workflow_manager.rb +10 -29
  77. data/lib/ddr/models.rb +50 -101
  78. data/lib/ddr/models/access_controllable.rb +12 -0
  79. data/lib/ddr/models/admin_set.rb +5 -16
  80. data/lib/ddr/models/base.rb +45 -165
  81. data/lib/ddr/models/describable.rb +19 -21
  82. data/lib/ddr/models/engine.rb +11 -39
  83. data/lib/ddr/models/error.rb +0 -3
  84. data/lib/ddr/models/file_management.rb +36 -72
  85. data/lib/ddr/models/finding_aid.rb +2 -35
  86. data/lib/ddr/models/fixity_checkable.rb +4 -0
  87. data/lib/ddr/models/governable.rb +3 -1
  88. data/lib/ddr/models/has_admin_metadata.rb +82 -56
  89. data/lib/ddr/models/has_attachments.rb +3 -1
  90. data/lib/ddr/models/has_children.rb +3 -7
  91. data/lib/ddr/models/has_content.rb +35 -32
  92. data/lib/ddr/models/has_multires_image.rb +7 -12
  93. data/lib/ddr/models/has_struct_metadata.rb +44 -6
  94. data/lib/ddr/models/has_thumbnail.rb +1 -4
  95. data/lib/ddr/models/indexing.rb +97 -186
  96. data/lib/ddr/models/licenses/admin_policy_license.rb +11 -0
  97. data/lib/ddr/models/licenses/effective_license.rb +9 -0
  98. data/lib/ddr/models/licenses/inherited_license.rb +9 -0
  99. data/lib/ddr/models/licenses/license.rb +21 -0
  100. data/lib/ddr/models/licenses/parent_license.rb +11 -0
  101. data/lib/ddr/models/metadata/descriptive_metadata.rb +50 -0
  102. data/lib/ddr/models/metadata/metadata.rb +37 -0
  103. data/lib/ddr/models/metadata/metadata_mapper.rb +32 -0
  104. data/lib/ddr/models/metadata/metadata_mappers.rb +18 -0
  105. data/lib/ddr/models/metadata/metadata_term.rb +24 -0
  106. data/lib/ddr/models/metadata/metadata_vocabularies.rb +18 -0
  107. data/lib/ddr/models/metadata/metadata_vocabulary.rb +34 -0
  108. data/lib/ddr/models/solr_document.rb +24 -156
  109. data/lib/ddr/models/struct_div.rb +63 -0
  110. data/lib/ddr/models/structure.rb +39 -175
  111. data/lib/ddr/models/version.rb +1 -1
  112. data/lib/ddr/models/year_facet.rb +118 -60
  113. data/lib/ddr/notifications.rb +12 -10
  114. data/lib/ddr/utils.rb +15 -28
  115. data/lib/ddr/vocab.rb +17 -15
  116. data/lib/ddr/vocab/asset.rb +17 -42
  117. data/lib/ddr/vocab/contact.rb +7 -5
  118. data/lib/ddr/vocab/display.rb +8 -6
  119. data/lib/ddr/vocab/duke_terms.rb +10 -8
  120. data/lib/ddr/vocab/rdf_vocabulary_parser.rb +39 -37
  121. data/lib/ddr/vocab/roles.rb +19 -17
  122. data/lib/ddr/vocab/sources/duketerms.rdf +8 -22
  123. data/lib/ddr/vocab/vocabulary.rb +26 -26
  124. data/spec/auth/ability_factory_spec.rb +1 -18
  125. data/spec/auth/ability_spec.rb +15 -119
  126. data/spec/auth/effective_permissions_spec.rb +1 -1
  127. data/spec/auth/effective_roles_spec.rb +1 -1
  128. data/spec/auth/ldap_gateway_spec.rb +9 -0
  129. data/spec/contacts/contacts_spec.rb +26 -0
  130. data/spec/controllers/including_role_based_access_controls_enforcement_spec.rb +5 -5
  131. data/spec/derivatives/multires_image_spec.rb +48 -0
  132. data/spec/derivatives/png_generator_spec.rb +8 -13
  133. data/spec/derivatives/ptif_generator_spec.rb +11 -9
  134. data/spec/derivatives/thumbnail_spec.rb +48 -0
  135. data/spec/dummy/config/environments/test.rb +1 -1
  136. data/spec/dummy/db/schema.rb +23 -25
  137. data/spec/factories/attachment_factories.rb +2 -2
  138. data/spec/factories/collection_factories.rb +2 -3
  139. data/spec/factories/component_factories.rb +2 -2
  140. data/spec/factories/item_factories.rb +2 -2
  141. data/spec/factories/structure_factories.rb +2 -8
  142. data/spec/factories/test_model_factories.rb +12 -4
  143. data/spec/fixtures/fits/document.xml +44 -42
  144. data/spec/fixtures/fits/image.xml +41 -42
  145. data/spec/helpers/models_helper_spec.rb +11 -0
  146. data/spec/index/filter_spec.rb +30 -208
  147. data/spec/index/filters_spec.rb +17 -0
  148. data/spec/index/query_spec.rb +10 -82
  149. data/spec/jobs/fits_file_characterization_spec.rb +52 -0
  150. data/spec/managers/derivatives_manager_spec.rb +105 -107
  151. data/spec/managers/technical_metadata_manager_spec.rb +27 -34
  152. data/spec/models/active_fedora_base_spec.rb +105 -5
  153. data/spec/models/active_fedora_datastream_spec.rb +39 -106
  154. data/spec/models/admin_set_spec.rb +10 -43
  155. data/spec/models/attachment_spec.rb +2 -3
  156. data/spec/models/collection_spec.rb +11 -225
  157. data/spec/models/component_spec.rb +4 -106
  158. data/spec/models/descriptive_metadata_spec.rb +38 -0
  159. data/spec/models/effective_license_spec.rb +64 -0
  160. data/spec/models/events_spec.rb +59 -52
  161. data/spec/models/file_management_spec.rb +13 -113
  162. data/spec/models/finding_aid_spec.rb +8 -31
  163. data/spec/models/has_admin_metadata_spec.rb +122 -131
  164. data/spec/models/has_children_spec.rb +3 -3
  165. data/spec/models/has_struct_metadata_spec.rb +37 -50
  166. data/spec/models/indexing_spec.rb +23 -160
  167. data/spec/models/item_spec.rb +2 -133
  168. data/spec/models/license_spec.rb +24 -0
  169. data/spec/models/solr_document_spec.rb +47 -236
  170. data/spec/models/struct_div_spec.rb +70 -0
  171. data/spec/models/structure_spec.rb +11 -89
  172. data/spec/models/target_spec.rb +2 -4
  173. data/spec/models/year_facet_spec.rb +23 -50
  174. data/spec/spec_helper.rb +13 -17
  175. data/spec/support/ezid_mock_identifier.rb +2 -2
  176. data/spec/support/shared_examples_for_auth_contexts.rb +0 -33
  177. data/spec/support/shared_examples_for_ddr_models.rb +94 -142
  178. data/spec/support/shared_examples_for_describables.rb +36 -31
  179. data/spec/support/shared_examples_for_governables.rb +2 -3
  180. data/spec/support/shared_examples_for_has_content.rb +46 -101
  181. data/spec/support/shared_examples_for_indexing.rb +6 -6
  182. data/spec/support/shared_examples_for_non_collection_models.rb +1 -32
  183. data/spec/support/structural_metadata_helper.rb +59 -230
  184. data/spec/utils_spec.rb +2 -0
  185. metadata +96 -229
  186. data/.ruby-version +0 -1
  187. data/config/initializers/rsolr_monkey_patches.rb +0 -7
  188. data/config/initializers/rubydora_monkey_patch.rb +0 -11
  189. data/config/locales/ddr-models.en.yml +0 -81
  190. data/db/migrate/20161021201011_add_permanent_id_to_events.rb +0 -8
  191. data/lib/ddr/auth/ability_definitions/admin_set_ability_definitions.rb +0 -9
  192. data/lib/ddr/auth/ability_definitions/lock_ability_definitions.rb +0 -13
  193. data/lib/ddr/auth/ability_definitions/publication_ability_definitions.rb +0 -16
  194. data/lib/ddr/datastreams/administrative_metadata_datastream.rb +0 -75
  195. data/lib/ddr/datastreams/caption_datastream.rb +0 -5
  196. data/lib/ddr/datastreams/content_datastream.rb +0 -17
  197. data/lib/ddr/datastreams/delete_external_files.rb +0 -29
  198. data/lib/ddr/datastreams/external_file_datastream.rb +0 -80
  199. data/lib/ddr/datastreams/intermediate_file_datastream.rb +0 -5
  200. data/lib/ddr/datastreams/multires_image_datastream.rb +0 -5
  201. data/lib/ddr/datastreams/streamable_media_datastream.rb +0 -5
  202. data/lib/ddr/derivatives/png_generator.rb +0 -17
  203. data/lib/ddr/derivatives/ptif_generator.rb +0 -55
  204. data/lib/ddr/derivatives/update_derivatives.rb +0 -25
  205. data/lib/ddr/events/deaccession_event.rb +0 -8
  206. data/lib/ddr/index/field_attribute.rb +0 -22
  207. data/lib/ddr/index/query_params.rb +0 -40
  208. data/lib/ddr/index/sort_order.rb +0 -28
  209. data/lib/ddr/models/cache.rb +0 -20
  210. data/lib/ddr/models/captionable.rb +0 -37
  211. data/lib/ddr/models/contact.rb +0 -23
  212. data/lib/ddr/models/file_characterization.rb +0 -37
  213. data/lib/ddr/models/has_intermediate_file.rb +0 -41
  214. data/lib/ddr/models/language.rb +0 -31
  215. data/lib/ddr/models/media_type.rb +0 -22
  216. data/lib/ddr/models/permanent_id.rb +0 -240
  217. data/lib/ddr/models/rights_statement.rb +0 -25
  218. data/lib/ddr/models/streamable.rb +0 -37
  219. data/lib/ddr/models/structures/agent.rb +0 -49
  220. data/lib/ddr/models/structures/component_type_term.rb +0 -29
  221. data/lib/ddr/models/structures/div.rb +0 -64
  222. data/lib/ddr/models/structures/f_locat.rb +0 -54
  223. data/lib/ddr/models/structures/file.rb +0 -52
  224. data/lib/ddr/models/structures/file_grp.rb +0 -35
  225. data/lib/ddr/models/structures/file_sec.rb +0 -22
  226. data/lib/ddr/models/structures/fptr.rb +0 -31
  227. data/lib/ddr/models/structures/mets_hdr.rb +0 -37
  228. data/lib/ddr/models/structures/mptr.rb +0 -49
  229. data/lib/ddr/models/structures/struct_map.rb +0 -40
  230. data/lib/ddr/models/with_content_file.rb +0 -37
  231. data/spec/datastreams/external_file_datastream_spec.rb +0 -48
  232. data/spec/dummy/config/structure_component_type.yml +0 -18
  233. data/spec/fixtures/abcd1234.vtt +0 -38
  234. data/spec/fixtures/arrow1rightred_e0.gif +0 -0
  235. data/spec/fixtures/extractedText1.txt +0 -1
  236. data/spec/fixtures/extractedText2.txt +0 -1
  237. data/spec/fixtures/extractedText3.txt +0 -3
  238. data/spec/fixtures/imageA.jpg +0 -0
  239. data/spec/fixtures/imageB.jpg +0 -0
  240. data/spec/index/csv_query_result_spec.rb +0 -44
  241. data/spec/index/fields_spec.rb +0 -380
  242. data/spec/index/query_builder_spec.rb +0 -140
  243. data/spec/index/query_clause_spec.rb +0 -68
  244. data/spec/models/cache_spec.rb +0 -32
  245. data/spec/models/contact_spec.rb +0 -56
  246. data/spec/models/descriptive_metadata_datastream_spec.rb +0 -139
  247. data/spec/models/file_characterization_spec.rb +0 -39
  248. data/spec/models/language_spec.rb +0 -59
  249. data/spec/models/media_type_spec.rb +0 -46
  250. data/spec/models/permanent_id_spec.rb +0 -432
  251. data/spec/models/rights_statement_spec.rb +0 -55
  252. data/spec/models/structures/agent_spec.rb +0 -30
  253. data/spec/models/structures/component_type_term_spec.rb +0 -14
  254. data/spec/models/structures/div_spec.rb +0 -26
  255. data/spec/models/structures/f_locat_spec.rb +0 -78
  256. data/spec/models/structures/file_grp_spec.rb +0 -23
  257. data/spec/models/structures/file_sec_spec.rb +0 -22
  258. data/spec/models/structures/file_spec.rb +0 -60
  259. data/spec/models/structures/fptr_spec.rb +0 -23
  260. data/spec/models/structures/mets_hdr_spec.rb +0 -26
  261. data/spec/models/structures/mptr_spec.rb +0 -25
  262. data/spec/models/structures/struct_map_spec.rb +0 -24
  263. data/spec/models/with_content_file_spec.rb +0 -37
  264. data/spec/support/shared_examples_for_associations.rb +0 -8
  265. data/spec/support/shared_examples_for_captionable.rb +0 -23
  266. data/spec/support/shared_examples_for_has_intermediate_file.rb +0 -28
  267. data/spec/support/shared_examples_for_publication.rb +0 -43
  268. data/spec/support/shared_examples_for_streamable_media.rb +0 -23
@@ -1,62 +1,67 @@
1
1
  RSpec.shared_examples "a describable object" do
2
2
 
3
- context "having an identifier" do
3
+ let(:object) { described_class.new }
4
+
5
+ describe "having an identifier" do
4
6
  before do
5
- subject.identifier = ["id001"]
6
- subject.save!
7
+ object.descMetadata.identifier = ["id001"]
8
+ object.save(validate: false)
7
9
  end
8
- it "is findable by identifier" do
9
- expect(described_class.find_by_identifier('id001')).to include subject
10
+ it "should be findable by identifier" do
11
+ expect(described_class.find_by_identifier('id001')).to include object
10
12
  end
11
13
  end
14
+
12
15
  describe "#desc_metadata_terms" do
13
- it "has a default value" do
14
- expect(subject.desc_metadata_terms).to eq Ddr::Datastreams::DescriptiveMetadataDatastream.term_names
16
+ it "should have a default value" do
17
+ expect(object.desc_metadata_terms).to match_array(Ddr::Models::DescriptiveMetadata.unqualified_names)
15
18
  end
16
19
  describe "arguments" do
17
20
  it "with fixed results" do
18
- expect(subject.desc_metadata_terms(:dcterms)).to eq(Ddr::Vocab::Vocabulary.term_names(RDF::DC11) + (Ddr::Vocab::Vocabulary.term_names(RDF::DC) - Ddr::Vocab::Vocabulary.term_names(RDF::DC11)))
19
- expect(subject.desc_metadata_terms(:dcterms)).to match_array Ddr::Vocab::Vocabulary.term_names(RDF::DC)
20
- expect(subject.desc_metadata_terms(:duke)).to eq Ddr::Vocab::Vocabulary.term_names(Ddr::Vocab::DukeTerms)
21
- expect(subject.desc_metadata_terms(:dcterms_elements11)).to eq Ddr::Vocab::Vocabulary.term_names(RDF::DC11)
22
- expect(subject.desc_metadata_terms(:defined_attributes)).to match_array Ddr::Vocab::Vocabulary.term_names(RDF::DC11)
21
+ expect(object.desc_metadata_terms(:dcterms))
22
+ .to eq(Ddr::Models::MetadataMapper.dc11.unqualified_names + (Ddr::Models::MetadataMapper.dcterms.unqualified_names - Ddr::Models::MetadataMapper.dc11.unqualified_names))
23
+ expect(object.desc_metadata_terms(:dcterms))
24
+ .to match_array(Ddr::Models::MetadataMapper.dcterms.unqualified_names)
25
+ expect(object.desc_metadata_terms(:duke)).to eq Ddr::Vocab::Vocabulary.term_names(Ddr::Vocab::DukeTerms)
26
+ expect(object.desc_metadata_terms(:dcterms_elements11)).to eq Ddr::Vocab::Vocabulary.term_names(RDF::DC11)
27
+ expect(object.desc_metadata_terms(:defined_attributes)).to match_array Ddr::Vocab::Vocabulary.term_names(RDF::DC11)
23
28
  end
24
29
  context "with variable results" do
25
30
  before do
26
- subject.descMetadata.title = ["Object Title"]
27
- subject.descMetadata.creator = ["Duke University Libraries"]
28
- subject.descMetadata.identifier = ["id001"]
29
- subject.save!
31
+ object.descMetadata.title = ["Object Title"]
32
+ object.descMetadata.creator = ["Duke University Libraries"]
33
+ object.descMetadata.identifier = ["id001"]
34
+ object.save
30
35
  end
31
- it "accepts an :empty argument" do
32
- expect(subject.desc_metadata_terms(:empty)).to eq(subject.desc_metadata_terms - [:title, :creator, :identifier])
36
+ it "should accept an :empty argument" do
37
+ expect(object.desc_metadata_terms(:empty)).to eq(object.desc_metadata_terms - [:title, :creator, :identifier])
33
38
  end
34
- it "accepts a :present argument" do
35
- expect(subject.desc_metadata_terms(:present)).to match_array [:title, :creator, :identifier]
39
+ it "should accept a :present argument" do
40
+ expect(object.desc_metadata_terms(:present)).to match_array [:title, :creator, :identifier]
36
41
  end
37
42
  end
38
43
  end
39
44
  end
40
45
  describe "#set_desc_metadata" do
41
- let(:term_values_hash) { subject.desc_metadata_terms.each_with_object({}) {|t, memo| memo[t] = ["Value"]} }
42
- it "sets the descMetadata terms to the values of the matching keys in the hash" do
43
- subject.desc_metadata_terms.each do |t|
44
- expect(subject).to receive(:set_desc_metadata_values).with(t, ["Value"])
46
+ let(:term_values_hash) { object.desc_metadata_terms.each_with_object({}) {|t, memo| memo[t] = ["Value"]} }
47
+ it "should set the descMetadata terms to the values of the matching keys in the hash" do
48
+ object.desc_metadata_terms.each do |t|
49
+ expect(object).to receive(:set_desc_metadata_values).with(t, ["Value"])
45
50
  end
46
- subject.set_desc_metadata(term_values_hash)
51
+ object.set_desc_metadata(term_values_hash)
47
52
  end
48
53
  end
49
54
  describe "#set_desc_metadata_values" do
50
55
  context "when values == nil" do
51
- it "sets the term to an empty value" do
52
- subject.set_desc_metadata_values(:title, nil)
53
- expect(subject.descMetadata.title).to be_empty
56
+ it "should set the term to an empty value" do
57
+ object.set_desc_metadata_values(:title, nil)
58
+ expect(object.descMetadata.title).to be_empty
54
59
  end
55
60
  end
56
61
  context "when values is an array" do
57
- it "rejects empty values from the array" do
58
- subject.set_desc_metadata_values(:title, ["Object Title", nil, "Alternative Title", ""])
59
- expect(subject.descMetadata.title).to eq ["Object Title", "Alternative Title"]
62
+ it "should reject empty values from the array" do
63
+ object.set_desc_metadata_values(:title, ["Object Title", nil, "Alternative Title", ""])
64
+ expect(object.descMetadata.title).to eq ["Object Title", "Alternative Title"]
60
65
  end
61
66
  end
62
67
  end
@@ -1,9 +1,8 @@
1
1
  RSpec.shared_examples "a governable object" do
2
2
  let(:object) do
3
3
  described_class.new.tap do |obj|
4
- obj.title = [ 'Describable' ]
5
- obj.admin_set = "foo" if obj.is_a?(Collection)
6
- obj.identifier = [ 'id001' ]
4
+ obj.descMetadata.title = [ 'Describable' ]
5
+ obj.descMetadata.identifier = [ 'id001' ]
7
6
  obj.save(validate: false)
8
7
  end
9
8
  end
@@ -1,21 +1,12 @@
1
+ require 'spec_helper'
1
2
  require 'openssl'
2
3
 
3
4
  RSpec.shared_examples "an object that can have content" do
4
5
 
5
- subject { described_class.new(title: [ "I Have Content!" ]) }
6
+ subject { described_class.new(dc_title: [ "I Have Content!" ]) }
6
7
 
7
8
  before { allow(Resque).to receive(:enqueue) }
8
9
 
9
- its(:can_have_content?) { is_expected.to be true }
10
- it { is_expected.to_not have_content }
11
- specify {
12
- allow(subject.content).to receive(:has_content?) { true }
13
- expect(subject).to have_content
14
- }
15
-
16
- its(:can_have_children?) { is_expected.to be false }
17
- it { is_expected.to_not have_children }
18
-
19
10
  it "should delegate :validate_checksum! to :content" do
20
11
  checksum = "dea56f15b309e47b74fa24797f85245dda0ca3d274644a96804438bbd659555a"
21
12
  expect(subject.content).to receive(:validate_checksum!).with(checksum, "SHA-256")
@@ -29,51 +20,56 @@ RSpec.shared_examples "an object that can have content" do
29
20
  its(:last_virus_check_outcome) { should eq(virus_check.outcome) }
30
21
  end
31
22
 
32
- describe "indexing" do
33
- let(:file) { fixture_file_upload("imageA.tif", "image/tiff") }
34
- before { subject.upload file }
35
- it "should index the content ds control group" do
36
- expect(subject.to_solr).to include(Ddr::Index::Fields::CONTENT_CONTROL_GROUP)
37
- end
38
- end
39
-
40
23
  describe "extracted text" do
41
24
  describe "when it is not present" do
42
25
  its(:has_extracted_text?) { should be false }
43
- its(:to_solr) { is_expected.not_to include(Ddr::Index::Fields::EXTRACTED_TEXT) }
26
+ its(:to_solr) { should_not include(Ddr::Index::Fields::EXTRACTED_TEXT) }
44
27
  end
45
28
  describe "when it is present" do
46
29
  before { subject.extractedText.content = "This is my text. See Spot run." }
47
30
  its(:has_extracted_text?) { should be true }
48
- its(:to_solr) { is_expected.to include(Ddr::Index::Fields::EXTRACTED_TEXT) }
31
+ it "should be indexed" do
32
+ expect(subject.to_solr[Ddr::Index::Fields::EXTRACTED_TEXT]).to eq("This is my text. See Spot run.")
33
+ end
49
34
  end
50
35
  end
51
36
 
52
37
  describe "adding a file" do
53
38
  let(:file) { fixture_file_upload("imageA.tif", "image/tiff") }
54
- before { subject.add_file file, "content" }
55
- its(:original_filename) { should eq("imageA.tif") }
56
- its(:content_type) { should eq("image/tiff") }
57
- it "should create a 'virus check' event for the object" do
58
- expect(Ddr::Events::VirusCheckEvent).to receive(:create)
59
- subject.save!
39
+ context "defaults" do
40
+ before { subject.add_file file, path: "content", mime_type: "image/tiff" }
41
+ its(:content_type) { should eq("image/tiff") }
42
+ it "should create a 'virus check' event for the object" do
43
+ expect { subject.save }.to change { subject.virus_checks.count }
44
+ end
60
45
  end
61
46
  end
62
47
 
63
48
  describe "save" do
49
+
64
50
  describe "when new content is present" do
51
+
65
52
  context "and it's a new object" do
66
- before { subject.add_file file, "content" }
53
+ before { subject.add_file file, path: "content" }
67
54
  let(:file) { fixture_file_upload("imageA.tif", "image/tiff") }
68
55
  it "should generate derivatives" do
69
- expect_any_instance_of(Ddr::Managers::DerivativesManager).to receive(:update_derivatives)
56
+ expect(subject.derivatives).to receive(:update_derivatives)
70
57
  subject.save
71
58
  end
72
- it "should notify that content has changed" do
73
- callback = lambda { |*args| args }
74
- ActiveSupport::Notifications.subscribed(callback, "content_changed.content.repo_file") do
75
- expect(callback).to receive(:call) { nil }
76
- subject.save
59
+ describe "file characterization" do
60
+ context "characterize files is false" do
61
+ before { allow(Ddr::Models).to receive(:characterize_files?) { false } }
62
+ it "should not enqueue a FITS file characterization job" do
63
+ expect(Resque).to_not receive(:enqueue).with(Ddr::Jobs::FitsFileCharacterization, instance_of(String))
64
+ subject.save
65
+ end
66
+ end
67
+ context "characterize files is true" do
68
+ before { allow(Ddr::Models).to receive(:characterize_files?) { true } }
69
+ it "should enqueue a FITS file characterization job" do
70
+ expect(Resque).to receive(:enqueue).with(Ddr::Jobs::FitsFileCharacterization, instance_of(String))
71
+ subject.save
72
+ end
77
73
  end
78
74
  end
79
75
  end
@@ -82,36 +78,23 @@ RSpec.shared_examples "an object that can have content" do
82
78
  before { subject.upload! fixture_file_upload('imageA.tif', 'image/tiff') }
83
79
  let(:file) { fixture_file_upload("imageB.tif", "image/tiff") }
84
80
  it "should generate derivatives" do
85
- expect_any_instance_of(Ddr::Managers::DerivativesManager).to receive(:update_derivatives)
81
+ expect(subject.derivatives).to receive(:update_derivatives)
86
82
  subject.upload! file
87
83
  end
88
- it "should notify that content has changed" do
89
- callback = lambda { |*args| args }
90
- ActiveSupport::Notifications.subscribed(callback, "content_changed.content.repo_file") do
91
- expect(callback).to receive(:call) { nil }
92
- subject.upload! file
84
+ describe "file characterization" do
85
+ context "characterize files is false" do
86
+ before { allow(Ddr::Models).to receive(:characterize_files?) { false } }
87
+ it "should not enqueue a FITS file characterization job" do
88
+ expect(Resque).to_not receive(:enqueue).with(Ddr::Jobs::FitsFileCharacterization, instance_of(String))
89
+ subject.upload! file
90
+ end
93
91
  end
94
- end
95
- context "and it is saved with :skip_update_derivatives=>true" do
96
- it "does not generate derivatives" do
97
- expect_any_instance_of(Ddr::Managers::DerivativesManager).not_to receive(:update_derivatives)
98
- subject.upload file
99
- subject.save(skip_update_derivatives: true)
100
- end
101
- end
102
- context "and the file has not previously been characterized" do
103
- it "does not try to delete the existing characterization data" do
104
- expect(subject.fits).not_to receive(:delete)
105
- subject.upload! file
106
- end
107
- end
108
- context "and the file has new characterization data" do
109
- before {
110
- subject.fits.content = fixture_file_upload("fits/document.xml")
111
- }
112
- it "preserves the characterization data" do
113
- subject.upload! file
114
- expect(subject.reload.fits).to have_content
92
+ context "characterize files is true" do
93
+ before { allow(Ddr::Models).to receive(:characterize_files?) { true } }
94
+ it "should enqueue a FITS file characterization job" do
95
+ expect(Resque).to receive(:enqueue).with(Ddr::Jobs::FitsFileCharacterization, instance_of(String))
96
+ subject.upload! file
97
+ end
115
98
  end
116
99
  end
117
100
  end
@@ -121,7 +104,7 @@ RSpec.shared_examples "an object that can have content" do
121
104
  describe "#upload" do
122
105
  let(:file) { fixture_file_upload("imageA.tif", "image/tiff") }
123
106
  it "should add the file to the content datastream" do
124
- expect(subject).to receive(:add_file).with(file, "content", {})
107
+ expect(subject).to receive(:add_file).with(file, { path: "content" })
125
108
  subject.upload(file)
126
109
  end
127
110
  end
@@ -129,48 +112,10 @@ RSpec.shared_examples "an object that can have content" do
129
112
  describe "#upload!" do
130
113
  let(:file) { fixture_file_upload("imageA.tif", "image/tiff") }
131
114
  it "should add the file to the content datastream and save the object" do
132
- expect(subject).to receive(:add_file).with(file, "content", {}).and_call_original
115
+ expect(subject).to receive(:add_file).with(file, { path: "content" }).and_call_original
133
116
  expect(subject).to receive(:save)
134
117
  subject.upload!(file)
135
118
  end
136
119
  end
137
120
 
138
- describe "deleting / deaccessioning" do
139
- let(:file1) { fixture_file_upload("sample.pdf") }
140
- let(:file2) { fixture_file_upload("sample.docx") }
141
- before do
142
- subject.upload! file1
143
- @path1 = subject.content.file_path
144
- subject.upload! file2
145
- @path2 = subject.content.file_path
146
- end
147
- describe "#destroy" do
148
- it "deletes the content files" do
149
- expect(::File.exist?(@path1)).to be true
150
- expect(::File.exist?(@path2)).to be true
151
- subject.destroy
152
- expect(::File.exist?(@path1)).to be false
153
- expect(::File.exist?(@path2)).to be false
154
- end
155
- end
156
- describe "#deaccession" do
157
- it "deletes the content files" do
158
- expect(::File.exist?(@path1)).to be true
159
- expect(::File.exist?(@path2)).to be true
160
- subject.deaccession
161
- expect(::File.exist?(@path1)).to be false
162
- expect(::File.exist?(@path2)).to be false
163
- end
164
- end
165
- describe "deleting the 'content' datastream" do
166
- it "deletes the content files" do
167
- expect(::File.exist?(@path1)).to be true
168
- expect(::File.exist?(@path2)).to be true
169
- subject.content.delete
170
- expect(::File.exist?(@path1)).to be false
171
- expect(::File.exist?(@path2)).to be false
172
- end
173
- end
174
- end
175
-
176
121
  end
@@ -3,13 +3,13 @@ RSpec.shared_examples "an object that has a display title" do
3
3
  let(:object) { described_class.new }
4
4
  subject { object.title_display }
5
5
  context "has title" do
6
- before { object.title = [ 'Title' ] }
6
+ before { object.descMetadata.title = [ 'Title' ] }
7
7
  it "should return the first title" do
8
8
  expect(subject).to eq('Title')
9
9
  end
10
10
  end
11
11
  context "has no title, has identifier" do
12
- before { object.identifier = [ 'id001' ] }
12
+ before { object.descMetadata.identifier = [ 'id001' ] }
13
13
  it "should return the first identifier" do
14
14
  expect(subject).to eq('id001')
15
15
  end
@@ -27,9 +27,9 @@ RSpec.shared_examples "an object that has a display title" do
27
27
  # end
28
28
  # end
29
29
  context "has no title, no identifier, no original_filename" do
30
- let(:object) { described_class.new(:pid => 'duke:test') }
30
+ let(:object) { described_class.new(:pid => 'duke-test') }
31
31
  it "should return the PID in square brackets" do
32
- expect(subject).to eq "[duke:test]"
32
+ expect(subject).to eq "[duke-test]"
33
33
  end
34
34
  end
35
35
  end
@@ -41,7 +41,7 @@ RSpec.shared_examples "an object that has identifiers" do
41
41
  subject { object.all_identifiers }
42
42
  context "has descriptive identifiers, local ID, permanent ID, and PID" do
43
43
  before do
44
- object.identifier = [ 'ID001', 'ID002' ]
44
+ object.descMetadata.identifier = [ 'ID001', 'ID002' ]
45
45
  object.local_id = 'LOCAL_ID_A'
46
46
  object.permanent_id = 'ark:/999999/cd3'
47
47
  end
@@ -56,4 +56,4 @@ RSpec.shared_examples "an object that has identifiers" do
56
56
  end
57
57
  end
58
58
  end
59
- end
59
+ end
@@ -3,39 +3,8 @@ RSpec.shared_examples "a non-collection model" do
3
3
  subject { described_class.new }
4
4
  let(:user) { FactoryGirl.build(:user) }
5
5
  before { subject.grant_roles_to_creator(user) }
6
- it "includes the Editor role in resource scope" do
6
+ it "should include the Editor role in resource scope" do
7
7
  expect(subject.roles.to_a).to eq([Ddr::Auth::Roles::Role.build(type: "Editor", agent: user.agent, scope: "resource")])
8
8
  end
9
9
  end
10
-
11
- describe "admin set" do
12
- subject { described_class.new }
13
- let(:collection) { FactoryGirl.build(:collection) }
14
- let(:admin_set) { Ddr::Models::AdminSet.new(code: "foobar", title: "FooBar") }
15
- before {
16
- allow(Ddr::Models::AdminSet).to receive(:find_by_code).with("foobar") { admin_set }
17
- collection.admin_set = "foobar"
18
- collection.save!
19
- subject.admin_policy = collection
20
- }
21
- it "indexes the admin set title" do
22
- expect(subject.to_solr[Ddr::Index::Fields::ADMIN_SET_TITLE]).to eq("FooBar")
23
- end
24
- end
25
-
26
- describe "collection title" do
27
- subject { described_class.new }
28
- let(:collection) { FactoryGirl.create(:collection) }
29
- before {
30
- subject.admin_policy = collection
31
- }
32
- it "indexes the collection title" do
33
- expect(subject.to_solr[Ddr::Index::Fields::COLLECTION_TITLE]).to eq("Test Collection")
34
- end
35
- end
36
-
37
- describe "attachments" do
38
- its(:can_have_attachments?) { is_expected.to be false }
39
- it { is_expected.not_to have_attachments }
40
- end
41
10
  end
@@ -1,19 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  def simple_structure_document
4
- Nokogiri::XML(simple_structure_xml) do |config|
4
+ Nokogiri::XML(simple_structure) do |config|
5
5
  config.noblanks
6
6
  end
7
7
  end
8
8
 
9
9
  def nested_structure_document
10
- Nokogiri::XML(nested_structure_xml) do |config|
11
- config.noblanks
12
- end
13
- end
14
-
15
- def nested_structure_mptr_document
16
- Nokogiri::XML(nested_structure_mptr_xml) do |config|
10
+ Nokogiri::XML(nested_structure) do |config|
17
11
  config.noblanks
18
12
  end
19
13
  end
@@ -24,99 +18,38 @@ def multiple_struct_maps_structure_document
24
18
  end
25
19
  end
26
20
 
27
- def simple_structure_xml
21
+ def simple_structure
28
22
  <<-eos
29
23
  <mets xmlns="http://www.loc.gov/METS/" xmlns:xlink="http://www.w3.org/1999/xlink">
30
- <metsHdr>
31
- <agent ROLE="CREATOR">
32
- <name>#{Ddr::Models::Structures::Agent::NAME_REPOSITORY_DEFAULT}</name>
33
- </agent>
34
- </metsHdr>
35
- <fileSec>
36
- <fileGrp>
37
- <file ID="abc" USE="foo">
38
- <FLocat LOCTYPE="ARK" xlink:href="ark:/99999/fk4ab3" />
39
- </file>
40
- <file ID="def" USE="bar">
41
- <FLocat LOCTYPE="ARK" xlink:href="ark:/99999/fk4cd9" />
42
- </file>
43
- <file ID="ghi" USE="baz">
44
- <FLocat LOCTYPE="ARK" xlink:href="ark:/99999/fk4ef1" />
45
- </file>
46
- </fileGrp>
47
- </fileSec>
48
24
  <structMap TYPE="default">
49
25
  <div ORDER="1">
50
- <fptr FILEID="abc" />
26
+ <fptr CONTENTIDS="info:fedora/test:6" />
51
27
  </div>
52
28
  <div ORDER="2">
53
- <fptr FILEID="def" />
29
+ <fptr CONTENTIDS="info:fedora/test:5" />
54
30
  </div>
55
31
  <div ORDER="3">
56
- <fptr FILEID="ghi" />
32
+ <fptr CONTENTIDS="info:fedora/test:7" />
57
33
  </div>
58
34
  </structMap>
59
35
  </mets>
60
36
  eos
61
37
  end
62
38
 
63
- def nested_structure_xml
39
+ def nested_structure
64
40
  <<-eos
65
41
  <mets xmlns="http://www.loc.gov/METS/" xmlns:xlink="http://www.w3.org/1999/xlink">
66
- <metsHdr>
67
- <agent ROLE="CREATOR">
68
- <name>Sam Spade</name>
69
- </agent>
70
- </metsHdr>
71
- <fileSec>
72
- <fileGrp>
73
- <file ID="abc" USE="foo">
74
- <FLocat LOCTYPE="ARK" xlink:href="ark:/99999/fk4ab3" />
75
- </file>
76
- <file ID="def" USE="bar">
77
- <FLocat LOCTYPE="ARK" xlink:href="ark:/99999/fk4cd9" />
78
- </file>
79
- <file ID="ghi" USE="baz">
80
- <FLocat LOCTYPE="ARK" xlink:href="ark:/99999/fk4ef1" />
81
- </file>
82
- </fileGrp>
83
- </fileSec>
84
42
  <structMap TYPE="default">
85
43
  <div ORDER="1" LABEL="Front">
86
- <fptr FILEID="abc" />
44
+ <fptr CONTENTIDS="info:fedora/test:5" />
87
45
  </div>
88
46
  <div ORDER="2" LABEL="Back">
89
47
  <div ORDER="1" LABEL="Top">
90
- <fptr FILEID="def" />
91
- </div>
92
- <div ORDER="2" LABEL="Bottom">
93
- <fptr FILEID="ghi" />
94
- </div>
95
- </div>
96
- </structMap>
97
- </mets>
98
- eos
99
- end
100
-
101
- def nested_structure_mptr_xml
102
- <<-eos
103
- <mets xmlns="http://www.loc.gov/METS/" xmlns:xlink="http://www.w3.org/1999/xlink">
104
- <metsHdr>
105
- <agent ROLE="CREATOR">
106
- <name>Sam Spade</name>
107
- </agent>
108
- </metsHdr>
109
- <structMap TYPE="default">
110
- <div ORDER="1" LABEL="Front">
111
- <mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4ab3" />
112
- </div>
113
- <div ORDER="2" LABEL="Back">
114
- <div ORDER="1" LABEL="Top">
115
- <mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4cd9" />
116
- </div>
48
+ <fptr CONTENTIDS="info:fedora/test:7" />
49
+ </div>
117
50
  <div ORDER="2" LABEL="Bottom">
118
- <mptr LOCTYPE="ARK" xlink:href="ark:/99999/fk4ef1" />
119
- </div>
51
+ <fptr CONTENTIDS="info:fedora/test:6" />
52
+ </div>
120
53
  </div>
121
54
  </structMap>
122
55
  </mets>
@@ -126,181 +59,77 @@ end
126
59
  def multiple_struct_maps_structure
127
60
  <<-eos
128
61
  <mets xmlns="http://www.loc.gov/METS/" xmlns:xlink="http://www.w3.org/1999/xlink">
129
- <fileSec>
130
- <fileGrp>
131
- <file ID="abc" USE="foo">
132
- <FLocat LOCTYPE="ARK" xlink:href="ark:/99999/fk4ab3" />
133
- </file>
134
- <file ID="def" USE="bar">
135
- <FLocat LOCTYPE="ARK" xlink:href="ark:/99999/fk4cd9" />
136
- </file>
137
- <file ID="ghi" USE="baz">
138
- <FLocat LOCTYPE="ARK" xlink:href="ark:/99999/fk4ef1" />
139
- </file>
140
- </fileGrp>
141
- </fileSec>
142
62
  <structMap TYPE="default">
143
63
  <div ORDER="1" LABEL="Front">
144
- <fptr FILEID="abc" />
64
+ <fptr CONTENTIDS="info:fedora/test:5" />
145
65
  </div>
146
66
  <div ORDER="2" LABEL="Back">
147
67
  <div ORDER="1" LABEL="Top">
148
- <fptr FILEID="def" />
149
- </div>
68
+ <fptr CONTENTIDS="info:fedora/test:7" />
69
+ </div>
150
70
  <div ORDER="2" LABEL="Bottom">
151
- <fptr FILEID="ghi" />
152
- </div>
71
+ <fptr CONTENTIDS="info:fedora/test:6" />
72
+ </div>
153
73
  </div>
154
74
  </structMap>
155
75
  <structMap TYPE="reverse">
156
76
  <div ORDER="1" LABEL="Back">
157
77
  <div ORDER="1" LABEL="Bottom">
158
- <fptr FILEID="ghi" />
78
+ <fptr CONTENTIDS="info:fedora/test:6" />
159
79
  </div>
160
80
  <div ORDER="2" LABEL="Top">
161
- <fptr FILEID="def" />
162
- </div>
81
+ <fptr CONTENTIDS="info:fedora/test:7" />
82
+ </div>
163
83
  </div>
164
84
  <div ORDER="2" LABEL="Front">
165
- <fptr FILEID="abc" />
85
+ <fptr CONTENTIDS="info:fedora/test:5" />
166
86
  </div>
167
87
  </structMap>
168
88
  </mets>
169
89
  eos
170
90
  end
171
91
 
172
- def simple_structure_dereferenced_hash
173
- yaml = <<-eos
174
- default:
175
- :type: 'default'
176
- :contents:
177
- - :order: '1'
178
- :contents:
179
- - :repo_id: 'test:7'
180
- :use: 'foo'
181
- - :order: '2'
182
- :contents:
183
- - :repo_id: 'test:8'
184
- :use: 'bar'
185
- - :order: '3'
186
- :contents:
187
- - :repo_id: 'test:9'
188
- :use: 'baz'
189
- eos
190
- YAML.load(yaml)
191
- end
192
-
193
- def nested_structure_dereferenced_hash
194
- yaml = <<-eos
195
- default:
196
- :type: 'default'
197
- :contents:
198
- - :label: 'Front'
199
- :order: '1'
200
- :contents:
201
- - :repo_id: 'test:7'
202
- :use: 'foo'
203
- - :label: 'Back'
204
- :order: '2'
205
- :contents:
206
- - :label: 'Top'
207
- :order: '1'
208
- :contents:
209
- - :repo_id: 'test:8'
210
- :use: 'bar'
211
- - :label: 'Bottom'
212
- :order: '2'
213
- :contents:
214
- - :repo_id: 'test:9'
215
- :use: 'baz'
216
- eos
217
- YAML.load(yaml)
218
- end
219
-
220
- def nested_structure_mptr_dereferenced_hash
221
- yaml = <<-eos
222
- default:
223
- :type: 'default'
224
- :contents:
225
- - :label: 'Front'
226
- :order: '1'
227
- :contents:
228
- - :repo_id: 'test:7'
229
- - :label: 'Back'
230
- :order: '2'
231
- :contents:
232
- - :label: 'Top'
233
- :order: '1'
234
- :contents:
235
- - :repo_id: 'test:8'
236
- - :label: 'Bottom'
237
- :order: '2'
238
- :contents:
239
- - :repo_id: 'test:9'
240
- eos
241
- YAML.load(yaml)
242
- end
243
-
244
- def multiple_struct_maps_structure_dereferenced_hash
245
- yaml = <<-eos
246
- default:
247
- :type: 'default'
248
- :contents:
249
- - :label: 'Front'
250
- :order: '1'
251
- :contents:
252
- - :repo_id: 'test:7'
253
- :use: 'foo'
254
- - :label: 'Back'
255
- :order: '2'
256
- :contents:
257
- - :label: 'Top'
258
- :order: '1'
259
- :contents:
260
- - :repo_id: 'test:8'
261
- :use: 'bar'
262
- - :label: 'Bottom'
263
- :order: '2'
264
- :contents:
265
- - :repo_id: 'test:9'
266
- :use: 'baz'
267
- reverse:
268
- :type: 'reverse'
269
- :contents:
270
- - :label: 'Back'
271
- :order: '1'
272
- :contents:
273
- - :label: 'Bottom'
274
- :order: '1'
275
- :contents:
276
- - :repo_id: 'test:9'
277
- :use: 'baz'
278
- - :label: 'Top'
279
- :order: '2'
280
- :contents:
281
- - :repo_id: 'test:8'
282
- :use: 'bar'
283
- - :label: 'Front'
284
- :order: '2'
285
- :contents:
286
- - :repo_id: 'test:7'
287
- :use: 'foo'
288
- eos
289
- YAML.load(yaml)
92
+ def simple_structure_query_response
93
+ [{"system_create_dtsi"=>"2015-06-17T21:04:24Z", "system_modified_dtsi"=>"2015-06-17T21:04:56Z", "object_state_ssi"=>"A", "active_fedora_model_ssi"=>"Component", "id"=>"test:6", "object_profile_ssm"=>["{\"datastreams\":{\"RELS-EXT\":{\"dsLabel\":\"Fedora Object-to-Object Relationship Metadata\",\"dsVersionID\":\"RELS-EXT.1\",\"dsCreateDate\":\"2015-06-17T21:04:56Z\",\"dsState\":\"A\",\"dsMIME\":\"application/rdf+xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"X\",\"dsSize\":408,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"test:6+RELS-EXT+RELS-EXT.1\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"bf84faa89d6b25924bc06357f7c33347a602e2ec8df9c1020ec98015fe571760\"},\"descMetadata\":{\"dsLabel\":\"Descriptive Metadata for this object\",\"dsVersionID\":\"descMetadata.1\",\"dsCreateDate\":\"2015-06-17T21:04:56Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":70,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"test:6+descMetadata+descMetadata.1\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"4d227bc972634ba2126eefff207fb3b35f6ff802a210ad7945d2ec60360076dd\"},\"rightsMetadata\":{},\"properties\":{},\"thumbnail\":{},\"adminMetadata\":{},\"content\":{},\"extractedText\":{},\"multiresImage\":{},\"structMetadata\":{}},\"objLabel\":null,\"objOwnerId\":\"fedoraAdmin\",\"objModels\":[\"info:fedora/fedora-system:FedoraObject-3.0\"],\"objCreateDate\":\"2015-06-17T21:04:24Z\",\"objLastModDate\":\"2015-06-17T21:04:24Z\",\"objDissIndexViewURL\":\"http://localhost:8983/fedora/objects/test%3A6/methods/fedora-system%3A3/viewMethodIndex\",\"objItemIndexViewURL\":\"http://localhost:8983/fedora/objects/test%3A6/methods/fedora-system%3A3/viewItemIndex\",\"objState\":\"A\"}"], "identifier_tesim"=>["abc001"], "is_part_of_ssim"=>["info:fedora/test:2"], "has_model_ssim"=>["info:fedora/afmodel:Component"], "title_ssi"=>"abc001", "internal_uri_ssi"=>"info:fedora/test:6", "identifier_ssi"=>"abc001", "access_role_ssi"=>"[]", "_version_"=>1504261016868880384, "timestamp"=>"2015-06-17T21:04:56.958Z"}, {"system_create_dtsi"=>"2015-06-17T21:03:58Z", "system_modified_dtsi"=>"2015-06-17T21:04:54Z", "object_state_ssi"=>"A", "active_fedora_model_ssi"=>"Component", "id"=>"test:5", "object_profile_ssm"=>["{\"datastreams\":{\"RELS-EXT\":{\"dsLabel\":\"Fedora Object-to-Object Relationship Metadata\",\"dsVersionID\":\"RELS-EXT.1\",\"dsCreateDate\":\"2015-06-17T21:04:54Z\",\"dsState\":\"A\",\"dsMIME\":\"application/rdf+xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"X\",\"dsSize\":408,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"test:5+RELS-EXT+RELS-EXT.1\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"6a7f1cbe6e435991ae3bba134e52e7a275af8a232b209ac725fa54fdd81bb973\"},\"descMetadata\":{\"dsLabel\":\"Descriptive Metadata for this object\",\"dsVersionID\":\"descMetadata.1\",\"dsCreateDate\":\"2015-06-17T21:04:54Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":70,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"test:5+descMetadata+descMetadata.1\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"8b106726ca2d39d9a2e187fc9da2e58b25bd3553031012515ae31cf4fbe520e9\"},\"rightsMetadata\":{},\"properties\":{},\"thumbnail\":{},\"adminMetadata\":{},\"content\":{},\"extractedText\":{},\"multiresImage\":{},\"structMetadata\":{}},\"objLabel\":null,\"objOwnerId\":\"fedoraAdmin\",\"objModels\":[\"info:fedora/fedora-system:FedoraObject-3.0\"],\"objCreateDate\":\"2015-06-17T21:03:58Z\",\"objLastModDate\":\"2015-06-17T21:03:58Z\",\"objDissIndexViewURL\":\"http://localhost:8983/fedora/objects/test%3A5/methods/fedora-system%3A3/viewMethodIndex\",\"objItemIndexViewURL\":\"http://localhost:8983/fedora/objects/test%3A5/methods/fedora-system%3A3/viewItemIndex\",\"objState\":\"A\"}"], "identifier_tesim"=>["abc002"], "is_part_of_ssim"=>["info:fedora/test:2"], "has_model_ssim"=>["info:fedora/afmodel:Component"], "title_ssi"=>"abc002", "internal_uri_ssi"=>"info:fedora/test:5", "identifier_ssi"=>"abc002", "access_role_ssi"=>"[]", "_version_"=>1504261014501195776, "timestamp"=>"2015-06-17T21:04:54.701Z"}, {"system_create_dtsi"=>"2015-06-17T21:04:46Z", "system_modified_dtsi"=>"2015-06-17T21:04:59Z", "object_state_ssi"=>"A", "active_fedora_model_ssi"=>"Component", "id"=>"test:7", "object_profile_ssm"=>["{\"datastreams\":{\"RELS-EXT\":{\"dsLabel\":\"Fedora Object-to-Object Relationship Metadata\",\"dsVersionID\":\"RELS-EXT.1\",\"dsCreateDate\":\"2015-06-17T21:04:59Z\",\"dsState\":\"A\",\"dsMIME\":\"application/rdf+xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"X\",\"dsSize\":408,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"test:7+RELS-EXT+RELS-EXT.1\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"cb385ff9a55b5fe24e8c2a8159fc928e3ee582ef312955132d34282676102a6a\"},\"descMetadata\":{\"dsLabel\":\"Descriptive Metadata for this object\",\"dsVersionID\":\"descMetadata.1\",\"dsCreateDate\":\"2015-06-17T21:04:59Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":70,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"test:7+descMetadata+descMetadata.1\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"523ee1e5d55d188bd17b2789e4c9109c8f9d0170b63af1219de8a74d4f32966a\"},\"rightsMetadata\":{},\"properties\":{},\"thumbnail\":{},\"adminMetadata\":{},\"content\":{},\"extractedText\":{},\"multiresImage\":{},\"structMetadata\":{}},\"objLabel\":null,\"objOwnerId\":\"fedoraAdmin\",\"objModels\":[\"info:fedora/fedora-system:FedoraObject-3.0\"],\"objCreateDate\":\"2015-06-17T21:04:46Z\",\"objLastModDate\":\"2015-06-17T21:04:46Z\",\"objDissIndexViewURL\":\"http://localhost:8983/fedora/objects/test%3A7/methods/fedora-system%3A3/viewMethodIndex\",\"objItemIndexViewURL\":\"http://localhost:8983/fedora/objects/test%3A7/methods/fedora-system%3A3/viewItemIndex\",\"objState\":\"A\"}"], "identifier_tesim"=>["abc003"], "is_part_of_ssim"=>["info:fedora/test:2"], "has_model_ssim"=>["info:fedora/afmodel:Component"], "title_ssi"=>"abc003", "internal_uri_ssi"=>"info:fedora/test:7", "identifier_ssi"=>"abc003", "access_role_ssi"=>"[]", "_version_"=>1504261019487174656, "timestamp"=>"2015-06-17T21:04:59.455Z"}]
290
94
  end
291
95
 
292
96
  def simple_structure_to_json
293
- simple_structure_dereferenced_hash.to_json
294
- end
295
-
296
- def nested_structure_to_json
297
- nested_structure_dereferenced_hash.to_json
298
- end
299
-
300
- def nested_structure_mptr_to_json
301
- nested_structure_mptr_dereferenced_hash.to_json
97
+ j = <<-eos
98
+ {\"default\":
99
+ {\"type\":\"default\",
100
+ \"divs\":[{\"order\":\"1\",\"fptrs\":[\"test:6\"],\"divs\":[]},
101
+ {\"order\":\"2\",\"fptrs\":[\"test:5\"],\"divs\":[]},
102
+ {\"order\":\"3\",\"fptrs\":[\"test:7\"],\"divs\":[]}
103
+ ]
104
+ }
105
+ }
106
+ eos
107
+ j.gsub(/\s+/, "")
302
108
  end
303
109
 
304
110
  def multiple_struct_maps_structure_to_json
305
- multiple_struct_maps_structure_dereferenced_hash.to_json
306
- end
111
+ j = <<-eos
112
+ {\"default\":
113
+ {\"type\":\"default\",
114
+ \"divs\":[{\"label\":\"Front\",\"order\":\"1\",\"fptrs\":[\"test:5\"],\"divs\":[]},
115
+ {\"label\":\"Back\",\"order\":\"2\",\"fptrs\":[],
116
+ \"divs\":[{\"label\":\"Top\",\"order\":\"1\",\"fptrs\":[\"test:7\"],\"divs\":[]},
117
+ {\"label\":\"Bottom\",\"order\":\"2\",\"fptrs\":[\"test:6\"],\"divs\":[]}
118
+ ]
119
+ }
120
+ ]
121
+ },
122
+ \"reverse\":
123
+ {\"type\":\"reverse\",
124
+ \"divs\":[{\"label\":\"Back\",\"order\":\"1\",\"fptrs\":[],
125
+ \"divs\":[{\"label\":\"Bottom\",\"order\":\"1\",\"fptrs\":[\"test:6\"],\"divs\":[]},
126
+ {\"label\":\"Top\",\"order\":\"2\",\"fptrs\":[\"test:7\"],\"divs\":[]}
127
+ ]
128
+ },
129
+ {\"label\":\"Front\",\"order\":\"2\",\"fptrs\":[\"test:5\"],\"divs\":[]}
130
+ ]
131
+ }
132
+ }
133
+ eos
134
+ j.gsub(/\s+/, "")
135
+ end