blacklight 8.3.0 → 8.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +10 -6
  3. data/.rubocop.yml +3 -0
  4. data/.rubocop_todo.yml +22 -55
  5. data/Gemfile +2 -10
  6. data/README.md +2 -2
  7. data/VERSION +1 -1
  8. data/app/assets/javascripts/blacklight/blacklight.esm.js +13 -7
  9. data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -1
  10. data/app/assets/javascripts/blacklight/blacklight.js +13 -7
  11. data/app/assets/javascripts/blacklight/blacklight.js.map +1 -1
  12. data/app/assets/stylesheets/blacklight/_balanced_list.scss +1 -1
  13. data/app/assets/stylesheets/blacklight/_bookmark.scss +30 -0
  14. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +0 -4
  15. data/app/assets/stylesheets/blacklight/_constraints.scss +15 -9
  16. data/app/assets/stylesheets/blacklight/_controls.scss +0 -1
  17. data/app/assets/stylesheets/blacklight/_facets.scss +33 -37
  18. data/app/assets/stylesheets/blacklight/_header.scss +2 -35
  19. data/app/assets/stylesheets/blacklight/_icons.scss +3 -2
  20. data/app/assets/stylesheets/blacklight/_layout.scss +3 -0
  21. data/app/assets/stylesheets/blacklight/_mixins.scss +4 -4
  22. data/app/assets/stylesheets/blacklight/_search_form.scss +3 -8
  23. data/app/assets/stylesheets/blacklight/_search_history.scss +5 -5
  24. data/app/assets/stylesheets/blacklight/_search_results.scss +5 -2
  25. data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +16 -10
  26. data/app/components/blacklight/advanced_search_form_component.html.erb +1 -1
  27. data/app/components/blacklight/advanced_search_form_component.rb +6 -0
  28. data/app/components/blacklight/constraint_layout_component.html.erb +2 -9
  29. data/app/components/blacklight/constraint_layout_component.rb +8 -0
  30. data/app/components/blacklight/constraints_component.rb +3 -3
  31. data/app/components/blacklight/document/action_component.rb +2 -1
  32. data/app/components/blacklight/document/bookmark_component.html.erb +2 -1
  33. data/app/components/blacklight/document/bookmark_component.rb +6 -0
  34. data/app/components/blacklight/document/page_header_component.html.erb +7 -0
  35. data/app/components/blacklight/document/page_header_component.rb +85 -0
  36. data/app/components/blacklight/document_component.rb +1 -1
  37. data/app/components/blacklight/facet_component.rb +1 -1
  38. data/app/components/blacklight/facet_field_checkboxes_component.html.erb +1 -1
  39. data/app/components/blacklight/facet_field_checkboxes_component.rb +1 -1
  40. data/app/components/blacklight/facet_field_inclusive_constraint_component.html.erb +1 -1
  41. data/app/components/blacklight/facet_field_list_component.html.erb +1 -1
  42. data/app/components/blacklight/facet_item_component.rb +1 -1
  43. data/app/components/blacklight/icons/bookmark_icon_component.rb +17 -0
  44. data/app/components/blacklight/icons/icon_component.rb +9 -4
  45. data/app/components/blacklight/icons/remove_component.rb +16 -0
  46. data/app/components/blacklight/metadata_field_component.html.erb +1 -1
  47. data/app/components/blacklight/metadata_field_component.rb +5 -0
  48. data/app/components/blacklight/response/facet_group_component.rb +1 -1
  49. data/app/components/blacklight/response/pagination_component.html.erb +1 -1
  50. data/app/components/blacklight/response/sort_component.html.erb +1 -6
  51. data/app/components/blacklight/response/sort_component.rb +15 -0
  52. data/app/components/blacklight/search/per_page_component.html.erb +2 -0
  53. data/app/components/blacklight/search/per_page_component.rb +50 -0
  54. data/app/components/blacklight/search_bar_component.html.erb +1 -1
  55. data/app/components/blacklight/search_context/server_item_pagination_component.html.erb +5 -4
  56. data/app/components/blacklight/search_context/server_item_pagination_component.rb +1 -1
  57. data/app/components/blacklight/skip_link_component.html.erb +7 -0
  58. data/app/components/blacklight/skip_link_component.rb +17 -0
  59. data/app/components/blacklight/system/dropdown_button_component.rb +18 -0
  60. data/app/components/blacklight/system/dropdown_component.rb +3 -6
  61. data/app/components/blacklight/system/flash_message_component.html.erb +1 -1
  62. data/app/components/blacklight/top_navbar_component.html.erb +2 -2
  63. data/app/components/blacklight/top_navbar_component.rb +4 -0
  64. data/app/helpers/blacklight/catalog_helper_behavior.rb +2 -0
  65. data/app/helpers/blacklight/component_helper_behavior.rb +4 -4
  66. data/app/helpers/blacklight/configuration_helper_behavior.rb +2 -0
  67. data/app/helpers/blacklight/document_helper_behavior.rb +14 -0
  68. data/app/javascript/blacklight/checkbox_submit.js +7 -1
  69. data/app/javascript/blacklight/core.js +5 -5
  70. data/app/models/concerns/blacklight/document/semantic_fields.rb +1 -1
  71. data/app/presenters/blacklight/facet_checkbox_item_presenter.rb +11 -0
  72. data/app/presenters/blacklight/facet_field_presenter.rb +9 -1
  73. data/app/services/blacklight/search_service.rb +9 -1
  74. data/app/views/catalog/_per_page_widget.html.erb +1 -10
  75. data/app/views/catalog/_search_results.html.erb +1 -1
  76. data/app/views/catalog/_show_main_content.html.erb +1 -1
  77. data/app/views/catalog/_show_sidebar.html.erb +1 -0
  78. data/app/views/catalog/show.html.erb +3 -3
  79. data/app/views/catalog/suggest.html.erb +1 -1
  80. data/app/views/kaminari/blacklight/_page.html.erb +14 -8
  81. data/app/views/kaminari/blacklight/_paginator.html.erb +2 -1
  82. data/app/views/layouts/blacklight/base.html.erb +3 -5
  83. data/blacklight.gemspec +6 -2
  84. data/{docker-compose.yml → compose.yaml} +1 -1
  85. data/config/locales/blacklight.ar.yml +3 -0
  86. data/config/locales/blacklight.de.yml +3 -0
  87. data/config/locales/blacklight.en.yml +216 -229
  88. data/config/locales/blacklight.es.yml +3 -0
  89. data/config/locales/blacklight.fr.yml +3 -0
  90. data/config/locales/blacklight.hu.yml +3 -0
  91. data/config/locales/blacklight.it.yml +3 -0
  92. data/config/locales/blacklight.nl.yml +3 -0
  93. data/config/locales/blacklight.pt-BR.yml +3 -0
  94. data/config/locales/blacklight.sq.yml +3 -0
  95. data/config/locales/blacklight.zh.yml +3 -0
  96. data/lib/blacklight/abstract_repository.rb +6 -0
  97. data/lib/blacklight/component.rb +10 -47
  98. data/lib/blacklight/configuration.rb +32 -19
  99. data/lib/blacklight/engine.rb +6 -0
  100. data/lib/blacklight/parameters.rb +1 -1
  101. data/lib/blacklight/solr/repository.rb +11 -4
  102. data/lib/blacklight/solr/response/params.rb +1 -1
  103. data/lib/blacklight/solr/response.rb +0 -12
  104. data/lib/blacklight/solr/search_builder_behavior.rb +1 -1
  105. data/lib/blacklight/solr.rb +0 -6
  106. data/lib/blacklight.rb +4 -14
  107. data/lib/generators/blacklight/assets/propshaft_generator.rb +2 -2
  108. data/lib/generators/blacklight/models_generator.rb +1 -1
  109. data/lib/generators/blacklight/user_generator.rb +2 -0
  110. data/package.json +3 -2
  111. data/rollup.config.js +6 -12
  112. data/spec/components/blacklight/document/action_component_spec.rb +1 -1
  113. data/spec/components/blacklight/document/page_header_component_spec.rb +92 -0
  114. data/spec/components/blacklight/document_component_spec.rb +20 -0
  115. data/spec/components/blacklight/icons/icon_component_spec.rb +42 -0
  116. data/spec/components/blacklight/search_context/server_item_pagination_component_spec.rb +13 -2
  117. data/spec/controllers/blacklight/catalog_spec.rb +1 -1
  118. data/spec/controllers/catalog_controller_spec.rb +5 -5
  119. data/spec/features/advanced_search_spec.rb +16 -2
  120. data/spec/features/bookmarks_spec.rb +15 -0
  121. data/spec/features/search_context_spec.rb +2 -1
  122. data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +2 -2
  123. data/spec/lib/blacklight/component_spec.rb +32 -27
  124. data/spec/lib/blacklight/nested_open_struct_with_hash_access_spec.rb +1 -1
  125. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +1 -1
  126. data/spec/models/blacklight/configuration_spec.rb +12 -12
  127. data/spec/models/blacklight/solr/document_spec.rb +2 -2
  128. data/spec/models/blacklight/solr/repository_spec.rb +31 -13
  129. data/spec/models/blacklight/solr/response/facets_spec.rb +2 -2
  130. data/spec/models/blacklight/solr/response/group_spec.rb +1 -1
  131. data/spec/models/blacklight/solr/response_spec.rb +2 -2
  132. data/spec/models/blacklight/solr/search_builder_behavior_spec.rb +1 -1
  133. data/spec/models/bookmark_spec.rb +1 -1
  134. data/spec/presenters/blacklight/document_presenter_spec.rb +2 -2
  135. data/spec/presenters/blacklight/facet_checkbox_item_presenter_spec.rb +42 -0
  136. data/spec/presenters/blacklight/facet_field_presenter_spec.rb +14 -0
  137. data/spec/requests/load_suggestions_spec.rb +5 -5
  138. data/spec/services/blacklight/search_service_spec.rb +2 -2
  139. data/spec/spec_helper.rb +5 -2
  140. data/spec/test_app_templates/lib/generators/test_app_generator.rb +1 -1
  141. data/tasks/blacklight.rake +6 -6
  142. metadata +86 -8
