hyrax 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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