hyrax 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE.md +1 -1
  3. data/.github/PULL_REQUEST_TEMPLATE.md +5 -0
  4. data/.rubocop.yml +8 -1
  5. data/README.md +3 -11
  6. data/app/actors/hyrax/actors/file_set_actor.rb +6 -1
  7. data/app/assets/javascripts/hyrax.js +1 -1
  8. data/app/assets/javascripts/hyrax/editor.es6 +8 -0
  9. data/app/assets/javascripts/hyrax/save_work/save_work_control.es6 +20 -1
  10. data/app/assets/javascripts/hyrax/save_work/uploaded_files.es6 +1 -0
  11. data/app/assets/stylesheets/hyrax/_breadcrumbs.scss +25 -0
  12. data/app/assets/stylesheets/hyrax/_collections.scss +6 -0
  13. data/app/assets/stylesheets/hyrax/_file-listing.scss +5 -0
  14. data/app/assets/stylesheets/hyrax/_file_upload.scss +14 -0
  15. data/app/assets/stylesheets/hyrax/_form-progress.scss +6 -0
  16. data/app/assets/stylesheets/hyrax/_hyrax.scss +1 -1
  17. data/app/assets/stylesheets/hyrax/_styles.scss +6 -0
  18. data/app/assets/stylesheets/hyrax/dashboard.scss +4 -5
  19. data/app/builders/hyrax/bootstrap_breadcrumbs_builder.rb +10 -4
  20. data/app/controllers/concerns/hyrax/admin/stats_behavior.rb +25 -1
  21. data/app/controllers/concerns/hyrax/breadcrumbs_for_collections.rb +6 -2
  22. data/app/controllers/concerns/hyrax/controller.rb +1 -1
  23. data/app/controllers/concerns/hyrax/deny_access_override_behavior.rb +1 -1
  24. data/app/controllers/concerns/hyrax/works_controller_behavior.rb +1 -1
  25. data/app/controllers/hyrax/admin/admin_sets_controller.rb +1 -1
  26. data/app/controllers/hyrax/dashboard/collections_controller.rb +2 -2
  27. data/app/controllers/hyrax/downloads_controller.rb +1 -1
  28. data/app/controllers/hyrax/featured_works_controller.rb +1 -5
  29. data/app/controllers/hyrax/homepage_controller.rb +1 -1
  30. data/app/controllers/hyrax/single_use_links_controller.rb +1 -1
  31. data/app/controllers/hyrax/transfers_controller.rb +1 -1
  32. data/app/controllers/hyrax/users_controller.rb +1 -0
  33. data/app/helpers/hyrax/citations_behaviors/publication_behavior.rb +2 -2
  34. data/app/helpers/hyrax/collections_helper.rb +1 -1
  35. data/app/helpers/hyrax/hyrax_helper_behavior.rb +2 -2
  36. data/app/jobs/characterize_job.rb +1 -1
  37. data/app/jobs/fixity_check_job.rb +1 -1
  38. data/app/jobs/import_url_job.rb +12 -1
  39. data/app/models/checksum_audit_log.rb +1 -1
  40. data/app/models/concerns/hyrax/ability.rb +1 -1
  41. data/app/models/hyrax/collection_type.rb +1 -1
  42. data/app/models/hyrax/operation.rb +4 -6
  43. data/app/models/hyrax/permission_template_access.rb +5 -5
  44. data/app/models/sipity/entity.rb +1 -1
  45. data/app/presenters/hyrax/admin_set_presenter.rb +9 -2
  46. data/app/presenters/hyrax/admin_stats_presenter.rb +52 -6
  47. data/app/presenters/hyrax/inspect_work_presenter.rb +1 -1
  48. data/app/presenters/hyrax/workflow_presenter.rb +1 -1
  49. data/app/search_builders/hyrax/dashboard/nested_collections_search_builder.rb +3 -5
  50. data/app/search_builders/hyrax/filter_suppressed_with_roles.rb +5 -1
  51. data/app/search_builders/hyrax/my/works_search_builder.rb +2 -1
  52. data/app/services/hyrax/collection_size_service.rb +12 -0
  53. data/app/services/hyrax/collections/nested_collection_query_service.rb +2 -2
  54. data/app/services/hyrax/graph_exporter.rb +6 -1
  55. data/app/services/hyrax/license_service.rb +1 -9
  56. data/app/services/hyrax/qa_select_service.rb +28 -0
  57. data/app/services/hyrax/rights_statement_service.rb +1 -1
  58. data/app/services/hyrax/tolerant_select_service.rb +23 -0
  59. data/app/services/hyrax/workflow/permission_query.rb +1 -1
  60. data/app/services/hyrax/workflow/sipity_actions_generator.rb +1 -1
  61. data/app/strategies/hyrax/strategies/yaml_strategy.rb +1 -1
  62. data/app/views/_logo.html.erb +1 -1
  63. data/app/views/catalog/_search_form.html.erb +1 -1
  64. data/app/views/hyrax/admin/collection_types/index.html.erb +1 -1
  65. data/app/views/hyrax/admin/workflow_roles/index.html.erb +4 -2
  66. data/app/views/hyrax/admin/workflows/index.html.erb +1 -1
  67. data/app/views/hyrax/base/_form_files.html.erb +7 -7
  68. data/app/views/hyrax/base/_form_progress.html.erb +10 -5
  69. data/app/views/hyrax/base/_share_with.html.erb +3 -11
  70. data/app/views/hyrax/base/_show_actions.html.erb +1 -3
  71. data/app/views/hyrax/batch_edits/_check_all.html.erb +15 -7
  72. data/app/views/hyrax/collections/_list_collections.html.erb +1 -1
  73. data/app/views/hyrax/dashboard/_index_partials/_transfers.html.erb +1 -1
  74. data/app/views/hyrax/dashboard/collections/_default_group.html.erb +7 -2
  75. data/app/views/hyrax/dashboard/collections/_edit_actions.html.erb +1 -2
  76. data/app/views/hyrax/dashboard/collections/_form.html.erb +1 -1
  77. data/app/views/hyrax/dashboard/collections/_form_branding.html.erb +6 -6
  78. data/app/views/hyrax/dashboard/collections/_list_collections.html.erb +1 -1
  79. data/app/views/hyrax/dashboard/collections/_show_actions.html.erb +1 -2
  80. data/app/views/hyrax/dashboard/collections/_show_add_items_actions.html.erb +1 -2
  81. data/app/views/hyrax/dashboard/sidebar/_repository_content.html.erb +1 -2
  82. data/app/views/hyrax/dashboard/works/_default_group.html.erb +1 -1
  83. data/app/views/hyrax/file_sets/_actions.html.erb +1 -1
  84. data/app/views/hyrax/file_sets/_form.html.erb +3 -3
  85. data/app/views/hyrax/file_sets/_permission.html.erb +2 -2
  86. data/app/views/hyrax/file_sets/_permission_form.html.erb +10 -10
  87. data/app/views/hyrax/file_sets/_show_actions.html.erb +1 -4
  88. data/app/views/hyrax/file_sets/_single_use_links.html.erb +5 -0
  89. data/app/views/hyrax/file_sets/_versioning.html.erb +9 -7
  90. data/app/views/hyrax/file_sets/edit.html.erb +6 -6
  91. data/app/views/hyrax/file_sets/media_display/_audio.html.erb +1 -1
  92. data/app/views/hyrax/file_sets/media_display/_image.html.erb +1 -1
  93. data/app/views/hyrax/file_sets/media_display/_office_document.html.erb +0 -1
  94. data/app/views/hyrax/file_sets/media_display/_pdf.html.erb +0 -1
  95. data/app/views/hyrax/file_sets/media_display/_video.html.erb +1 -1
  96. data/app/views/hyrax/my/collections/_default_group.html.erb +8 -3
  97. data/app/views/hyrax/my/collections/_list_collections.html.erb +1 -1
  98. data/app/views/hyrax/my/works/_batch_actions.html.erb +1 -1
  99. data/app/views/hyrax/my/works/_tabs.html.erb +3 -3
  100. data/app/views/hyrax/single_use_links_viewer/show.html.erb +1 -1
  101. data/app/views/hyrax/uploads/_js_templates.html.erb +11 -11
  102. data/app/views/hyrax/uploads/_js_templates_branding.html.erb +2 -2
  103. data/app/views/layouts/_head_tag_content.html.erb +1 -1
  104. data/app/views/layouts/hyrax.html.erb +1 -1
  105. data/app/views/layouts/hyrax/dashboard.html.erb +1 -1
  106. data/app/views/records/edit_fields/_license.html.erb +1 -1
  107. data/app/views/records/edit_fields/_rights_statement.html.erb +2 -1
  108. data/config/features.rb +4 -0
  109. data/config/locales/hyrax.de.yml +1 -0
  110. data/config/locales/hyrax.en.yml +39 -1
  111. data/config/locales/hyrax.es.yml +1 -0
  112. data/config/locales/hyrax.fr.yml +1 -0
  113. data/config/locales/hyrax.it.yml +1 -0
  114. data/config/locales/hyrax.pt-BR.yml +1 -0
  115. data/config/locales/hyrax.zh.yml +1 -0
  116. data/hyrax.gemspec +5 -2
  117. data/lib/generators/hyrax/templates/mediated_deposit_workflow.json.erb +1 -0
  118. data/lib/hyrax.rb +7 -1
  119. data/lib/hyrax/arkivo/create_subscription_job.rb +1 -1
  120. data/lib/hyrax/redis_event_store.rb +1 -1
  121. data/lib/hyrax/resource_sync/change_list_writer.rb +2 -2
  122. data/lib/hyrax/version.rb +1 -1
  123. data/spec/actors/hyrax/actors/file_set_actor_spec.rb +1 -1
  124. data/spec/controllers/hyrax/admin/stats_controller_spec.rb +31 -1
  125. data/spec/controllers/hyrax/collections_controller_spec.rb +2 -2
  126. data/spec/controllers/hyrax/dashboard/collections_controller_spec.rb +2 -2
  127. data/spec/controllers/hyrax/generic_works_controller_spec.rb +19 -3
  128. data/spec/controllers/hyrax/homepage_controller_spec.rb +1 -1
  129. data/spec/controllers/hyrax/users_controller_spec.rb +58 -0
  130. data/spec/features/batch_create_spec.rb +1 -1
  131. data/spec/features/create_work_spec.rb +22 -2
  132. data/spec/features/dashboard/collection_spec.rb +3 -3
  133. data/spec/features/homepage_spec.rb +20 -4
  134. data/spec/javascripts/save_work_spec.js +50 -0
  135. data/spec/jobs/import_url_job_spec.rb +10 -8
  136. data/spec/lib/hyrax_spec.rb +9 -0
  137. data/spec/models/flipflop_spec.rb +8 -0
  138. data/spec/models/solr_document_spec.rb +2 -2
  139. data/spec/presenters/hyrax/admin_stats_presenter_spec.rb +73 -0
  140. data/spec/search_builders/hyrax/my/works_search_builder_spec.rb +0 -2
  141. data/spec/services/hyrax/graph_exporter_spec.rb +18 -0
  142. data/spec/services/hyrax/qa_select_service_spec.rb +40 -17
  143. data/spec/services/hyrax/tolerant_select_service_spec.rb +80 -0
  144. data/spec/support/fakes/fake_authority.rb +13 -0
  145. data/spec/support/logging_formatter.rb +1 -1
  146. data/spec/support/matchers/collection_type_property_matchers.rb +5 -5
  147. data/spec/views/hyrax/base/_form_progress.html.erb_spec.rb +11 -1
  148. data/spec/views/hyrax/file_sets/_show_actions.html.erb_spec.rb +0 -1
  149. data/spec/views/hyrax/file_sets/_single_use_links.html.erb_spec.rb +4 -0
  150. data/spec/views/hyrax/single_use_links_viewer/show.html.erb_spec.rb +0 -4
  151. data/template.rb +1 -1
  152. metadata +24 -11
  153. data/app/views/kaminari/blacklight_compact/_paginator.html.erb +0 -22
