curation_concerns 1.7.0.beta1 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/concerns/curation_concerns/application_controller_behavior.rb +2 -8
- data/app/controllers/concerns/curation_concerns/collections_controller_behavior.rb +13 -13
- data/app/controllers/concerns/curation_concerns/curation_concern_controller.rb +40 -3
- data/app/controllers/concerns/curation_concerns/selects_collections.rb +2 -0
- data/app/controllers/concerns/curation_concerns/single_use_links_controller_behavior.rb +9 -7
- data/app/models/concerns/curation_concerns/solr_document_behavior.rb +8 -0
- data/app/models/concerns/curation_concerns/suppressible.rb +31 -0
- data/app/models/concerns/curation_concerns/work_behavior.rb +1 -1
- data/app/presenters/curation_concerns/inspect_work_presenter.rb +52 -0
- data/app/presenters/curation_concerns/work_show_presenter.rb +4 -0
- data/app/search_builders/curation_concerns/README.md +69 -0
- data/app/search_builders/curation_concerns/collection_search_builder.rb +35 -17
- data/app/search_builders/curation_concerns/filter_suppressed.rb +15 -0
- data/app/search_builders/curation_concerns/filter_suppressed_with_roles.rb +30 -0
- data/app/search_builders/curation_concerns/search_filters.rb +1 -0
- data/app/search_builders/curation_concerns/single_collection_search_builder.rb +5 -0
- data/app/search_builders/curation_concerns/work_search_builder.rb +1 -0
- data/app/services/curation_concerns/actors/actor_factory.rb +0 -1
- data/app/services/curation_concerns/embargo_service.rb +0 -13
- data/app/services/curation_concerns/workflow/action_taken_service.rb +25 -15
- data/app/services/curation_concerns/workflow/activate_object.rb +9 -2
- data/app/services/curation_concerns/workflow/deactivate_object.rb +9 -4
- data/app/services/curation_concerns/workflow/{remove_depositor_permissions.rb → grant_edit_to_depositor.rb} +4 -4
- data/app/services/curation_concerns/workflow/workflow_action_service.rb +1 -1
- data/app/services/curation_concerns/working_directory.rb +1 -1
- data/app/views/curation_concerns/base/inspect_work.html.erb +37 -0
- data/app/views/curation_concerns/base/unavailable.html.erb +10 -0
- data/app/views/curation_concerns/operations/index.html.erb +1 -1
- data/app/views/curation_concerns/operations/show.html.erb +1 -1
- data/config/locales/curation_concerns.en.yml +3 -0
- data/curation_concerns.gemspec +3 -3
- data/lib/curation_concerns/rails/routes.rb +1 -0
- data/lib/curation_concerns/version.rb +1 -1
- data/lib/curation_concerns/workflow_authorization_exception.rb +4 -0
- data/lib/generators/curation_concerns/templates/workflow.json.erb +1 -0
- data/spec/controllers/curation_concerns/generic_works_controller_spec.rb +78 -16
- data/spec/controllers/selects_collections_controller_spec.rb +2 -4
- data/spec/factories/generic_works.rb +6 -0
- data/spec/factories/workflows.rb +1 -1
- data/spec/features/add_file_spec.rb +3 -0
- data/spec/features/create_child_work_spec.rb +13 -7
- data/spec/features/update_file_spec.rb +3 -2
- data/spec/forms/curation_concerns/forms/workflow_action_form_spec.rb +2 -4
- data/spec/indexers/work_indexer_spec.rb +11 -7
- data/spec/jobs/characterize_job_spec.rb +2 -2
- data/spec/models/curation_concerns/work_behavior_spec.rb +1 -1
- data/spec/models/generic_work_spec.rb +16 -7
- data/spec/models/solr_document_spec.rb +13 -0
- data/spec/presenters/curation_concerns/inspect_work_presenter_spec.rb +58 -0
- data/spec/presenters/curation_concerns/work_show_presenter_spec.rb +9 -0
- data/spec/presenters/curation_concerns/workflow_presenter_spec.rb +29 -15
- data/spec/routing/route_spec.rb +4 -0
- data/spec/services/curation_concerns/workflow/action_taken_service_spec.rb +5 -6
- data/spec/services/curation_concerns/workflow/activate_object_spec.rb +13 -12
- data/spec/services/curation_concerns/workflow/deactivate_object_spec.rb +14 -13
- data/spec/services/curation_concerns/workflow/grant_edit_to_depositor_spec.rb +20 -0
- data/spec/services/curation_concerns/workflow/permission_query_spec.rb +3 -3
- data/spec/services/curation_concerns/workflow/status_list_service_spec.rb +4 -1
- data/spec/services/curation_concerns/workflow/workflow_importer_spec.rb +2 -3
- data/spec/services/curation_concerns/working_directory_spec.rb +12 -0
- data/spec/views/curation_concerns/base/unavailable.html.erb_spec.rb +40 -0
- metadata +34 -20
- data/app/actors/curation_concerns/actors/grant_edit_to_depositor_actor.rb +0 -19
- data/app/models/concerns/curation_concerns/publishable.rb +0 -25
- data/app/models/curation_concerns/state_workflow.rb +0 -13
- data/app/views/curation_concerns/file_sets/_rights_modal.html.erb +0 -41
- data/app/views/records/_rights_modal.html.erb +0 -1
- data/spec/actors/curation_concerns/grant_edit_to_depositor_actor_spec.rb +0 -32
- data/spec/services/curation_concerns/workflow/remove_depositor_permissions_spec.rb +0 -21
@@ -1,10 +1,15 @@
|
|
1
1
|
module CurationConcerns
|
2
2
|
module Workflow
|
3
|
-
|
4
|
-
#
|
3
|
+
##
|
4
|
+
# This is a built in function for workflow, setting the `#state`
|
5
|
+
# of the target to the Fedora 'inactive' status URI
|
6
|
+
#
|
7
|
+
# @param target [#state] an instance of a model that includes `CurationConcerns::Suppressible`
|
8
|
+
#
|
9
|
+
# @return [RDF::Vocabulary::Term] the Fedora Resource Status 'inactive' term
|
5
10
|
class DeactivateObject
|
6
|
-
def self.call(
|
7
|
-
|
11
|
+
def self.call(target:, **)
|
12
|
+
target.state = Vocab::FedoraResourceStatus.inactive
|
8
13
|
end
|
9
14
|
end
|
10
15
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module CurationConcerns
|
2
2
|
module Workflow
|
3
3
|
# This is a built in function for workflow, so that a workflow action can be created that
|
4
|
-
#
|
5
|
-
class
|
6
|
-
def self.call(
|
7
|
-
|
4
|
+
# grants the creator the ability to alter it.
|
5
|
+
class GrantEditToDepositor
|
6
|
+
def self.call(target:, **)
|
7
|
+
target.edit_users = [target.depositor]
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -45,7 +45,7 @@ module CurationConcerns
|
|
45
45
|
# Run any configured custom methods
|
46
46
|
def handle_additional_sipity_workflow_action_processing(comment:)
|
47
47
|
CurationConcerns::Workflow::ActionTakenService.handle_action_taken(
|
48
|
-
|
48
|
+
target: subject.work,
|
49
49
|
comment: comment,
|
50
50
|
action: action,
|
51
51
|
user: subject.user
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<h1><%= t("inspect_work.link_text") %></h1>
|
2
|
+
<ul class="breadcrumb">
|
3
|
+
<li>
|
4
|
+
Back to <%= link_to @presenter.to_s, [main_app, @presenter] %>
|
5
|
+
</li>
|
6
|
+
</ul>
|
7
|
+
|
8
|
+
<h3>Workflow</h3>
|
9
|
+
<dl>
|
10
|
+
<% workflow = @presenter.inspect_work.workflow %>
|
11
|
+
<dt>Object Name</dt>
|
12
|
+
<dd><%= @presenter.to_s %></dd>
|
13
|
+
<dt>Processing Entity ID</dt>
|
14
|
+
<dd>Entity ID: <%= workflow[:entity_id] %> (Proxy for <%= workflow[:proxy_for] %>)</dd>
|
15
|
+
<dt>Workflow</dt>
|
16
|
+
<dd>Name: <%= workflow[:workflow_name] %> (ID=<%= workflow[:workflow_id] %>)</dd>
|
17
|
+
<dt>State</dt>
|
18
|
+
<dd>State Name: <%= workflow[:state_name] %> (ID=<%= workflow[:state_id] %>)</dd>
|
19
|
+
<dt>Workflow Comments</dt>
|
20
|
+
<dd>
|
21
|
+
<% workflow[:comments].each do |comment| %>
|
22
|
+
<dd><%= comment[:created_at] %>, <%= comment[:comment] %></dd>
|
23
|
+
<% end %>
|
24
|
+
</dd>
|
25
|
+
<dt>Roles</dt>
|
26
|
+
<dd>
|
27
|
+
<% workflow[:roles].each do |role| %>
|
28
|
+
<dd><%= role[:name] %> (ID=<%= role[:id] %>) <%= role[:description] %> Users: <%= role[:users] %></dd>
|
29
|
+
<% end %>
|
30
|
+
</dd>
|
31
|
+
</dl>
|
32
|
+
|
33
|
+
<h3>Persistence</h3>
|
34
|
+
<dl>
|
35
|
+
<dt>Solr</dt>
|
36
|
+
<dd><%= @presenter.inspect_work.solr %></dd>
|
37
|
+
</dl>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<h1><%= @presenter %> </h1>
|
2
|
+
<span class="state state-<%= @presenter.workflow.state %>"><%= @presenter.workflow.state_label %></span>
|
3
|
+
<% if @parent_presenter %>
|
4
|
+
<ul class="breadcrumb">
|
5
|
+
<li><%= link_to @parent_presenter, polymorphic_path([main_app, @parent_presenter]) %></li>
|
6
|
+
<li class="active"><%= @presenter.human_readable_type %></li>
|
7
|
+
</ul>
|
8
|
+
<% else %>
|
9
|
+
<span class="human_readable_type">(<%= @presenter.human_readable_type %>)</span>
|
10
|
+
<% end %>
|
@@ -13,7 +13,7 @@
|
|
13
13
|
<tbody>
|
14
14
|
<% @operations.each do |op| %>
|
15
15
|
<tr>
|
16
|
-
<td><%= link_to op.operation_type,
|
16
|
+
<td><%= link_to op.operation_type, curation_concerns.user_operation_path(params[:user_id], op) %></td>
|
17
17
|
<td><span class="label <%= op.status == 'failure' ? 'label-danger' : 'label-success' %>"><%= op.status %></span></td>
|
18
18
|
</tr>
|
19
19
|
<% end %>
|
@@ -18,7 +18,7 @@
|
|
18
18
|
<tbody>
|
19
19
|
<% @operation.children.each do |op| %>
|
20
20
|
<tr>
|
21
|
-
<td><%= link_to op.operation_type,
|
21
|
+
<td><%= link_to op.operation_type, curation_concerns.user_operation_path(params[:user_id], op) %></td>
|
22
22
|
<td><span class="label <%= op.status == 'failure' ? 'label-danger' : 'label-success' %>"><%= op.status %></span></td>
|
23
23
|
<td><%= op.message %></td>
|
24
24
|
</tr>
|
@@ -181,6 +181,7 @@ en:
|
|
181
181
|
workflow:
|
182
182
|
default:
|
183
183
|
deposit: "Deposit"
|
184
|
+
unauthorized: "The work is not currently available because it has not yet completed the approval process"
|
184
185
|
blacklight:
|
185
186
|
search:
|
186
187
|
fields:
|
@@ -233,6 +234,8 @@ en:
|
|
233
234
|
submit:
|
234
235
|
sipity_workflow_responsibility:
|
235
236
|
create: "Add"
|
237
|
+
inspect_work:
|
238
|
+
link_text: 'Inspect Work'
|
236
239
|
simple_form:
|
237
240
|
required:
|
238
241
|
html: '<span class="label label-info required-tag">required</span>'
|
data/curation_concerns.gemspec
CHANGED
@@ -18,11 +18,11 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency 'hydra-head', '>= 10.
|
21
|
+
spec.add_dependency 'hydra-head', '>= 10.3.0', '< 11'
|
22
22
|
spec.add_dependency 'active-fedora', '>= 10.3.0.rc1'
|
23
23
|
spec.add_dependency 'blacklight', '~> 6.3'
|
24
24
|
spec.add_dependency 'breadcrumbs_on_rails', '>= 3.0.1', '< 4'
|
25
|
-
spec.add_dependency 'jquery-ui-rails'
|
25
|
+
spec.add_dependency 'jquery-ui-rails', '~> 5.0.5'
|
26
26
|
spec.add_dependency 'simple_form', '~> 3.1'
|
27
27
|
spec.add_dependency 'hydra-editor', '>= 2', '< 4'
|
28
28
|
spec.add_dependency 'rails_autolink'
|
@@ -37,7 +37,7 @@ Gem::Specification.new do |spec|
|
|
37
37
|
spec.add_dependency 'rdf', '>= 1.99'
|
38
38
|
spec.add_dependency 'rdf-vocab', '>= 0.8'
|
39
39
|
spec.add_dependency 'awesome_nested_set', '~> 3.0'
|
40
|
-
spec.add_dependency 'browse-everything', '~> 0.10'
|
40
|
+
spec.add_dependency 'browse-everything', '~> 0.10', '>= 0.10.5'
|
41
41
|
spec.add_dependency 'clipboard-rails', '~> 1.5'
|
42
42
|
spec.add_dependency 'power_converter', '~> 0.1', '>= 0.1.2'
|
43
43
|
spec.add_dependency 'dry-validation', '~> 0.9'
|
@@ -4,7 +4,25 @@ require 'spec_helper'
|
|
4
4
|
# which is included into .internal_test_app/app/controllers/generic_works_controller.rb
|
5
5
|
describe CurationConcerns::GenericWorksController do
|
6
6
|
let(:user) { create(:user) }
|
7
|
-
|
7
|
+
let(:work) { create(:generic_work, user: user) }
|
8
|
+
let!(:sipity_entity) do
|
9
|
+
create(:sipity_entity, proxy_for_global_id: work.to_global_id.to_s)
|
10
|
+
end
|
11
|
+
before do
|
12
|
+
sign_in user
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'integration test for suppressed documents' do
|
16
|
+
let(:work) do
|
17
|
+
create(:work, :public, state: Vocab::FedoraResourceStatus.inactive)
|
18
|
+
end
|
19
|
+
it 'renders the unavailable message because it is in workflow' do
|
20
|
+
get :show, params: { id: work }
|
21
|
+
expect(response.code).to eq '401'
|
22
|
+
expect(response).to render_template(:unavailable)
|
23
|
+
expect(flash[:notice]).to eq 'The work is not currently available because it has not yet completed the approval process'
|
24
|
+
end
|
25
|
+
end
|
8
26
|
|
9
27
|
describe '#show' do
|
10
28
|
context 'my own private work' do
|
@@ -16,6 +34,9 @@ describe CurationConcerns::GenericWorksController do
|
|
16
34
|
|
17
35
|
context "with a parent work" do
|
18
36
|
let(:parent) { create(:generic_work, title: ['Parent Work'], user: user, ordered_members: [work]) }
|
37
|
+
let!(:parent_sipity_entity) do
|
38
|
+
create(:sipity_entity, proxy_for_global_id: parent.to_global_id.to_s)
|
39
|
+
end
|
19
40
|
it "sets the parent presenter" do
|
20
41
|
get :show, params: { id: work, parent_id: parent }
|
21
42
|
expect(response).to be_success
|
@@ -50,7 +71,7 @@ describe CurationConcerns::GenericWorksController do
|
|
50
71
|
allow(presenter).to receive(:export_as_ttl).and_return("ttl graph")
|
51
72
|
end
|
52
73
|
|
53
|
-
it 'renders
|
74
|
+
it 'renders a turtle file' do
|
54
75
|
get :show, params: { id: '99999999', format: :ttl }
|
55
76
|
expect(response).to be_successful
|
56
77
|
expect(response.body).to eq "ttl graph"
|
@@ -68,6 +89,35 @@ describe CurationConcerns::GenericWorksController do
|
|
68
89
|
end
|
69
90
|
end
|
70
91
|
|
92
|
+
context 'with work still in workflow' do
|
93
|
+
before do
|
94
|
+
allow(controller).to receive(:search_results).and_return([nil, document_list])
|
95
|
+
end
|
96
|
+
context 'with a user lacking workflow permission' do
|
97
|
+
before do
|
98
|
+
allow(SolrDocument).to receive(:find).and_return(document)
|
99
|
+
end
|
100
|
+
let(:document_list) { [] }
|
101
|
+
let(:document) { instance_double(SolrDocument, suppressed?: true) }
|
102
|
+
it 'shows the unauthorized message' do
|
103
|
+
get :show, params: { id: '99999' }
|
104
|
+
expect(response.code).to eq '401'
|
105
|
+
expect(response).to render_template(:unavailable)
|
106
|
+
expect(flash[:notice]).to eq 'The work is not currently available because it has not yet completed the approval process'
|
107
|
+
end
|
108
|
+
end
|
109
|
+
context 'with a user granted workflow permission' do
|
110
|
+
let(:document_list) { [document] }
|
111
|
+
let(:document) { instance_double(SolrDocument) }
|
112
|
+
it 'renders without the unauthorized message' do
|
113
|
+
get :show, params: { id: '88888' }
|
114
|
+
expect(response.code).to eq '200'
|
115
|
+
expect(response).to render_template(:show)
|
116
|
+
expect(flash[:notice]).to be_nil
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
71
121
|
context 'when a ObjectNotFoundError is raised' do
|
72
122
|
it 'returns 404 page' do
|
73
123
|
allow(controller).to receive(:show).and_raise(ActiveFedora::ObjectNotFoundError)
|
@@ -193,7 +243,6 @@ describe CurationConcerns::GenericWorksController do
|
|
193
243
|
|
194
244
|
context 'when there are children' do
|
195
245
|
let(:work) { create(:work_with_one_file, user: user) }
|
196
|
-
|
197
246
|
it 'prompts to change the files access' do
|
198
247
|
patch :update, params: { id: work, generic_work: {} }
|
199
248
|
expect(response).to redirect_to main_app.confirm_curation_concerns_permission_path(controller.curation_concern)
|
@@ -238,23 +287,23 @@ describe CurationConcerns::GenericWorksController do
|
|
238
287
|
end
|
239
288
|
|
240
289
|
describe '#destroy' do
|
241
|
-
let(:
|
290
|
+
let(:work) { create(:private_generic_work, user: user) }
|
242
291
|
let(:parent_collection) { create(:collection) }
|
243
292
|
|
244
293
|
it 'deletes the work' do
|
245
|
-
delete :destroy, params: { id:
|
294
|
+
delete :destroy, params: { id: work }
|
246
295
|
expect(response).to redirect_to main_app.search_catalog_path
|
247
|
-
expect(GenericWork).not_to exist(
|
296
|
+
expect(GenericWork).not_to exist(work.id)
|
248
297
|
end
|
249
298
|
|
250
299
|
context "when work is a member of a collection" do
|
251
300
|
before do
|
252
|
-
parent_collection.members = [
|
301
|
+
parent_collection.members = [work]
|
253
302
|
parent_collection.save!
|
254
303
|
end
|
255
304
|
it 'deletes the work and updates the parent collection' do
|
256
|
-
delete :destroy, params: { id:
|
257
|
-
expect(GenericWork).not_to exist(
|
305
|
+
delete :destroy, params: { id: work }
|
306
|
+
expect(GenericWork).not_to exist(work.id)
|
258
307
|
expect(response).to redirect_to main_app.search_catalog_path
|
259
308
|
expect(parent_collection.reload.members).to eq []
|
260
309
|
end
|
@@ -262,35 +311,48 @@ describe CurationConcerns::GenericWorksController do
|
|
262
311
|
|
263
312
|
it "invokes the after_destroy callback" do
|
264
313
|
expect(CurationConcerns.config.callback).to receive(:run)
|
265
|
-
.with(:after_destroy,
|
266
|
-
delete :destroy, params: { id:
|
314
|
+
.with(:after_destroy, work.id, user)
|
315
|
+
delete :destroy, params: { id: work }
|
267
316
|
end
|
268
317
|
|
269
318
|
context 'someone elses public work' do
|
270
|
-
let(:
|
319
|
+
let(:work) { create(:private_generic_work) }
|
271
320
|
it 'shows unauthorized message' do
|
272
|
-
delete :destroy, params: { id:
|
321
|
+
delete :destroy, params: { id: work }
|
273
322
|
expect(response.code).to eq '401'
|
274
323
|
expect(response).to render_template(:unauthorized)
|
275
324
|
end
|
276
325
|
end
|
277
326
|
|
278
327
|
context 'when I am a repository manager' do
|
279
|
-
let(:
|
328
|
+
let(:work) { create(:private_generic_work) }
|
280
329
|
before { allow_any_instance_of(User).to receive(:groups).and_return(['admin']) }
|
281
330
|
it 'someone elses private work should delete the work' do
|
282
|
-
delete :destroy, params: { id:
|
283
|
-
expect(GenericWork).not_to exist(
|
331
|
+
delete :destroy, params: { id: work }
|
332
|
+
expect(GenericWork).not_to exist(work.id)
|
284
333
|
end
|
285
334
|
end
|
286
335
|
end
|
287
336
|
|
288
337
|
describe '#file_manager' do
|
289
338
|
let(:work) { create(:private_generic_work, user: user) }
|
339
|
+
|
290
340
|
it "is successful" do
|
291
341
|
get :file_manager, params: { id: work.id }
|
292
342
|
expect(response).to be_success
|
293
343
|
expect(assigns(:presenter)).not_to be_blank
|
294
344
|
end
|
295
345
|
end
|
346
|
+
|
347
|
+
describe '#inspect_work' do
|
348
|
+
let(:work) { create(:private_generic_work, user: user) }
|
349
|
+
context 'when I am a repository manager' do
|
350
|
+
before { allow_any_instance_of(User).to receive(:groups).and_return(['admin']) }
|
351
|
+
it "the response is successful" do
|
352
|
+
get :inspect_work, params: { id: work.id }
|
353
|
+
expect(response).to be_success
|
354
|
+
expect(assigns(:presenter)).not_to be_blank
|
355
|
+
end
|
356
|
+
end
|
357
|
+
end
|
296
358
|
end
|
@@ -11,10 +11,8 @@ end
|
|
11
11
|
describe SelectsCollectionsController, type: :controller do
|
12
12
|
describe "#find_collections" do
|
13
13
|
it "uses the search builder" do
|
14
|
-
expect(subject.collections_search_builder_class.default_processor_chain)
|
15
|
-
:default_solr_parameters, :add_query_to_solr,
|
16
|
-
:add_access_controls_to_solr_params, :filter_models,
|
17
|
-
:some_rows, :sort_by_title]
|
14
|
+
expect(subject.collections_search_builder_class.default_processor_chain)
|
15
|
+
.to include(:default_solr_parameters, :add_query_to_solr, :add_access_controls_to_solr_params)
|
18
16
|
expect(CurationConcerns::CollectionSearchBuilder).to receive(:new).with(subject).and_call_original
|
19
17
|
subject.find_collections
|
20
18
|
end
|
data/spec/factories/workflows.rb
CHANGED
@@ -2,23 +2,23 @@ require 'spec_helper'
|
|
2
2
|
require 'redlock'
|
3
3
|
|
4
4
|
feature 'Creating a new child Work', :workflow do
|
5
|
-
let(:user) {
|
6
|
-
|
5
|
+
let(:user) { create(:user) }
|
6
|
+
let!(:sipity_entity) do
|
7
|
+
create(:sipity_entity, proxy_for_global_id: parent.to_global_id.to_s)
|
8
|
+
end
|
7
9
|
let(:redlock_client_stub) { # stub out redis connection
|
8
10
|
client = double('redlock client')
|
9
11
|
allow(client).to receive(:lock).and_yield(true)
|
10
12
|
allow(Redlock::Client).to receive(:new).and_return(client)
|
11
13
|
client
|
12
14
|
}
|
13
|
-
let(:parent) {
|
15
|
+
let!(:parent) { create(:generic_work, user: user, title: ["Parent First"]) }
|
14
16
|
|
15
17
|
before do
|
16
18
|
sign_in user
|
17
|
-
|
18
19
|
# stub out characterization. Travis doesn't have fits installed, and it's not relevant to the test.
|
19
20
|
allow(CharacterizeJob).to receive(:perform_later)
|
20
21
|
redlock_client_stub
|
21
|
-
parent
|
22
22
|
end
|
23
23
|
|
24
24
|
it 'creates the child work' do
|
@@ -34,7 +34,14 @@ feature 'Creating a new child Work', :workflow do
|
|
34
34
|
end
|
35
35
|
|
36
36
|
context "when it's being updated" do
|
37
|
-
let(:curation_concern) {
|
37
|
+
let(:curation_concern) { create(:generic_work, user: user) }
|
38
|
+
let(:new_parent) { create(:generic_work, user: user) }
|
39
|
+
let!(:cc_sipity_entity) do
|
40
|
+
create(:sipity_entity, proxy_for_global_id: curation_concern.to_global_id.to_s)
|
41
|
+
end
|
42
|
+
let!(:new_sipity_entity) do
|
43
|
+
create(:sipity_entity, proxy_for_global_id: new_parent.to_global_id.to_s)
|
44
|
+
end
|
38
45
|
before do
|
39
46
|
parent.ordered_members << curation_concern
|
40
47
|
parent.save!
|
@@ -46,7 +53,6 @@ feature 'Creating a new child Work', :workflow do
|
|
46
53
|
expect(parent.reload.ordered_members.to_a.length).to eq 1
|
47
54
|
end
|
48
55
|
it "doesn't lose other memberships" do
|
49
|
-
new_parent = FactoryGirl.create(:generic_work, user: user)
|
50
56
|
new_parent.ordered_members << curation_concern
|
51
57
|
new_parent.save!
|
52
58
|
|
@@ -4,7 +4,9 @@ feature 'Editing attached files' do
|
|
4
4
|
let(:user) { create(:user) }
|
5
5
|
let!(:parent) { create(:work_with_one_file, user: user) }
|
6
6
|
let!(:file_set) { parent.file_sets.first }
|
7
|
-
|
7
|
+
let!(:sipity_entity) do
|
8
|
+
create(:sipity_entity, proxy_for_global_id: parent.to_global_id.to_s)
|
9
|
+
end
|
8
10
|
around do |example|
|
9
11
|
original_adapter = ActiveJob::Base.queue_adapter
|
10
12
|
ActiveJob::Base.queue_adapter = :inline
|
@@ -14,7 +16,6 @@ feature 'Editing attached files' do
|
|
14
16
|
|
15
17
|
before do
|
16
18
|
sign_in user
|
17
|
-
|
18
19
|
# stub out characterization. Travis doesn't have fits installed, and it's not relevant to the test.
|
19
20
|
expect(CharacterizeJob).to receive(:perform_later)
|
20
21
|
end
|
@@ -3,9 +3,7 @@ require 'spec_helper'
|
|
3
3
|
RSpec.describe CurationConcerns::Forms::WorkflowActionForm, no_clean: true do
|
4
4
|
let(:work) { create(:work) }
|
5
5
|
let(:sipity_entity) do
|
6
|
-
create(:sipity_entity,
|
7
|
-
proxy_for_global_id: work.to_global_id.to_s,
|
8
|
-
workflow_state_id: 2)
|
6
|
+
create(:sipity_entity, proxy_for_global_id: work.to_global_id.to_s, workflow_state_id: 2)
|
9
7
|
end
|
10
8
|
let(:user) { create(:user) }
|
11
9
|
let(:current_ability) { double(current_user: user) }
|
@@ -102,7 +100,7 @@ RSpec.describe CurationConcerns::Forms::WorkflowActionForm, no_clean: true do
|
|
102
100
|
|
103
101
|
it 'will send the #handle_action_taken message to CurationConcerns::Workflow::ActionTakenService' do
|
104
102
|
expect(CurationConcerns::Workflow::ActionTakenService).to(
|
105
|
-
receive(:handle_action_taken).with(
|
103
|
+
receive(:handle_action_taken).with(target: work, comment: kind_of(Sipity::Comment), action: an_action, user: user)
|
106
104
|
)
|
107
105
|
subject
|
108
106
|
end
|
@@ -37,30 +37,34 @@ describe CurationConcerns::WorkIndexer do
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
-
|
40
|
+
describe 'suppressed state' do
|
41
|
+
before { allow(work).to receive(:suppressed?).and_return(suppressed) }
|
41
42
|
context "when suppressed" do
|
42
|
-
|
43
|
-
|
44
|
-
it "indexed the suppressed field" do
|
43
|
+
let(:suppressed) { true }
|
44
|
+
it "indexes the suppressed field with a true value" do
|
45
45
|
expect(solr_document.fetch('suppressed_bsi')).to be true
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
49
|
context "when not suppressed" do
|
50
|
-
|
50
|
+
let(:suppressed) { false }
|
51
|
+
it "indexes the suppressed field with a false value" do
|
51
52
|
expect(solr_document.fetch('suppressed_bsi')).to be false
|
52
53
|
end
|
53
54
|
end
|
54
55
|
end
|
55
56
|
|
56
57
|
context "the actionable workflow roles" do
|
58
|
+
let!(:sipity_entity) do
|
59
|
+
create(:sipity_entity, proxy_for_global_id: work.to_global_id.to_s)
|
60
|
+
end
|
57
61
|
before do
|
58
|
-
allow(PowerConverter).to receive(:convert_to_sipity_entity).with(work).and_return(
|
62
|
+
allow(PowerConverter).to receive(:convert_to_sipity_entity).with(work).and_return(sipity_entity)
|
59
63
|
allow(CurationConcerns::Workflow::PermissionQuery).to receive(:scope_roles_associated_with_the_given_entity)
|
60
64
|
.and_return(['approve', 'reject'])
|
61
65
|
end
|
62
66
|
it "indexed the roles and state" do
|
63
|
-
expect(solr_document.fetch('actionable_workflow_roles_ssim')).to eq ["
|
67
|
+
expect(solr_document.fetch('actionable_workflow_roles_ssim')).to eq ["#{sipity_entity.workflow.name}-approve", "#{sipity_entity.workflow.name}-reject"]
|
64
68
|
expect(solr_document.fetch('workflow_state_name_ssim')).to eq "initial"
|
65
69
|
end
|
66
70
|
end
|
@@ -4,8 +4,8 @@ describe CharacterizeJob do
|
|
4
4
|
include CurationConcerns::FactoryHelpers
|
5
5
|
|
6
6
|
let(:file_set) { FileSet.new(id: file_set_id) }
|
7
|
-
let(:file_set_id) { '
|
8
|
-
let(:file_path) { Rails.root + 'tmp' + 'uploads' + 'ab' + 'c1' + '23' + '45' + 'picture.png' }
|
7
|
+
let(:file_set_id) { 'abc12345' }
|
8
|
+
let(:file_path) { Rails.root + 'tmp' + 'uploads' + 'ab' + 'c1' + '23' + '45' + 'abc12345' + 'picture.png' }
|
9
9
|
let(:filename) { file_path.to_s }
|
10
10
|
let(:file) do
|
11
11
|
Hydra::PCDM::File.new.tap do |f|
|
@@ -13,7 +13,7 @@ describe CurationConcerns::WorkBehavior do
|
|
13
13
|
subject { EssentialWork.new }
|
14
14
|
|
15
15
|
it 'mixes together all the goodness' do
|
16
|
-
[::CurationConcerns::WithFileSets, ::CurationConcerns::HumanReadableType, CurationConcerns::Noid, CurationConcerns::Serializers, Hydra::WithDepositor, Hydra::AccessControls::Embargoable, Solrizer::Common].each do |mixin|
|
16
|
+
[::CurationConcerns::WithFileSets, ::CurationConcerns::HumanReadableType, CurationConcerns::Noid, CurationConcerns::Serializers, Hydra::WithDepositor, Hydra::AccessControls::Embargoable, Solrizer::Common, ::CurationConcerns::Suppressible].each do |mixin|
|
17
17
|
expect(subject.class.ancestors).to include(mixin)
|
18
18
|
end
|
19
19
|
end
|
@@ -35,16 +35,25 @@ describe GenericWork do
|
|
35
35
|
|
36
36
|
describe '#suppressed?' do
|
37
37
|
let(:work) { described_class.new(state: state) }
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
38
|
+
context "when state is inactive" do
|
39
|
+
let(:state) { ::RDF::URI('http://fedora.info/definitions/1/0/access/ObjState#inactive') }
|
40
|
+
it 'is suppressed' do
|
41
|
+
expect(work).to be_suppressed
|
42
|
+
end
|
43
43
|
end
|
44
44
|
|
45
|
-
context "when the state is
|
45
|
+
context "when the state is active" do
|
46
46
|
let(:state) { ::RDF::URI('http://fedora.info/definitions/1/0/access/ObjState#active') }
|
47
|
-
it
|
47
|
+
it 'is not suppressed' do
|
48
|
+
expect(work).not_to be_suppressed
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "when the state is nil" do
|
53
|
+
let(:state) { nil }
|
54
|
+
it 'is not suppressed' do
|
55
|
+
expect(work).not_to be_suppressed
|
56
|
+
end
|
48
57
|
end
|
49
58
|
end
|
50
59
|
|
@@ -22,6 +22,19 @@ describe SolrDocument do
|
|
22
22
|
it { is_expected.to eq 'one' }
|
23
23
|
end
|
24
24
|
|
25
|
+
describe "#suppressed?" do
|
26
|
+
let(:attributes) { { 'suppressed_bsi' => suppressed_value } }
|
27
|
+
subject { document }
|
28
|
+
context 'when true' do
|
29
|
+
let(:suppressed_value) { true }
|
30
|
+
it { is_expected.to be_suppressed }
|
31
|
+
end
|
32
|
+
context 'when false' do
|
33
|
+
let(:suppressed_value) { false }
|
34
|
+
it { is_expected.not_to be_suppressed }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
25
38
|
describe "creator" do
|
26
39
|
subject { document.creator }
|
27
40
|
|