blacklight 9.0.0.beta1 → 9.0.0.beta2

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 (203) hide show
  1. checksums.yaml +4 -4
  2. data/.github/matrix.json +47 -0
  3. data/.github/workflows/build.yml +16 -0
  4. data/.github/workflows/lint.yml +25 -0
  5. data/.github/workflows/main.yml +22 -0
  6. data/.github/workflows/release_7_x_scheduled.yml +39 -0
  7. data/.github/workflows/release_8_x_scheduled.yml +39 -0
  8. data/.github/workflows/test.yml +53 -0
  9. data/.rubocop.yml +70 -2
  10. data/.rubocop_todo.yml +43 -67
  11. data/.solr_wrapper.yml +2 -0
  12. data/VERSION +1 -1
  13. data/app/assets/builds/blacklight.css +19 -15
  14. data/app/assets/javascripts/blacklight/blacklight.esm.js +31 -69
  15. data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -1
  16. data/app/assets/javascripts/blacklight/blacklight.js +31 -69
  17. data/app/assets/javascripts/blacklight/blacklight.js.map +1 -1
  18. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +4 -0
  19. data/app/assets/stylesheets/blacklight/_facets.scss +2 -2
  20. data/app/assets/stylesheets/blacklight/_header.scss +4 -0
  21. data/app/assets/stylesheets/blacklight/_modal.scss +9 -8
  22. data/app/assets/stylesheets/blacklight/_pagination.scss +1 -3
  23. data/app/assets/stylesheets/blacklight/_search_history.scss +0 -4
  24. data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +3 -0
  25. data/app/components/blacklight/advanced_search_form_component.rb +2 -2
  26. data/app/components/blacklight/constraints_component.rb +2 -2
  27. data/app/components/blacklight/document/action_component.rb +1 -3
  28. data/app/components/blacklight/document/bookmark_component.rb +2 -2
  29. data/app/components/blacklight/document/more_like_this_component.rb +2 -2
  30. data/app/components/blacklight/document/page_header_component.rb +2 -2
  31. data/app/components/blacklight/document/thumbnail_component.html.erb +3 -7
  32. data/app/components/blacklight/document/thumbnail_component.rb +7 -6
  33. data/app/components/blacklight/document_component.rb +3 -3
  34. data/app/components/blacklight/document_title_component.rb +3 -10
  35. data/app/components/blacklight/facet_field_checkboxes_component.rb +2 -20
  36. data/app/components/blacklight/facet_field_component.rb +2 -17
  37. data/app/components/blacklight/facet_field_filter_component.rb +2 -21
  38. data/app/components/blacklight/facet_field_inclusive_constraint_component.rb +4 -25
  39. data/app/components/blacklight/facet_field_list_component.rb +2 -32
  40. data/app/components/blacklight/facet_field_no_layout_component.rb +2 -10
  41. data/app/components/blacklight/facet_field_pagination_component.html.erb +2 -2
  42. data/app/components/blacklight/facet_item_component.rb +2 -74
  43. data/app/components/blacklight/facet_item_pivot_component.rb +1 -1
  44. data/app/components/blacklight/facets/checkboxes_component.rb +26 -0
  45. data/app/components/blacklight/facets/count_component.rb +23 -0
  46. data/app/components/blacklight/{facet_field_component.html.erb → facets/field_component.html.erb} +1 -1
  47. data/app/components/blacklight/facets/field_component.rb +23 -0
  48. data/app/components/blacklight/facets/filters_component.html.erb +4 -0
  49. data/app/components/blacklight/facets/filters_component.rb +27 -0
  50. data/app/components/blacklight/{facet_field_inclusive_constraint_component.html.erb → facets/inclusive_constraint_component.html.erb} +1 -1
  51. data/app/components/blacklight/facets/inclusive_constraint_component.rb +31 -0
  52. data/app/components/blacklight/{facet_field_filter_component.html.erb → facets/index_navigation_component.html.erb} +1 -1
  53. data/app/components/blacklight/facets/index_navigation_component.rb +32 -0
  54. data/app/components/blacklight/facets/item_component.rb +73 -0
  55. data/app/components/blacklight/facets/list_component.html.erb +11 -0
  56. data/app/components/blacklight/facets/list_component.rb +38 -0
  57. data/app/components/blacklight/facets/no_layout_component.rb +16 -0
  58. data/app/components/blacklight/facets/selected_value_component.rb +29 -0
  59. data/app/components/blacklight/facets/suggest_component.html.erb +12 -0
  60. data/app/components/blacklight/facets/suggest_component.rb +22 -0
  61. data/app/components/blacklight/metadata_field_plain_text_layout_component.rb +2 -2
  62. data/app/components/blacklight/response/facet_group_component.html.erb +1 -1
  63. data/app/components/blacklight/response/facet_group_component.rb +5 -1
  64. data/app/components/blacklight/system/dropdown_component.html.erb +1 -1
  65. data/app/components/blacklight/system/dropdown_component.rb +1 -1
  66. data/app/components/blacklight/top_navbar_component.html.erb +1 -1
  67. data/app/controllers/concerns/blacklight/bookmarks.rb +3 -3
  68. data/app/controllers/concerns/blacklight/catalog.rb +10 -25
  69. data/app/controllers/concerns/blacklight/controller.rb +1 -1
  70. data/app/controllers/concerns/blacklight/facetable.rb +34 -0
  71. data/app/controllers/concerns/blacklight/search_context.rb +1 -1
  72. data/app/controllers/concerns/blacklight/searchable.rb +1 -1
  73. data/app/helpers/blacklight/configuration_helper_behavior.rb +2 -2
  74. data/app/helpers/blacklight/document_helper_behavior.rb +3 -1
  75. data/app/helpers/blacklight/facets_helper_behavior.rb +9 -0
  76. data/app/helpers/blacklight/icon_helper_behavior.rb +2 -2
  77. data/app/javascript/blacklight-frontend/checkbox_submit.js +3 -0
  78. data/app/javascript/blacklight-frontend/debounce.js +1 -1
  79. data/app/javascript/blacklight-frontend/facet_suggest.js +23 -3
  80. data/app/javascript/blacklight-frontend/index.js +0 -2
  81. data/app/javascript/blacklight-frontend/modal.js +1 -4
  82. data/app/javascript/blacklight-frontend/search_context.js +3 -2
  83. data/app/models/facet_search_builder.rb +5 -0
  84. data/app/presenters/blacklight/facet_field_presenter.rb +1 -1
  85. data/app/presenters/blacklight/json_presenter.rb +1 -3
  86. data/app/presenters/blacklight/rendering/helper_method.rb +4 -4
  87. data/app/presenters/blacklight/rendering/join.rb +2 -2
  88. data/app/services/blacklight/facet_search_service.rb +44 -0
  89. data/app/services/blacklight/field_retriever.rb +1 -1
  90. data/app/services/blacklight/search_service.rb +6 -6
  91. data/app/values/blacklight/types.rb +2 -2
  92. data/app/views/catalog/_facet_pivot.html.erb +1 -1
  93. data/app/views/catalog/_home_text.html.erb +2 -2
  94. data/app/views/catalog/_sort_and_per_page.html.erb +1 -1
  95. data/app/views/catalog/facet.html.erb +8 -10
  96. data/config/locales/blacklight.ar.yml +2 -2
  97. data/config/locales/blacklight.es.yml +2 -2
  98. data/config/locales/blacklight.fr.yml +2 -2
  99. data/config/locales/blacklight.hu.yml +2 -2
  100. data/config/locales/blacklight.it.yml +2 -2
  101. data/config/locales/blacklight.nl.yml +1 -1
  102. data/config/locales/blacklight.pt-BR.yml +2 -2
  103. data/config/locales/blacklight.sq.yml +2 -2
  104. data/config/locales/blacklight.zh.yml +2 -2
  105. data/lib/blacklight/abstract_repository.rb +2 -2
  106. data/lib/blacklight/abstract_search_builder.rb +154 -0
  107. data/lib/blacklight/configuration/context.rb +3 -3
  108. data/lib/blacklight/configuration/facet_field.rb +6 -6
  109. data/lib/blacklight/configuration/field.rb +4 -4
  110. data/lib/blacklight/configuration/fields.rb +0 -1
  111. data/lib/blacklight/configuration/search_field.rb +1 -1
  112. data/lib/blacklight/configuration/view_config.rb +2 -2
  113. data/lib/blacklight/configuration.rb +6 -7
  114. data/lib/blacklight/facet_search_builder.rb +18 -0
  115. data/lib/blacklight/nested_open_struct_with_hash_access.rb +1 -1
  116. data/lib/blacklight/open_struct_with_hash_access.rb +2 -2
  117. data/lib/blacklight/search_builder.rb +1 -159
  118. data/lib/blacklight/search_state/filter_field.rb +4 -4
  119. data/lib/blacklight/search_state/pivot_filter_field.rb +4 -4
  120. data/lib/blacklight/solr/abstract_filter_query_builder.rb +77 -0
  121. data/lib/blacklight/solr/default_filter_query_builder.rb +20 -0
  122. data/lib/blacklight/solr/facet_search_builder_behavior.rb +62 -0
  123. data/lib/blacklight/solr/repository.rb +8 -9
  124. data/lib/blacklight/solr/response/facets.rb +2 -2
  125. data/lib/blacklight/solr/response/params.rb +0 -4
  126. data/lib/blacklight/solr/response.rb +5 -1
  127. data/lib/blacklight/solr/search_builder_behavior.rb +17 -132
  128. data/lib/blacklight.rb +1 -1
  129. data/lib/generators/blacklight/assets/importmap_generator.rb +3 -5
  130. data/lib/generators/blacklight/assets_generator.rb +1 -1
  131. data/lib/generators/blacklight/search_builder_generator.rb +1 -1
  132. data/lib/generators/blacklight/templates/.solr_wrapper.yml +2 -0
  133. data/lib/generators/blacklight/templates/catalog_controller.rb +3 -1
  134. data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +0 -4
  135. data/package.json +3 -3
  136. data/spec/components/blacklight/advanced_search_form_component_spec.rb +18 -22
  137. data/spec/components/blacklight/constraint_layout_component_spec.rb +8 -8
  138. data/spec/components/blacklight/constraints_component_spec.rb +11 -11
  139. data/spec/components/blacklight/document/action_component_spec.rb +23 -15
  140. data/spec/components/blacklight/document/group_component_spec.rb +10 -15
  141. data/spec/components/blacklight/document/page_header_component_spec.rb +35 -28
  142. data/spec/components/blacklight/document/sidebar_component_spec.rb +5 -11
  143. data/spec/components/blacklight/document_component_spec.rb +98 -65
  144. data/spec/components/blacklight/facet_component_spec.rb +12 -8
  145. data/spec/components/blacklight/facet_item_pivot_component_spec.rb +12 -12
  146. data/spec/components/blacklight/{facet_field_checkboxes_component_spec.rb → facets/checkboxes_component_spec.rb} +13 -13
  147. data/spec/components/blacklight/facets/filters_component_spec.rb +36 -0
  148. data/spec/components/blacklight/facets/index_navigation_component_spec.rb +40 -0
  149. data/spec/components/blacklight/{facet_item_component_spec.rb → facets/item_component_spec.rb} +10 -10
  150. data/spec/components/blacklight/{facet_field_list_component_spec.rb → facets/list_component_spec.rb} +23 -23
  151. data/spec/components/blacklight/facets/suggest_component_spec.rb +68 -0
  152. data/spec/components/blacklight/header_component_spec.rb +2 -4
  153. data/spec/components/blacklight/hidden_search_state_component_spec.rb +7 -7
  154. data/spec/components/blacklight/metadata_field_component_spec.rb +17 -15
  155. data/spec/components/blacklight/response/facet_group_component_spec.rb +37 -0
  156. data/spec/components/blacklight/response/pagination_component_spec.rb +1 -1
  157. data/spec/components/blacklight/response/spellcheck_component_spec.rb +1 -1
  158. data/spec/components/blacklight/search_bar_component_spec.rb +4 -4
  159. data/spec/components/blacklight/search_context/server_applied_params_component_spec.rb +2 -2
  160. data/spec/components/blacklight/search_context/server_item_pagination_component_spec.rb +3 -5
  161. data/spec/components/blacklight/skip_link_component_spec.rb +8 -11
  162. data/spec/components/blacklight/start_over_button_component_spec.rb +4 -4
  163. data/spec/components/blacklight/system/dropdown_component_spec.rb +26 -0
  164. data/spec/components/blacklight/system/flash_message_component_spec.rb +7 -11
  165. data/spec/controllers/catalog_controller_spec.rb +12 -20
  166. data/spec/features/facets_spec.rb +70 -7
  167. data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +10 -0
  168. data/spec/lib/blacklight/configuration/facet_field_spec.rb +2 -2
  169. data/spec/lib/blacklight/parameters_spec.rb +12 -1
  170. data/spec/lib/blacklight/search_state/filter_field_spec.rb +18 -0
  171. data/spec/models/blacklight/configuration_spec.rb +32 -28
  172. data/spec/models/blacklight/facet_search_builder_spec.rb +19 -0
  173. data/spec/models/blacklight/search_builder_spec.rb +1 -11
  174. data/spec/models/blacklight/solr/default_filter_query_builder_spec.rb +72 -0
  175. data/spec/models/blacklight/solr/document_spec.rb +0 -4
  176. data/spec/models/blacklight/solr/facet_search_builder_behavior_spec.rb +929 -0
  177. data/spec/models/blacklight/solr/repository_spec.rb +31 -29
  178. data/spec/models/blacklight/solr/response/facets_spec.rb +86 -40
  179. data/spec/models/blacklight/solr/response/group_response_spec.rb +8 -5
  180. data/spec/models/blacklight/solr/response/group_spec.rb +9 -5
  181. data/spec/models/blacklight/solr/response_spec.rb +96 -64
  182. data/spec/models/blacklight/solr/search_builder_behavior_spec.rb +2 -227
  183. data/spec/models/solr_document_spec.rb +5 -1
  184. data/spec/services/blacklight/search_service_spec.rb +6 -27
  185. data/spec/spec_helper.rb +0 -1
  186. data/spec/support/view_component_test_helpers.rb +0 -18
  187. data/spec/views/catalog/facet.html.erb_spec.rb +10 -3
  188. data/spec/views/catalog/index.atom.builder_spec.rb +6 -3
  189. data/spec/views/catalog/index.html.erb_spec.rb +3 -1
  190. metadata +58 -29
  191. data/.github/workflows/ruby.yml +0 -98
  192. data/app/components/blacklight/facet_field_list_component.html.erb +0 -19
  193. data/app/components/blacklight/search/facet_suggest_input.html.erb +0 -9
  194. data/app/components/blacklight/search/facet_suggest_input.rb +0 -16
  195. data/app/javascript/blacklight-frontend/modalForm.js +0 -60
  196. data/app/views/catalog/_facet_index_navigation.html.erb +0 -1
  197. data/app/views/catalog/_facet_layout.html.erb +0 -8
  198. data/app/views/catalog/_facet_pagination.html.erb +0 -1
  199. data/spec/components/blacklight/document_metadata_component_spec.rb +0 -0
  200. data/spec/components/blacklight/search/facet_suggest_input_spec.rb +0 -33
  201. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +0 -43
  202. data/spec/views/catalog/_facet_layout.html.erb_spec.rb +0 -41
  203. /data/app/components/blacklight/{facet_field_checkboxes_component.html.erb → facets/checkboxes_component.html.erb} +0 -0