@@ -39,7 +39,7 @@ RSpec.describe 'Batch creation of works', type: :feature do
39
39
  it "allows on-behalf-of batch deposit", :js do
40
40
  click_link "Files" # switch tab
41
41
  expect(page).to have_content "Add files"
42
- within('span#addfiles') do
42
+ within('button#addfiles') do
43
43
  # two arbitrary files that aren't actually related, but should be
44
44
  # small enough to require minimal processessing.
45
45
  attach_file("files[]", "#{Hyrax::Engine.root}/spec/fixtures/small_file.txt", visible: false)
@@ -30,7 +30,7 @@ RSpec.describe 'Creating a new Work', :js, :workflow do
30
30
  click_link "Files" # switch tab
31
31
  expect(page).to have_content "Add files"
32
32
  expect(page).to have_content "Add folder"
33
- within('span#addfiles') do
33
+ within('button#addfiles') do
34
34
  attach_file("files[]", "#{Hyrax::Engine.root}/spec/fixtures/image.jp2", visible: false)
35
35
  attach_file("files[]", "#{Hyrax::Engine.root}/spec/fixtures/jp2_fits.xml", visible: false)
36
36
  end
@@ -71,7 +71,7 @@ RSpec.describe 'Creating a new Work', :js, :workflow do
71
71
  it "allows on-behalf-of deposit" do
