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
@@ -15,32 +15,15 @@ module Ddr::Models
15
15
  findaidstatus="published"
16
16
  langencoding="iso639-2b"
17
17
  repositoryencoding="iso15511">
18
- <eadid url="http://example.com/ead/">ead</eadid>
19
- <filedesc>
20
- <titlestmt>
21
- <titleproper>Guide to the Perplexed
22
- <num>00001</num>
23
- </titleproper>
24
- </titlestmt>
25
- </filedesc>
18
+ <eadid url="http://example.com/ead/">ead</eadid>
19
+ <filedesc>
20
+ <titlestmt>
21
+ <titleproper>Guide to the Perplexed
22
+ <num>00001</num>
23
+ </titleproper>
24
+ </titlestmt>
25
+ </filedesc>
26
26
  </eadheader>
27
- <archdesc level="collection">
28
- <did>
29
- <repository>
30
- <corpname>Library of the Perplexed</corpname>
31
- </repository>
32
- <unittitle>Perplexities</unittitle>
33
- <unitid>RL.00327</unitid>
34
- <physdesc altrender="whole">
35
- <extent altrender="materialtype spaceoccupied">6.5 Linear Feet</extent>
36
- </physdesc>
37
- <unitdate normal="1876/1953" type="inclusive">1876-1953</unitdate>
38
- <abstract>Abstract of Perplexities.</abstract>
39
- <physdesc id="aspace_foobar">
40
- <extent>4000 Items</extent>
41
- </physdesc>
42
- </did>
43
- </archdesc>
44
27
  </ead>
45
28
  EOS
46
29
  end
@@ -51,12 +34,6 @@ EOS
51
34
 
52
35
  its(:title) { is_expected.to eq("Guide to the Perplexed") }
53
36
  its(:url) { is_expected.to eq("http://example.com/ead/") }
54
- its(:repository) { is_expected.to eq("Library of the Perplexed") }
55
- its(:collection_date_span) { is_expected.to eq("1876-1953") }
56
- its(:collection_number) { is_expected.to eq("RL.00327") }
57
- its(:collection_title) { is_expected.to eq("Perplexities") }
58
- its(:extent) { is_expected.to eq("6.5 Linear Feet; 4000 Items") }
59
- its(:abstract) { is_expected.to eq("Abstract of Perplexities.") }
60
37
 
61
38
  end
62
39
  end
@@ -4,80 +4,142 @@ require 'support/ezid_mock_identifier'
4
4
  module Ddr::Models
5
5
  RSpec.describe HasAdminMetadata, type: :model, contacts: true do
6
6
 
7
- describe "workflow" do
8
- let(:collection) { FactoryGirl.create(:collection) }
9
- let(:item) { FactoryGirl.create(:item) }
10
- let(:component) { FactoryGirl.create(:component) }
11
- before do
12
- item.parent = collection
13
- item.save!
14
- component.parent = item
15
- component.save!
7
+ describe "permanent id and permanent url" do
8
+ subject { FactoryGirl.build(:item) }
9
+
10
+ describe "#assign_permanent_id!" do
11
+ it "should assign the permanent id later" do
12
+ expect(subject.permanent_id_manager).to receive(:assign_later) { nil }
13
+ subject.assign_permanent_id!
14
+ end
15
+ context "when the object is created (first saved)" do
16
+ context "and auto-assignment is enabled" do
17
+ before { allow(Ddr::Models).to receive(:auto_assign_permanent_ids) { true } }
18
+ it "should assign a permanent id" do
19
+ expect(subject).to receive(:assign_permanent_id!) { nil }
20
+ subject.save!
21
+ end
22
+ end
23
+ context "and auto-assignment is disabled" do
24
+ before { allow(Ddr::Models).to receive(:auto_assign_permanent_ids) { false } }
25
+ it "should not assign a permanent id" do
26
+ expect(subject).not_to receive(:assign_permanent_id!)
27
+ subject.save!
28
+ end
29
+ end
30
+ end
31
+ context "when saved" do
32
+ context "and auto-assignment is enabled" do
33
+ before { allow(Ddr::Models).to receive(:auto_assign_permanent_ids) { true } }
34
+ it "should assign a permanent id once" do
35
+ expect(subject).to receive(:assign_permanent_id!).once { nil }
36
+ subject.save!
37
+ subject.dc_title = ["New Title"]
38
+ subject.save!
39
+ end
40
+ end
41
+ context "and auto-assignment is disabled" do
42
+ before { allow(Ddr::Models).to receive(:auto_assign_permanent_ids) { false } }
43
+ it "should not assign a permanent id" do
44
+ expect(subject).not_to receive(:assign_permanent_id!)
45
+ subject.save!
46
+ end
47
+ end
48
+ end
16
49
  end
