sufia 4.0.1 → 4.1.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.
- checksums.yaml +4 -4
- data/History.md +247 -215
- data/README.md +7 -3
- data/SUFIA_VERSION +1 -1
- data/app/assets/javascripts/sufia.js +5 -2
- data/app/assets/javascripts/sufia/proxy_rights.js +68 -0
- data/app/assets/javascripts/sufia/transfers.js +3 -0
- data/app/assets/javascripts/sufia/user_search.js +31 -0
- data/app/assets/stylesheets/jquery-ui.css +17 -17
- data/app/assets/stylesheets/sufia.css.scss +3 -2
- data/app/assets/stylesheets/sufia/_proxy-rights.scss +10 -0
- data/app/controllers/concerns/sufia/contact_form_controller_behavior.rb +22 -23
- data/app/controllers/concerns/sufia/depositors_controller_behavior.rb +41 -0
- data/app/controllers/concerns/sufia/files_controller_behavior.rb +1 -0
- data/app/controllers/concerns/sufia/transfers_controller_behavior.rb +76 -0
- data/app/controllers/concerns/sufia/users_controller_behavior.rb +9 -11
- data/app/controllers/depositors_controller.rb +3 -0
- data/app/controllers/transfers_controller.rb +3 -0
- data/app/helpers/sufia/dashboard_helper_behavior.rb +15 -0
- data/app/helpers/sufia/sufia_helper_behavior.rb +24 -2
- data/app/jobs/content_depositor_change_event_job.rb +50 -0
- data/app/views/dashboard/_index_partials/_contents.html.erb +18 -0
- data/app/views/dashboard/_index_partials/_proxy_rights.html.erb +23 -0
- data/app/views/dashboard/_index_partials/_transfers.html.erb +14 -0
- data/app/views/generic_files/proxy.html.erb +5 -0
- data/app/views/generic_files/upload/_form.html.erb +7 -2
- data/app/views/my/_action_menu.html.erb +3 -1
- data/app/views/records/edit_fields/_default.html.erb +1 -1
- data/app/views/transfers/_received.html.erb +58 -0
- data/app/views/transfers/_sent.html.erb +38 -0
- data/app/views/transfers/index.html.erb +7 -0
- data/app/views/transfers/new.html.erb +23 -0
- data/app/views/users/_proxies.html.erb +8 -0
- data/app/views/users/_user_util_links_extra.html.erb +1 -0
- data/app/views/users/edit.html.erb +6 -1
- data/config/locales/sufia.en.yml +9 -4
- data/config/routes.rb +14 -3
- data/lib/sufia.rb +7 -5
- data/lib/sufia/version.rb +1 -1
- data/spec/controllers/authorities_controller_spec.rb +6 -6
- data/spec/controllers/batch_controller_spec.rb +29 -29
- data/spec/controllers/batch_edits_controller_spec.rb +7 -7
- data/spec/controllers/catalog_controller_spec.rb +9 -9
- data/spec/controllers/collections_controller_spec.rb +28 -28
- data/spec/controllers/content_blocks_controller_spec.rb +3 -3
- data/spec/controllers/dashboard_controller_spec.rb +1 -1
- data/spec/controllers/depositors_controller_spec.rb +50 -0
- data/spec/controllers/downloads_controller_spec.rb +22 -22
- data/spec/controllers/featured_work_lists_controller_spec.rb +1 -1
- data/spec/controllers/featured_works_controller_spec.rb +1 -1
- data/spec/controllers/generic_files_controller_spec.rb +98 -90
- data/spec/controllers/homepage_controller_spec.rb +1 -1
- data/spec/controllers/mailbox_controller_spec.rb +10 -10
- data/spec/controllers/my/collections_controller_spec.rb +1 -1
- data/spec/controllers/my/files_controller_spec.rb +1 -1
- data/spec/controllers/my/highlights_controller_spec.rb +1 -1
- data/spec/controllers/my/shares_controller_spec.rb +1 -1
- data/spec/controllers/my_controller_spec.rb +1 -1
- data/spec/controllers/pages_controller_spec.rb +1 -1
- data/spec/controllers/single_use_links_controller_spec.rb +46 -50
- data/spec/controllers/single_use_links_viewer_controller_spec.rb +16 -16
- data/spec/controllers/static_controller_spec.rb +9 -9
- data/spec/controllers/tinymce_assets_controller_spec.rb +1 -1
- data/spec/controllers/transfers_controller_spec.rb +212 -0
- data/spec/controllers/users_controller_spec.rb +1 -1
- data/spec/factories/generic_files.rb +4 -4
- data/spec/factories/proxy_deposit_requests.rb +6 -0
- data/spec/features/browse_dashboard_files_spec.rb +25 -36
- data/spec/features/browse_files_spec.rb +18 -13
- data/spec/features/catalog_search_spec.rb +3 -6
- data/spec/features/cloud_upload_spec.rb +5 -7
- data/spec/features/collection_spec.rb +28 -35
- data/spec/features/contact_form_spec.rb +24 -24
- data/spec/features/display_dashboard_spec.rb +11 -11
- data/spec/features/ingest_upload_files_spec.rb +10 -10
- data/spec/features/notifications_spec.rb +11 -11
- data/spec/features/ownership_transfer_spec.rb +111 -0
- data/spec/features/proxy_spec.rb +52 -0
- data/spec/features/search_spec.rb +1 -1
- data/spec/features/single_use_links_spec.rb +28 -18
- data/spec/features/users_spec.rb +3 -3
- data/spec/helpers/batch_edits_helper_spec.rb +1 -1
- data/spec/helpers/content_block_helper_spec.rb +1 -1
- data/spec/helpers/dashboard_helper_spec.rb +1 -1
- data/spec/helpers/generic_file_helper_spec.rb +1 -1
- data/spec/helpers/records_helper_spec.rb +1 -1
- data/spec/helpers/sufia_helper_spec.rb +8 -8
- data/spec/helpers/trophy_helper_spec.rb +1 -1
- data/spec/jobs/audit_job_spec.rb +5 -5
- data/spec/jobs/batch_update_job_spec.rb +14 -14
- data/spec/jobs/content_depositor_change_event_job_spec.rb +22 -0
- data/spec/jobs/event_jobs_spec.rb +104 -104
- data/spec/jobs/import_url_job_spec.rb +2 -2
- data/spec/jobs/ingest_local_file_job_spec.rb +1 -1
- data/spec/lib/sufia/breadcrumbs_spec.rb +3 -3
- data/spec/lib/sufia/id_service_spec.rb +1 -1
- data/spec/lib/sufia/upload_complete_behavior_spec.rb +4 -4
- data/spec/models/ability_spec.rb +59 -15
- data/spec/models/batch_spec.rb +16 -16
- data/spec/models/characterization_spec.rb +1 -1
- data/spec/models/checksum_audit_log_spec.rb +34 -26
- data/spec/models/collection_spec.rb +1 -1
- data/spec/models/download_spec.rb +1 -1
- data/spec/models/featured_work_list_spec.rb +1 -1
- data/spec/models/featured_work_spec.rb +15 -4
- data/spec/models/file_content_datastream_spec.rb +14 -14
- data/spec/models/file_usage_spec.rb +1 -1
- data/spec/models/fits_datastream_spec.rb +1 -1
- data/spec/models/generic_file/reload_on_save_spec.rb +4 -4
- data/spec/models/generic_file/visibility_spec.rb +1 -1
- data/spec/models/generic_file/web_form_spec.rb +6 -5
- data/spec/models/generic_file_rdf_datastream_spec.rb +1 -1
- data/spec/models/generic_file_spec.rb +254 -220
- data/spec/models/geo_names_resource_spec.rb +2 -2
- data/spec/models/local_authority_spec.rb +60 -59
- data/spec/models/pageview_spec.rb +1 -1
- data/spec/models/properties_datastream_spec.rb +29 -10
- data/spec/models/proxy_deposit_request_spec.rb +107 -0
- data/spec/models/single_use_link_spec.rb +13 -13
- data/spec/models/solr_document_spec.rb +1 -1
- data/spec/models/trophy_spec.rb +6 -6
- data/spec/models/user_spec.rb +38 -22
- data/spec/routing/featured_works_route_spec.rb +1 -1
- data/spec/routing/ownership_transfers_route_spec.rb +45 -0
- data/spec/routing/route_spec.rb +42 -42
- data/spec/services/noid_spec.rb +2 -2
- data/spec/spec_helper.rb +10 -5
- data/spec/support/cleaner.rb +12 -0
- data/spec/support/features.rb +5 -0
- data/spec/support/features/session_helpers.rb +3 -17
- data/spec/support/locations.rb +36 -0
- data/spec/support/poltergeist.rb +11 -0
- data/spec/support/proxies.rb +14 -0
- data/spec/support/selectors.rb +122 -0
- data/spec/views/batch/edit.html.erb_spec.rb +1 -1
- data/spec/views/batch_edits/check_all_spec.rb +4 -4
- data/spec/views/catalog/index.html.erb_spec.rb +1 -1
- data/spec/views/catalog/sort_and_per_page.html.erb_spec.rb +1 -1
- data/spec/views/collections/_form.html.erb_spec.rb +3 -1
- data/spec/views/collections/_show_descriptions.html.erb_spec.rb +1 -1
- data/spec/views/dashboard/index_spec.rb +3 -6
- data/spec/views/generic_file/edit.html.erb_spec.rb +1 -1
- data/spec/views/generic_file/show.html.erb_spec.rb +1 -1
- data/spec/views/generic_file/stats.html.erb_spec.rb +1 -1
- data/spec/views/my/facet.html.erb_spec.rb +2 -2
- data/spec/views/users/_follower_modal.html.erb_spec.rb +1 -1
- data/spec/views/users/_following_modal.html.erb_spec.rb +1 -1
- data/spec/views/users/_notify_number.html.erb_spec.rb +1 -1
- data/spec/views/users/_user_util_links.html.erb_spec.rb +1 -1
- data/spec/views/users/index.html.erb_spec.rb +2 -2
- data/spec/views/users/show.html.erb_spec.rb +2 -2
- data/sufia-models/app/models/concerns/sufia/ability.rb +22 -0
- data/sufia-models/app/models/concerns/sufia/generic_file.rb +1 -0
- data/sufia-models/app/models/concerns/sufia/generic_file/proxy_deposit.rb +22 -0
- data/sufia-models/app/models/concerns/sufia/properties_datastream_behavior.rb +3 -0
- data/sufia-models/app/models/concerns/sufia/user.rb +9 -0
- data/sufia-models/app/models/proxy_deposit_request.rb +85 -0
- data/sufia-models/app/models/proxy_deposit_rights.rb +4 -0
- data/sufia-models/app/models/sufia/avatar_uploader.rb +2 -3
- data/sufia-models/lib/generators/sufia/models/install_generator.rb +9 -1
- data/sufia-models/lib/generators/sufia/models/proxies_generator.rb +53 -0
- data/sufia-models/lib/generators/sufia/models/templates/migrations/create_proxy_deposit_requests.rb +16 -0
- data/sufia-models/lib/generators/sufia/models/templates/migrations/create_proxy_deposit_rights.rb +11 -0
- data/sufia-models/lib/sufia/models/engine.rb +1 -1
- data/sufia-models/lib/sufia/models/version.rb +1 -1
- data/sufia.gemspec +2 -1
- data/tasks/sufia-dev.rake +5 -0
- metadata +82 -6
- data/tasks/sufia-db.rake +0 -21
|
@@ -1,6 +1,40 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
|
-
describe GenericFile do
|
|
3
|
+
describe GenericFile, :type => :model do
|
|
4
|
+
let(:user) { FactoryGirl.find_or_create(:jill) }
|
|
5
|
+
|
|
6
|
+
before(:each) do
|
|
7
|
+
@file = GenericFile.new
|
|
8
|
+
@file.apply_depositor_metadata(user.user_key)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
describe "created for someone (proxy)" do
|
|
12
|
+
before do
|
|
13
|
+
@transfer_to = FactoryGirl.find_or_create(:jill)
|
|
14
|
+
end
|
|
15
|
+
after do
|
|
16
|
+
@file.destroy
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "transfers the request" do
|
|
20
|
+
@file.on_behalf_of = @transfer_to.user_key
|
|
21
|
+
stub_job = double('change depositor job')
|
|
22
|
+
allow(ContentDepositorChangeEventJob).to receive(:new).and_return(stub_job)
|
|
23
|
+
expect(Sufia.queue).to receive(:push).with(stub_job).once.and_return(true)
|
|
24
|
+
@file.save!
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe "delegations" do
|
|
29
|
+
before do
|
|
30
|
+
@file.proxy_depositor = "sally@example.com"
|
|
31
|
+
end
|
|
32
|
+
it "should include proxies" do
|
|
33
|
+
expect(@file).to respond_to(:relative_path)
|
|
34
|
+
expect(@file).to respond_to(:depositor)
|
|
35
|
+
expect(@file.proxy_depositor).to eq 'sally@example.com'
|
|
36
|
+
end
|
|
37
|
+
end
|
|
4
38
|
|
|
5
39
|
subject { GenericFile.new }
|
|
6
40
|
|
|
@@ -56,176 +90,176 @@ describe GenericFile do
|
|
|
56
90
|
context "when pdf?" do
|
|
57
91
|
it "should be true for pdf" do
|
|
58
92
|
subject.mime_type = 'application/pdf'
|
|
59
|
-
subject.
|
|
93
|
+
expect(subject).to be_pdf
|
|
60
94
|
end
|
|
61
95
|
end
|
|
62
96
|
context "when audio?" do
|
|
63
97
|
it "should be true for wav" do
|
|
64
98
|
subject.mime_type = 'audio/x-wave'
|
|
65
|
-
subject.
|
|
99
|
+
expect(subject).to be_audio
|
|
66
100
|
subject.mime_type = 'audio/x-wav'
|
|
67
|
-
subject.
|
|
101
|
+
expect(subject).to be_audio
|
|
68
102
|
end
|
|
69
103
|
it "should be true for mpeg" do
|
|
70
104
|
subject.mime_type = 'audio/mpeg'
|
|
71
|
-
subject.
|
|
105
|
+
expect(subject).to be_audio
|
|
72
106
|
subject.mime_type = 'audio/mp3'
|
|
73
|
-
subject.
|
|
107
|
+
expect(subject).to be_audio
|
|
74
108
|
end
|
|
75
109
|
it "should be true for ogg" do
|
|
76
110
|
subject.mime_type = 'audio/ogg'
|
|
77
|
-
subject.
|
|
111
|
+
expect(subject).to be_audio
|
|
78
112
|
end
|
|
79
113
|
end
|
|
80
114
|
context "when video?" do
|
|
81
115
|
it "should be true for avi" do
|
|
82
116
|
subject.mime_type = 'video/avi'
|
|
83
|
-
subject.
|
|
117
|
+
expect(subject).to be_video
|
|
84
118
|
end
|
|
85
119
|
it "should be true for webm" do
|
|
86
120
|
subject.mime_type = 'video/webm'
|
|
87
|
-
subject.
|
|
121
|
+
expect(subject).to be_video
|
|
88
122
|
end
|
|
89
123
|
it "should be true for mpeg" do
|
|
90
124
|
subject.mime_type = 'video/mp4'
|
|
91
|
-
subject.
|
|
125
|
+
expect(subject).to be_video
|
|
92
126
|
subject.mime_type = 'video/mpeg'
|
|
93
|
-
subject.
|
|
127
|
+
expect(subject).to be_video
|
|
94
128
|
end
|
|
95
129
|
it "should be true for quicktime" do
|
|
96
130
|
subject.mime_type = 'video/quicktime'
|
|
97
|
-
subject.
|
|
131
|
+
expect(subject).to be_video
|
|
98
132
|
end
|
|
99
133
|
it "should be true for mxf" do
|
|
100
134
|
subject.mime_type = 'application/mxf'
|
|
101
|
-
subject.
|
|
135
|
+
expect(subject).to be_video
|
|
102
136
|
end
|
|
103
137
|
end
|
|
104
138
|
end
|
|
105
139
|
|
|
106
140
|
describe "visibility" do
|
|
107
141
|
it "should not be changed when it's new" do
|
|
108
|
-
subject.
|
|
142
|
+
expect(subject).not_to be_visibility_changed
|
|
109
143
|
end
|
|
110
144
|
it "should be changed when it has been changed" do
|
|
111
145
|
subject.visibility= 'open'
|
|
112
|
-
subject.
|
|
146
|
+
expect(subject).to be_visibility_changed
|
|
113
147
|
end
|
|
114
148
|
|
|
115
149
|
it "should not be changed when it's set to its previous value" do
|
|
116
150
|
subject.visibility= 'restricted'
|
|
117
|
-
subject.
|
|
151
|
+
expect(subject).not_to be_visibility_changed
|
|
118
152
|
end
|
|
119
153
|
|
|
120
154
|
end
|
|
121
155
|
|
|
122
156
|
describe "attributes" do
|
|
123
157
|
it "should have rightsMetadata" do
|
|
124
|
-
subject.rightsMetadata.
|
|
158
|
+
expect(subject.rightsMetadata).to be_instance_of ParanoidRightsDatastream
|
|
125
159
|
end
|
|
126
160
|
it "should have properties datastream for depositor" do
|
|
127
|
-
subject.properties.
|
|
161
|
+
expect(subject.properties).to be_instance_of PropertiesDatastream
|
|
128
162
|
end
|
|
129
163
|
it "should have apply_depositor_metadata" do
|
|
130
|
-
subject.rightsMetadata.edit_access.
|
|
131
|
-
subject.depositor.
|
|
164
|
+
expect(subject.rightsMetadata.edit_access).to eq(['jcoyne'])
|
|
165
|
+
expect(subject.depositor).to eq('jcoyne')
|
|
132
166
|
end
|
|
133
167
|
it "should have a set of permissions" do
|
|
134
168
|
subject.read_groups=['group1', 'group2']
|
|
135
169
|
subject.edit_users=['user1']
|
|
136
170
|
subject.read_users=['user2', 'user3']
|
|
137
|
-
subject.permissions.
|
|
171
|
+
expect(subject.permissions).to eq([{type: "group", access: "read", name: "group1"},
|
|
138
172
|
{type: "group", access: "read", name: "group2"},
|
|
139
173
|
{type: "user", access: "read", name: "user2"},
|
|
140
174
|
{type: "user", access: "read", name: "user3"},
|
|
141
|
-
{type: "user", access: "edit", name: "user1"}]
|
|
175
|
+
{type: "user", access: "edit", name: "user1"}])
|
|
142
176
|
end
|
|
143
177
|
describe "updating permissions" do
|
|
144
178
|
it "should create new group permissions" do
|
|
145
179
|
subject.permissions = {new_group_name: {'group1'=>'read'}}
|
|
146
|
-
subject.permissions.
|
|
147
|
-
{type: "user", access: "edit", name: "jcoyne"}]
|
|
180
|
+
expect(subject.permissions).to eq([{type: "group", access: "read", name: "group1"},
|
|
181
|
+
{type: "user", access: "edit", name: "jcoyne"}])
|
|
148
182
|
end
|
|
149
183
|
it "should create new user permissions" do
|
|
150
184
|
subject.permissions = {new_user_name: {'user1'=>'read'}}
|
|
151
|
-
subject.permissions.
|
|
152
|
-
{type: "user", access: "edit", name: "jcoyne"}]
|
|
185
|
+
expect(subject.permissions).to eq([{type: "user", access: "read", name: "user1"},
|
|
186
|
+
{type: "user", access: "edit", name: "jcoyne"}])
|
|
153
187
|
end
|
|
154
188
|
it "should not replace existing groups" do
|
|
155
189
|
subject.permissions = {new_group_name: {'group1' => 'read'}}
|
|
156
190
|
subject.permissions = {new_group_name: {'group2' => 'read'}}
|
|
157
|
-
subject.permissions.
|
|
191
|
+
expect(subject.permissions).to eq([{type: "group", access: "read", name: "group1"},
|
|
158
192
|
{type: "group", access: "read", name: "group2"},
|
|
159
|
-
{type: "user", access: "edit", name: "jcoyne"}]
|
|
193
|
+
{type: "user", access: "edit", name: "jcoyne"}])
|
|
160
194
|
end
|
|
161
195
|
it "should not replace existing users" do
|
|
162
196
|
subject.permissions = {new_user_name:{'user1'=>'read'}}
|
|
163
197
|
subject.permissions = {new_user_name:{'user2'=>'read'}}
|
|
164
|
-
subject.permissions.
|
|
198
|
+
expect(subject.permissions).to eq([{type: "user", access: "read", name: "user1"},
|
|
165
199
|
{type: "user", access: "read", name: "user2"},
|
|
166
|
-
{type: "user", access: "edit", name: "jcoyne"}]
|
|
200
|
+
{type: "user", access: "edit", name: "jcoyne"}])
|
|
167
201
|
end
|
|
168
202
|
it "should update permissions on existing users" do
|
|
169
203
|
subject.permissions = {new_user_name:{'user1'=>'read'}}
|
|
170
204
|
subject.permissions = {user:{'user1'=>'edit'}}
|
|
171
|
-
subject.permissions.
|
|
172
|
-
{type: "user", access: "edit", name: "jcoyne"}]
|
|
205
|
+
expect(subject.permissions).to eq([{type: "user", access: "edit", name: "user1"},
|
|
206
|
+
{type: "user", access: "edit", name: "jcoyne"}])
|
|
173
207
|
end
|
|
174
208
|
it "should update permissions on existing groups" do
|
|
175
209
|
subject.permissions = {new_group_name:{'group1'=>'read'}}
|
|
176
210
|
subject.permissions = {group:{'group1'=>'edit'}}
|
|
177
|
-
subject.permissions.
|
|
178
|
-
{type: "user", access: "edit", name: "jcoyne"}]
|
|
211
|
+
expect(subject.permissions).to eq([{type: "group", access: "edit", name: "group1"},
|
|
212
|
+
{type: "user", access: "edit", name: "jcoyne"}])
|
|
179
213
|
end
|
|
180
214
|
end
|
|
181
215
|
it "should have a characterization datastream" do
|
|
182
|
-
subject.characterization.
|
|
216
|
+
expect(subject.characterization).to be_kind_of FitsDatastream
|
|
183
217
|
end
|
|
184
218
|
it "should have a dc desc metadata" do
|
|
185
|
-
subject.descMetadata.
|
|
219
|
+
expect(subject.descMetadata).to be_kind_of GenericFileRdfDatastream
|
|
186
220
|
end
|
|
187
221
|
it "should have content datastream" do
|
|
188
222
|
subject.add_file(File.open(fixture_path + '/world.png'), 'content', 'world.png')
|
|
189
|
-
subject.content.
|
|
223
|
+
expect(subject.content).to be_kind_of FileContentDatastream
|
|
190
224
|
end
|
|
191
225
|
end
|
|
192
226
|
describe "delegations" do
|
|
193
227
|
it "should delegate methods to properties metadata" do
|
|
194
|
-
subject.
|
|
195
|
-
subject.
|
|
228
|
+
expect(subject).to respond_to(:relative_path)
|
|
229
|
+
expect(subject).to respond_to(:depositor)
|
|
196
230
|
end
|
|
197
231
|
it "should delegate methods to descriptive metadata" do
|
|
198
|
-
subject.
|
|
199
|
-
subject.
|
|
200
|
-
subject.
|
|
201
|
-
subject.
|
|
202
|
-
subject.
|
|
203
|
-
subject.
|
|
204
|
-
subject.
|
|
205
|
-
subject.
|
|
206
|
-
subject.
|
|
207
|
-
subject.
|
|
208
|
-
subject.
|
|
209
|
-
subject.
|
|
210
|
-
subject.
|
|
211
|
-
subject.
|
|
212
|
-
subject.
|
|
213
|
-
subject.
|
|
232
|
+
expect(subject).to respond_to(:related_url)
|
|
233
|
+
expect(subject).to respond_to(:based_near)
|
|
234
|
+
expect(subject).to respond_to(:part_of)
|
|
235
|
+
expect(subject).to respond_to(:contributor)
|
|
236
|
+
expect(subject).to respond_to(:creator)
|
|
237
|
+
expect(subject).to respond_to(:title)
|
|
238
|
+
expect(subject).to respond_to(:description)
|
|
239
|
+
expect(subject).to respond_to(:publisher)
|
|
240
|
+
expect(subject).to respond_to(:date_created)
|
|
241
|
+
expect(subject).to respond_to(:date_uploaded)
|
|
242
|
+
expect(subject).to respond_to(:date_modified)
|
|
243
|
+
expect(subject).to respond_to(:subject)
|
|
244
|
+
expect(subject).to respond_to(:language)
|
|
245
|
+
expect(subject).to respond_to(:rights)
|
|
246
|
+
expect(subject).to respond_to(:resource_type)
|
|
247
|
+
expect(subject).to respond_to(:identifier)
|
|
214
248
|
end
|
|
215
249
|
it "should delegate methods to characterization metadata" do
|
|
216
|
-
subject.
|
|
217
|
-
subject.
|
|
218
|
-
subject.
|
|
219
|
-
subject.
|
|
220
|
-
subject.
|
|
221
|
-
subject.
|
|
222
|
-
subject.
|
|
223
|
-
subject.
|
|
224
|
-
subject.
|
|
225
|
-
subject.
|
|
250
|
+
expect(subject).to respond_to(:format_label)
|
|
251
|
+
expect(subject).to respond_to(:mime_type)
|
|
252
|
+
expect(subject).to respond_to(:file_size)
|
|
253
|
+
expect(subject).to respond_to(:last_modified)
|
|
254
|
+
expect(subject).to respond_to(:filename)
|
|
255
|
+
expect(subject).to respond_to(:original_checksum)
|
|
256
|
+
expect(subject).to respond_to(:well_formed)
|
|
257
|
+
expect(subject).to respond_to(:file_title)
|
|
258
|
+
expect(subject).to respond_to(:file_author)
|
|
259
|
+
expect(subject).to respond_to(:page_count)
|
|
226
260
|
end
|
|
227
261
|
it "should redefine to_param to make redis keys more recognizable" do
|
|
228
|
-
subject.to_param.
|
|
262
|
+
expect(subject.to_param).to eq(subject.noid)
|
|
229
263
|
end
|
|
230
264
|
describe "that have been saved" do
|
|
231
265
|
# This file has no content, so it doesn't characterize
|
|
@@ -244,10 +278,10 @@ describe GenericFile do
|
|
|
244
278
|
it "should have activity stream-related methods defined" do
|
|
245
279
|
subject.save
|
|
246
280
|
f = subject.reload
|
|
247
|
-
f.
|
|
248
|
-
f.
|
|
249
|
-
f.
|
|
250
|
-
f.
|
|
281
|
+
expect(f).to respond_to(:stream)
|
|
282
|
+
expect(f).to respond_to(:events)
|
|
283
|
+
expect(f).to respond_to(:create_event)
|
|
284
|
+
expect(f).to respond_to(:log_event)
|
|
251
285
|
end
|
|
252
286
|
it "should be able to set values via delegated methods" do
|
|
253
287
|
subject.related_url = ["http://example.org/"]
|
|
@@ -255,23 +289,23 @@ describe GenericFile do
|
|
|
255
289
|
subject.title = ["New work"]
|
|
256
290
|
subject.save
|
|
257
291
|
f = subject.reload
|
|
258
|
-
f.related_url.
|
|
259
|
-
f.creator.
|
|
260
|
-
f.title.
|
|
292
|
+
expect(f.related_url).to eq(["http://example.org/"])
|
|
293
|
+
expect(f.creator).to eq(["John Doe"])
|
|
294
|
+
expect(f.title).to eq(["New work"])
|
|
261
295
|
end
|
|
262
296
|
it "should be able to be added to w/o unexpected graph behavior" do
|
|
263
297
|
subject.creator = ["John Doe"]
|
|
264
298
|
subject.title = ["New work"]
|
|
265
299
|
subject.save
|
|
266
300
|
f = subject.reload
|
|
267
|
-
f.creator.
|
|
268
|
-
f.title.
|
|
301
|
+
expect(f.creator).to eq(["John Doe"])
|
|
302
|
+
expect(f.title).to eq(["New work"])
|
|
269
303
|
f.creator = ["Jane Doe"]
|
|
270
304
|
f.title << "Newer work"
|
|
271
305
|
f.save
|
|
272
306
|
f = subject.reload
|
|
273
|
-
f.creator.
|
|
274
|
-
f.title.
|
|
307
|
+
expect(f.creator).to eq(["Jane Doe"])
|
|
308
|
+
expect(f.title).to eq(["New work", "Newer work"])
|
|
275
309
|
end
|
|
276
310
|
end
|
|
277
311
|
end
|
|
@@ -327,12 +361,12 @@ describe GenericFile do
|
|
|
327
361
|
end
|
|
328
362
|
it "should support multi-valued fields in solr" do
|
|
329
363
|
subject.tag = ["tag1", "tag2"]
|
|
330
|
-
|
|
364
|
+
expect { subject.save }.not_to raise_error
|
|
331
365
|
subject.delete
|
|
332
366
|
end
|
|
333
367
|
it "should support setting and getting the relative_path value" do
|
|
334
368
|
subject.relative_path = "documents/research/NSF/2010"
|
|
335
|
-
subject.relative_path.
|
|
369
|
+
expect(subject.relative_path).to eq("documents/research/NSF/2010")
|
|
336
370
|
end
|
|
337
371
|
describe "create_thumbnail" do
|
|
338
372
|
before do
|
|
@@ -344,14 +378,14 @@ describe GenericFile do
|
|
|
344
378
|
end
|
|
345
379
|
describe "with a video", if: Sufia.config.enable_ffmpeg do
|
|
346
380
|
before do
|
|
347
|
-
@f.
|
|
381
|
+
allow(@f).to receive_messages(mime_type: 'video/quicktime') #Would get set by the characterization job
|
|
348
382
|
@f.add_file(File.open("#{fixture_path}/countdown.avi", 'rb'), 'content', 'countdown.avi')
|
|
349
383
|
@f.save
|
|
350
384
|
end
|
|
351
385
|
it "should make a png thumbnail" do
|
|
352
386
|
@f.create_thumbnail
|
|
353
|
-
@f.thumbnail.content.size.
|
|
354
|
-
@f.thumbnail.mimeType.
|
|
387
|
+
expect(@f.thumbnail.content.size).to eq(4768) # this is a bad test. I just want to show that it did something.
|
|
388
|
+
expect(@f.thumbnail.mimeType).to eq('image/png')
|
|
355
389
|
end
|
|
356
390
|
end
|
|
357
391
|
end
|
|
@@ -384,33 +418,33 @@ describe GenericFile do
|
|
|
384
418
|
end
|
|
385
419
|
it "should schedule a audit job for each datastream" do
|
|
386
420
|
s0 = double('zero')
|
|
387
|
-
AuditJob.
|
|
388
|
-
Sufia.queue.
|
|
421
|
+
expect(AuditJob).to receive(:new).with(@f.pid, 'descMetadata', "descMetadata.0").and_return(s0)
|
|
422
|
+
expect(Sufia.queue).to receive(:push).with(s0)
|
|
389
423
|
s1 = double('one')
|
|
390
|
-
AuditJob.
|
|
391
|
-
Sufia.queue.
|
|
424
|
+
expect(AuditJob).to receive(:new).with(@f.pid, 'DC', "DC1.0").and_return(s1)
|
|
425
|
+
expect(Sufia.queue).to receive(:push).with(s1)
|
|
392
426
|
s2 = double('two')
|
|
393
|
-
AuditJob.
|
|
394
|
-
Sufia.queue.
|
|
427
|
+
expect(AuditJob).to receive(:new).with(@f.pid, 'RELS-EXT', "RELS-EXT.0").and_return(s2)
|
|
428
|
+
expect(Sufia.queue).to receive(:push).with(s2)
|
|
395
429
|
s3 = double('three')
|
|
396
|
-
AuditJob.
|
|
397
|
-
Sufia.queue.
|
|
430
|
+
expect(AuditJob).to receive(:new).with(@f.pid, 'rightsMetadata', "rightsMetadata.0").and_return(s3)
|
|
431
|
+
expect(Sufia.queue).to receive(:push).with(s3)
|
|
398
432
|
s4 = double('four')
|
|
399
|
-
AuditJob.
|
|
400
|
-
Sufia.queue.
|
|
433
|
+
expect(AuditJob).to receive(:new).with(@f.pid, 'properties', "properties.0").and_return(s4)
|
|
434
|
+
expect(Sufia.queue).to receive(:push).with(s4)
|
|
401
435
|
s5 = double('five')
|
|
402
|
-
AuditJob.
|
|
403
|
-
Sufia.queue.
|
|
436
|
+
expect(AuditJob).to receive(:new).with(@f.pid, 'content', "content.0").and_return(s5)
|
|
437
|
+
expect(Sufia.queue).to receive(:push).with(s5)
|
|
404
438
|
@f.audit!
|
|
405
439
|
end
|
|
406
440
|
it "should log a failing audit" do
|
|
407
|
-
@f.datastreams.each { |ds| ds.
|
|
408
|
-
GenericFile.
|
|
441
|
+
@f.datastreams.each { |ds| allow(ds).to receive(:dsChecksumValid).and_return(false) }
|
|
442
|
+
allow(GenericFile).to receive(:run_audit).and_return(double(:respose, pass:1, created_at: '2005-12-20', pid: 'foo:123', dsid: 'foo', version: '1'))
|
|
409
443
|
@f.audit!
|
|
410
444
|
expect(ChecksumAuditLog.all).to be_all { |cal| cal.pass == 0 }
|
|
411
445
|
end
|
|
412
446
|
it "should log a passing audit" do
|
|
413
|
-
GenericFile.
|
|
447
|
+
allow(GenericFile).to receive(:run_audit).and_return(double(:respose, pass:1, created_at: '2005-12-20', pid: 'foo:123', dsid: 'foo', version: '1'))
|
|
414
448
|
@f.audit!
|
|
415
449
|
expect(ChecksumAuditLog.all).to be_all { |cal| cal.pass == 1 }
|
|
416
450
|
end
|
|
@@ -431,22 +465,22 @@ describe GenericFile do
|
|
|
431
465
|
@new = ChecksumAuditLog.create(pid: @f.pid, dsid: @version.dsid, version: @version.versionID, pass: 0)
|
|
432
466
|
end
|
|
433
467
|
it "should not prune failed audits" do
|
|
434
|
-
@version.
|
|
468
|
+
expect(@version).to receive(:dsChecksumValid).and_return(true)
|
|
435
469
|
GenericFile.run_audit(@version)
|
|
436
470
|
|
|
437
|
-
@version.
|
|
471
|
+
expect(@version).to receive(:dsChecksumValid).and_return(false)
|
|
438
472
|
GenericFile.run_audit(@version)
|
|
439
473
|
|
|
440
|
-
@version.
|
|
474
|
+
expect(@version).to receive(:dsChecksumValid).and_return(false)
|
|
441
475
|
GenericFile.run_audit(@version)
|
|
442
476
|
|
|
443
|
-
@version.
|
|
477
|
+
expect(@version).to receive(:dsChecksumValid).and_return(true)
|
|
444
478
|
GenericFile.run_audit(@version)
|
|
445
479
|
|
|
446
|
-
@version.
|
|
480
|
+
expect(@version).to receive(:dsChecksumValid).and_return(false)
|
|
447
481
|
GenericFile.run_audit(@version)
|
|
448
482
|
|
|
449
|
-
@f.logs(@version.dsid).map(&:pass).
|
|
483
|
+
expect(@f.logs(@version.dsid).map(&:pass)).to eq([0, 1, 0, 0, 1, 0, 1])
|
|
450
484
|
end
|
|
451
485
|
|
|
452
486
|
end
|
|
@@ -503,15 +537,15 @@ describe GenericFile do
|
|
|
503
537
|
@new_file.delete
|
|
504
538
|
end
|
|
505
539
|
it "should support the noid method" do
|
|
506
|
-
@new_file.
|
|
540
|
+
expect(@new_file).to respond_to(:noid)
|
|
507
541
|
end
|
|
508
542
|
it "should return the expected identifier" do
|
|
509
|
-
@new_file.noid.
|
|
543
|
+
expect(@new_file.noid).to eq('123')
|
|
510
544
|
end
|
|
511
545
|
it "should work outside of an instance" do
|
|
512
546
|
new_id = Sufia::IdService.mint
|
|
513
547
|
noid = new_id.split(':').last
|
|
514
|
-
Sufia::Noid.noidify(new_id).
|
|
548
|
+
expect(Sufia::Noid.noidify(new_id)).to eq(noid)
|
|
515
549
|
end
|
|
516
550
|
end
|
|
517
551
|
describe "characterize" do
|
|
@@ -519,7 +553,7 @@ describe GenericFile do
|
|
|
519
553
|
subject.add_file(File.open(fixture_path + '/world.png'), 'content', 'world.png')
|
|
520
554
|
subject.characterize
|
|
521
555
|
doc = Nokogiri::XML.parse(subject.characterization.content)
|
|
522
|
-
doc.root.xpath('//ns:imageWidth/text()', {'ns'=>'http://hul.harvard.edu/ois/xml/ns/fits/fits_output'}).inner_text.
|
|
556
|
+
expect(doc.root.xpath('//ns:imageWidth/text()', {'ns'=>'http://hul.harvard.edu/ois/xml/ns/fits/fits_output'}).inner_text).to eq('50')
|
|
523
557
|
end
|
|
524
558
|
context "after characterization" do
|
|
525
559
|
before(:all) do
|
|
@@ -535,25 +569,25 @@ describe GenericFile do
|
|
|
535
569
|
@myfile.destroy
|
|
536
570
|
end
|
|
537
571
|
it "should return expected results after a save" do
|
|
538
|
-
@myfile.file_size.
|
|
539
|
-
@myfile.original_checksum.
|
|
572
|
+
expect(@myfile.file_size).to eq(['218882'])
|
|
573
|
+
expect(@myfile.original_checksum).to eq(['5a2d761cab7c15b2b3bb3465ce64586d'])
|
|
540
574
|
end
|
|
541
575
|
it "should return a hash of all populated values from the characterization terminology" do
|
|
542
|
-
@myfile.characterization_terms[:format_label].
|
|
543
|
-
@myfile.characterization_terms[:mime_type].
|
|
544
|
-
@myfile.characterization_terms[:file_size].
|
|
545
|
-
@myfile.characterization_terms[:original_checksum].
|
|
546
|
-
@myfile.characterization_terms.keys.
|
|
547
|
-
@myfile.characterization_terms.keys.
|
|
576
|
+
expect(@myfile.characterization_terms[:format_label]).to eq(["Portable Document Format"])
|
|
577
|
+
expect(@myfile.characterization_terms[:mime_type]).to eq("application/pdf")
|
|
578
|
+
expect(@myfile.characterization_terms[:file_size]).to eq(["218882"])
|
|
579
|
+
expect(@myfile.characterization_terms[:original_checksum]).to eq(["5a2d761cab7c15b2b3bb3465ce64586d"])
|
|
580
|
+
expect(@myfile.characterization_terms.keys).to include(:last_modified)
|
|
581
|
+
expect(@myfile.characterization_terms.keys).to include(:filename)
|
|
548
582
|
end
|
|
549
583
|
it "should append metadata from the characterization" do
|
|
550
|
-
@myfile.title.
|
|
551
|
-
@myfile.filename[0].
|
|
584
|
+
expect(@myfile.title).to include("Microsoft Word - sample.pdf.docx")
|
|
585
|
+
expect(@myfile.filename[0]).to eq(@myfile.label)
|
|
552
586
|
end
|
|
553
587
|
it "should append each term only once" do
|
|
554
588
|
@myfile.append_metadata
|
|
555
|
-
@myfile.format_label.
|
|
556
|
-
@myfile.title.
|
|
589
|
+
expect(@myfile.format_label).to eq(["Portable Document Format"])
|
|
590
|
+
expect(@myfile.title).to include("Microsoft Word - sample.pdf.docx")
|
|
557
591
|
end
|
|
558
592
|
it 'includes extracted full-text content' do
|
|
559
593
|
expect(@myfile.full_text.content).to eq("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nMicrosoft Word - sample.pdf.docx\n\n\n \n \n\n \n\n \n\n \n\nThis PDF file was created using CutePDF. \n\nwww.cutepdf.com")
|
|
@@ -563,7 +597,7 @@ describe GenericFile do
|
|
|
563
597
|
describe "label" do
|
|
564
598
|
it "should set the inner label" do
|
|
565
599
|
subject.label = "My New Label"
|
|
566
|
-
subject.inner_object.label.
|
|
600
|
+
expect(subject.inner_object.label).to eq("My New Label")
|
|
567
601
|
end
|
|
568
602
|
end
|
|
569
603
|
context "with rightsMetadata" do
|
|
@@ -574,27 +608,27 @@ describe GenericFile do
|
|
|
574
608
|
m
|
|
575
609
|
end
|
|
576
610
|
it "should have read groups accessor" do
|
|
577
|
-
subject.read_groups.
|
|
611
|
+
expect(subject.read_groups).to eq(['group-6', 'group-7'])
|
|
578
612
|
end
|
|
579
613
|
it "should have read groups string accessor" do
|
|
580
|
-
subject.read_groups_string.
|
|
614
|
+
expect(subject.read_groups_string).to eq('group-6, group-7')
|
|
581
615
|
end
|
|
582
616
|
it "should have read groups writer" do
|
|
583
617
|
subject.read_groups = ['group-2', 'group-3']
|
|
584
|
-
subject.rightsMetadata.groups.
|
|
585
|
-
subject.rightsMetadata.users.
|
|
618
|
+
expect(subject.rightsMetadata.groups).to eq({'group-2' => 'read', 'group-3'=>'read', 'group-8' => 'edit'})
|
|
619
|
+
expect(subject.rightsMetadata.users).to eq({"person1"=>"read","person2"=>"read", 'jcoyne' => 'edit'})
|
|
586
620
|
end
|
|
587
621
|
|
|
588
622
|
it "should have read groups string writer" do
|
|
589
623
|
subject.read_groups_string = 'umg/up.dlt.staff, group-3'
|
|
590
|
-
subject.rightsMetadata.groups.
|
|
591
|
-
subject.rightsMetadata.users.
|
|
624
|
+
expect(subject.rightsMetadata.groups).to eq({'umg/up.dlt.staff' => 'read', 'group-3'=>'read', 'group-8' => 'edit'})
|
|
625
|
+
expect(subject.rightsMetadata.users).to eq({"person1"=>"read","person2"=>"read", 'jcoyne' => 'edit'})
|
|
592
626
|
end
|
|
593
627
|
it "should only revoke eligible groups" do
|
|
594
628
|
subject.set_read_groups(['group-2', 'group-3'], ['group-6'])
|
|
595
629
|
# 'group-7' is not eligible to be revoked
|
|
596
|
-
subject.rightsMetadata.groups.
|
|
597
|
-
subject.rightsMetadata.users.
|
|
630
|
+
expect(subject.rightsMetadata.groups).to eq({'group-2' => 'read', 'group-3'=>'read', 'group-7' => 'read', 'group-8' => 'edit'})
|
|
631
|
+
expect(subject.rightsMetadata.users).to eq({"person1"=>"read","person2"=>"read", 'jcoyne' => 'edit'})
|
|
598
632
|
end
|
|
599
633
|
end
|
|
600
634
|
describe "permissions validation" do
|
|
@@ -634,66 +668,66 @@ describe GenericFile do
|
|
|
634
668
|
end
|
|
635
669
|
it "should work via permissions=()" do
|
|
636
670
|
@file.permissions = {user: {'mjg36' => 'read'}}
|
|
637
|
-
|
|
671
|
+
expect { @file.save }.not_to raise_error
|
|
638
672
|
expect(@file).to be_new_record
|
|
639
|
-
@file.errors.
|
|
640
|
-
@file.errors[:edit_users].
|
|
673
|
+
expect(@file.errors).to include(:edit_users)
|
|
674
|
+
expect(@file.errors[:edit_users]).to include('Depositor must have edit access')
|
|
641
675
|
expect(@file).to_not be_valid
|
|
642
676
|
end
|
|
643
677
|
it "should work via update_attributes" do
|
|
644
678
|
# automatically triggers save
|
|
645
|
-
|
|
679
|
+
expect { @file.update_attributes(read_users_string: 'mjg36') }.not_to raise_error
|
|
646
680
|
expect(@file).to be_new_record
|
|
647
|
-
@file.errors.
|
|
648
|
-
@file.errors[:edit_users].
|
|
681
|
+
expect(@file.errors).to include(:edit_users)
|
|
682
|
+
expect(@file.errors[:edit_users]).to include('Depositor must have edit access')
|
|
649
683
|
expect(@file).to_not be_valid
|
|
650
684
|
end
|
|
651
685
|
it "should work via update_indexed_attributes" do
|
|
652
686
|
@rightsmd.update_indexed_attributes([:edit_access, :person] => '')
|
|
653
|
-
|
|
687
|
+
expect { @file.save }.not_to raise_error
|
|
654
688
|
expect(@file).to be_new_record
|
|
655
|
-
@file.errors.
|
|
656
|
-
@file.errors[:edit_users].
|
|
689
|
+
expect(@file.errors).to include(:edit_users)
|
|
690
|
+
expect(@file.errors[:edit_users]).to include('Depositor must have edit access')
|
|
657
691
|
expect(@file).to_not be_valid
|
|
658
692
|
end
|
|
659
693
|
it "should work via permissions()" do
|
|
660
694
|
@rightsmd.permissions({person: "mjg36"}, "read")
|
|
661
|
-
|
|
695
|
+
expect { @file.save }.not_to raise_error
|
|
662
696
|
expect(@file).to be_new_record
|
|
663
|
-
@file.errors.
|
|
664
|
-
@file.errors[:edit_users].
|
|
697
|
+
expect(@file.errors).to include(:edit_users)
|
|
698
|
+
expect(@file.errors[:edit_users]).to include('Depositor must have edit access')
|
|
665
699
|
expect(@file).to_not be_valid
|
|
666
700
|
end
|
|
667
701
|
it "should work via update_permissions()" do
|
|
668
702
|
@rightsmd.update_permissions({"person" => {"mjg36" => "read"}})
|
|
669
|
-
|
|
703
|
+
expect { @file.save }.not_to raise_error
|
|
670
704
|
expect(@file).to be_new_record
|
|
671
|
-
@file.errors.
|
|
672
|
-
@file.errors[:edit_users].
|
|
705
|
+
expect(@file.errors).to include(:edit_users)
|
|
706
|
+
expect(@file.errors[:edit_users]).to include('Depositor must have edit access')
|
|
673
707
|
expect(@file).to_not be_valid
|
|
674
708
|
end
|
|
675
709
|
it "should work via content=()" do
|
|
676
710
|
@rightsmd.content=(@rights_xml)
|
|
677
|
-
|
|
711
|
+
expect { @file.save }.not_to raise_error
|
|
678
712
|
expect(@file).to be_new_record
|
|
679
|
-
@file.errors.
|
|
680
|
-
@file.errors[:edit_users].
|
|
713
|
+
expect(@file.errors).to include(:edit_users)
|
|
714
|
+
expect(@file.errors[:edit_users]).to include('Depositor must have edit access')
|
|
681
715
|
expect(@file).to_not be_valid
|
|
682
716
|
end
|
|
683
717
|
it "should work via ng_xml=()" do
|
|
684
718
|
@rightsmd.ng_xml=(Nokogiri::XML::Document.parse(@rights_xml))
|
|
685
|
-
|
|
719
|
+
expect { @file.save }.not_to raise_error
|
|
686
720
|
expect(@file).to be_new_record
|
|
687
|
-
@file.errors.
|
|
688
|
-
@file.errors[:edit_users].
|
|
721
|
+
expect(@file.errors).to include(:edit_users)
|
|
722
|
+
expect(@file.errors[:edit_users]).to include('Depositor must have edit access')
|
|
689
723
|
expect(@file).to_not be_valid
|
|
690
724
|
end
|
|
691
725
|
it "should work via update_values()" do
|
|
692
726
|
@rightsmd.update_values([:edit_access, :person] => '')
|
|
693
|
-
|
|
727
|
+
expect { @file.save }.not_to raise_error
|
|
694
728
|
expect(@file).to be_new_record
|
|
695
|
-
@file.errors.
|
|
696
|
-
@file.errors[:edit_users].
|
|
729
|
+
expect(@file.errors).to include(:edit_users)
|
|
730
|
+
expect(@file.errors[:edit_users]).to include('Depositor must have edit access')
|
|
697
731
|
expect(@file).to_not be_valid
|
|
698
732
|
end
|
|
699
733
|
end
|
|
@@ -734,66 +768,66 @@ describe GenericFile do
|
|
|
734
768
|
end
|
|
735
769
|
it "should work via permissions=()" do
|
|
736
770
|
@file.permissions = {group: {'public' => 'edit'}}
|
|
737
|
-
|
|
771
|
+
expect { @file.save }.not_to raise_error
|
|
738
772
|
expect(@file).to be_new_record
|
|
739
|
-
@file.errors.
|
|
740
|
-
@file.errors[:edit_groups].
|
|
773
|
+
expect(@file.errors).to include(:edit_groups)
|
|
774
|
+
expect(@file.errors[:edit_groups]).to include('Public cannot have edit access')
|
|
741
775
|
expect(@file).to_not be_valid
|
|
742
776
|
end
|
|
743
777
|
it "should work via update_attributes" do
|
|
744
778
|
# automatically triggers save
|
|
745
|
-
|
|
779
|
+
expect { @file.update_attributes(edit_groups_string: 'public') }.not_to raise_error
|
|
746
780
|
expect(@file).to be_new_record
|
|
747
|
-
@file.errors.
|
|
748
|
-
@file.errors[:edit_groups].
|
|
781
|
+
expect(@file.errors).to include(:edit_groups)
|
|
782
|
+
expect(@file.errors[:edit_groups]).to include('Public cannot have edit access')
|
|
749
783
|
expect(@file).to_not be_valid
|
|
750
784
|
end
|
|
751
785
|
it "should work via update_indexed_attributes" do
|
|
752
786
|
@rightsmd.update_indexed_attributes([:edit_access, :group] => 'public')
|
|
753
|
-
|
|
787
|
+
expect { @file.save }.not_to raise_error
|
|
754
788
|
expect(@file).to be_new_record
|
|
755
|
-
@file.errors.
|
|
756
|
-
@file.errors[:edit_groups].
|
|
789
|
+
expect(@file.errors).to include(:edit_groups)
|
|
790
|
+
expect(@file.errors[:edit_groups]).to include('Public cannot have edit access')
|
|
757
791
|
expect(@file).to_not be_valid
|
|
758
792
|
end
|
|
759
793
|
it "should work via permissions()" do
|
|
760
794
|
@rightsmd.permissions({group: "public"}, "edit")
|
|
761
|
-
|
|
795
|
+
expect { @file.save }.not_to raise_error
|
|
762
796
|
expect(@file).to be_new_record
|
|
763
|
-
@file.errors.
|
|
764
|
-
@file.errors[:edit_groups].
|
|
797
|
+
expect(@file.errors).to include(:edit_groups)
|
|
798
|
+
expect(@file.errors[:edit_groups]).to include('Public cannot have edit access')
|
|
765
799
|
expect(@file).to_not be_valid
|
|
766
800
|
end
|
|
767
801
|
it "should work via update_permissions()" do
|
|
768
802
|
@rightsmd.update_permissions({"group" => {"public" => "edit"}})
|
|
769
|
-
|
|
803
|
+
expect { @file.save }.not_to raise_error
|
|
770
804
|
expect(@file).to be_new_record
|
|
771
|
-
@file.errors.
|
|
772
|
-
@file.errors[:edit_groups].
|
|
805
|
+
expect(@file.errors).to include(:edit_groups)
|
|
806
|
+
expect(@file.errors[:edit_groups]).to include('Public cannot have edit access')
|
|
773
807
|
expect(@file).to_not be_valid
|
|
774
808
|
end
|
|
775
809
|
it "should work via content=()" do
|
|
776
810
|
@rightsmd.content=(@rights_xml)
|
|
777
|
-
|
|
811
|
+
expect { @file.save }.not_to raise_error
|
|
778
812
|
expect(@file).to be_new_record
|
|
779
|
-
@file.errors.
|
|
780
|
-
@file.errors[:edit_groups].
|
|
813
|
+
expect(@file.errors).to include(:edit_groups)
|
|
814
|
+
expect(@file.errors[:edit_groups]).to include('Public cannot have edit access')
|
|
781
815
|
expect(@file).to_not be_valid
|
|
782
816
|
end
|
|
783
817
|
it "should work via ng_xml=()" do
|
|
784
818
|
@rightsmd.ng_xml=(Nokogiri::XML::Document.parse(@rights_xml))
|
|
785
|
-
|
|
819
|
+
expect { @file.save }.not_to raise_error
|
|
786
820
|
expect(@file).to be_new_record
|
|
787
|
-
@file.errors.
|
|
788
|
-
@file.errors[:edit_groups].
|
|
821
|
+
expect(@file.errors).to include(:edit_groups)
|
|
822
|
+
expect(@file.errors[:edit_groups]).to include('Public cannot have edit access')
|
|
789
823
|
expect(@file).to_not be_valid
|
|
790
824
|
end
|
|
791
825
|
it "should work via update_values()" do
|
|
792
826
|
@rightsmd.update_values([:edit_access, :group] => 'public')
|
|
793
|
-
|
|
827
|
+
expect { @file.save }.not_to raise_error
|
|
794
828
|
expect(@file).to be_new_record
|
|
795
|
-
@file.errors.
|
|
796
|
-
@file.errors[:edit_groups].
|
|
829
|
+
expect(@file.errors).to include(:edit_groups)
|
|
830
|
+
expect(@file.errors[:edit_groups]).to include('Public cannot have edit access')
|
|
797
831
|
expect(@file).to_not be_valid
|
|
798
832
|
end
|
|
799
833
|
end
|
|
@@ -834,66 +868,66 @@ describe GenericFile do
|
|
|
834
868
|
end
|
|
835
869
|
it "should work via permissions=()" do
|
|
836
870
|
@file.permissions = {group: {'registered' => 'edit'}}
|
|
837
|
-
|
|
871
|
+
expect { @file.save }.not_to raise_error
|
|
838
872
|
expect(@file).to be_new_record
|
|
839
|
-
@file.errors.
|
|
840
|
-
@file.errors[:edit_groups].
|
|
873
|
+
expect(@file.errors).to include(:edit_groups)
|
|
874
|
+
expect(@file.errors[:edit_groups]).to include('Registered cannot have edit access')
|
|
841
875
|
expect(@file).to_not be_valid
|
|
842
876
|
end
|
|
843
877
|
it "should work via update_attributes" do
|
|
844
878
|
# automatically triggers save
|
|
845
|
-
|
|
879
|
+
expect { @file.update_attributes(edit_groups_string: 'registered') }.not_to raise_error
|
|
846
880
|
expect(@file).to be_new_record
|
|
847
|
-
@file.errors.
|
|
848
|
-
@file.errors[:edit_groups].
|
|
881
|
+
expect(@file.errors).to include(:edit_groups)
|
|
882
|
+
expect(@file.errors[:edit_groups]).to include('Registered cannot have edit access')
|
|
849
883
|
expect(@file).to_not be_valid
|
|
850
884
|
end
|
|
851
885
|
it "should work via update_indexed_attributes" do
|
|
852
886
|
@rightsmd.update_indexed_attributes([:edit_access, :group] => 'registered')
|
|
853
|
-
|
|
887
|
+
expect { @file.save }.not_to raise_error
|
|
854
888
|
expect(@file).to be_new_record
|
|
855
|
-
@file.errors.
|
|
856
|
-
@file.errors[:edit_groups].
|
|
889
|
+
expect(@file.errors).to include(:edit_groups)
|
|
890
|
+
expect(@file.errors[:edit_groups]).to include('Registered cannot have edit access')
|
|
857
891
|
expect(@file).to_not be_valid
|
|
858
892
|
end
|
|
859
893
|
it "should work via permissions()" do
|
|
860
894
|
@rightsmd.permissions({group: "registered"}, "edit")
|
|
861
|
-
|
|
895
|
+
expect { @file.save }.not_to raise_error
|
|
862
896
|
expect(@file).to be_new_record
|
|
863
|
-
@file.errors.
|
|
864
|
-
@file.errors[:edit_groups].
|
|
897
|
+
expect(@file.errors).to include(:edit_groups)
|
|
898
|
+
expect(@file.errors[:edit_groups]).to include('Registered cannot have edit access')
|
|
865
899
|
expect(@file).to_not be_valid
|
|
866
900
|
end
|
|
867
901
|
it "should work via update_permissions()" do
|
|
868
902
|
@rightsmd.update_permissions({"group" => {"registered" => "edit"}})
|
|
869
|
-
|
|
903
|
+
expect { @file.save }.not_to raise_error
|
|
870
904
|
expect(@file).to be_new_record
|
|
871
|
-
@file.errors.
|
|
872
|
-
@file.errors[:edit_groups].
|
|
905
|
+
expect(@file.errors).to include(:edit_groups)
|
|
906
|
+
expect(@file.errors[:edit_groups]).to include('Registered cannot have edit access')
|
|
873
907
|
expect(@file).to_not be_valid
|
|
874
908
|
end
|
|
875
909
|
it "should work via content=()" do
|
|
876
910
|
@rightsmd.content=(@rights_xml)
|
|
877
|
-
|
|
911
|
+
expect { @file.save }.not_to raise_error
|
|
878
912
|
expect(@file).to be_new_record
|
|
879
|
-
@file.errors.
|
|
880
|
-
@file.errors[:edit_groups].
|
|
913
|
+
expect(@file.errors).to include(:edit_groups)
|
|
914
|
+
expect(@file.errors[:edit_groups]).to include('Registered cannot have edit access')
|
|
881
915
|
expect(@file).to_not be_valid
|
|
882
916
|
end
|
|
883
917
|
it "should work via ng_xml=()" do
|
|
884
918
|
@rightsmd.ng_xml=(Nokogiri::XML::Document.parse(@rights_xml))
|
|
885
|
-
|
|
919
|
+
expect { @file.save }.not_to raise_error
|
|
886
920
|
expect(@file).to be_new_record
|
|
887
|
-
@file.errors.
|
|
888
|
-
@file.errors[:edit_groups].
|
|
921
|
+
expect(@file.errors).to include(:edit_groups)
|
|
922
|
+
expect(@file.errors[:edit_groups]).to include('Registered cannot have edit access')
|
|
889
923
|
expect(@file).to_not be_valid
|
|
890
924
|
end
|
|
891
925
|
it "should work via update_values()" do
|
|
892
926
|
@rightsmd.update_values([:edit_access, :group] => 'registered')
|
|
893
|
-
|
|
927
|
+
expect { @file.save }.not_to raise_error
|
|
894
928
|
expect(@file).to be_new_record
|
|
895
|
-
@file.errors.
|
|
896
|
-
@file.errors[:edit_groups].
|
|
929
|
+
expect(@file.errors).to include(:edit_groups)
|
|
930
|
+
expect(@file.errors[:edit_groups]).to include('Registered cannot have edit access')
|
|
897
931
|
expect(@file).to_not be_valid
|
|
898
932
|
end
|
|
899
933
|
end
|
|
@@ -936,58 +970,58 @@ describe GenericFile do
|
|
|
936
970
|
end
|
|
937
971
|
it "should work via permissions=()" do
|
|
938
972
|
@file.permissions = {group: {'registered' => 'read'}}
|
|
939
|
-
|
|
973
|
+
expect { @file.save }.not_to raise_error
|
|
940
974
|
expect(@file).to_not be_new_record
|
|
941
|
-
@file.errors.
|
|
975
|
+
expect(@file.errors).to be_empty
|
|
942
976
|
expect(@file).to be_valid
|
|
943
977
|
end
|
|
944
978
|
it "should work via update_attributes" do
|
|
945
979
|
# automatically triggers save
|
|
946
|
-
|
|
980
|
+
expect { @file.update_attributes(read_groups_string: 'registered') }.not_to raise_error
|
|
947
981
|
expect(@file).to_not be_new_record
|
|
948
|
-
@file.errors.
|
|
982
|
+
expect(@file.errors).to be_empty
|
|
949
983
|
expect(@file).to be_valid
|
|
950
984
|
end
|
|
951
985
|
it "should work via update_indexed_attributes" do
|
|
952
986
|
@rightsmd.update_indexed_attributes([:read_access, :group] => 'registered')
|
|
953
|
-
|
|
987
|
+
expect { @file.save }.not_to raise_error
|
|
954
988
|
expect(@file).to_not be_new_record
|
|
955
|
-
@file.errors.
|
|
989
|
+
expect(@file.errors).to be_empty
|
|
956
990
|
expect(@file).to be_valid
|
|
957
991
|
end
|
|
958
992
|
it "should work via permissions()" do
|
|
959
993
|
@rightsmd.permissions({group: "registered"}, "read")
|
|
960
|
-
|
|
994
|
+
expect { @file.save }.not_to raise_error
|
|
961
995
|
expect(@file).to_not be_new_record
|
|
962
|
-
@file.errors.
|
|
996
|
+
expect(@file.errors).to be_empty
|
|
963
997
|
expect(@file).to be_valid
|
|
964
998
|
end
|
|
965
999
|
it "should work via update_permissions()" do
|
|
966
1000
|
@rightsmd.update_permissions({"group" => {"registered" => "read"}})
|
|
967
|
-
|
|
1001
|
+
expect { @file.save }.not_to raise_error
|
|
968
1002
|
expect(@file).to_not be_new_record
|
|
969
|
-
@file.errors.
|
|
1003
|
+
expect(@file.errors).to be_empty
|
|
970
1004
|
expect(@file).to be_valid
|
|
971
1005
|
end
|
|
972
1006
|
it "should work via content=()" do
|
|
973
1007
|
@rightsmd.content=(@rights_xml)
|
|
974
|
-
|
|
1008
|
+
expect { @file.save }.not_to raise_error
|
|
975
1009
|
expect(@file).to_not be_new_record
|
|
976
|
-
@file.errors.
|
|
1010
|
+
expect(@file.errors).to be_empty
|
|
977
1011
|
expect(@file).to be_valid
|
|
978
1012
|
end
|
|
979
1013
|
it "should work via ng_xml=()" do
|
|
980
1014
|
@rightsmd.ng_xml=(Nokogiri::XML::Document.parse(@rights_xml))
|
|
981
|
-
|
|
1015
|
+
expect { @file.save }.not_to raise_error
|
|
982
1016
|
expect(@file).to_not be_new_record
|
|
983
|
-
@file.errors.
|
|
1017
|
+
expect(@file.errors).to be_empty
|
|
984
1018
|
expect(@file).to be_valid
|
|
985
1019
|
end
|
|
986
1020
|
it "should work via update_values()" do
|
|
987
1021
|
@rightsmd.update_values([:read_access, :group] => 'registered')
|
|
988
|
-
|
|
1022
|
+
expect { @file.save }.not_to raise_error
|
|
989
1023
|
expect(@file).to_not be_new_record
|
|
990
|
-
@file.errors.
|
|
1024
|
+
expect(@file.errors).to be_empty
|
|
991
1025
|
expect(@file).to be_valid
|
|
992
1026
|
end
|
|
993
1027
|
end
|
|
@@ -1002,7 +1036,7 @@ describe GenericFile do
|
|
|
1002
1036
|
allow(Sufia::GenericFile::Actor).to receive(:virus_check).and_raise(Sufia::VirusFoundError, "A virus was found in #{f.path}: EL CRAPO VIRUS")
|
|
1003
1037
|
subject.add_file(f, 'content', 'small_file.txt')
|
|
1004
1038
|
subject.save
|
|
1005
|
-
subject.
|
|
1039
|
+
expect(subject).not_to be_persisted
|
|
1006
1040
|
expect(subject.errors.messages).to eq(base: ["A virus was found in #{f.path}: EL CRAPO VIRUS"])
|
|
1007
1041
|
end
|
|
1008
1042
|
it "does not save a new version of a GenericFile" do
|
|
@@ -1011,7 +1045,7 @@ describe GenericFile do
|
|
|
1011
1045
|
allow(Sufia::GenericFile::Actor).to receive(:virus_check).and_raise(Sufia::VirusFoundError)
|
|
1012
1046
|
subject.add_file(File.new(fixture_path + '/sufia_generic_stub.txt') , 'content', 'sufia_generic_stub.txt')
|
|
1013
1047
|
subject.save
|
|
1014
|
-
subject.reload.content.content.
|
|
1048
|
+
expect(subject.reload.content.content).to eq("small\n")
|
|
1015
1049
|
end
|
|
1016
1050
|
end
|
|
1017
1051
|
end
|
|
@@ -1043,12 +1077,12 @@ describe GenericFile do
|
|
|
1043
1077
|
describe "public?" do
|
|
1044
1078
|
context "when read group is set to public" do
|
|
1045
1079
|
before { subject.read_groups = ['public'] }
|
|
1046
|
-
it {
|
|
1080
|
+
it { is_expected.to be_public }
|
|
1047
1081
|
end
|
|
1048
1082
|
|
|
1049
1083
|
context "when read group is not set to public" do
|
|
1050
1084
|
before { subject.read_groups = ['foo'] }
|
|
1051
|
-
it {
|
|
1085
|
+
it { is_expected.not_to be_public }
|
|
1052
1086
|
end
|
|
1053
1087
|
end
|
|
1054
1088
|
end
|