@@ -43,7 +43,7 @@ RSpec.describe Blacklight::Solr::SearchBuilderBehavior, :api do
43
43
  end
44
44
 
45
45
  context "with a complex parameter environment" do
46
- subject { search_builder.with(user_params).processed_parameters }
46
+ subject { search_builder.with(user_params).send(:processed_parameters) }
47
47
 
48
48
  let(:user_params) do
49
49
  { :search_field => "test_field", :q => "test query", "facet.field" => "extra_facet" }
@@ -90,7 +90,7 @@ RSpec.describe Blacklight::Solr::SearchBuilderBehavior, :api do
90
90
  # SPECS for actual search parameter generation
91
91
  describe "#processed_parameters" do
92
92
  subject do
93
- search_builder.with(user_params).processed_parameters
93
+ search_builder.with(user_params).send(:processed_parameters)
94
94
  end
95
95
 
96
96
  context "when search_params_logic is customized" do
@@ -523,71 +523,6 @@ RSpec.describe Blacklight::Solr::SearchBuilderBehavior, :api do
523
523
  end
524
524
  end
525
525
 
526
- describe "#facet_value_to_fq_string" do
527
- it "uses the configured field name" do
528
- blacklight_config.add_facet_field :facet_key, field: "facet_name"
529
- expect(subject.send(:facet_value_to_fq_string, "facet_key", "my value")).to eq "{!term f=facet_name}my value"
530
- end
531
-
532
- it "uses the raw handler for strings" do
533
- expect(subject.send(:facet_value_to_fq_string, "facet_name", "my value")).to eq "{!term f=facet_name}my value"
534
- end
535
-
536
- it "passes booleans through" do
537
- expect(subject.send(:facet_value_to_fq_string, "facet_name", true)).to eq '{!term f=facet_name}true'
538
- end
539
-
540
- it "passes boolean-like strings through" do
541
- expect(subject.send(:facet_value_to_fq_string, "facet_name", "true")).to eq '{!term f=facet_name}true'
542
- end
543
-
544
- it "passes integers through" do
545
- expect(subject.send(:facet_value_to_fq_string, "facet_name", 1)).to eq '{!term f=facet_name}1'
546
- end
547
-
548
- it "passes integer-like strings through" do
549
- expect(subject.send(:facet_value_to_fq_string, "facet_name", "1")).to eq '{!term f=facet_name}1'
550
- expect(subject.send(:facet_value_to_fq_string, "facet_name", -1)).to eq '{!term f=facet_name}-1'
551
- end
552
-
553
- it "passes floats through" do
554
- expect(subject.send(:facet_value_to_fq_string, "facet_name", 1.11)).to eq '{!term f=facet_name}1.11'
555
- end
556
-
557
- it "passes floats in strings through" do
558
- expect(subject.send(:facet_value_to_fq_string, "facet_name", "1.11")).to eq '{!term f=facet_name}1.11'
559
- end
560
-
561
- context 'date handling' do
562
- before { allow(blacklight_config.facet_fields).to receive(:[]).with('facet_name').and_return(double(date: true, query: nil, tag: nil, field: 'facet_name')) }
563
-
564
- it "passes date-type fields through" do
565
- expect(subject.send(:facet_value_to_fq_string, "facet_name", "2012-01-01")).to eq '{!term f=facet_name}2012-01-01'
566
- expect(subject.send(:facet_value_to_fq_string, "facet_name", "2003-04-09T00:00:00Z")).to eq '{!term f=facet_name}2003-04-09T00:00:00Z'
567
- end
568
-
569
- it "formats Date objects correctly" do
570
- allow(blacklight_config.facet_fields).to receive(:[]).with('facet_name').and_return(double(date: nil, query: nil, tag: nil, field: 'facet_name'))
571
- d = DateTime.parse("2003-04-09T00:00:00")
572
- expect(subject.send(:facet_value_to_fq_string, "facet_name", d)).to eq '{!term f=facet_name}2003-04-09T00:00:00Z'
573
- end
574
- end
575
-
576
- it "handles range requests" do
577
- expect(subject.send(:facet_value_to_fq_string, "facet_name", 1..5)).to eq "facet_name:[1 TO 5]"
578
- expect(subject.send(:facet_value_to_fq_string, "facet_name", 1..nil)).to eq "facet_name:[1 TO *]"
579
- expect(subject.send(:facet_value_to_fq_string, "facet_name", nil..5)).to eq "facet_name:[* TO 5]"
580
- expect(subject.send(:facet_value_to_fq_string, "facet_name", nil..nil)).to eq "facet_name:[* TO *]"
581
- end
582
-
583
- it "adds tag local parameters" do
584
- allow(blacklight_config.facet_fields).to receive(:[]).with('facet_name').and_return(double(query: nil, tag: 'asdf', date: nil, field: 'facet_name'))
585
-
586
- expect(subject.send(:facet_value_to_fq_string, "facet_name", true)).to eq "{!term f=facet_name tag=asdf}true"
587
- expect(subject.send(:facet_value_to_fq_string, "facet_name", "my value")).to eq "{!term f=facet_name tag=asdf}my value"
588
- end
589
- end
590
-
591
526
  describe "#add_facet_fq_to_solr" do