17
50
 
18
- describe "#published?" do
19
- subject { collection }
20
- context "object is published" do
21
- before { subject.workflow_state = Ddr::Managers::WorkflowManager::PUBLISHED }
22
- it { is_expected.to be_published }
51
+ describe "lifecycle" do
52
+ let!(:identifier) { Ezid::MockIdentifier.new(id: "ark:/99999/fk4zzz", status: "public") }
53
+ before do
54
+ allow(Ddr::Models).to receive(:auto_assign_permanent_ids) { false }
55
+ allow(Ezid::Identifier).to receive(:find).with("ark:/99999/fk4zzz") { identifier }
56
+ subject.permanent_id = "ark:/99999/fk4zzz"
57
+ subject.save!
23
58
  end
24
- context "object workflow is not set" do
25
- before { subject.workflow_state = nil }
26
- it { is_expected.not_to be_published }
59
+ it "should update the status of the identifier when the object is destroyed" do
60
+ expect { subject.destroy }.to change(identifier, :status).from("public").to("unavailable | deleted")
27
61
  end
28
- context "object is unpublished" do
29
- before { subject.workflow_state = Ddr::Managers::WorkflowManager::UNPUBLISHED }
30
- it { is_expected.not_to be_published }
62
+ end
63
+
64
+ describe "events" do
65
+ before { allow(Ddr::Models).to receive(:auto_assign_permanent_ids) { true } }
66
+ context "when the operation succeeds" do
67
+ let!(:mock_identifier) { Ezid::MockIdentifier.new(id: "ark:/99999/fk4zzz",
68
+ metadata: "_target: http://example.com") }
69
+ before do
70
+ allow(Ezid::Identifier).to receive(:create) { mock_identifier }
71
+ allow(Ezid::Identifier).to receive(:find) { mock_identifier }
72
+ allow(subject.permanent_id_manager).to receive(:record) { mock_identifier }
73
+ end
74
+ it "should create a success event" do
75
+ expect { subject.save }.to change { subject.update_events.count }.by(1)
76
+ end
77
+ end
78
+ context "when there's an exception" do
79
+ before { allow(Ezid::Identifier).to receive(:create).and_raise(Ezid::Error) }
80
+ it "should create a failure event" do
81
+ begin
82
+ subject.save
83
+ rescue Ezid::Error
84
+ end
85
+ expect(subject.update_events.last).to be_failure
86
+ end
31
87
  end
32
88
  end
89
+ end
90
+
91
+ describe "workflow" do
92
+
93
+ subject { FactoryGirl.build(:item) }
33
94
 
34
- describe "#unpublished?" do
35
- subject { collection }
95
+ describe "#published?" do
36
96
  context "object is published" do
37
- before { subject.workflow_state = Ddr::Managers::WorkflowManager::PUBLISHED }
38
- it { is_expected.not_to be_unpublished }
97
+ before { allow(subject).to receive(:workflow_state) { Ddr::Managers::WorkflowManager::PUBLISHED } }
98
+ it "should return true" do
99
+ expect(subject).to be_published
100
+ end
39
101
  end