72
72
  click_link "Files" # switch tab
73
73
  expect(page).to have_content "Add files"
74
- within('span#addfiles') do
74
+ within('button#addfiles') do
75
75
  attach_file("files[]", "#{Hyrax::Engine.root}/spec/fixtures/image.jp2", visible: false)
76
76
  attach_file("files[]", "#{Hyrax::Engine.root}/spec/fixtures/jp2_fits.xml", visible: false)
77
77
  end
@@ -101,4 +101,24 @@ RSpec.describe 'Creating a new Work', :js, :workflow do
101
101
  expect(page).to have_content "My Test Work"
102
102
  end
103
103
  end
104
+
105
+ context "when a file uploaded and then deleted" do
106
+ before do
107
+ sign_in user
108
+ click_link 'Works'
109
+ click_link "Add new work"
110
+ choose "payload_concern", option: "GenericWork"
111
+ click_button 'Create work'
112
+ end
113
+
114
+ it 'updates the required file check status' do
115
+ click_link "Files" # switch to the Files tab
116
+ within('button#addfiles') do
117
+ attach_file("files[]", "#{Hyrax::Engine.root}/spec/fixtures/image.jp2", visible: false)
118
+ end
119
+ expect(page).to have_css('ul li#required-files.complete', text: 'Add files')
120
+ click_button 'Delete' # delete the file
121
+ expect(page).to have_css('ul li#required-files.incomplete', text: 'Add files')
122
+ end
123
+ end
104
124
  end
