ddr-models 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +12 -0
  3. data/README.md +5 -0
  4. data/Rakefile +37 -0
  5. data/app/models/attachment.rb +7 -0
  6. data/app/models/collection.rb +54 -0
  7. data/app/models/component.rb +15 -0
  8. data/app/models/item.rb +19 -0
  9. data/app/models/solr_document.rb +36 -0
  10. data/app/models/target.rb +8 -0
  11. data/config/initializers/active_fedora_base.rb +77 -0
  12. data/config/initializers/active_fedora_datastream.rb +5 -0
  13. data/config/initializers/ddr.rb +8 -0
  14. data/config/initializers/devise.rb +245 -0
  15. data/config/initializers/devise.rb~ +245 -0
  16. data/config/initializers/subscriptions.rb +15 -0
  17. data/config/routes.rb +2 -0
  18. data/db/migrate/20141021233359_create_events.rb +28 -0
  19. data/db/migrate/20141021234156_create_minted_ids.rb +19 -0
  20. data/db/migrate/20141103192146_create_workflow_state.rb +13 -0
  21. data/db/migrate/20141104181418_create_users.rb +34 -0
  22. data/db/migrate/20141104181418_create_users.rb~ +6 -0
  23. data/lib/ddr-models.rb +1 -0
  24. data/lib/ddr/actions.rb +8 -0
  25. data/lib/ddr/actions/fixity_check.rb +35 -0
  26. data/lib/ddr/auth.rb +45 -0
  27. data/lib/ddr/auth.rb~ +47 -0
  28. data/lib/ddr/auth/ability.rb +204 -0
  29. data/lib/ddr/auth/ability.rb~ +204 -0
  30. data/lib/ddr/auth/group_service.rb +53 -0
  31. data/lib/ddr/auth/group_service.rb~ +53 -0
  32. data/lib/ddr/auth/grouper_service.rb +76 -0
  33. data/lib/ddr/auth/grouper_service.rb~ +77 -0
  34. data/lib/ddr/auth/remote_group_service.rb +35 -0
  35. data/lib/ddr/auth/remote_group_service.rb~ +35 -0
  36. data/lib/ddr/auth/superuser.rb +13 -0
  37. data/lib/ddr/auth/superuser.rb~ +9 -0
  38. data/lib/ddr/auth/user.rb +71 -0
  39. data/lib/ddr/auth/user.rb~ +65 -0
  40. data/lib/ddr/configurable.rb +34 -0
  41. data/lib/ddr/datastreams.rb +32 -0
  42. data/lib/ddr/datastreams/content_metadata_datastream.rb +147 -0
  43. data/lib/ddr/datastreams/datastream_behavior.rb +95 -0
  44. data/lib/ddr/datastreams/descriptive_metadata_datastream.rb +84 -0
  45. data/lib/ddr/datastreams/properties_datastream.rb +25 -0
  46. data/lib/ddr/datastreams/role_assignments_datastream.rb +19 -0
  47. data/lib/ddr/events.rb +17 -0
  48. data/lib/ddr/events/creation_event.rb +12 -0
  49. data/lib/ddr/events/event.rb +163 -0
  50. data/lib/ddr/events/fixity_check_event.rb +43 -0
  51. data/lib/ddr/events/ingestion_event.rb +12 -0
  52. data/lib/ddr/events/preservation_event_behavior.rb +37 -0
  53. data/lib/ddr/events/preservation_event_type.rb +24 -0
  54. data/lib/ddr/events/reindex_object_after_save.rb +18 -0
  55. data/lib/ddr/events/update_event.rb +9 -0
  56. data/lib/ddr/events/validation_event.rb +11 -0
  57. data/lib/ddr/events/virus_check_event.rb +30 -0
  58. data/lib/ddr/index_fields.rb +39 -0
  59. data/lib/ddr/metadata.rb +22 -0
  60. data/lib/ddr/metadata/duke_terms.rb +15 -0
  61. data/lib/ddr/metadata/premis_event.rb +59 -0
  62. data/lib/ddr/metadata/rdf_vocabulary_parser.rb +45 -0
  63. data/lib/ddr/metadata/roles_vocabulary.rb +10 -0
  64. data/lib/ddr/metadata/sources/duketerms.rdf.xml +856 -0
  65. data/lib/ddr/metadata/vocabulary.rb +37 -0
  66. data/lib/ddr/models.rb +60 -0
  67. data/lib/ddr/models/access_controllable.rb +23 -0
  68. data/lib/ddr/models/base.rb +37 -0
  69. data/lib/ddr/models/describable.rb +81 -0
  70. data/lib/ddr/models/engine.rb +58 -0
  71. data/lib/ddr/models/error.rb +12 -0
  72. data/lib/ddr/models/event_loggable.rb +36 -0
  73. data/lib/ddr/models/file_management.rb +183 -0
  74. data/lib/ddr/models/fixity_checkable.rb +20 -0
  75. data/lib/ddr/models/governable.rb +48 -0
  76. data/lib/ddr/models/has_attachments.rb +12 -0
  77. data/lib/ddr/models/has_children.rb +21 -0
  78. data/lib/ddr/models/has_content.rb +114 -0
  79. data/lib/ddr/models/has_content_metadata.rb +16 -0
  80. data/lib/ddr/models/has_properties.rb +15 -0
  81. data/lib/ddr/models/has_role_assignments.rb +17 -0
  82. data/lib/ddr/models/has_thumbnail.rb +27 -0
  83. data/lib/ddr/models/has_workflow.rb +29 -0
  84. data/lib/ddr/models/indexing.rb +53 -0
  85. data/lib/ddr/models/licensable.rb +28 -0
  86. data/lib/ddr/models/minted_id.rb +10 -0
  87. data/lib/ddr/models/permanent_identification.rb +48 -0
  88. data/lib/ddr/models/solr_document.rb +193 -0
  89. data/lib/ddr/models/version.rb +5 -0
  90. data/lib/ddr/notifications.rb +15 -0
  91. data/lib/ddr/services.rb +8 -0
  92. data/lib/ddr/services/id_service.rb +48 -0
  93. data/lib/ddr/utils.rb +153 -0
  94. data/lib/ddr/workflow.rb +8 -0
  95. data/lib/ddr/workflow/workflow_state.rb +39 -0
  96. data/spec/dummy/README.rdoc +28 -0
  97. data/spec/dummy/Rakefile +6 -0
  98. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  99. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  100. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  101. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  102. data/spec/dummy/app/models/user.rb +5 -0
  103. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  104. data/spec/dummy/bin/bundle +3 -0
  105. data/spec/dummy/bin/rails +4 -0
  106. data/spec/dummy/bin/rake +4 -0
  107. data/spec/dummy/config.ru +4 -0
  108. data/spec/dummy/config/application.rb +29 -0
  109. data/spec/dummy/config/boot.rb +5 -0
  110. data/spec/dummy/config/database.yml +25 -0
  111. data/spec/dummy/config/environment.rb +5 -0
  112. data/spec/dummy/config/environments/development.rb +37 -0
  113. data/spec/dummy/config/environments/production.rb +78 -0
  114. data/spec/dummy/config/environments/test.rb +39 -0
  115. data/spec/dummy/config/initializers/assets.rb +8 -0
  116. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  117. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  118. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  119. data/spec/dummy/config/initializers/inflections.rb +16 -0
  120. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  121. data/spec/dummy/config/initializers/session_store.rb +3 -0
  122. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  123. data/spec/dummy/config/locales/en.yml +23 -0
  124. data/spec/dummy/config/routes.rb +56 -0
  125. data/spec/dummy/config/secrets.yml +22 -0
  126. data/spec/dummy/db/development.sqlite3 +0 -0
  127. data/spec/dummy/db/schema.rb +80 -0
  128. data/spec/dummy/db/test.sqlite3 +0 -0
  129. data/spec/dummy/log/development.log +4974 -0
  130. data/spec/dummy/log/test.log +55627 -0
  131. data/spec/dummy/public/404.html +67 -0
  132. data/spec/dummy/public/422.html +67 -0
  133. data/spec/dummy/public/500.html +66 -0
  134. data/spec/dummy/public/favicon.ico +0 -0
  135. data/spec/factories/attachment_factories.rb +15 -0
  136. data/spec/factories/collection_factories.rb +16 -0
  137. data/spec/factories/component_factories.rb +15 -0
  138. data/spec/factories/event_factories.rb +7 -0
  139. data/spec/factories/item_factories.rb +16 -0
  140. data/spec/factories/target_factories.rb +11 -0
  141. data/spec/factories/test_model_factories.rb +133 -0
  142. data/spec/factories/user_factories.rb +7 -0
  143. data/spec/factories/user_factories.rb~ +7 -0
  144. data/spec/features/grouper_integration_spec.rb~ +21 -0
  145. data/spec/fixtures/contentMetadata.xml +37 -0
  146. data/spec/fixtures/image1.tiff +0 -0
  147. data/spec/fixtures/image2.tiff +0 -0
  148. data/spec/fixtures/image3.tiff +0 -0
  149. data/spec/fixtures/library-devil.tiff +0 -0
  150. data/spec/fixtures/sample.docx +0 -0
  151. data/spec/fixtures/sample.pdf +0 -0
  152. data/spec/fixtures/target.png +0 -0
  153. data/spec/models/ability_spec.rb +248 -0
  154. data/spec/models/ability_spec.rb~ +245 -0
  155. data/spec/models/active_fedora_base_spec.rb +107 -0
  156. data/spec/models/active_fedora_datastream_spec.rb +121 -0
  157. data/spec/models/attachment_spec.rb +13 -0
  158. data/spec/models/collection_spec.rb +33 -0
  159. data/spec/models/component_spec.rb +8 -0
  160. data/spec/models/descriptive_metadata_datastream_spec.rb +102 -0
  161. data/spec/models/events_spec.rb +64 -0
  162. data/spec/models/file_management_spec.rb +179 -0
  163. data/spec/models/has_role_assignments_spec.rb +29 -0
  164. data/spec/models/has_workflow_spec.rb +54 -0
  165. data/spec/models/item_spec.rb +8 -0
  166. data/spec/models/permanent_identification_spec.rb +65 -0
  167. data/spec/models/role_assignments_datastream_spec.rb +25 -0
  168. data/spec/models/superuser_spec.rb +13 -0
  169. data/spec/models/superuser_spec.rb~ +13 -0
  170. data/spec/models/target_spec.rb +8 -0
  171. data/spec/models/user_spec.rb +60 -0
  172. data/spec/models/user_spec.rb~ +56 -0
  173. data/spec/services/group_service_spec.rb +75 -0
  174. data/spec/services/group_service_spec.rb~ +71 -0
  175. data/spec/services/id_service_spec.rb +33 -0
  176. data/spec/spec_helper.rb +125 -0
  177. data/spec/support/shared_examples_for_access_controllables.rb +6 -0
  178. data/spec/support/shared_examples_for_associations.rb +8 -0
  179. data/spec/support/shared_examples_for_ddr_models.rb +7 -0
  180. data/spec/support/shared_examples_for_describables.rb +63 -0
  181. data/spec/support/shared_examples_for_event_loggables.rb +3 -0
  182. data/spec/support/shared_examples_for_events.rb +179 -0
  183. data/spec/support/shared_examples_for_governables.rb +17 -0
  184. data/spec/support/shared_examples_for_has_content.rb +136 -0
  185. data/spec/support/shared_examples_for_has_content_metadata.rb +74 -0
  186. data/spec/support/shared_examples_for_has_properties.rb +5 -0
  187. data/spec/support/shared_examples_for_indexing.rb +36 -0
  188. metadata +562 -0