592
527
  it "converts a String fq into an Array" do
593
528
  solr_parameters = { fq: 'a string' }
@@ -731,166 +666,6 @@ RSpec.describe Blacklight::Solr::SearchBuilderBehavior, :api do
731
666
  end
732
667
  end
733
668
 
734
- describe "#add_facet_paging_to_solr" do
735
- let(:facet_field) { 'format' }
736
- let(:sort_key) { Blacklight::Solr::FacetPaginator.request_keys[:sort] }
737
- let(:page_key) { Blacklight::Solr::FacetPaginator.request_keys[:page] }
738
- let(:prefix_key) { Blacklight::Solr::FacetPaginator.request_keys[:prefix] }
739
-
740
- let(:blacklight_config) do
741
- Blacklight::Configuration.new do |config|
742
- config.add_facet_fields_to_solr_request!
743
- config.add_facet_field 'format'
744
- config.add_facet_field 'format_ordered', sort: :count
745
- config.add_facet_field 'format_limited', limit: 5
746
- config.add_facet_field 'format_more_limited', limit: 5, more_limit: 50
747
- end
748
- end
749
-
750
- let(:solr_parameters) do
751
- solr_parameters = Blacklight::Solr::Request.new
752
- subject.facet(facet_field).add_facet_paging_to_solr(solr_parameters)
753
- solr_parameters
754
- end
755
-
756
- it 'sets rows to 0' do
757
- expect(solr_parameters[:rows]).to eq 0
758
- end
759
-
760
- it 'sets facets requested to facet_field argument' do
761
- expect(solr_parameters[:'facet.field']).to eq facet_field
762
- end
763
-
764
- it 'defaults offset to 0' do
765
- expect(solr_parameters[:"f.#{facet_field}.facet.offset"]).to eq 0
766
- end
767
-
768
- context 'when offset is manually set' do
769
- let(:user_params) { { page_key => 2 } }
770
-
771
- it 'uses offset manually set, and converts it to an integer' do
772
- expect(solr_parameters[:"f.#{facet_field}.facet.offset"]).to eq 20
773
- end
774
- end
775
-
776
- context 'for a field with a configured more_limit' do
777
- let(:facet_field) { 'format_more_limited' }
778
-
779
- it 'uses the more_limit configuration' do
780
- expect(solr_parameters[:"f.#{facet_field}.facet.limit"]).to eq 51
781
- end
782
- end
783
-
784
- context 'for a field with a param key different from the field name' do
785
- let(:user_params) { { page_key => 2, 'facet.sort': 'index', 'facet.prefix': 'x' } }
786
- let(:facet_field) { 'param_key' }
787
-
788
- let(:blacklight_config) do
789
- Blacklight::Configuration.new.tap do |config|
790
- config.add_facet_field key: 'param_key', field: 'solr_field', more_limit: 50, ex: 'other'
791
-
792
- config.add_facet_fields_to_solr_request!
793
- end
794
- end
795
-
796
- it "uses the configured solr field name in queries" do
797
- expect(solr_parameters).to include 'f.solr_field.facet.limit': 51,
798
- 'f.solr_field.facet.offset': 50,
799
- 'f.solr_field.facet.sort': 'index',
800
- 'f.solr_field.facet.prefix': 'x',
801
- 'facet.field': '{!ex=other}solr_field'
802
- end
803
- end
804
-
805
- it 'defaults limit to 20' do
806
- expect(solr_parameters[:"f.#{facet_field}.facet.limit"]).to eq 21
807
- end
808
-
809
- it 'uses the default sort' do
810
- expect(solr_parameters[:"f.#{facet_field}.facet.sort"]).to be_blank
811
- end
812
-
813
- context 'when sort is provided' do
814
- let(:user_params) { { sort_key => 'index' } }
815
-
816
- it 'uses sort provided in the parameters' do
817
- expect(solr_parameters[:"f.#{facet_field}.facet.sort"]).to eq 'index'
818
- end
819
- end
820
-
821
- context 'when a prefix is provided' do
822
- let(:user_params) { { prefix_key => 'A' } }
823
-
824
- it 'includes the prefix in the query' do
825
- expect(solr_parameters[:"f.#{facet_field}.facet.prefix"]).to eq 'A'
826
- end
827
- end
828
- end
829
-
830
- describe "#add_facet_suggestion_parameters" do
831
- it "does not add anything when the builder has no facet_suggestion_query and no facet" do
832
- expect(subject.facet).to be_nil
833
- expect(subject.facet_suggestion_query).to be_nil
834
- solr_params = Blacklight::Solr::Request.new
835
-
836
- expect do
837
- subject.add_facet_suggestion_parameters(solr_params)
838
- end.not_to(change { solr_params })
839
- end
840
-
841
- it "does not add anything when the builder has a facet_suggestion_query but no facet" do
842
- subject.facet_suggestion_query = 'artic'
843
- expect(subject.facet_suggestion_query).to eq 'artic'
844
- expect(subject.facet).to be_nil
845
- solr_params = Blacklight::Solr::Request.new
846
-
847
- expect do
848
- subject.add_facet_suggestion_parameters(solr_params)
849
- end.not_to(change { solr_params })
850
- end
851
-
852
- it "does not add anything when the builder has a facet but no facet_suggestion_query" do
853
- subject.facet = 'subject_facet'
854
- expect(subject.facet_suggestion_query).to be_nil
855
- expect(subject.facet).to eq 'subject_facet'
856
- solr_params = Blacklight::Solr::Request.new
857
-
858
- expect do
859
- subject.add_facet_suggestion_parameters(solr_params)
860
- end.not_to(change { solr_params })
861
- end
862
-
863
- it "adds the facet_suggestion_query to facet.contains" do
864
- subject.facet = 'subject_facet'
865
- subject.facet_suggestion_query = 'artic'
866
- solr_params = Blacklight::Solr::Request.new
867
-
868
- subject.add_facet_suggestion_parameters(solr_params)
869
-
870
- expect(solr_params[:'facet.contains']).to eq 'artic'
871
- end
872
-
873
- it "adds the first part of facet_suggestion_query to facet.contains if it is extremely long" do
874
- subject.facet = 'subject_facet'
875
- subject.facet_suggestion_query = 'Call me Ishmael. Some years ago—never mind how long precisely'
876
- solr_params = Blacklight::Solr::Request.new
877
-
878
- subject.add_facet_suggestion_parameters(solr_params)
879
-
880
- expect(solr_params[:'facet.contains']).to eq 'Call me Ishmael. Some years ago—never mind how long'
881
- end
882
-
883
- it "adds facet.contains.ignoreCase" do
884
- subject.facet = 'subject_facet'
885
- subject.facet_suggestion_query = 'artic'
886
- solr_params = Blacklight::Solr::Request.new
887
-
888
- subject.add_facet_suggestion_parameters(solr_params)
889
-
890
- expect(solr_params[:'facet.contains.ignoreCase']).to be true
891
- end
892
- end
893
-
894
669
  describe "#with_tag_ex" do