@@ -631,14 +631,14 @@ RSpec.describe 'collection', type: :feature, clean_repo: true do
631
631
  it "preselects the collection we are adding works to and adds the selected works" do
632
632
  visit "/dashboard/collections/#{collection1.id}"
633
633
  click_link 'Add existing works'
634
- first('input#check_all').click
634
+ find('input#check_all').click
635
635
  click_button "Add to collection"
636
636
  expect(page).to have_selector "#member_of_collection_ids[value=\"#{collection1.id}\"]", visible: false
637
637
  expect(page).to have_selector "#member_of_collection_label[value=\"#{collection1.title.first}\"]"
638
638
 
639
639
  visit "/dashboard/collections/#{collection2.id}"
640
640
  click_link 'Add existing works'
641
- first('input#check_all').click
641
+ find('input#check_all').click
642
642
  click_button "Add to collection"
643
643
  expect(page).to have_selector "#member_of_collection_ids[value=\"#{collection2.id}\"]", visible: false
644
644
  expect(page).to have_selector "#member_of_collection_label[value=\"#{collection2.title.first}\"]"
@@ -671,7 +671,7 @@ RSpec.describe 'collection', type: :feature, clean_repo: true do
671
671
 
672
672
  # add required file
673
673
  click_link "Files" # switch tab
674
- within('span#addfiles') do
674
+ within('button#addfiles') do
675
675
  attach_file("files[]", "#{Hyrax::Engine.root}/spec/fixtures/image.jp2", visible: false)
676
676
  end
677
677
  # set required metadata
@@ -1,5 +1,6 @@
1
- RSpec.describe "The homepage" do
2
- let(:work1) { create(:work, :public, title: ['Work 1']) }
1
+ RSpec.describe "The homepage", :clean_repo do
2
+ let(:work1) { create(:work, :public, title: ["Work 1"], date_uploaded: (DateTime.current - 1.day)) }
3
+ let(:work2) { create(:work, :public, title: ["Work 2"], date_uploaded: (DateTime.current - 1.year)) }
3
4
 