@@ -13,7 +13,7 @@ RSpec.describe Blacklight::FacetsHelperBehavior do
13
13
 
14
14
  it 'wraps the facet data in a presenter' do
15
15
  presenter = helper.facet_field_presenter(facet_config, display_facet)
16
- expect(presenter).to be_a_kind_of Blacklight::FacetFieldPresenter
16
+ expect(presenter).to be_a Blacklight::FacetFieldPresenter
17
17
  expect(presenter.facet_field).to eq facet_config
18
18
  expect(presenter.display_facet).to eq display_facet
19
19
  expect(presenter.view_context).to eq helper
@@ -23,7 +23,7 @@ RSpec.describe Blacklight::FacetsHelperBehavior do
23
23
  stub_const('SomePresenter', Class.new(Blacklight::FacetFieldPresenter))
24
24
  facet_config.presenter = SomePresenter
25
25
  presenter = helper.facet_field_presenter(facet_config, display_facet)
26
- expect(presenter).to be_a_kind_of SomePresenter
26
+ expect(presenter).to be_a SomePresenter
27
27
  end
28
28
  end
29
29
  end
@@ -1,43 +1,48 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- RSpec.describe Blacklight::Component do
4
- let(:component_class) { Blacklight::DocumentTitleComponent }
3
+ RSpec.describe Blacklight::Component, type: :component do
4
+ let(:component_class) { Blacklight::System::ModalComponent }
5
5
 