@@ -0,0 +1,3 @@
1
+ shared_examples "an event loggable object" do
2
+
3
+ end
@@ -0,0 +1,179 @@
1
+ def mock_object(opts={})
2
+ double("object", {create_date: "2014-01-01T01:01:01.000Z", modified_date: "2014-06-01T01:01:01.000Z"}.merge(opts))
3
+ end
4
+
5
+ RSpec.shared_examples "a preservation-related event" do
6
+ subject { described_class.new }
7
+ it "should have an event_type" do
8
+ expect(subject.preservation_event_type).not_to be_nil
9
+ end
10
+ it "should have a PREMIS representation" do
11
+ expect(subject).to respond_to :as_premis
12
+ expect(subject).to respond_to :to_xml
13
+ end
14
+ end
15
+
16
+ RSpec.shared_examples "an event that reindexes its object after save" do
17
+ it "should implement the reindexing concern" do
18
+ expect(subject).to be_a Ddr::Events::ReindexObjectAfterSave
19
+ end
20
+ context "when object is present" do
21
+ let(:object) { mock_object }
22
+ before do
23
+ allow(subject).to receive(:object) { object }
24
+ end
25
+ it "should reindex its object after save" do
26
+ expect(object).to receive(:update_index)
27
+ subject.save(validate: false)
28
+ end
29
+ end
30
+ end
31
+
32
+ RSpec.shared_examples "an event" do
33
+ describe "validation" do
34
+ context "of pid" do
35
+ it "should require presence" do
36
+ expect(subject).not_to be_valid
37
+ expect(subject.errors[:pid]).to include "can't be blank"
38
+ end
39
+ context "when the object exists" do
40
+ before { subject.pid = ActiveFedora::Base.create.pid }
41
+ it "should be valid" do
42
+ expect(subject).to be_valid
43
+ end
44
+ end
45
+ context "when the object doesn't exist" do
46
+ before { subject.pid = "test:123" }
47
+ it "should not be valid" do
48
+ expect(subject).not_to be_valid
49
+ expect(subject.errors).to have_key :pid
50
+ end
51
+ end
52
+ end
53
+ it "should require an event_date_time" do
54
+ subject.event_date_time = nil # reset b/c set to default after init
55
+ expect(subject).not_to be_valid
56
+ expect(subject.errors[:event_date_time]).to include "can't be blank"
57
+ end
58
+ it "should require a valid outcome" do
59
+ subject.outcome = Ddr::Events::Event::SUCCESS
60
+ subject.valid?
61
+ expect(subject.errors).not_to have_key :outcome
62
+ subject.outcome = Ddr::Events::Event::FAILURE
63
+ subject.valid?
64
+ expect(subject.errors).not_to have_key :outcome
65
+ subject.outcome = "Some other value"
66
+ expect(subject).not_to be_valid
67
+ expect(subject.errors[:outcome]).to include "\"Some other value\" is not a valid event outcome"
68
+ end
69
+ end
70
+
71
+ describe "outcome setters and getters" do
72
+ it "should encapsulate access" do
73
+ subject.success!
74
+ expect(subject.outcome).to eq Ddr::Events::Event::SUCCESS
75
+ expect(subject).to be_success
76
+ subject.failure!
77
+ expect(subject.outcome).to eq Ddr::Events::Event::FAILURE
78
+ expect(subject).to be_failure
79
+ end
80
+ end
81
+
82
+ describe "setting defaults" do
83
+ context "after initialization" do
84
+ it "should set outcome to 'success'" do
85
+ expect(subject.outcome).to eq Ddr::Events::Event::SUCCESS
86
+ end
87
+ it "should set event_date_time" do
88
+ expect(subject.event_date_time).to be_present
89
+ end
90
+ it "should set software" do
91
+ expect(subject.software).to be_present
92
+ expect(subject.software).to eq subject.send(:default_software)
93
+ end
94
+ it "should set summary" do
95
+ expect(subject.summary).to eq subject.send(:default_summary)
96
+ end
97
+ end
98
+ context "when attributes are set" do
99
+ let(:obj) { ActiveFedora::Base.create }
100
+ let(:event) { described_class.new(pid: obj.pid, outcome: Ddr::Events::Event::FAILURE, event_date_time: Time.utc(2013), software: "Test", summary: "A terrible disaster") }
101
+ it "should not overwrite attributes" do
102
+ expect { event.send(:set_defaults) }.not_to change { event.outcome }
103
+ expect { event.send(:set_defaults) }.not_to change { event.event_date_time }
104
+ expect { event.send(:set_defaults) }.not_to change { event.software }
105
+ expect { event.send(:set_defaults) }.not_to change { event.summary }
106
+ end
107
+ end
108
+ end
109
+
110
+ describe "object getter" do
111
+ subject { described_class.new(pid: "test:123") }
112
+ let(:object) { mock_object }
113
+ before { allow(ActiveFedora::Base).to receive(:find).with("test:123") { object } }
114
+ it "should retrieve the object" do
115
+ expect(subject.object).to eq object
116
+ end
117
+ it "should cache the object" do
118
+ expect(ActiveFedora::Base).to receive(:find).with("test:123").once
119
+ subject.object
120
+ subject.object
121
+ end
122
+ end
123
+
124
+ describe "object setter" do
125
+ let(:object) { mock_object(pid: "test:123") }
126
+ it "should set the event pid and object" do
127
+ allow(object).to receive(:new_record?) { false }
128
+ subject.object = object
129
+ expect(subject.pid).to eq "test:123"
130
+ expect(subject.object).to eq object
131
+ end
132
+ it "should raise an ArgumentError if object is a new record" do
133
+ allow(object).to receive(:new_record?) { true }
134
+ expect { subject.object = object }.to raise_error ArgumentError
135
+ end
136
+ end
137
+
138
+ describe "object existence" do
139
+ it "should be false if pid is nil" do
140
+ expect(subject.object_exists?).to be_falsey
141
+ end
142
+ it "should be false if pid not found in repository" do
143
+ subject.pid = "test:123"
144
+ expect(subject.object_exists?).to be_falsey
145
+ end
146
+ it "should be true if object exists in repository" do
147
+ allow(ActiveFedora::Base).to receive(:find).with("test:123") { mock_object }
148
+ subject.pid = "test:123"
149
+ expect(subject.object_exists?).to be_truthy
150
+ end
151
+ it "should be true if object instance variable is set" do
152
+ obj = mock_object(pid: "test:123")
153
+ allow(obj).to receive(:new_record?) { false }
154
+ subject.object = obj
155
+ expect(subject.object_exists?).to be_truthy
156
+ end
157
+ end
158
+
159
+ describe "event_date_time string representation" do
160
+ subject { described_class.new(event_date_time: Time.utc(2014, 6, 4, 11, 7, 35)) }
161
+ it "should conform to the specified format" do
162
+ expect(subject.event_date_time_s).to eq "2014-06-04T11:07:35.000Z"
163
+ end
164
+ end
165
+
166
+ describe "rendering who/what performed the action" do
167
+ context "when performed by a user" do
168
+ before { subject.user = User.new(username: "bob") }
169
+ it "should render the user" do
170
+ expect(subject.performed_by).to eq "bob"
171
+ end
172
+ end
173
+ context "when not performed by a user" do
174
+ it "should render 'SYSTEM'" do
175
+ expect(subject.performed_by).to eq "SYSTEM"
176
+ end
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,17 @@
1
+ RSpec.shared_examples "a governable object" do
2
+ let(:object) do
3
+ described_class.new.tap do |obj|
4
+ obj.title = [ 'Describable' ]
5
+ obj.identifier = [ 'id001' ]
6
+ obj.save(validate: false)
7
+ end
8
+ end
9
+ describe "can have an admin policy" do
10
+ let(:coll) { FactoryGirl.create(:collection) }
11
+ it "should set its admin policy with #admin_policy= and get with #admin_policy" do
12
+ object.admin_policy = coll
13
+ object.save(validate: false)
14
+ expect(ActiveFedora::Base.find(object.pid, cast: true).admin_policy).to eq(coll)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,136 @@
1
+ require 'spec_helper'
2
+ require 'openssl'
3
+
4
+ RSpec.shared_examples "an object that can have content" do
5
+
6
+ let(:object) { described_class.new(title: [ "I Have Content!" ]) }
7
+
8
+ it "should delegate :validate_checksum! to :content" do
9
+ checksum = "dea56f15b309e47b74fa24797f85245dda0ca3d274644a96804438bbd659555a"
10
+ expect(object.content).to receive(:validate_checksum!).with(checksum, "SHA-256")
11
+ object.validate_checksum!(checksum, "SHA-256")
12
+ end
13
+
14
+ describe "indexing" do
15
+ let(:file) { fixture_file_upload("library-devil.tiff", "image/tiff") }
16
+ before { object.upload file }
17
+ it "should index the content ds control group" do
18
+ expect(object.to_solr).to include(Ddr::IndexFields::CONTENT_CONTROL_GROUP)
19
+ end
20
+ end
21
+
22
+ describe "adding a file" do
23
+ let(:file) { fixture_file_upload("library-devil.tiff", "image/tiff") }
24
+ context "defaults" do
25
+ before { object.add_file file, "content" }
26
+ it "should have an original_filename" do
27
+ expect(object.original_filename).to eq("library-devil.tiff")
28
+ end
29
+ it "should have a content_type" do
30
+ expect(object.content_type).to eq("image/tiff")
31
+ end
32
+ it "should create a 'virus check' event for the object" do
33
+ expect { object.save }.to change { object.virus_checks.count }.by(1)
34
+ end
35
+ end
36
+ context "with option `:original_name=>false`" do
37
+ before { object.add_file file, "content", original_name: false }
38
+ it "should not have an original_filename" do
39
+ expect(object.original_filename).to be_nil
40
+ end
41
+ end
42
+ context "with `:original_name` option set to a string" do
43
+ before { object.add_file file, "content", original_name: "another-name.tiff" }
44
+ it "should have an original_filename" do
45
+ expect(object.original_filename).to eq("another-name.tiff")
46
+ end
47
+ end
48
+ end
49
+
50
+ describe "save" do
51
+
52
+ describe "when content is not present" do
53
+ it "should not save" do
54
+ expect(object.save).to be false
55
+ expect(object.errors[:content]).to include "can't be blank"
56
+ end
57
+ end
58
+
59
+ describe "when new content is present" do
60
+
61
+ context "and it's a new object" do
62
+ before { object.add_file file, "content" }
63
+
64
+ context "and the content is an image" do
65
+ let(:file) { fixture_file_upload("library-devil.tiff", "image/tiff") }
66
+ it "should generate a thumbnail" do
67
+ expect(object.thumbnail).not_to be_present
68
+ object.save
69
+ expect(object.thumbnail).to be_present
70
+ end
71
+ end
72
+ context "and the content is a pdf" do
73
+ let(:file) { fixture_file_upload("sample.pdf", "application/pdf") }
74
+ it "should generate a thumbnail" do
75
+ expect(object.thumbnail).not_to be_present
76
+ object.save
77
+ expect(object.thumbnail).to be_present
78
+ end
79
+ end
80
+ context "and the content is neither an image nor a pdf" do
81
+ let(:file) { fixture_file_upload("sample.docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document") }
82
+ it "should not generate a thumbnail" do
83
+ expect(object.thumbnail).not_to be_present
84
+ object.save
85
+ expect(object.thumbnail).not_to be_present
86
+ end
87
+ end
88
+ end
89
+
90
+ context "and it's an existing object with content" do
91
+ before { object.upload! fixture_file_upload('library-devil.tiff', 'image/tiff') }
92
+
93
+ context "and the content is an image" do
94
+ let(:file) { fixture_file_upload("image1.tiff", "image/tiff") }
95
+ it "should generate a new thumbnail" do
96
+ expect(object.thumbnail).to be_present
97
+ expect { object.upload! file }.to change { object.thumbnail.content }
98
+ end
99
+ end
100
+ context "and the content is a pdf" do
101
+ let(:file) { fixture_file_upload("sample.pdf", "application/pdf") }
102
+ it "should generate a new thumbnail" do
103
+ expect(object.thumbnail).to be_present
104
+ expect { object.upload! file }.to change { object.thumbnail.content }
105
+ end
106
+ end
107
+ context "and the content is neither an image nor a pdf" do
108
+ let(:file) { fixture_file_upload("sample.docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document") }
109
+ it "should delete the thumbnail" do
110
+ expect(object.thumbnail).to be_present
111
+ object.upload! file
112
+ expect(object.thumbnail).to_not be_present
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+ describe "#upload" do
120
+ let(:file) { fixture_file_upload("library-devil.tiff", "image/tiff") }
121
+ it "should add the file to the content datastream" do
122
+ expect(object).to receive(:add_file).with(file, "content", {})
123
+ object.upload(file)
124
+ end
125
+ end
126
+
127
+ describe "#upload!" do
128
+ let(:file) { fixture_file_upload("library-devil.tiff", "image/tiff") }
129
+ it "should add the file to the content datastream and save the object" do
130
+ expect(object).to receive(:add_file).with(file, "content", {}).and_call_original
131
+ expect(object).to receive(:save)
132
+ object.upload!(file)
133
+ end
134
+ end
135
+
136
+ end
@@ -0,0 +1,74 @@
1
+ require 'spec_helper'
2
+ require 'tempfile'
3
+
4
+ RSpec.shared_examples "an object that has content metadata" do
5
+ let!(:object) { described_class.create! }
6
+ let(:file_path) { File.join(File.dirname(__FILE__), '..', 'fixtures', 'contentMetadata.xml') }
7
+ before do
8
+ object.contentMetadata.content = File.new(file_path, "r")
9
+ object.save!
10
+ end
11
+ context "contentMetadata datastream" do
12
+ let(:expected_result) do
13
+ [
14
+ {
15
+ "div" => [
16
+ {
17
+ "type" => "image",
18
+ "label" => "Images",
19
+ "div" => [
20
+ {
21
+ "pids" => [
22
+ {
23
+ "pid" => "test:1",
24
+ "use" => "Master Image"
25
+ }
26
+ ]
27
+ },
28
+ {
29
+ "pids" => [
30
+ {
31
+ "pid" => "test:2",
32
+ "use" => "Master Image"
33
+ }
34
+ ]
35
+ },
36
+ {
37
+ "pids" => [
38
+ {
39
+ "pid" => "test:3",
40
+ "use" => "Master Image"
41
+ }
42
+ ]
43
+ }
44
+ ]
45
+ },
46
+ {
47
+ "type" => "pdf",
48
+ "label" => "PDF",
49
+ "pids" => [
50
+ {
51
+ "pid" => "test:4",
52
+ "use" => "Composite PDF"
53
+ }
54
+ ]
55
+ }
56
+
57
+ ]
58
+ }
59
+ ]
60
+ end
61
+ context "#parse" do
62
+ it "should produce the appropriate result" do
63
+ result = object.contentMetadata.parse
64
+ expect(result).to eq(expected_result)
65
+ end
66
+ end
67
+ context "#to_solr" do
68
+ let(:solr_result) { ActiveFedora::SolrService.query("id:#{object.pid.gsub(':', '\\:')}").first }
69
+ it "should add the parsed contentMetadata to the index" do
70
+ expect(JSON.parse(solr_result[ActiveFedora::SolrService.solr_name(:content_metadata_parsed, :symbol)].first)).to eq(expected_result)
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,5 @@
1
+ RSpec.shared_examples "an object that has properties" do
2
+ it "should have a properties datastream" do
3
+ expect(subject.datastreams.keys).to include(Ddr::Datastreams::PROPERTIES)
4
+ end
5
+ end
@@ -0,0 +1,36 @@
1
+ RSpec.shared_examples "an object that has a display title" do
2
+ describe "#title_display" do
3
+ let(:object) { described_class.new }
4
+ subject { object.title_display }
5
+ context "has title" do
6
+ before { object.title = [ 'Title' ] }
7
+ it "should return the first title" do
8
+ expect(subject).to eq('Title')
9
+ end
10
+ end
11
+ context "has no title, has identifier" do
12
+ before { object.identifier = [ 'id001' ] }
13
+ it "should return the first identifier" do
14
+ expect(subject).to eq('id001')
15
+ end
16
+ end
17
+ # Only objects with content implement :original_filename
18
+ # This test worked before b/c allowing rspec to stub methods
19
+ # that aren't defined on object. This rspec-mocks config setting prevents that:
20
+ #
21
+ # verify_partial_doubles = true
22
+ #
23
+ # context "has no title, no identifier, has original_filename" do
24
+ # before { allow(object).to receive(:original_filename) { "file.txt" } }
25
+ # it "should return original_filename" do
26
+ # expect(subject).to eq "file.txt"
27
+ # end
28
+ # end
29
+ context "has no title, no identifier, no original_filename" do
30
+ let(:object) { described_class.new(:pid => 'duke:test') }
31
+ it "should return the PID in square brackets" do
32
+ expect(subject).to eq "[duke:test]"
33
+ end
34
+ end
35
+ end
36
+ end