895
670
  it "adds an !ex local parameter if the facet configuration requests it" do
896
671
  expect(subject.with_ex_local_param("xyz", "some-value")).to eq "{!ex=xyz}some-value"
@@ -37,7 +37,11 @@ RSpec.describe SolrDocument, :api do
37
37
  title_tesim: ['Good Omens'])
38
38
  end
39
39
 
40
- it { is_expected.to end_with "_source: {\"id\"=>\"123\", \"title_tesim\"=>[\"Good Omens\"]}>" }
40
+ if RUBY_VERSION > '3.4'
41
+ it { is_expected.to end_with "_source: {\"id\" => \"123\", \"title_tesim\" => [\"Good Omens\"]}>" }
42
+ else
43
+ it { is_expected.to end_with "_source: {\"id\"=>\"123\", \"title_tesim\"=>[\"Good Omens\"]}>" }
44
+ end
41
45
  end
42
46
 
43
47
  describe '.attribute' do
@@ -12,22 +12,19 @@ RSpec.describe Blacklight::SearchService, :api do
12
12
  subject { service }
13
13
 
14
14
  let(:context) { { whatever: :value } }
15
- let(:service) { described_class.new(config: blacklight_config, user_params: user_params, **context) }
15
+ let(:search_state) { Blacklight::SearchState.new(user_params, blacklight_config) }
16
+ let(:service) { described_class.new(config: blacklight_config, search_state: search_state, **context) }
16
17
  let(:repository) { Blacklight::Solr::Repository.new(blacklight_config) }