6
- context "subclassed" do
7
- it "returns our Compiler implementation" do
8
- expect(component_class.ancestors).to include described_class
9
- expect(component_class.compiler).to be_a Blacklight::Component::EngineCompiler
6
+ before do
7
+ component_class.reset_compiler!
8
+ ViewComponent::CompileCache.invalidate!
9
+
10
+ component_class.class_eval do
11
+ undef :call if method_defined?(:call)
10
12
  end
11
13
  end
12
14
 
13
- describe Blacklight::Component::EngineCompiler do
14
- subject(:compiler) { described_class.new(component_class) }
15
+ after do
16
+ component_class.reset_compiler!
17
+ ViewComponent::CompileCache.invalidate!
15
18
 
16
- let(:original_compiler) { ViewComponent::Compiler.new(component_class) }
17
- let(:original_path) { original_compiler.send(:templates).first[:path] }
18
- let(:resolved_path) { compiler.templates.first[:path] }
19
+ component_class.class_eval do
20
+ undef :call if method_defined?(:call)
21
+ end
22
+ end
19
23
 
20
- context "without overrides" do
21
- it "links to engine template" do
22
- expect(resolved_path).not_to include(".internal_test_app")
23
- expect(resolved_path).to eql(original_path)
24
- end
24
+ context "without overrides" do
25
+ it "renders the engine template" do
26
+ render_inline(component_class.new)
27
+ expect(page).to have_css('.modal-header')
25
28
  end
29
+ end
26
30
 
27
- context "with overrides" do
28
- let(:path_match) do
29
- Regexp.new(Regexp.escape(File.join(".internal_test_app", component_class.view_component_path)))
31
+ context "with overrides" do
32
+ around do |ex|
33
+ FileUtils.mkdir_p(Rails.root.join('app/components/blacklight/system'))
34
+ Rails.root.join("app/components/blacklight/system/modal_component.html.erb").open("w") do |f|
35
+ f.puts '<div class="custom-modal">Overridden</div>'
30
36
  end
31
37
 
32
- before do
33
- allow(File).to receive(:exist?).and_call_original
34
- allow(File).to receive(:exist?).with(path_match).and_return(true)
35
- end
38
+ ex.run
39
+ ensure
40
+ Rails.root.join('app/components/blacklight/system/modal_component.html.erb').unlink
41
+ end
36
42
 