4
5
  before do
5
6
  create(:featured_work, work_id: work1.id)
@@ -7,7 +8,22 @@ RSpec.describe "The homepage" do
7
8
 
8
9
  it 'shows featured works' do
9
10
  visit root_path
10
- expect(page).to have_link "Work 1"
11
+ expect(page).to have_link work1.title.first
12
+ end
13
+
14
+ it 'shows recently uploaded' do
15
+ visit root_path
16
+ click_link("Recently Uploaded")
17
+ within '#recently_uploaded' do
18
+ # Expect to see the one with "date uploaded" of yesterday
19
+ expect(page).to have_link work1.title.first
20
+ # Do not expect to see the one with "date uploaded" of last year.
21
+ expect(page).not_to have_link work2.title.first
22
+ # Expect the system create of work2 to be later than that of work1.
23
+ # This helps verify that 'recently uploaded' is looking at
24
+ # 'date_uploaded_dtsi' and not 'system_create_dtsi'.
25
+ expect(DateTime.parse(work2.to_solr['system_create_dtsi']).getlocal).to be >= DateTime.parse(work1.to_solr['system_create_dtsi']).getlocal
26
+ end
11
27
  end
12
28
 
13
29
  context "as an admin" do
@@ -20,7 +36,7 @@ RSpec.describe "The homepage" do
20
36
  it 'shows featured works that I can sort' do
21
37
  visit root_path
22
38
  within '.dd-item' do
23
- expect(page).to have_link "Work 1"
39
+ expect(page).to have_link work1.title.first
24
40
  end
25
41
  end
26
42
  end
@@ -173,6 +173,56 @@ describe("SaveWorkControl", function() {
173
173
 
174
174
  });
175
175
 