17
18
  let(:user_params) { {} }
18
19
 
19
- let(:blacklight_config) { Blacklight::Configuration.new }
20
- let(:copy_of_catalog_config) { CatalogController.blacklight_config.deep_copy }
21
- let(:blacklight_solr) { RSolr.connect(Blacklight.connection_config.except(:adapter)) }
20
+ let(:blacklight_config) { CatalogController.blacklight_config.deep_copy }
22
21
 
23
22
  let(:all_docs_query) { '' }
24
23
  let(:no_docs_query) { 'zzzzzzzzzzzz' }
25
- # f[format][]=Book&f[language_facet][]=English
26
24
  let(:single_facet) { { format: 'Book' } }
27
25
 
28
26
  before do
29
27
  allow(service).to receive(:repository).and_return(repository)
30
- service.repository.connection = blacklight_solr
31
28
  end
32
29
 
33
30
  describe '#search_builder_class' do
@@ -39,8 +36,7 @@ RSpec.describe Blacklight::SearchService, :api do
39
36
 
40
37
  context 'when the search_builder_class is passed in' do
41
38
  let(:klass) { double("Search builder") }
42
-
43
- let(:service) { described_class.new(config: blacklight_config, user_params: user_params, search_builder_class: klass) }
39
+ let(:context) { { search_builder_class: klass } }
44
40
 