37
- it "links to application template" do
38
- expect(resolved_path).to include(".internal_test_app")
39
- expect(resolved_path).not_to eql(original_path)
40
- end
43
+ it "renders to application template" do
44
+ render_inline(component_class.new)
45
+ expect(page).to have_css('.custom-modal')
41
46
  end
42
47
  end
43
48
  end
@@ -23,7 +23,7 @@ RSpec.describe Blacklight::NestedOpenStructWithHashAccess do
23
23
 
24
24
  describe "#deep_dup" do
25
25
  it "preserves the current class" do
26
- expect(described_class.new(described_class).deep_dup).to be_a_kind_of described_class
26
+ expect(described_class.new(described_class).deep_dup).to be_a described_class
27
27
  end
28
28
 
29
29
  it "preserves the default proc" do
@@ -36,7 +36,7 @@ RSpec.describe Blacklight::OpenStructWithHashAccess do
36
36
  end
37
37
 
38
38
  it "exposes the internal hash table" do
39
- expect(@h.to_h).to be_a_kind_of(Hash)
39
+ expect(@h.to_h).to be_a(Hash)
40
40
  expect(@h.to_h[:a]).to eq 1
41
41
  end
42
42
 
@@ -14,7 +14,7 @@ RSpec.describe "Blacklight::Configuration", :api do
14
14
 
15
15
  describe "initialization" do
16
16
  it "is an OpenStructWithHashAccess" do
17
- expect(config).to be_a_kind_of Blacklight::OpenStructWithHashAccess
17
+ expect(config).to be_a Blacklight::OpenStructWithHashAccess
18
18
  end
19
19
 
20
20
  it "accepts a block for configuration" do
@@ -30,22 +30,22 @@ RSpec.describe "Blacklight::Configuration", :api do
30
30
 
31
31
  describe "defaults" do
32
32
  it "has a hash of default rsolr query parameters" do
33
- expect(config.default_solr_params).to be_a_kind_of Hash
33
+ expect(config.default_solr_params).to be_a Hash
34
34
  end
35
35
 
36
36
  it "has openstruct values for show and index parameters" do
37
- expect(config.show).to be_a_kind_of OpenStruct
38
- expect(config.index).to be_a_kind_of OpenStruct
37
+ expect(config.show).to be_a OpenStruct
38
+ expect(config.index).to be_a OpenStruct
39
39
  end
40
40
 
41
41
  it "has ordered hashes for field configuration" do
42
- expect(config.facet_fields).to be_a_kind_of Hash
43
- expect(config.index_fields).to be_a_kind_of Hash
44
- expect(config.show_fields).to be_a_kind_of Hash
45
- expect(config.search_fields).to be_a_kind_of Hash
46
- expect(config.show_fields).to be_a_kind_of Hash
47
- expect(config.search_fields).to be_a_kind_of Hash
48
- expect(config.sort_fields).to be_a_kind_of Hash
42
+ expect(config.facet_fields).to be_a Hash
43
+ expect(config.index_fields).to be_a Hash
44
+ expect(config.show_fields).to be_a Hash
45
+ expect(config.search_fields).to be_a Hash
46
+ expect(config.show_fields).to be_a Hash
47
+ expect(config.search_fields).to be_a Hash
48
+ expect(config.sort_fields).to be_a Hash
49
49
  end
50
50
  end
51
51
 
@@ -197,7 +197,7 @@ RSpec.describe "Blacklight::Configuration", :api do
197
197
  config.add_my_custom_facet_field 'qwerty', label: "asdf"
198
198
  end
199
199
 
200
- expect(config.my_custom_facet_fields['qwerty']).to be_a_kind_of(Blacklight::Configuration::FacetField)
200
+ expect(config.my_custom_facet_fields['qwerty']).to be_a(Blacklight::Configuration::FacetField)
201
201
  end
202
202
  end
203
203
 
@@ -231,7 +231,7 @@ RSpec.describe "Blacklight::Solr::Document", :api do
231
231
  end
232
232
 
233
233
  it "returns an array even for a single-value field" do
234
- expect(@doc1.to_semantic_values[:title]).to be_kind_of(Array)
234
+ expect(@doc1.to_semantic_values[:title]).to be_a(Array)
235
235
  end
236
236
 
237
237
  it "returns complete array for a multi-value field" do
@@ -290,7 +290,7 @@ RSpec.describe "Blacklight::Solr::Document", :api do
290
290
 
291
291
  it "plucks the MoreLikeThis results from the Solr Response" do
292
292
  expect(result).to have(1).item
293
- expect(result.first).to be_a_kind_of(MockDocument)
293
+ expect(result.first).to be_a(MockDocument)
294
294
  expect(result.first.id).to eq 'abc'