176
+ describe('isSaveButtonEnabled helper method', function() {
177
+ const form_id = 'new_generic_work';
178
+ let buildTarget = function(form_id) {
179
+ let buildFixture = function(id) {
180
+ return setFixtures(
181
+ `<form id="${id}">
182
+ <aside id="form-progress">
183
+ <ul>
184
+ <li id="required-metadata"></li>
185
+ <li id="required-files"></li>
186
+ <li id="required-agreement"></li>
187
+ </ul>
188
+ <input type="checkbox" name="agreement" id="agreement" value="1" required="required" checked="checked" />
189
+ <input type="submit">
190
+ </aside>
191
+ </form>`
192
+ );
193
+ };
194
+ target = new SaveWorkControl(buildFixture(form_id).find('#form-progress'));
195
+ return target;
196
+ };
197
+
198
+ describe('returns a boolean value of', function() {
199
+ beforeEach(function() {
200
+ target = buildTarget(form_id);
201
+ target.uploads = {
202
+ hasFiles: true,
203
+ hasFileRequirement: true,
204
+ // mock current uploads getter value
205
+ inProgress: false
206
+ };
207
+ });
208
+
209
+ it('true when the form is valid and there are no in progress uploads', () => {
210
+ expect(target.isSaveButtonEnabled).toBeTruthy();
211
+ });
212
+
213
+ it('false when required files have not been added to the form', () => {
214
+ target.uploads.hasFiles = false;
215
+ expect(target.isSaveButtonEnabled).toBeFalsy();
216
+ });
217
+
218
+ it('false when file uploads are still in progress', () => {
219
+ target.uploads.inProgress = true;
220
+ expect(target.isSaveButtonEnabled).toBeFalsy();
221
+ });
222
+ });
223
+ });
224
+
225
+
176
226
  describe("on submit", function() {
177
227
  var target;
178
228
  beforeEach(function() {
@@ -20,10 +20,14 @@ RSpec.describe ImportUrlJob do
20
20
  before do
21
21
  allow(Hyrax::Actors::FileSetActor).to receive(:new).with(file_set, user).and_return(actor)
22
22
 
23
- response_headers = { 'Content-Type' => 'image/png', 'Content-Length' => File.size(File.expand_path(file_path, __FILE__)) }
24
-
25
- stub_request(:head, "http://example.org#{file_hash}").to_return(
26
- body: "", status: 200, headers: response_headers
23
+ response_headers = {
24
+ 'Content-Type' => 'image/png',
25
+ 'Content-Length' => 1,
26
+ 'Content-Range' => "0-0/#{File.size(File.expand_path(file_path, __FILE__))}"
27
+ }
28
+
29
+ stub_request(:get, "http://example.org#{file_hash}").with(headers: { 'Range' => 'bytes=0-0' }).to_return(
30
+ body: File.open(File.expand_path(file_path, __FILE__)).read(1), status: 206, headers: response_headers
27
31
  )
28
32
 
29
33
  stub_request(:get, "http://example.org#{file_hash}").to_return(
@@ -97,10 +101,8 @@ RSpec.describe ImportUrlJob do
97
101
 
98
102
  context 'when the remote file is unavailable' do
99
103
  before do
100
- response_headers = { 'Content-Type' => 'image/png', 'Content-Length' => File.size(File.expand_path(file_path, __FILE__)) }
101
-
102
- stub_request(:head, "http://example.org#{file_hash}").to_return(
103
- body: "", status: 404, headers: response_headers
104
+ stub_request(:get, "http://example.org#{file_hash}").with(headers: { 'Range' => 'bytes=0-0' }).to_return(
105
+ body: '', status: 406, headers: {}
104
106
  )
105
107
  end
106
108
 
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Hyrax do
4
+ describe '.logger' do
5
+ it 'is a Logger' do
6
+ expect(described_class.logger).to respond_to :log
7
+ end
8
+ end
9
+ end
@@ -38,4 +38,12 @@ RSpec.describe Flipflop do
38
38
  is_expected.to be false
39
39
  end
40
40
  end
41
+
42
+ describe "hide_users_list?" do
43
+ subject { described_class.hide_users_list? }
44
+
45
+ it "defaults to true" do
46
+ is_expected.to be true
47
+ end
48
+ end
41
49
  end
@@ -31,7 +31,7 @@ RSpec.describe ::SolrDocument, type: :model do
31
31
  let(:attributes) { { 'date_uploaded_dtsi' => 'Test' } }
32
32
 
33
33
  it "logs parse errors" do
34
- expect(ActiveFedora::Base.logger).to receive(:info).with(/Unable to parse date.*/)
34
+ expect(Hyrax.logger).to receive(:info).with(/Unable to parse date.*/)
35
35
  subject
36
36
  end
37
37
  end
@@ -59,7 +59,7 @@ RSpec.describe ::SolrDocument, type: :model do
59
59
  let(:attributes) { { 'system_create_dtsi' => 'Test' } }
60
60
 
61
61
  it "logs parse errors" do
62
- expect(ActiveFedora::Base.logger).to receive(:info).with(/Unable to parse date.*/)
62
+ expect(Hyrax.logger).to receive(:info).with(/Unable to parse date.*/)
63
63
  subject
64
64
  end
65
65
  end
@@ -16,6 +16,20 @@ RSpec.describe Hyrax::AdminStatsPresenter do
16
16
  expect(Hyrax::Statistics::Works::ByDepositor).to receive(:query).with(limit: limit).and_return(:query_response)
17
17
  expect(service.active_users).to eq(:query_response)
18
18
  end
19
+
20
+ context 'with alternatate class' do
21
+ subject(:service) do
22
+ described_class.new(filters, limit, by_depositor: by_depositor_class)
23
+ end
24
+
25
+ let(:by_depositor_class) { spy('ByDepositor') }
26
+
27
+ it 'retrieves active_users from the class' do
28
+ service.active_users
29
+
30
+ expect(by_depositor_class).to have_received(:query).with(limit: limit)
31
+ end
32
+ end
19
33
  end
20
34
 
21
35
  describe "#top_formats" do
@@ -23,6 +37,20 @@ RSpec.describe Hyrax::AdminStatsPresenter do
23
37
  expect(Hyrax::Statistics::FileSets::ByFormat).to receive(:query).with(limit: limit).and_return(:query_response)
24
38
  expect(service.top_formats).to eq(:query_response)
25
39
  end
40
+
41
+ context 'with alternatate class' do
42
+ subject(:service) do
43
+ described_class.new(filters, limit, by_format: by_format)
44
+ end
45
+
46
+ let(:by_format) { spy('ByFormat') }
47
+
48
+ it 'retrieves formats from the class' do
49
+ service.top_formats
50
+
51
+ expect(by_format).to have_received(:query).with(limit: limit)
52
+ end
53
+ end
26
54
  end
27
55
 
28
56
  describe "#works_count" do
@@ -30,6 +58,19 @@ RSpec.describe Hyrax::AdminStatsPresenter do
30
58
  expect(Hyrax::Statistics::Works::Count).to receive(:by_permission).with(start_date: service.start_date, end_date: service.end_date).and_return(:query_response)
31
59
  expect(service.works_count).to eq(:query_response)
32
60
  end
61
+
62
+ context 'with alternatate class' do
63
+ subject(:service) { described_class.new(filters, limit, works_counter: works_counter) }
64
+ let(:works_counter) { spy('Works::Count') }
65
+
66
+ it 'retrieves count from the class' do
67
+ service.works_count
68
+
69
+ expect(works_counter)
70
+ .to have_received(:by_permission)
71
+ .with(start_date: service.start_date, end_date: service.end_date)
72
+ end
73
+ end
33
74
  end
34
75
 
35
76
  describe "#depositors" do
@@ -37,6 +78,22 @@ RSpec.describe Hyrax::AdminStatsPresenter do
37
78
  expect(Hyrax::Statistics::Depositors::Summary).to receive(:depositors).with(start_date: service.start_date, end_date: service.end_date).and_return(:query_response)
38
79
  expect(service.depositors).to eq(:query_response)
39
80
  end
81
+
82
+ context 'with alternatate class' do
83
+ subject(:service) do
84
+ described_class.new(filters, limit, depositor_summary: summary_class)
85
+ end
86
+
87
+ let(:summary_class) { spy('depositor summary class') }
88
+
89
+ it 'retrieves depositors from the class' do
90
+ service.depositors
91
+
92
+ expect(summary_class)
93
+ .to have_received(:depositors)
94
+ .with(start_date: service.start_date, end_date: service.end_date)
95
+ end
96
+ end
40
97
  end
41
98
 
42
99
  describe "#recent_users" do
@@ -44,6 +101,22 @@ RSpec.describe Hyrax::AdminStatsPresenter do
44
101
  expect(Hyrax::Statistics::SystemStats).to receive(:recent_users).with(limit: limit, start_date: service.start_date, end_date: service.end_date).and_return(:query_response)
45
102
  expect(service.recent_users).to eq(:query_response)
46
103
  end
104
+
105
+ context 'with alternatate class' do
106
+ subject(:service) do
107
+ described_class.new(filters, limit, system_stats: system_stats)
108
+ end
109
+
110
+ let(:system_stats) { spy('SystemStats') }
111
+
112
+ it 'retrieves users from the class' do
113
+ service.recent_users
114
+
115
+ expect(system_stats)
116
+ .to have_received(:recent_users)
117
+ .with(limit: limit, start_date: service.start_date, end_date: service.end_date)
118
+ end
119
+ end
47
120
  end
48
121
 
49
122
  describe '#date_filter_string' do
@@ -24,7 +24,6 @@ RSpec.describe Hyrax::My::WorksSearchBuilder do
24
24
 
25
25
  it "filters works that we are the depositor of" do
26
26
  expect(subject).to eq ["{!terms f=has_model_ssim}GenericWork",
27
- "-suppressed_bsi:true",
28
27
  "depositor"]
29
28
  end
30
29
  end
@@ -44,7 +43,6 @@ RSpec.describe Hyrax::My::WorksSearchBuilder do
44
43
  :add_group_config_to_solr,
45
44
  :add_facet_paging_to_solr,
46
45
  :filter_models,
47
- :only_active_works,
48
46
  :show_only_resources_deposited_by_current_user
49
47
  ]
50
48
  end
@@ -36,5 +36,23 @@ RSpec.describe Hyrax::GraphExporter do
36
36
  expect { subject }.to raise_error ActiveFedora::ObjectNotFoundError
37
37
  end
38
38
  end
39
+
40
+ context 'with a nested work' do
41
+ let(:work) do
42
+ NamespacedWorks::NestedWork
43
+ .create(title: ['Comet in Moominland'],
44
+ created_attributes: [{ start: DateTime.now.utc - 1, finish: DateTime.now.utc },
45
+ { start: DateTime.now.utc - 2, finish: DateTime.now.utc }])
46
+ end
47
+
48
+ it 'includes each nested resources once' do
49
+ resource_fragments = work.created.map { |ts| ts.rdf_subject.fragment }
50
+ mapped_fragments = subject.query(predicate: RDF.type, object: RDF::Vocab::EDM.TimeSpan)
51
+ .subjects
52
+ .map(&:fragment)
53
+
54
+ expect(mapped_fragments).to contain_exactly(*resource_fragments)
55
+ end
56
+ end
39
57
  end
40
58
  end
@@ -1,21 +1,4 @@
1
1
  RSpec.describe Hyrax::QaSelectService do
2
- let(:authority) do
3
- # Implementing an ActiveRecord interface as required for this spec
4
- Class.new do
5
- def initialize(map)
6
- @map = map
7
- end
8
-
9
- def all
10
- @map
11
- end
12
-
13
- def find(id)
14
- @map.detect { |item| item[:id] == id }
15
- end
16
- end
17
- # rubocop:enable RSpec/InstanceVariable
18
- end
19
2
  let(:authority_map) do
20
3
  [
21
4
  HashWithIndifferentAccess.new(term: 'Active Label', label: 'Active Label', id: 'active-id', active: true),
@@ -23,6 +6,8 @@ RSpec.describe Hyrax::QaSelectService do
23
6
  HashWithIndifferentAccess.new(label: 'Active No Term', id: 'active-no-term-id', active: true)
24
7
  ]
25
8
  end
9
+
10
+ let(:authority) { FakeAuthority }
26
11
  let(:authority_name) { 'respect_my' }
27
12
  let(:qa_select_service) { described_class.new(authority_name) }
28
13
 
@@ -44,6 +29,16 @@ RSpec.describe Hyrax::QaSelectService do
44
29
  it 'will be Array of Arrays<label, id>' do
45
30
  expect(subject).to eq([['Active Label', 'active-id'], ['Active No Term', 'active-no-term-id']])
46
31
  end
32
+
33
+ context 'when a key has no active property' do
34
+ let(:no_state) { HashWithIndifferentAccess.new(term: 'term', label: 'label', id: 'no-state') }
35
+
36
+ before { authority_map << no_state }
37
+
38
+ it 'raises KeyError' do
39
+ expect { subject }.to raise_error(KeyError)
40
+ end
41
+ end
47
42
  end
48
43
 
49
44
  describe '#label' do
@@ -83,4 +78,32 @@ RSpec.describe Hyrax::QaSelectService do
83
78
  end
84
79
  end
85
80
  end
81
+
82
+ describe '#include_current_value' do
83
+ let(:render_opts) { [] }
84
+ let(:html_opts) { { class: 'moomin' } }
85
+
86
+ let(:authority_map) do
87
+ [
88
+ HashWithIndifferentAccess.new(term: 'Active Label', label: 'Active Label', id: 'active-id', active: true),
89
+ HashWithIndifferentAccess.new(term: 'Inactive Label', label: 'Inactive Label', id: 'inactive-id', active: false),
90
+ HashWithIndifferentAccess.new(label: 'Inactive No Term', id: 'inactive-no-term-id', active: false)
91
+ ]
92
+ end
93
+
94
+ it 'adds an inactive current value' do
95
+ expect(qa_select_service.include_current_value('inactive-id', :idx, render_opts, html_opts))
96
+ .to eq [[['Inactive Label', 'inactive-id']], { class: 'moomin force-select' }]
97
+ end
98
+
99
+ it 'adds an inactive current value with fallback label' do
100
+ expect(qa_select_service.include_current_value('inactive-no-term-id', :idx, render_opts, html_opts))
101
+ .to eq [[['inactive-no-term-id', 'inactive-no-term-id']], { class: 'moomin force-select' }]
102
+ end
103
+
104
+ it 'does not add an active current value' do
105
+ expect(qa_select_service.include_current_value('active-id', :idx, render_opts.dup, html_opts.dup))
106
+ .to eq [render_opts, html_opts]
107
+ end
108
+ end
86
109
  end