hyrax 2.3.3 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +1 -1
- data/.github/stale.yml +19 -0
- data/README.md +2 -2
- data/app/actors/hyrax/actors/apply_permission_template_actor.rb +2 -4
- data/app/actors/hyrax/actors/create_with_files_ordered_members_actor.rb +45 -0
- data/app/actors/hyrax/actors/create_with_remote_files_ordered_members_actor.rb +96 -0
- data/app/actors/hyrax/actors/file_set_ordered_members_actor.rb +16 -0
- data/app/actors/hyrax/actors/ordered_members_actor.rb +28 -0
- data/app/assets/javascripts/hyrax/collections.js +2 -0
- data/app/assets/stylesheets/hyrax/_file-listing.scss +2 -1
- data/app/assets/stylesheets/hyrax/_work-show.scss +4 -0
- data/app/controllers/concerns/hyrax/embargoes_controller_behavior.rb +1 -1
- data/app/controllers/concerns/hyrax/works_controller_behavior.rb +5 -2
- data/app/controllers/hyrax/dashboard/nest_collections_controller.rb +2 -9
- data/app/helpers/hyrax/batch_edits_helper.rb +0 -1
- data/app/helpers/hyrax/hyrax_helper_behavior.rb +1 -0
- data/app/helpers/hyrax/iiif_helper.rb +12 -0
- data/app/jobs/attach_files_to_work_with_ordered_members_job.rb +41 -0
- data/app/presenters/hyrax/work_show_presenter.rb +29 -2
- data/app/services/hyrax/permission_template_applicator.rb +48 -0
- data/app/views/hyrax/admin/collection_types/_form_settings.html.erb +1 -1
- data/app/views/hyrax/admin/collection_types/index.html.erb +1 -1
- data/app/views/hyrax/base/_form_rendering.html.erb +7 -5
- data/app/views/hyrax/base/_form_representative.html.erb +4 -2
- data/app/views/hyrax/base/_form_thumbnail.html.erb +4 -2
- data/app/views/hyrax/base/_member.html.erb +1 -1
- data/app/views/hyrax/base/_representative_media.html.erb +1 -4
- data/app/views/hyrax/base/_show_actions.html.erb +6 -4
- data/app/views/hyrax/base/iiif_viewers/_universal_viewer.html.erb +4 -0
- data/app/views/hyrax/base/show.html.erb +2 -2
- data/app/views/hyrax/dashboard/works/_default_group.html.erb +1 -1
- data/app/views/hyrax/file_sets/_file_set_title.erb +2 -2
- data/app/views/hyrax/homepage/_featured.html.erb +0 -3
- data/app/views/hyrax/my/_collection_action_menu.html.erb +1 -0
- data/app/views/hyrax/my/collections/_default_group.html.erb +1 -9
- data/app/views/hyrax/my/collections/_list_collections.html.erb +1 -1
- data/app/views/hyrax/users/_activity_log.html.erb +1 -1
- data/config/locales/hyrax.de.yml +2 -0
- data/config/locales/hyrax.en.yml +2 -0
- data/config/locales/hyrax.es.yml +2 -0
- data/config/locales/hyrax.fr.yml +2 -0
- data/config/locales/hyrax.it.yml +2 -0
- data/config/locales/hyrax.pt-BR.yml +2 -0
- data/config/locales/hyrax.zh.yml +2 -0
- data/hyrax.gemspec +1 -0
- data/lib/generators/hyrax/templates/config/initializers/hyrax.rb +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.de.yml +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.en.yml +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.es.yml +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.fr.yml +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.it.yml +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.zh.yml +1 -1
- data/lib/hyrax/configuration.rb +1 -1
- data/lib/hyrax/transactions.rb +23 -0
- data/lib/hyrax/transactions/container.rb +63 -0
- data/lib/hyrax/transactions/create_work.rb +47 -0
- data/lib/hyrax/transactions/steps/apply_permission_template.rb +29 -0
- data/lib/hyrax/transactions/steps/ensure_admin_set.rb +23 -0
- data/lib/hyrax/transactions/steps/ensure_permission_template.rb +27 -0
- data/lib/hyrax/transactions/steps/save_work.rb +35 -0
- data/lib/hyrax/transactions/steps/set_default_admin_set.rb +25 -0
- data/lib/hyrax/transactions/steps/set_modified_date.rb +25 -0
- data/lib/hyrax/transactions/steps/set_uploaded_date.rb +28 -0
- data/lib/hyrax/version.rb +1 -1
- data/spec/actors/hyrax/actors/create_with_files_ordered_members_actor_spec.rb +41 -0
- data/spec/actors/hyrax/actors/create_with_remote_files_ordered_members_actor_spec.rb +49 -0
- data/spec/actors/hyrax/actors/file_set_ordered_members_actor_spec.rb +35 -0
- data/spec/actors/hyrax/actors/ordered_members_actor_spec.rb +59 -0
- data/spec/controllers/hyrax/embargoes_controller_spec.rb +2 -0
- data/spec/controllers/hyrax/generic_works_controller_spec.rb +6 -1
- data/spec/factories/generic_works.rb +6 -0
- data/spec/features/collection_multi_membership_spec.rb +6 -6
- data/spec/features/work_show_spec.rb +58 -5
- data/spec/helpers/hyrax/batch_edits_helper_spec.rb +4 -2
- data/spec/helpers/hyrax/iiif_helper_spec.rb +44 -0
- data/spec/hyrax/transactions/create_work_spec.rb +155 -0
- data/spec/hyrax/transactions/steps/apply_permission_template_spec.rb +72 -0
- data/spec/hyrax/transactions/steps/ensure_admin_set_spec.rb +25 -0
- data/spec/hyrax/transactions/steps/ensure_permission_template_spec.rb +33 -0
- data/spec/hyrax/transactions/steps/save_work_spec.rb +32 -0
- data/spec/hyrax/transactions/steps/set_default_admin_set_spec.rb +38 -0
- data/spec/hyrax/transactions/steps/set_modified_date_spec.rb +22 -0
- data/spec/hyrax/transactions/steps/set_uploaded_date_spec.rb +32 -0
- data/spec/jobs/attach_files_to_work_with_ordered_members_job_spec.rb +13 -0
- data/spec/presenters/hyrax/presenter_renderer_spec.rb +4 -2
- data/spec/presenters/hyrax/work_show_presenter_spec.rb +46 -2
- data/spec/services/hyrax/permission_template_applicator_spec.rb +69 -0
- data/spec/spec_helper.rb +13 -2
- data/spec/views/catalog/index.html.erb_spec.rb +7 -4
- data/spec/views/hyrax/admin/admin_sets/_show_actions.html.erb_spec.rb +2 -0
- data/spec/views/hyrax/admin/admin_sets/_show_document_list_row.html.erb_spec.rb +4 -1
- data/spec/views/hyrax/admin/admin_sets/index.html.erb_spec.rb +6 -2
- data/spec/views/hyrax/admin/admin_sets/index.json.erb_spec.rb +1 -2
- data/spec/views/hyrax/admin/collection_types/_form_metadata_admin_set.html.erb_spec.rb +1 -1
- data/spec/views/hyrax/admin/collection_types/_form_settings.html.erb_spec.rb +5 -26
- data/spec/views/hyrax/admin/collection_types/index.html.erb_spec.rb +26 -5
- data/spec/views/hyrax/admin/stats/show.html.erb_spec.rb +1 -0
- data/spec/views/hyrax/base/_attribute_rows.html.erb_spec.rb +5 -1
- data/spec/views/hyrax/base/_attributes.html.erb_spec.rb +1 -0
- data/spec/views/hyrax/base/_form_rendering.html.erb_spec.rb +5 -1
- data/spec/views/hyrax/base/_items.html.erb_spec.rb +2 -0
- data/spec/views/hyrax/base/_relationships.html.erb_spec.rb +2 -1
- data/spec/views/hyrax/base/_show_actions.html.erb_spec.rb +71 -0
- data/spec/views/hyrax/base/file_manager.html.erb_spec.rb +11 -14
- data/spec/views/hyrax/base/show.html.erb_spec.rb +2 -2
- data/spec/views/hyrax/base/show.json.jbuilder_spec.rb +3 -1
- data/spec/views/hyrax/collections/_show_document_list_row.html.erb_spec.rb +6 -1
- data/spec/views/hyrax/collections/_show_parent_collections.html.erb_spec.rb +5 -5
- data/spec/views/hyrax/collections/_subcollection_list.html.erb_spec.rb +1 -1
- data/spec/views/hyrax/collections/show.html.erb_spec.rb +3 -2
- data/spec/views/hyrax/dashboard/collections/_form_share.erb_spec.rb +1 -1
- data/spec/views/hyrax/dashboard/collections/_form_share_table.html.erb_spec.rb +1 -1
- data/spec/views/hyrax/dashboard/collections/_show_document_list_row.html.erb_spec.rb +6 -1
- data/spec/views/hyrax/dashboard/collections/_subcollection_list.html.erb_spec.rb +1 -1
- data/spec/views/hyrax/dashboard/collections/edit.html.erb_spec.rb +3 -1
- data/spec/views/hyrax/dashboard/profiles/show.html.erb_spec.rb +2 -3
- data/spec/views/hyrax/file_sets/_show_characterization_details.html.erb_spec.rb +1 -2
- data/spec/views/hyrax/file_sets/_single_use_links.html.erb_spec.rb +1 -2
- data/spec/views/hyrax/homepage/_sortable_featured.html.erb_spec.rb +1 -1
- data/spec/views/hyrax/my/_collection_action_menu.html.erb_spec.rb +5 -5
- data/spec/views/hyrax/my/collections/_list_collections.html.erb_spec.rb +11 -8
- data/spec/views/hyrax/users/index.html.erb_spec.rb +1 -0
- data/spec/views/hyrax/users/show.html.erb_spec.rb +3 -0
- data/template.rb +1 -1
- metadata +65 -3
- data/app/views/hyrax/dashboard/collections/_form_default_group_delt.html.erb +0 -27
@@ -609,9 +609,14 @@ RSpec.describe Hyrax::GenericWorksController do
|
|
609
609
|
.and_return(manifest_factory)
|
610
610
|
end
|
611
611
|
|
612
|
-
it "produces a manifest" do
|
612
|
+
it "produces a manifest for a json request" do
|
613
613
|
get :manifest, params: { id: work, format: :json }
|
614
614
|
expect(response.body).to eq "{\"test\":\"manifest\"}"
|
615
615
|
end
|
616
|
+
|
617
|
+
it "produces a manifest for a html request" do
|
618
|
+
get :manifest, params: { id: work, format: :html }
|
619
|
+
expect(response.body).to eq "{\"test\":\"manifest\"}"
|
620
|
+
end
|
616
621
|
end
|
617
622
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
FactoryBot.define do
|
2
4
|
factory :work, aliases: [:generic_work, :private_generic_work], class: GenericWork do
|
3
5
|
transient do
|
@@ -34,6 +36,10 @@ FactoryBot.define do
|
|
34
36
|
visibility { Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC }
|
35
37
|
end
|
36
38
|
|
39
|
+
factory :invalid_generic_work do
|
40
|
+
title { nil }
|
41
|
+
end
|
42
|
+
|
37
43
|
factory :private_work do
|
38
44
|
# private is default
|
39
45
|
# visibility { Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE }
|
@@ -18,7 +18,7 @@ RSpec.describe 'Adding a work to multiple collections', type: :feature, clean_re
|
|
18
18
|
let!(:new_collection) { create(:collection_lw, user: admin_user, collection_type_gid: multi_membership_type_2.gid, title: ['NewCollectionTitle']) }
|
19
19
|
|
20
20
|
it 'then the work is added to both collections' do
|
21
|
-
optional 'ability to get capybara to find css select2-result (see Issue #3038)' if
|
21
|
+
optional 'ability to get capybara to find css select2-result (see Issue #3038)' if ci_build?
|
22
22
|
# Add to second multi-membership collection of a different type
|
23
23
|
visit '/dashboard/my/works'
|
24
24
|
check 'check_all'
|
@@ -38,7 +38,7 @@ RSpec.describe 'Adding a work to multiple collections', type: :feature, clean_re
|
|
38
38
|
let!(:new_collection) { create(:collection_lw, user: admin_user, collection_type_gid: multi_membership_type_1.gid, title: ['NewCollectionTitle']) }
|
39
39
|
|
40
40
|
it 'then the work is added to both collections' do
|
41
|
-
optional 'ability to get capybara to find css select2-result (see Issue #3038)' if
|
41
|
+
optional 'ability to get capybara to find css select2-result (see Issue #3038)' if ci_build?
|
42
42
|
# Add to second multi-membership collection of a different type
|
43
43
|
visit '/dashboard/my/works'
|
44
44
|
check 'check_all'
|
@@ -70,7 +70,7 @@ RSpec.describe 'Adding a work to multiple collections', type: :feature, clean_re
|
|
70
70
|
let!(:new_collection) { create(:collection_lw, user: admin_user, collection_type_gid: single_membership_type_2.gid, title: ['NewCollectionTitle']) }
|
71
71
|
|
72
72
|
it 'then the work is added to both collections' do
|
73
|
-
optional 'ability to get capybara to find css select2-result (see Issue #3038)' if
|
73
|
+
optional 'ability to get capybara to find css select2-result (see Issue #3038)' if ci_build?
|
74
74
|
# Add to second single-membership collection of a different type
|
75
75
|
visit '/dashboard/my/works'
|
76
76
|
check 'check_all'
|
@@ -91,7 +91,7 @@ RSpec.describe 'Adding a work to multiple collections', type: :feature, clean_re
|
|
91
91
|
|
92
92
|
context 'then the work fails to add to the second collection' do
|
93
93
|
it 'from the dashboard->works batch add to collection' do
|
94
|
-
optional 'ability to get capybara to find css select2-result (see Issue #3038)' if
|
94
|
+
optional 'ability to get capybara to find css select2-result (see Issue #3038)' if ci_build?
|
95
95
|
# Attempt to add to second single-membership collection of the same type
|
96
96
|
visit '/dashboard/my/works'
|
97
97
|
check 'check_all'
|
@@ -165,7 +165,7 @@ RSpec.describe 'Adding a work to multiple collections', type: :feature, clean_re
|
|
165
165
|
let!(:new_collection) { old_collection }
|
166
166
|
|
167
167
|
it 'then the add is treated as a success' do
|
168
|
-
optional 'ability to get capybara to find css select2-result (see Issue #3038)' if
|
168
|
+
optional 'ability to get capybara to find css select2-result (see Issue #3038)' if ci_build?
|
169
169
|
# Re-add to same multi-membership collection
|
170
170
|
visit '/dashboard/my/works'
|
171
171
|
check 'check_all'
|
@@ -186,7 +186,7 @@ RSpec.describe 'Adding a work to multiple collections', type: :feature, clean_re
|
|
186
186
|
let!(:new_collection) { old_collection }
|
187
187
|
|
188
188
|
it 'then the add is treated as a success' do
|
189
|
-
optional 'ability to get capybara to find css select2-result (see Issue #3038)' if
|
189
|
+
optional 'ability to get capybara to find css select2-result (see Issue #3038)' if ci_build?
|
190
190
|
# Re-add to same single-membership collection
|
191
191
|
visit '/dashboard/my/works'
|
192
192
|
check 'check_all'
|
@@ -1,4 +1,4 @@
|
|
1
|
-
RSpec.describe "
|
1
|
+
RSpec.describe "work show view" do
|
2
2
|
include Selectors::Dashboard
|
3
3
|
|
4
4
|
let(:work_path) { "/concern/generic_works/#{work.id}" }
|
@@ -29,13 +29,17 @@ RSpec.describe "display a work as its owner" do
|
|
29
29
|
visit work_path
|
30
30
|
end
|
31
31
|
|
32
|
-
it "shows
|
32
|
+
it "shows work content and all editor buttons and links" do
|
33
33
|
expect(page).to have_selector 'h2', text: 'Magnificent splendor'
|
34
34
|
expect(page).to have_selector 'h2', text: 'Happy little trees'
|
35
35
|
expect(page).to have_selector 'li', text: 'The Internet'
|
36
36
|
expect(page).to have_selector 'dt', text: 'Location'
|
37
37
|
expect(page).not_to have_selector 'dt', text: 'Based near'
|
38
38
|
expect(page).to have_selector 'button', text: 'Attach Child', count: 1
|
39
|
+
expect(page).to have_link 'Analytics'
|
40
|
+
expect(page).to have_link 'Edit'
|
41
|
+
expect(page).to have_link 'Delete'
|
42
|
+
expect(page).to have_selector 'button', text: 'Add to collection', count: 1
|
39
43
|
|
40
44
|
# Displays FileSets already attached to this work
|
41
45
|
within '.related-files' do
|
@@ -43,11 +47,60 @@ RSpec.describe "display a work as its owner" do
|
|
43
47
|
end
|
44
48
|
|
45
49
|
# IIIF manifest does not include locale query param
|
46
|
-
expect(find('div.viewer:first')['data-uri']).to eq "/concern/generic_works/#{work.id}/manifest"
|
50
|
+
expect(find('div.viewer:first')['data-uri']).to eq "http://www.example.com/concern/generic_works/#{work.id}/manifest"
|
51
|
+
end
|
52
|
+
|
53
|
+
it "allows adding work to a collection", clean_repo: true, js: true do
|
54
|
+
optional 'ability to get capybara to find css select2-result (see Issue #3038)' if ci_build?
|
55
|
+
click_button "Add to collection" # opens the modal
|
56
|
+
select_member_of_collection(collection)
|
57
|
+
click_button 'Save changes'
|
58
|
+
|
59
|
+
# forwards to collection show page
|
60
|
+
expect(page).to have_content collection.title.first
|
61
|
+
expect(page).to have_content work.title.first
|
62
|
+
expect(page).to have_selector '.alert-success', text: 'Collection was successfully updated.'
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context "as the work viewer" do
|
67
|
+
let(:work) do
|
68
|
+
create(:public_work,
|
69
|
+
with_admin_set: true,
|
70
|
+
title: ["Magnificent splendor", "Happy little trees"],
|
71
|
+
source: ["The Internet"],
|
72
|
+
based_near: ["USA"],
|
73
|
+
user: user,
|
74
|
+
ordered_members: [file_set],
|
75
|
+
representative_id: file_set.id)
|
76
|
+
end
|
77
|
+
let(:user) { create(:user) }
|
78
|
+
let(:viewer) { create(:user) }
|
79
|
+
let(:file_set) { create(:file_set, user: user, title: ['A Contained FileSet'], content: file) }
|
80
|
+
let(:file) { File.open(fixture_path + '/world.png') }
|
81
|
+
let(:multi_membership_type_1) { create(:collection_type, :allow_multiple_membership, title: 'Multi-membership 1') }
|
82
|
+
let!(:collection) { create(:collection_lw, user: viewer, collection_type_gid: multi_membership_type_1.gid) }
|
83
|
+
|
84
|
+
before do
|
85
|
+
sign_in viewer
|
86
|
+
visit work_path
|
87
|
+
end
|
88
|
+
|
89
|
+
it "shows work content and only Analytics and Add to collection buttons" do
|
90
|
+
expect(page).to have_selector 'h2', text: 'Magnificent splendor'
|
91
|
+
expect(page).to have_selector 'h2', text: 'Happy little trees'
|
92
|
+
expect(page).to have_selector 'li', text: 'The Internet'
|
93
|
+
expect(page).to have_selector 'dt', text: 'Location'
|
94
|
+
expect(page).not_to have_selector 'dt', text: 'Based near'
|
95
|
+
expect(page).not_to have_selector 'button', text: 'Attach Child', count: 1
|
96
|
+
expect(page).to have_link 'Analytics'
|
97
|
+
expect(page).not_to have_link 'Edit'
|
98
|
+
expect(page).not_to have_link 'Delete'
|
99
|
+
expect(page).to have_selector 'button', text: 'Add to collection', count: 1
|
47
100
|
end
|
48
101
|
|
49
|
-
it "
|
50
|
-
optional 'ability to get capybara to find css select2-result (see Issue #3038)' if
|
102
|
+
it "allows adding work to a collection", clean_repo: true, js: true do
|
103
|
+
optional 'ability to get capybara to find css select2-result (see Issue #3038)' if ci_build?
|
51
104
|
click_button "Add to collection" # opens the modal
|
52
105
|
select_member_of_collection(collection)
|
53
106
|
click_button 'Save changes'
|
@@ -40,8 +40,10 @@ RSpec.describe Hyrax::BatchEditsHelper, type: :helper do
|
|
40
40
|
context "with my collections" do
|
41
41
|
let(:controller_path) { "hyrax/my/collections" }
|
42
42
|
|
43
|
-
it "
|
44
|
-
expect(subject).to
|
43
|
+
it "show the check all dropdown" do
|
44
|
+
expect(subject).to have_css("span.caret")
|
45
|
+
expect(subject).to have_content t("hyrax.dashboard.my.action.select_all")
|
46
|
+
expect(subject).to have_content t("hyrax.dashboard.my.action.select_none")
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
@@ -0,0 +1,44 @@
|
|
1
|
+
RSpec.describe Hyrax::IiifHelper, type: :helper do
|
2
|
+
let(:solr_document) { SolrDocument.new }
|
3
|
+
let(:request) { double }
|
4
|
+
let(:ability) { nil }
|
5
|
+
let(:presenter) { Hyrax::WorkShowPresenter.new(solr_document, ability, request) }
|
6
|
+
let(:uv_partial_path) { 'hyrax/base/iiif_viewers/universal_viewer' }
|
7
|
+
|
8
|
+
describe '#iiif_viewer_display' do
|
9
|
+
before do
|
10
|
+
allow(helper).to receive(:iiif_viewer_display_partial).with(presenter)
|
11
|
+
.and_return(uv_partial_path)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "renders a partial" do
|
15
|
+
expect(helper).to receive(:render)
|
16
|
+
.with(uv_partial_path, presenter: presenter)
|
17
|
+
helper.iiif_viewer_display(presenter)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "takes options" do
|
21
|
+
expect(helper).to receive(:render)
|
22
|
+
.with(uv_partial_path, presenter: presenter, transcript_id: '123')
|
23
|
+
helper.iiif_viewer_display(presenter, transcript_id: '123')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#iiif_viewer_display_partial' do
|
28
|
+
subject { helper.iiif_viewer_display_partial(presenter) }
|
29
|
+
|
30
|
+
it 'defaults to universal viewer' do
|
31
|
+
expect(subject).to eq uv_partial_path
|
32
|
+
end
|
33
|
+
|
34
|
+
context "with #iiif_viewer override" do
|
35
|
+
let(:iiif_viewer) { :mirador }
|
36
|
+
|
37
|
+
before do
|
38
|
+
allow(presenter).to receive(:iiif_viewer).and_return(iiif_viewer)
|
39
|
+
end
|
40
|
+
|
41
|
+
it { is_expected.to eq 'hyrax/base/iiif_viewers/mirador' }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'hyrax/transactions'
|
4
|
+
|
5
|
+
RSpec.describe Hyrax::Transactions::CreateWork do
|
6
|
+
subject(:transaction) { described_class.new }
|
7
|
+
let(:template) { Hyrax::PermissionTemplate.find_by!(source_id: work.admin_set_id) }
|
8
|
+
let(:work) { build(:generic_work) }
|
9
|
+
let(:xmas) { DateTime.parse('2018-12-25 11:30').iso8601 }
|
10
|
+
|
11
|
+
before do
|
12
|
+
Hyrax::PermissionTemplate
|
13
|
+
.find_or_create_by(source_id: AdminSet.find_or_create_default_admin_set_id)
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#call' do
|
17
|
+
context 'with an invalid work' do
|
18
|
+
let(:work) { build(:invalid_generic_work) }
|
19
|
+
|
20
|
+
it 'is a failure' do
|
21
|
+
expect(transaction.call(work)).to be_failure
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'does not save the work' do
|
25
|
+
expect { transaction.call(work) }.not_to change { work.new_record? }.from true
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'gives useful errors' do
|
29
|
+
expect(transaction.call(work).failure).to eq work.errors
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'is a success' do
|
34
|
+
expect(transaction.call(work)).to be_success
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'persists the work' do
|
38
|
+
expect { transaction.call(work) }
|
39
|
+
.to change { work.persisted? }
|
40
|
+
.to true
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'sets visibility to restricted by default' do
|
44
|
+
expect { transaction.call(work) }
|
45
|
+
.not_to change { work.visibility }
|
46
|
+
.from Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'sets the default admin set' do
|
50
|
+
expect { transaction.call(work) }
|
51
|
+
.to change { work.admin_set&.id }
|
52
|
+
.to AdminSet.find_or_create_default_admin_set_id
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'sets the modified time using Hyrax::TimeService' do
|
56
|
+
allow(Hyrax::TimeService).to receive(:time_in_utc).and_return(xmas)
|
57
|
+
|
58
|
+
expect { transaction.call(work) }.to change { work.date_modified }.to xmas
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'sets the created time using Hyrax::TimeService' do
|
62
|
+
allow(Hyrax::TimeService).to receive(:time_in_utc).and_return(xmas)
|
63
|
+
|
64
|
+
expect { transaction.call(work) }.to change { work.date_uploaded }.to xmas
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'grants edit permission to depositor' do
|
68
|
+
transaction.call(work)
|
69
|
+
|
70
|
+
expect(work.edit_users).to include work.depositor
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'when visibility is set' do
|
75
|
+
let(:visibility) { Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC }
|
76
|
+
|
77
|
+
before { work.visibility = visibility }
|
78
|
+
|
79
|
+
it 'keeps the visibility' do
|
80
|
+
expect { transaction.call(work) }
|
81
|
+
.not_to change { work.visibility }
|
82
|
+
.from visibility
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'with an admin set' do
|
87
|
+
let(:admin_set) { AdminSet.find(template.source_id) }
|
88
|
+
let(:template) { create(:permission_template, with_admin_set: true) }
|
89
|
+
let(:work) { build(:generic_work, admin_set: admin_set) }
|
90
|
+
|
91
|
+
context 'without a permission template' do
|
92
|
+
let(:admin_set) { create(:admin_set, with_permission_template: false) }
|
93
|
+
|
94
|
+
it 'is a failure' do
|
95
|
+
expect(transaction.call(work)).to be_failure
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'is does not persist the work' do
|
99
|
+
expect { transaction.call(work) }
|
100
|
+
.not_to change { work.persisted? }
|
101
|
+
.from false
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'is a success' do
|
106
|
+
expect(transaction.call(work)).to be_success
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'retains the set admin set' do
|
110
|
+
expect { transaction.call(work) }
|
111
|
+
.not_to change { work.admin_set&.id }
|
112
|
+
.from admin_set.id
|
113
|
+
end
|
114
|
+
|
115
|
+
context 'with users and groups' do
|
116
|
+
let(:manage_groups) { ['manage_group_1', 'manage_group_2'] }
|
117
|
+
let(:manage_users) { create_list(:user, 2) }
|
118
|
+
let(:view_groups) { ['view_group_1', 'view_group_2'] }
|
119
|
+
let(:view_users) { create_list(:user, 2) }
|
120
|
+
|
121
|
+
let(:template) do
|
122
|
+
create(:permission_template,
|
123
|
+
with_admin_set: true,
|
124
|
+
manage_groups: manage_groups,
|
125
|
+
manage_users: manage_users,
|
126
|
+
view_groups: view_groups,
|
127
|
+
view_users: view_users)
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'assigns edit groups from template' do
|
131
|
+
expect { transaction.call(work) }
|
132
|
+
.to change { work.edit_groups }
|
133
|
+
.to include(*manage_groups)
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'assigns edit users from template' do
|
137
|
+
expect { transaction.call(work) }
|
138
|
+
.to change { work.edit_users }
|
139
|
+
.to include(*manage_users.map(&:user_key))
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'assigns read groups from template' do
|
143
|
+
expect { transaction.call(work) }
|
144
|
+
.to change { work.read_groups }
|
145
|
+
.to include(*view_groups)
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'assigns read users from template' do
|
149
|
+
expect { transaction.call(work) }
|
150
|
+
.to change { work.read_users }
|
151
|
+
.to include(*view_users.map(&:user_key))
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'hyrax/transactions'
|
4
|
+
|
5
|
+
RSpec.describe Hyrax::Transactions::Steps::ApplyPermissionTemplate do
|
6
|
+
subject(:step) { described_class.new }
|
7
|
+
let(:work) { build(:generic_work) }
|
8
|
+
|
9
|
+
context 'without an admin_set' do
|
10
|
+
it 'is a failure' do
|
11
|
+
expect(step.call(work)).to be_failure
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'with an admin_set' do
|
16
|
+
let(:work) { build(:generic_work, admin_set: admin_set) }
|
17
|
+
let(:admin_set) { create(:admin_set, with_permission_template: true) }
|
18
|
+
|
19
|
+
it 'is a success' do
|
20
|
+
expect(step.call(work)).to be_success
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'with users and groups' do
|
24
|
+
let(:admin_set) { AdminSet.find(template.source_id) }
|
25
|
+
let(:manage_groups) { ['edit_group_1', 'edit_group_2'] }
|
26
|
+
let(:manage_users) { create_list(:user, 2) }
|
27
|
+
let(:view_groups) { ['read_group_1', 'read_group_2'] }
|
28
|
+
let(:view_users) { create_list(:user, 2) }
|
29
|
+
|
30
|
+
let(:template) do
|
31
|
+
create(:permission_template,
|
32
|
+
with_admin_set: true,
|
33
|
+
manage_groups: manage_groups,
|
34
|
+
manage_users: manage_users,
|
35
|
+
view_groups: view_groups,
|
36
|
+
view_users: view_users)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'assigns edit users from template' do
|
40
|
+
expect { step.call(work) }
|
41
|
+
.to change { work.edit_users }
|
42
|
+
.to include(*manage_users.map(&:user_key))
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'assigns edit groups from template' do
|
46
|
+
expect { step.call(work) }
|
47
|
+
.to change { work.edit_groups }
|
48
|
+
.to include(*manage_groups)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'assigns read users from template' do
|
52
|
+
expect { step.call(work) }
|
53
|
+
.to change { work.read_users }
|
54
|
+
.to include(*view_users.map(&:user_key))
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'assigns read groups from template' do
|
58
|
+
expect { step.call(work) }
|
59
|
+
.to change { work.read_groups }
|
60
|
+
.to include(*view_groups)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'missing PermissionTemplate' do
|
65
|
+
let(:admin_set) { create(:admin_set, with_permission_template: false) }
|
66
|
+
|
67
|
+
it 'is a failure' do
|
68
|
+
expect(step.call(work)).to be_failure
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|