295
295
  expect(result.first.solr_response).to eq response
296
296
  end
@@ -24,12 +24,12 @@ RSpec.describe Blacklight::Solr::Repository, :api do
24
24
  blacklight_config.document_solr_path = 'abc'
25
25
  blacklight_config.solr_path = 'xyz'
26
26
  allow(subject.connection).to receive(:send_and_receive).with('abc', anything).and_return(mock_response)
27
- expect(subject.find("123")).to be_a_kind_of Blacklight::Solr::Response
27
+ expect(subject.find("123")).to be_a Blacklight::Solr::Response
28
28
  end
29
29
 
30
30
  it "uses a default :qt param" do
31
31
  allow(subject.connection).to receive(:send_and_receive).with('get', hash_including(params: hash_including(ids: '123'))).and_return(mock_response)
32
- expect(subject.find("123", {})).to be_a_kind_of Blacklight::Solr::Response
32
+ expect(subject.find("123", {})).to be_a Blacklight::Solr::Response
33
33
  end
34
34
 
35
35
  context "without a document solr path configured" do
@@ -40,7 +40,7 @@ RSpec.describe Blacklight::Solr::Repository, :api do
40
40
  it "uses the default solr path" do
41
41
  blacklight_config.solr_path = 'xyz'
42
42
  allow(subject.connection).to receive(:send_and_receive).with('xyz', anything).and_return(mock_response)
43
- expect(subject.find("123")).to be_a_kind_of Blacklight::Solr::Response
43
+ expect(subject.find("123")).to be_a Blacklight::Solr::Response
44
44
  end
45
45
  end
46
46
 
@@ -53,14 +53,14 @@ RSpec.describe Blacklight::Solr::Repository, :api do
53
53
  it "uses the provided :qt param" do
54
54
  blacklight_config.document_solr_request_handler = 'xyz'
55
55
  allow(subject.connection).to receive(:send_and_receive).with('select', hash_including(params: { id: '123', qt: 'abc' })).and_return(mock_response)
56
- expect(subject.find("123", qt: 'abc')).to be_a_kind_of Blacklight::Solr::Response
56
+ expect(subject.find("123", qt: 'abc')).to be_a Blacklight::Solr::Response
57
57
  end
58
58
 
59
59
  it "uses the :qt parameter from the default_document_solr_params" do
60
60
  blacklight_config.default_document_solr_params[:qt] = 'abc'
61
61
  blacklight_config.document_solr_request_handler = 'xyz'
62
62
  allow(subject.connection).to receive(:send_and_receive).with('select', hash_including(params: { id: '123', qt: 'abc' })).and_return(mock_response)
63
- expect(subject.find("123")).to be_a_kind_of Blacklight::Solr::Response
63
+ expect(subject.find("123")).to be_a Blacklight::Solr::Response
64
64
  end
65
65
  end
66
66
 
@@ -68,8 +68,26 @@ RSpec.describe Blacklight::Solr::Repository, :api do
68
68
  doc_params = ActiveSupport::HashWithIndifferentAccess.new
69
69
  allow(subject.connection).to receive(:send_and_receive).with('get', anything).and_return(mock_response)
70
70
  response = subject.find("123", doc_params)
71
- expect(response).to be_a_kind_of Blacklight::Solr::Response
72
- expect(response.params).to be_a_kind_of ActiveSupport::HashWithIndifferentAccess
71
+ expect(response).to be_a Blacklight::Solr::Response
72
+ expect(response.params).to be_a ActiveSupport::HashWithIndifferentAccess
73
+ end
74
+ end
75
+
76
+ describe '#find_many' do
77
+ context 'with a configured fetch_many_documents_path' do
78
+ it 'uses the path' do
79
+ blacklight_config.fetch_many_documents_path = 'documents'
80
+ allow(subject.connection).to receive(:send_and_receive).with('documents', anything).and_return(mock_response)
81
+ expect(subject.find_many({})).to be_a Blacklight::Solr::Response
82
+ end
83
+ end
84
+
85
+ context 'without a configured fetch_many_documents_path' do
86
+ it 'falls back to the search path' do
87
+ blacklight_config.solr_path = 'xyz'
88
+ allow(subject.connection).to receive(:send_and_receive).with('xyz', anything).and_return(mock_response)
89
+ expect(subject.find_many({})).to be_a Blacklight::Solr::Response
90
+ end
73
91
  end
74
92
  end
75
93
 
@@ -77,24 +95,24 @@ RSpec.describe Blacklight::Solr::Repository, :api do
77
95
  it "uses the search-specific solr path" do
78
96
  blacklight_config.solr_path = 'xyz'
79
97
  allow(subject.connection).to receive(:send_and_receive).with('xyz', anything).and_return(mock_response)