45
41
  it 'uses the passed value' do
46
42
  expect(subject).to eq klass
@@ -50,16 +46,15 @@ RSpec.describe Blacklight::SearchService, :api do
50
46
 
51
47
  # SPECS FOR SEARCH RESULTS FOR QUERY
52
48
  describe 'Search Results', :integration do
53
- let(:blacklight_config) { copy_of_catalog_config }
54
-
55
49
  describe 'for a sample query returning results' do
56
50
  let(:user_params) { { q: all_docs_query } }
51
+ let(:blacklight_solr) { service.repository.connection }
57
52
 
58
53
  it "uses the configured request handler" do
59
54
  allow(blacklight_config).to receive(:default_solr_params).and_return(qt: 'custom_request_handler')
60
55
  allow(blacklight_solr).to receive(:send_and_receive) do |path, params|
61
56
  expect(path).to eq 'select'
62
- expect(params[:params]['facet.field']).to eq ["format", "{!ex=pub_date_ssim_single}pub_date_ssim", "subject_ssim", "language_ssim", "lc_1letter_ssim", "subject_geo_ssim", "subject_era_ssim"]
57
+ expect(params[:params]['facet.field']).to contain_exactly "format", "{!ex=pub_date_ssim_single}pub_date_ssim", "subject_ssim", "language_ssim", "lc_1letter_ssim", "subject_geo_ssim", "subject_era_ssim"
63
58
  expect(params[:params]["facet.query"]).to eq ["pub_date_ssim:[#{5.years.ago.year} TO *]", "pub_date_ssim:[#{10.years.ago.year} TO *]", "pub_date_ssim:[#{25.years.ago.year} TO *]"]