40
- context "object is unpublished" do
41
- before { subject.workflow_state = Ddr::Managers::WorkflowManager::UNPUBLISHED }
42
- it { is_expected.to be_unpublished }
102
+ context "object is not published" do
103
+ before { allow(subject).to receive(:workflow_state) { nil } }
104
+ it "should return false" do
105
+ expect(subject).not_to be_published
106
+ end
43
107
  end
44
- context "object workflow is not set" do
45
- before { subject.workflow_state = nil }
46
- it { is_expected.not_to be_unpublished }
108
+ end
109
+
110
+ describe "#publish" do
111
+ it "should publish the object" do
112
+ subject.publish
113
+ expect(subject).to be_published
47
114
  end
48
115
  end
49
116
 
50
117
  describe "#publish!" do
51
- context "do not include descendants" do
52
- it "should publish and persist the object" do
53
- collection.publish!(include_descendants: false)
54
- expect(collection.reload).to be_published
55
- expect(item.reload).not_to be_published
56
- expect(component.reload).not_to be_published
57
- end
118
+ it "should publish and persist the object" do
119
+ subject.publish!
120
+ expect(subject.reload).to be_published
58
121
  end
59
- context "do include descendants" do
60
- it "should publish and persist the object and descendants" do
61
- collection.publish!
62
- expect(collection.reload).to be_published
63
- expect(item.reload).to be_published
64
- expect(component.reload).to be_published
65
- end
122
+ end
123
+
124
+ describe "#unpublish" do
125
+ before { subject.publish }
126
+ it "should unpublish the object" do
127
+ subject.unpublish
128
+ expect(subject).not_to be_published
66
129
  end
67
130
  end
68
131
 
69
132
  describe "#unpublish!" do
70
- before { collection.publish! }
71
- it "should unpublish and persist the object and descendants" do
72
- collection.unpublish!
73
- expect(collection.reload).not_to be_published
74
- expect(item.reload).not_to be_published
75
- expect(component.reload).not_to be_published
133
+ before { subject.publish! }
134
+ it "should unpublish and persist the object" do
135
+ subject.unpublish!
136
+ expect(subject.reload).not_to be_published
76
137
  end
77
138
  end
78
139
  end
79
140
 
80
141
  describe "roles" do
142
+
81
143
  subject { FactoryGirl.build(:item) }
82
144
 
83
145
  describe "#copy_resource_roles_from" do
@@ -114,91 +176,20 @@ module Ddr::Models
114
176
  end
115
177
  end
116
178
 
117
- end
118
-
119
- describe "contacts" do
120
- subject { FactoryGirl.build(:item) }
121
- before do
122
- allow(Ddr::Models::Contact).to receive(:get).with(:find, slug: 'xa') do
123
- {'id'=>1, 'slug'=>'xa', 'name'=>'Contact A', 'short_name'=>'A'}
124
- end
125
- allow(Ddr::Models::Contact).to receive(:get).with(:find, slug: 'yb') do
126
- {'id'=>1, 'slug'=>'yb', 'name'=>'Contact B', 'short_name'=>'B'}
127
- end
128
- end
129
- describe "#research_help" do
130
- before { subject.research_help_contact = 'yb' }
131
- it "should return the appropriate contact" do
132
- expect(subject.research_help.slug).to eq('yb')
133
- end
134
- end
135
- end
136
-
137
- describe "locking" do
138
- subject { FactoryGirl.build(:item) }
139
-
140
- describe "#locked?" do
141
- context "object is locked" do
142
- before { subject.is_locked = true }
143
- context "repository is locked" do
144
- before { Ddr::Models.repository_locked = true }
145
- after { Ddr::Models.repository_locked = false }
146
- it "should be true" do
147
- expect(subject.locked?).to be true
148
- end
149
- end
150
- context "repository is not locked" do
151
- it "should be true" do
152
- expect(subject.locked?).to be true
153
- end
154
- end
155
- end
156
- context "object is not locked" do
157
- before { subject.is_locked = false }
158
- context "repository is locked" do
159
- before { Ddr::Models.repository_locked = true }
160
- after { Ddr::Models.repository_locked = false }
161
- it "should be true" do
162
- expect(subject.locked?).to be true
163
- end
164
- end
165
- context "repository is not locked" do
166
- it "should be false" do
167
- expect(subject.locked?).to be false
168
- end
179
+ describe "contacts" do
180
+ before do
181
+ allow(YAML).to receive(:load_file) { { 'a' => { 'name' => 'Contact A', 'short_name' => 'A' },
182
+ 'b' => { 'name' => 'Contact B', 'short_name' => 'B' } } }
183
+ Ddr::Contacts.load_contacts
184
+ end
185
+ describe "#research_help" do
186
+ before { subject.research_help_contact = 'b' }
187
+ it "should return the appropriate contact" do
188
+ expect(subject.research_help.slug).to eq('b')
169
189
  end