80
- expect(subject.search({})).to be_a_kind_of Blacklight::Solr::Response
98
+ expect(subject.search({})).to be_a Blacklight::Solr::Response
81
99
  end
82
100
 
83
101
  it "uses the default solr path" do
84
102
  allow(subject.connection).to receive(:send_and_receive).with('select', anything).and_return(mock_response)
85
- expect(subject.search({})).to be_a_kind_of Blacklight::Solr::Response
103
+ expect(subject.search({})).to be_a Blacklight::Solr::Response
86
104
  end
87
105
 
88
106
  it "uses a default :qt param" do
89
107
  blacklight_config.qt = 'xyz'
90
108
  allow(subject.connection).to receive(:send_and_receive).with('select', hash_including(params: { qt: 'xyz' })).and_return(mock_response)
91
- expect(subject.search({})).to be_a_kind_of Blacklight::Solr::Response
109
+ expect(subject.search({})).to be_a Blacklight::Solr::Response
92
110
  end
93
111
 
94
112
  it "uses the provided :qt param" do
95
113
  blacklight_config.qt = 'xyz'
96
114
  allow(subject.connection).to receive(:send_and_receive).with('select', hash_including(params: { qt: 'abc' })).and_return(mock_response)
97
- expect(subject.search(qt: 'abc')).to be_a_kind_of Blacklight::Solr::Response
115
+ expect(subject.search(qt: 'abc')).to be_a Blacklight::Solr::Response
98
116
  end
99
117
 
100
118
  it "preserves the class of the incoming params" do
@@ -103,8 +121,8 @@ RSpec.describe Blacklight::Solr::Repository, :api do
103
121
  allow(subject.connection).to receive(:send_and_receive).with('select', anything).and_return(mock_response)
104
122
 
105
123
  response = subject.search(search_params)
106
- expect(response).to be_a_kind_of Blacklight::Solr::Response
107
- expect(response.params).to be_a_kind_of ActiveSupport::HashWithIndifferentAccess
124
+ expect(response).to be_a Blacklight::Solr::Response
125
+ expect(response.params).to be_a ActiveSupport::HashWithIndifferentAccess
108
126
  end
109
127
 
110
128
  it "calls send_and_receive with params returned from request factory method" do
@@ -247,7 +247,7 @@ RSpec.describe Blacklight::Solr::Response::Facets, :api do
247
247
  it "converts the query facets into a double RSolr FacetField" do
248
248
  field = subject.aggregations['my_query_facet_field']
249
249
 
250
- expect(field).to be_a_kind_of Blacklight::Solr::Response::Facets::FacetField
250
+ expect(field).to be_a Blacklight::Solr::Response::Facets::FacetField
251
251
 
252
252
  expect(field.name).to eq 'my_query_facet_field'
253
253
  expect(field.items.size).to eq 3
@@ -316,7 +316,7 @@ RSpec.describe Blacklight::Solr::Response::Facets, :api do
316
316
  it "converts the pivot facet into a double RSolr FacetField" do
317
317
  field = subject.aggregations['my_pivot_facet_field']
318
318
 
319
- expect(field).to be_a_kind_of Blacklight::Solr::Response::Facets::FacetField
319
+ expect(field).to be_a Blacklight::Solr::Response::Facets::FacetField
320
320
 
321
321
  expect(field.name).to eq 'my_pivot_facet_field'
322
322
 
@@ -37,7 +37,7 @@ RSpec.describe Blacklight::Solr::Response::Group, :api do
37
37
  describe "#docs" do
38
38
  it "is a list of SolrDocuments" do
39
39
  subject.docs.each do |doc|
40
- expect(doc).to be_a_kind_of SolrDocument
40
+ expect(doc).to be_a SolrDocument
41
41
  end
42
42
 
43
43
  expect(subject.docs.first.id).to eq 1
@@ -79,7 +79,7 @@ RSpec.describe Blacklight::Solr::Response, :api do
79
79
  if Kaminari.config.respond_to? :max_pages
80
80
  expect(r.max_pages).to be_nil
81
81
  end
82
- expect(r).to be_a_kind_of Kaminari::PageScopeMethods
82
+ expect(r).to be_a Kaminari::PageScopeMethods
83
83
  end
84
84
 
85
85
  describe "FacetItem" do
@@ -101,7 +101,7 @@ RSpec.describe Blacklight::Solr::Response, :api do
101
101
 
102
102
  expect(item.hits).to eq 15
103
103
  expect(item.value).to eq 'value'
104
- expect(item).to be_a_kind_of(OpenStruct)
104
+ expect(item).to be_a(OpenStruct)
105
105
  end
106
106
 
107
107
  it "provides a label accessor" do