64
59
  expect(params[:params]).to include('rows' => 10, 'qt' => "custom_request_handler", 'q' => "", "f.subject_ssim.facet.limit" => 21, 'sort' => "score desc, pub_date_si desc, title_si asc")
65
60
  end.and_return('response' => { 'docs' => [] })
@@ -68,7 +63,6 @@ RSpec.describe Blacklight::SearchService, :api do
68
63
  end
69
64
 
70
65
  describe "for a query returning a grouped response" do
71
- let(:blacklight_config) { copy_of_catalog_config }
72
66
  let(:user_params) { { q: all_docs_query } }
73
67
 
74
68
  before do
@@ -82,7 +76,6 @@ RSpec.describe Blacklight::SearchService, :api do
82
76
  end
83
77
 
84
78
  describe "for a query returning multiple groups", :integration do
85
- let(:blacklight_config) { copy_of_catalog_config }
86
79
  let(:user_params) { { q: all_docs_query } }
87
80
 
88
81
  before do
@@ -140,7 +133,6 @@ RSpec.describe Blacklight::SearchService, :api do
140
133
 
141
134
  # SPECS FOR SEARCH RESULTS FOR FACETS
142
135
  describe 'Facets in Search Results for All Docs Query', :integration do
143
- let(:blacklight_config) { copy_of_catalog_config }
144
136
  let(:user_params) { { q: all_docs_query } }
145
137
 
146
138
  before do
@@ -185,7 +177,6 @@ RSpec.describe Blacklight::SearchService, :api do
185
177
 
186
178
  # SPECS FOR SEARCH RESULTS FOR PAGING
187
179
  describe 'Paging', :integration do
188
- let(:blacklight_config) { copy_of_catalog_config }
189
180
  let(:user_params) { { q: all_docs_query } }
190
181
 
191
182
  it 'starts with first results by default' do
@@ -379,18 +370,6 @@ RSpec.describe Blacklight::SearchService, :api do
379
370
  # TODO: maybe eventually check other types of solr requests
380
371
  # more like this
381
372
  # nearby on shelf
382
- it "raises a Blacklight exception if RSolr can't connect to the Solr instance" do
383
- allow(blacklight_solr).to receive(:send_and_receive).and_raise(Errno::ECONNREFUSED)
384
- expect { service.repository.search }.to raise_exception(/Unable to connect to Solr instance/)
385
- end
386
-
387
- it "raises a Blacklight exception if RSolr raises a timeout error connecting to Solr instance" do
388
- rsolr_timeout = RSolr::Error::Timeout.new(nil, nil)
389
- allow(rsolr_timeout).to receive(:to_s).and_return("mocked RSolr timeout")
390
-
391
- allow(blacklight_solr).to receive(:send_and_receive).and_raise(rsolr_timeout)
392
- expect { service.repository.search }.to raise_exception(Blacklight::Exceptions::RepositoryTimeout, /Timeout connecting to Solr instance/)
393
- end
394
373
 
395
374
  describe "#previous_and_next_documents_for_search" do
396
375
  let(:user_params) { { q: '', per_page: 100 } }
data/spec/spec_helper.rb CHANGED
@@ -21,7 +21,6 @@ require 'selenium-webdriver'
21
21
  require 'equivalent-xml'
22
22
  require 'axe-rspec'
23
23
 
24
- require 'rsolr'
25
24
  require 'blacklight'
26
25
 
27
26
  Capybara.javascript_driver = :headless_chrome