170
190
  end
171
191
  end
172
192
 
173
- describe "lock" do
174
- it "should lock the object" do
175
- expect { subject.lock }.to change(subject, :locked?).from(false).to(true)
176
- end
177
- end
178
-
179
- describe "unlock" do
180
- before { subject.lock }
181
- it "should unlock the object" do
182
- expect { subject.unlock }.to change(subject, :locked?).from(true).to(false)
183
- end
184
- end
185
-
186
- describe "lock!" do
187
- it "should lock and save the object" do
188
- subject.lock!
189
- subject.reload
190
- expect(subject.locked?).to be true
191
- end
192
- end
193
-
194
- describe "unlock!" do
195
- before { subject.lock! }
196
- it "should unlock and save the object" do
197
- subject.unlock!
198
- subject.reload
199
- expect(subject.locked?).to be false
200
- end
201
- end
202
193
  end
203
194
  end
204
195
  end
@@ -14,12 +14,12 @@ module Ddr::Models
14
14
  let(:child2) { FactoryGirl.create(:item) }
15
15
  before do
16
16
  child1.local_id = "test002"
17
- child1.save!
17
+ child1.save
18
18
  child2.local_id = "test001"
19
- child2.save!
19
+ child2.save
20
20
  subject.children << child1
21
21
  subject.children << child2
22
- subject.save!
22
+ subject.save
23
23
  end
24
24
  it "should return the first child as sorted by local ID" do
25
25
  expect(subject.first_child).to eq(child2)
@@ -1,61 +1,48 @@
1
- module Ddr::Models
2
- RSpec.describe HasStructMetadata, type: :model, structural_metadata: true do
1
+ require 'spec_helper'
3
2
 
4
- let(:item) { Item.new(pid: 'test:2') }
3
+ module Ddr
4
+ module Models
5
+ RSpec.describe HasStructMetadata, type: :model, structural_metadata: true do
5
6
 
6
- describe "#structures" do
7
- context "no existing structural metadata" do
8
- it "should return nil" do
9
- expect(item.structure).to eq(nil)
7
+ let(:item) { Item.new(pid: 'test:2') }
8
+
9
+ describe "#structure" do
10
+ context "no existing structural metadata" do
11
+ it "should return nil" do
12
+ expect(item.structure).to eq(nil)
13
+ end
10
14
  end
11
- end
12
- context "existing structural metadata" do
13
- before { item.datastreams[Ddr::Datastreams::STRUCT_METADATA].content = simple_structure_xml }
14
- it "should return the structural metadata" do
15
- expect(item.structure.to_xml).to be_equivalent_to(simple_structure_xml)
15
+ context "existing structural metadata" do
16
+ before { item.datastreams[Ddr::Datastreams::STRUCT_METADATA].content = simple_structure }
17
+ it "should return the structural metadata" do
18
+ expect(item.structure.to_xml).to be_equivalent_to(simple_structure)
19
+ end
16
20
  end