@@ -591,7 +591,7 @@ RSpec.describe Blacklight::Solr::SearchBuilderBehavior, :api do
591
591
 
592
592
  subject.add_facet_fq_to_solr(solr_parameters)
593
593
 
594
- expect(solr_parameters[:fq]).to be_a_kind_of Array
594
+ expect(solr_parameters[:fq]).to be_a Array
595
595
  end
596
596
 
597
597
  context "facet not defined in config" do
@@ -30,7 +30,7 @@ RSpec.describe Bookmark do
30
30
 
31
31
  describe "#document" do
32
32
  it "is a SolrDocument with just an id field" do
33
- expect(subject.document).to be_a_kind_of SolrDocument
33
+ expect(subject.document).to be_a SolrDocument
34
34
  expect(subject.document.id).to eq 'u001'
35
35
  end
36
36
  end
@@ -50,14 +50,14 @@ RSpec.describe Blacklight::DocumentPresenter do
50
50
 
51
51
  describe '#thumbnail' do
52
52
  it 'returns a thumbnail presenter' do
53
- expect(presenter.thumbnail).to be_a_kind_of(Blacklight::ThumbnailPresenter)
53
+ expect(presenter.thumbnail).to be_a(Blacklight::ThumbnailPresenter)
54
54
  end
55
55
 
56
56
  it 'use the configured thumbnail presenter' do
57
57
  custom_presenter_class = Class.new(Blacklight::ThumbnailPresenter)
58
58
  blacklight_config.index.thumbnail_presenter = custom_presenter_class
59
59
 
60
- expect(presenter.thumbnail).to be_a_kind_of custom_presenter_class
60
+ expect(presenter.thumbnail).to be_a custom_presenter_class
61
61
  end
62
62
  end
63
63
 
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Blacklight::FacetCheckboxItemPresenter, type: :presenter do
6
+ subject(:presenter) do
7
+ described_class.new(facet_item, facet_config, view_context, facet_field, search_state)
8
+ end
9
+
10
+ let(:facet_item) { Blacklight::Solr::Response::Facets::FacetItem.new(value: 'Book', hits: 30) }
11
+ let(:facet_config) { Blacklight::Configuration::FacetField.new(key: 'format') }
12
+ let(:view_context) { controller.view_context }
13
+ let(:filter_field) { Blacklight::SearchState::FilterField.new(facet_config, search_state) }
14
+ let(:facet_field) { Blacklight::Solr::Response::Facets::FacetField.new('format', [facet_item]) }
15
+ let(:params) { ActionController::Parameters.new(f_inclusive: { format: ["Book"] }) }
16
+ let(:blacklight_config) { Blacklight::Configuration.new }
17
+ let(:search_state) { Blacklight::SearchState.new(params, blacklight_config) }
18
+
19
+ before do
20
+ blacklight_config.add_facet_field 'format'
21
+ end
22
+
23
+ describe '#selected?' do
24
+ subject { presenter.selected? }
25
+
26
+ context 'with a matching inclusive filter' do
27
+ it { is_expected.to be true }
28
+ end
29
+
30
+ context 'with an inclusive filter that does not match' do
31
+ let(:params) { ActionController::Parameters.new(f_inclusive: { format: ["Manuscript"] }) }
32
+
33
+ it { is_expected.to be false }
34
+ end
35
+
36
+ context 'with a matching exclusive filter' do
37
+ let(:params) { ActionController::Parameters.new(f: { format: ["Book"] }) }
38
+
39
+ it { is_expected.to be false }
40
+ end
41
+ end
42
+ end
@@ -51,6 +51,20 @@ RSpec.describe Blacklight::FacetFieldPresenter, type: :presenter do
51
51
  it "is false if no value for facet is selected" do
52
52
  expect(presenter.active?).to be false
53
53
  end
54
+
55
+ context 'with an advanced search action' do
56
+ before { controller.params[:action] = 'advanced_search' }
57
+
58
+ it "is true if any value for inclusive facet is selected" do
59
+ search_state.params[:f_inclusive] = ActiveSupport::HashWithIndifferentAccess.new(key: [1])
60
+ expect(presenter.active?).to be true
61
+ end
62
+
63
+ it "is false if no value for inclusive facet is selected" do
64
+ search_state.params[:f] = ActiveSupport::HashWithIndifferentAccess.new(key: [1])
65
+ expect(presenter.active?).to be false
66
+ end
67
+ end
54
68
  end
55
69
 
56
70
  describe '#in_modal?' do
@@ -6,11 +6,11 @@ RSpec.describe 'GET /catalog/suggest' do
6
6
  it 'returns suggestions' do
7
7
  get '/catalog/suggest?q=new'