@@ -1,24 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ViewComponentTestHelpers
4
- # Work around for https://github.com/teamcapybara/capybara/issues/2466
5
- def render_inline_to_capybara_node(component)
6
- Capybara::Node::Simple.new(render_inline(component).to_s)
7
- end
8
-
9
- # Work-around for https://github.com/ViewComponent/view_component/pull/1661
10
- # which made the component test's controller method (more) private. This makes
11
- # it available so we can set up controller-level state for our tests.
12
- def controller
13
- # ViewComponent 2.x
14
- return super if defined?(super)
15
-
16
- # ViewComponent 3.x
17
- return vc_test_controller if defined?(vc_test_controller)
18
-
19
- ApplicationController.new.extend(Rails.application.routes.url_helpers)
20
- end
21
-
22
4
  # Nokogiri 1.15.0 upgrades the vendored libxml2 from v2.10.4 to v2.11.3
23
5
  # libxml2 v2.11.0 introduces a change to parsing HTML href attributes
24
6
  # in nokogiri < 1.15, brackets in href attributes are escaped:
@@ -4,15 +4,21 @@ RSpec.describe 'catalog/facet.html.erb' do
4
4
  let(:display_facet) { double }
5
5
  let(:blacklight_config) { Blacklight::Configuration.new }
6
6
  let(:component) { instance_double(Blacklight::FacetComponent) }
7
+ let(:pagination) { instance_double(Blacklight::FacetFieldPaginationComponent) }
8
+ let(:facet_filters) { instance_double(Blacklight::Facets::FiltersComponent) }
7
9
 
8
10
  before do
9
11
  allow(Blacklight::FacetComponent).to receive(:new).and_return(component)
12
+ allow(Blacklight::Facets::FiltersComponent).to receive(:new).and_return(facet_filters)
13
+ allow(Blacklight::FacetFieldPaginationComponent).to receive(:new).and_return(pagination)
14
+
10
15
  allow(view).to receive(:render).and_call_original
11
16
  allow(view).to receive(:render).with(component)
17
+ allow(view).to receive(:render).with(facet_filters)
18
+ allow(view).to receive(:render).with(pagination)
12
19
 
13
20
  blacklight_config.add_facet_field 'xyz', label: "Facet title"
14
21
  allow(view).to receive(:blacklight_config).and_return(blacklight_config)
15
- stub_template 'catalog/_facet_pagination.html.erb' => 'pagination'
16
22
  assign :facet, blacklight_config.facet_fields['xyz']
17
23
  assign :display_facet, display_facet
18
24
  end
@@ -22,9 +28,10 @@ RSpec.describe 'catalog/facet.html.erb' do
22
28
  expect(rendered).to have_css 'h1', text: "Facet title"
23
29
  end
24
30
 
25
- it "renders facet pagination" do
31
+ it "renders the subcomponents" do
26
32
  render
27
- expect(rendered).to have_content 'pagination'
33
+ expect(view).to have_received(:render).with(facet_filters)
34
+ expect(view).to have_received(:render).with(pagination).twice
28
35
  end
29
36
 
30
37
  it "renders the facet limit" do
@@ -14,13 +14,16 @@ RSpec.describe "catalog/index" do
14
14
  end
15
15
 
16
16
  let(:blacklight_config) { CatalogController.blacklight_config.deep_copy }
17
+ let(:search_builder) { Blacklight::SearchBuilder.new(view) }
18
+ let(:response) { Blacklight::Solr::Response.new({ response: { numFound: 30 } }, search_builder) }
17
19
 
18
20
  before do
19
- @response = Blacklight::Solr::Response.new({ response: { numFound: 30 } }, start: 10, rows: 10)
21
+ allow(view).to receive_messages(action_name: 'index', blacklight_config: blacklight_config)
22
+ @response = response
20
23
  allow(controller).to receive(:search_state_class).and_return(Blacklight::SearchState)
21
- allow(@response).to receive(:documents).and_return(document_list)
24
+ allow(search_builder).to receive_messages(start: 10, rows: 10)
25
+ allow(response).to receive(:documents).and_return(document_list)
22
26
  params['content_format'] = 'some_format'
23
- allow(view).to receive_messages(action_name: 'index', blacklight_config: blacklight_config)
24
27
  end
25
28
 
26
29
  # We need to use rexml to test certain things that have_tag wont' test
@@ -20,12 +20,14 @@ RSpec.describe "catalog/index.html.erb" do
20
20
  before do
21
21
  stub_template "catalog/_results_pagination.html.erb" => ""
22
22
  allow(view).to receive_messages(has_search_parameters?: true, blacklight_config: Blacklight::Configuration.new)
23
+ allow(search_builder).to receive_messages(start: 10, rows: 10)
23
24
  allow(controller).to receive_messages(blacklight_config: Blacklight::Configuration.new)
24
25
 
25
26
  @response = response
26
27
  end
27
28
 
28
- let(:response) { Blacklight::Solr::Response.new({ response: { numFound: 30 } }, start: 10, rows: 10) }
29
+ let(:search_builder) { Blacklight::SearchBuilder.new(view) }
30
+ let(:response) { Blacklight::Solr::Response.new({ response: { numFound: 30 } }, search_builder) }
29
31
 
30
32
  it "renders the search_header partial" do
31
33
  render