hyrax 2.3.3 → 2.4.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/.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
|