8
8
  expect(response.body).to eq <<-RESULT
9
- <li role="option"><span>new jersey</span></li>
10
- <li role="option"><span>new jersey bridgeton biography</span></li>
11
- <li role="option"><span>new jersey bridgeton history</span></li>
12
- <li role="option"><span>new york</span></li>
13
- <li role="option"><span>nuwākshūṭ</span></li>
9
+ <li role="option" class="dropdown-item"><span>new jersey</span></li>
10
+ <li role="option" class="dropdown-item"><span>new jersey bridgeton biography</span></li>
11
+ <li role="option" class="dropdown-item"><span>new jersey bridgeton history</span></li>
12
+ <li role="option" class="dropdown-item"><span>new york</span></li>
13
+ <li role="option" class="dropdown-item"><span>nuwākshūṭ</span></li>
14
14
  RESULT
15
15
  end
16
16
  end
@@ -77,7 +77,7 @@ RSpec.describe Blacklight::SearchService, :api do
77
77
  end
78
78
 
79
79
  it "returns a grouped response" do
80
- expect(service.search_results).to be_a_kind_of Blacklight::Solr::Response::GroupResponse
80
+ expect(service.search_results).to be_a Blacklight::Solr::Response::GroupResponse
81
81
  end
82
82
  end
83
83
 
@@ -93,7 +93,7 @@ RSpec.describe Blacklight::SearchService, :api do
93
93
 
94
94
  it "returns a grouped response" do
95
95
  solr_response = service.search_results
96
- expect(solr_response).to be_a_kind_of Blacklight::Solr::Response::GroupResponse
96
+ expect(solr_response).to be_a Blacklight::Solr::Response::GroupResponse
97
97
  expect(solr_response.group_field).to eq "title_si"
98
98
  end
99
99
  end
data/spec/spec_helper.rb CHANGED
@@ -49,8 +49,11 @@ RSpec.configure do |config|
49
49
  # When we're testing the API, only run the api tests
50
50
  config.filter_run api: true if ENV['BLACKLIGHT_API_TEST'].present?
51
51
 
52
- # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
53
- config.fixture_path = Rails.root.join("spec/fixtures")
52
+ if Rails.version.to_f >= 7.1
53
+ config.fixture_paths = [Rails.root.join("spec/fixtures")]
54
+ else
55
+ config.fixture_path = Rails.root.join("spec/fixtures")
56
+ end
54
57
 
55
58
  # If you're not using ActiveRecord, or you'd prefer not to run each of your
56
59
  # examples within a transaction, remove the following line or assign false
@@ -39,7 +39,7 @@ class TestAppGenerator < Rails::Generators::Base
39
39
  src_template = File.join(Blacklight::Engine.root, 'app', 'components', 'blacklight', 'top_navbar_component.html.erb')
40
40
  target_template = File.join('app', 'components', 'blacklight', 'top_navbar_component.html.erb')
41
41
  create_file(target_template) do
42
- File.read(src_template).gsub('role="navigation"', 'role="navigation" data-template-override="top_navbar_component"')
42
+ File.read(src_template).gsub('aria-label', 'data-template-override="top_navbar_component" aria-label')
43
43
  end
44
44
  end
45
45
  end
@@ -21,18 +21,18 @@ def system_with_error_handling(*args)
21
21
  end
22
22
 
23
23
  def with_solr(&block)
24
- # We're being invoked by the app entrypoint script and solr is already up via docker-compose
24
+ # We're being invoked by the app entrypoint script and solr is already up via docker compose
25
25
  if ENV['SOLR_ENV'] == 'docker-compose'
26
26
  yield
27
- elsif system('docker-compose -v')
28
- # We're not running docker-compose up but still want to use a docker instance of solr.
27
+ elsif system('docker compose version')
28
+ # We're not running `docker compose up' but still want to use a docker instance of solr.
29
29
  begin
30
30
  puts "Starting Solr"
31
- system_with_error_handling "docker-compose up -d solr"
31
+ system_with_error_handling "docker compose up -d solr"
32
32
  yield
33
33
  ensure
34
34
  puts "Stopping Solr"
35
- system_with_error_handling "docker-compose stop solr"
35
+ system_with_error_handling "docker compose stop solr"
36
36
  end
37
37
  else
38
38
  SolrWrapper.wrap do |solr|
@@ -47,7 +47,7 @@ task ci: ['build:npm'] do
47
47
  with_solr do
48
48
  Rake::Task['blacklight:internal:seed'].invoke
49
49
  within_test_app do
50
- # Precompiles the javascript
50
+ # Precompiles the assets
51
51
  system "bin/rake spec:prepare"
52
52
  end
53
53
  Rake::Task['blacklight:coverage'].invoke