17
21
  end
18
- end
19
22
 
20
- describe "indexing" do
21
- let(:expected_json) { nested_structure_to_json }
22
- before do
23
- item.datastreams[Ddr::Datastreams::STRUCT_METADATA].content = nested_structure_xml
24
- flocat_x = instance_double("Structures::FLocat", effective_use: 'foo')
25
- flocat_y = instance_double("Structures::FLocat", effective_use: 'bar')
26
- flocat_z = instance_double("Structures::FLocat", effective_use: 'baz')
27
- file_a = instance_double("Structures::File", repo_ids: [ 'test:7' ], flocats: [ flocat_x ])
28
- file_b = instance_double("Structures::File", repo_ids: [ 'test:8' ], flocats: [ flocat_y ])
29
- file_c = instance_double("Structures::File", repo_ids: [ 'test:9' ], flocats: [ flocat_z ])
30
- allow(Structures::File).to receive(:find).with(an_instance_of(Ddr::Models::Structure), 'abc') { file_a }
31
- allow(Structures::File).to receive(:find).with(an_instance_of(Ddr::Models::Structure), 'def') { file_b }
32
- allow(Structures::File).to receive(:find).with(an_instance_of(Ddr::Models::Structure), 'ghi') { file_c }
33
- end
34
- it "should index the JSON representation of the structures" do
35
- indexing = item.to_solr
36
- expect(indexing[Ddr::Index::Fields::STRUCTURE]).to eq(expected_json)
37
- end
38
- describe "structure source" do
39
- describe "repository maintained" do
40
- before do
41
- item.datastreams[Ddr::Datastreams::STRUCT_METADATA].content = simple_structure_xml
42
- end
43
- it "should index the structure source as repository maintained" do
44
- indexing = item.to_solr
45
- expect(indexing[Ddr::Index::Fields::STRUCTURE_SOURCE]).to eq(Ddr::Models::Structure::REPOSITORY_MAINTAINED)
46
- end
23
+ describe "#build_default_structure" do
24
+ let(:components) { [ Component.new(pid: 'test:5', identifier: [ 'abc002' ]),
25
+ Component.new(pid: 'test:6', identifier: [ 'abc001' ]),
26
+ Component.new(pid: 'test:7', identifier: [ 'abc003' ])
27
+ ] }
28
+ let(:expected) { FactoryGirl.build(:simple_structure) }
29
+ before { allow(item).to receive(:find_children) { simple_structure_query_response } }
30
+ it "should build the appropriate structural metadata" do
31
+ results = item.build_default_structure
32
+ expect(results).to be_equivalent_to(expected)
47
33
  end
48
- describe "externally provided" do
49
- before do
50
- item.datastreams[Ddr::Datastreams::STRUCT_METADATA].content = nested_structure_xml
51
- end
52
- it "should index the structure source as repository maintained" do
53
- indexing = item.to_solr
54
- expect(indexing[Ddr::Index::Fields::STRUCTURE_SOURCE]).to eq(Ddr::Models::Structure::EXTERNALLY_PROVIDED)
55
- end
34
+ end
35
+
36
+ describe "indexing" do
37
+ let(:expected_json) { multiple_struct_maps_structure_to_json }
38
+ before { item.datastreams[Ddr::Datastreams::STRUCT_METADATA].content = multiple_struct_maps_structure }
39
+ it "should index the JSON representation of the structure" do
40
+ indexing = item.to_solr
41
+ expect(indexing.keys).to include(Ddr::Index::Fields::STRUCT_MAPS)
42
+ expect(indexing[Ddr::Index::Fields::STRUCT_MAPS]).to eq(expected_json)
56
43
  end
57
44
  end
58
- end
59
45
 
46
+ end
60
47
  end
61
- end
48
+ end