blacklight 7.17.2 → 7.19.2

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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/app/assets/javascripts/blacklight/blacklight.js +1 -2
  4. data/app/assets/stylesheets/blacklight/_balanced_list.scss +2 -2
  5. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +1 -1
  6. data/app/assets/stylesheets/blacklight/_constraints.scss +2 -2
  7. data/app/assets/stylesheets/blacklight/_controls.scss +2 -1
  8. data/app/assets/stylesheets/blacklight/_facets.scss +3 -1
  9. data/app/assets/stylesheets/blacklight/_header.scss +6 -1
  10. data/app/components/blacklight/constraint_layout_component.html.erb +1 -1
  11. data/app/components/blacklight/constraints_component.html.erb +2 -2
  12. data/app/components/blacklight/content_areas_shim.rb +2 -1
  13. data/app/components/blacklight/document/thumbnail_component.html.erb +3 -3
  14. data/app/components/blacklight/document/thumbnail_component.rb +11 -3
  15. data/app/components/blacklight/document_component.rb +7 -7
  16. data/app/components/blacklight/facet_field_component.html.erb +3 -1
  17. data/app/components/blacklight/facet_field_no_layout_component.rb +1 -1
  18. data/app/components/blacklight/facet_item_component.rb +2 -2
  19. data/app/components/blacklight/facet_item_pivot_component.rb +2 -2
  20. data/app/components/blacklight/metadata_field_layout_component.rb +1 -1
  21. data/app/components/blacklight/response/facet_group_component.html.erb +2 -0
  22. data/app/components/blacklight/response/view_type_component.html.erb +1 -1
  23. data/app/components/blacklight/search_bar_component.html.erb +3 -3
  24. data/app/components/blacklight/system/dropdown_component.rb +1 -1
  25. data/app/components/blacklight/system/flash_message_component.html.erb +1 -1
  26. data/app/components/blacklight/system/modal_component.html.erb +1 -1
  27. data/app/helpers/blacklight/component_helper_behavior.rb +1 -1
  28. data/app/helpers/blacklight/render_partials_helper_behavior.rb +5 -1
  29. data/app/javascript/blacklight/modal.js +1 -1
  30. data/app/views/blacklight/nav/_bookmark.html.erb +1 -1
  31. data/app/views/bookmarks/index.html.erb +1 -1
  32. data/app/views/catalog/_constraints.html.erb +2 -2
  33. data/app/views/catalog/_document.html.erb +4 -3
  34. data/app/views/catalog/_document_list.html.erb +3 -2
  35. data/app/views/catalog/_home_text.html.erb +1 -1
  36. data/app/views/catalog/_per_page_widget.html.erb +1 -1
  37. data/app/views/catalog/_search_results.html.erb +2 -2
  38. data/app/views/search_history/index.html.erb +1 -1
  39. data/app/views/shared/_header_navbar.html.erb +1 -1
  40. data/config/locales/blacklight.ar.yml +2 -2
  41. data/config/locales/blacklight.ca.yml +2 -2
  42. data/config/locales/blacklight.de.yml +2 -2
  43. data/config/locales/blacklight.en.yml +2 -2
  44. data/config/locales/blacklight.es.yml +2 -2
  45. data/config/locales/blacklight.fr.yml +2 -2
  46. data/config/locales/blacklight.hu.yml +2 -2
  47. data/config/locales/blacklight.it.yml +2 -2
  48. data/config/locales/blacklight.nl.yml +2 -2
  49. data/config/locales/blacklight.pt-BR.yml +1 -1
  50. data/config/locales/blacklight.sq.yml +2 -2
  51. data/config/locales/blacklight.zh.yml +2 -2
  52. data/lib/blacklight/configuration.rb +7 -1
  53. data/lib/blacklight/configuration/view_config.rb +3 -1
  54. data/lib/blacklight/nested_open_struct_with_hash_access.rb +33 -14
  55. data/lib/blacklight/open_struct_with_hash_access.rb +1 -1
  56. data/lib/blacklight/search_builder.rb +1 -0
  57. data/lib/blacklight/solr/request.rb +10 -7
  58. data/lib/blacklight/solr/search_builder_behavior.rb +28 -16
  59. data/lib/generators/blacklight/install_generator.rb +5 -5
  60. data/lib/generators/blacklight/solr_generator.rb +4 -2
  61. data/lib/generators/blacklight/user_generator.rb +4 -2
  62. data/spec/components/blacklight/constraint_layout_component_spec.rb +3 -7
  63. data/spec/components/blacklight/facet_field_checkboxes_component_spec.rb +3 -7
  64. data/spec/components/blacklight/facet_field_list_component_spec.rb +3 -7
  65. data/spec/components/blacklight/facet_item_component_spec.rb +2 -6
  66. data/spec/components/blacklight/facet_item_pivot_component_spec.rb +3 -7
  67. data/spec/components/blacklight/hidden_search_state_component_spec.rb +7 -8
  68. data/spec/components/blacklight/metadata_field_component_spec.rb +4 -8
  69. data/spec/features/facets_spec.rb +2 -2
  70. data/spec/helpers/blacklight/configuration_helper_behavior_spec.rb +9 -10
  71. data/spec/helpers/blacklight_helper_spec.rb +20 -2
  72. data/spec/helpers/catalog_helper_spec.rb +1 -1
  73. data/spec/lib/blacklight/nested_open_struct_with_hash_access_spec.rb +36 -0
  74. data/spec/models/blacklight/configuration_spec.rb +10 -0
  75. data/spec/models/blacklight/solr/request_spec.rb +0 -1
  76. data/spec/models/blacklight/solr/search_builder_spec.rb +23 -1
  77. data/spec/services/blacklight/search_service_spec.rb +1 -1
  78. data/spec/spec_helper.rb +1 -0
  79. data/spec/support/view_component_capybara_test_helpers.rb +8 -0
  80. data/spec/views/catalog/_constraints.html.erb_spec.rb +1 -1
  81. data/spec/views/catalog/_document.html.erb_spec.rb +9 -0
  82. data/spec/views/catalog/_document_list.html.erb_spec.rb +1 -1
  83. data/spec/views/catalog/_facet_layout.html.erb_spec.rb +2 -2
  84. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +5 -5
  85. metadata +4 -2
@@ -5,7 +5,8 @@ module Blacklight::Solr
5
5
 
6
6
  included do
7
7
  self.default_processor_chain = [
8
- :default_solr_parameters, :add_query_to_solr, :add_facet_fq_to_solr,
8
+ :default_solr_parameters, :add_search_field_default_parameters,
9
+ :add_query_to_solr, :add_facet_fq_to_solr,
9
10
  :add_facetting_to_solr, :add_solr_fields_to_query, :add_paging_to_solr,
10
11
  :add_sorting_to_solr, :add_group_config_to_solr,
11
12
  :add_facet_paging_to_solr, :add_adv_search_clauses,
@@ -18,21 +19,17 @@ module Blacklight::Solr
18
19
  # merge to dup values, to avoid later mutating the original by mistake.
19
20
  def default_solr_parameters(solr_parameters)
20
21
  blacklight_config.default_solr_params.each do |key, value|
21
- solr_parameters[key] = if value.respond_to? :deep_dup
22
- value.deep_dup
23
- elsif value.respond_to?(:dup) && value.duplicable?
24
- value.dup
25
- else
26
- value
27
- end
22
+ solr_parameters[key] ||= if value.respond_to? :deep_dup
23
+ value.deep_dup
24
+ elsif value.respond_to?(:dup) && value.duplicable?
25
+ value.dup
26
+ else
27
+ value
28
+ end
28
29
  end
29
30
  end
30
31
 
31
- ##
32
- # Take the user-entered query, and put it in the solr params,
33
- # including config's "search field" params for current search field.
34
- # also include setting spellcheck.q.
35
- def add_query_to_solr(solr_parameters)
32
+ def add_search_field_default_parameters(solr_parameters)
36
33
  ###
37
34
  # legacy behavior of user param :qt is passed through, but over-ridden
38
35
  # by actual search field config if present. We might want to remove
@@ -46,10 +43,21 @@ module Blacklight::Solr
46
43
  ###
47
44
  # Merge in search field configured values, if present, over-writing general
48
45
  # defaults
49
-
50
46
  if search_field
51
47
  solr_parameters[:qt] = search_field.qt if search_field.qt
52
- solr_parameters.merge!(search_field.solr_parameters) if search_field.solr_parameters
48
+
49
+ solr_parameters.deep_merge!(search_field.solr_parameters) if search_field.solr_parameters
50
+ end
51
+ end
52
+
53
+ ##
54
+ # Take the user-entered query, and put it in the solr params,
55
+ # including config's "search field" params for current search field.
56
+ # also include setting spellcheck.q.
57
+ def add_query_to_solr(solr_parameters)
58
+ unless processor_chain.include?(:add_search_field_default_parameters)
59
+ Deprecation.warn(Blacklight::Solr::SearchBuilderBehavior, 'Please include :add_search_field_default_parameters in your process chain')
60
+ add_search_field_default_parameters(solr_parameters)
53
61
  end
54
62
 
55
63
  ##
@@ -64,7 +72,10 @@ module Blacklight::Solr
64
72
  elsif search_field&.solr_local_parameters.present?
65
73
  add_search_field_with_local_parameters(solr_parameters)
66
74
  elsif search_state.query_param.is_a? Hash
67
- add_additional_filters(solr_parameters, search_state.query_param)
75
+ if search_state.query_param == @additional_filters && !processor_chain.include?(:add_additional_filters)
76
+ Deprecation.warn(Blacklight::Solr::SearchBuilderBehavior, 'Expecting to see the processor step add_additional_filters; falling back to legacy query handling')
77
+ add_additional_filters(solr_parameters, search_state.query_param)
78
+ end
68
79
  elsif search_state.query_param
69
80
  solr_parameters.append_query search_state.query_param
70
81
  end
@@ -322,6 +333,7 @@ module Blacklight::Solr
322
333
  # around the term unless it's a bare-word. Escape internal quotes
323
334
  # if needed.
324
335
  def solr_param_quote(val, options = {})
336
+ val = val.to_s
325
337
  options[:quote] ||= '"'
326
338
  unless val =~ /^[a-zA-Z0-9$_\-\^]+$/
327
339
  val = options[:quote] +
@@ -37,8 +37,10 @@ module Blacklight
37
37
  end
38
38
 
39
39
  def bundle_install
40
- Bundler.with_clean_env do
41
- run "bundle install"
40
+ inside destination_root do
41
+ Bundler.with_clean_env do
42
+ run "bundle install"
43
+ end
42
44
  end
43
45
  end
44
46
 
@@ -81,9 +83,7 @@ module Blacklight
81
83
  blacklight_marc = String.new('blacklight-marc')
82
84
  gem blacklight_marc, '>= 7.0.0.rc1', '< 8'
83
85
 
84
- Bundler.with_clean_env do
85
- run "bundle install"
86
- end
86
+ bundle_install
87
87
 
88
88
  generate 'blacklight:marc:install'
89
89
  end
@@ -35,8 +35,10 @@ module Blacklight
35
35
  end
36
36
 
37
37
  def bundle_install
38
- Bundler.with_clean_env do
39
- run "bundle install"
38
+ inside destination_root do
39
+ Bundler.with_clean_env do
40
+ run "bundle install"
41
+ end
40
42
  end
41
43
  end
42
44
  end
@@ -24,8 +24,10 @@ module Blacklight
24
24
  gem "devise"
25
25
  gem "devise-guests", "~> 0.6"
26
26
 
27
- Bundler.with_clean_env do
28
- run "bundle install"
27
+ inside destination_root do
28
+ Bundler.with_clean_env do
29
+ run "bundle install"
30
+ end
29
31
  end
30
32
 
31
33
  generate "devise:install"
@@ -3,12 +3,8 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  RSpec.describe Blacklight::ConstraintLayoutComponent, type: :component do
6
- subject(:render) do
7
- render_inline(described_class.new(**params))
8
- end
9
-
10
- let(:rendered) do
11
- Capybara::Node::Simple.new(render)
6
+ subject(:rendered) do
7
+ render_inline_to_capybara_node(described_class.new(**params))
12
8
  end
13
9
 
14
10
  describe "for simple display" do
@@ -39,7 +35,7 @@ RSpec.describe Blacklight::ConstraintLayoutComponent, type: :component do
39
35
 
40
36
  it "has an accessible remove label" do
41
37
  expect(rendered).to have_selector(".remove") do |s|
42
- expect(s).to have_selector('.sr-only', text: 'Remove constraint my label: my value')
38
+ expect(s).to have_selector('.visually-hidden', text: 'Remove constraint my label: my value')
43
39
  end
44
40
  end
45
41
  end
@@ -3,12 +3,8 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  RSpec.describe Blacklight::FacetFieldCheckboxesComponent, type: :component do
6
- subject(:render) do
7
- render_inline(described_class.new(facet_field: facet_field))
8
- end
9
-
10
- let(:rendered) do
11
- Capybara::Node::Simple.new(render)
6
+ subject(:rendered) do
7
+ render_inline_to_capybara_node(described_class.new(facet_field: facet_field))
12
8
  end
13
9
 
14
10
  let(:facet_field) do
@@ -40,7 +36,7 @@ RSpec.describe Blacklight::FacetFieldCheckboxesComponent, type: :component do
40
36
  it 'renders a collapsible card' do
41
37
  expect(rendered).to have_selector '.card'
42
38
  expect(rendered).to have_button 'Field'
43
- expect(rendered).to have_selector 'button[data-target="#facet-field"]'
39
+ expect(rendered).to have_selector 'button[data-bs-target="#facet-field"]'
44
40
  expect(rendered).to have_selector '#facet-field.collapse.show'
45
41
  end
46
42
 
@@ -3,12 +3,8 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  RSpec.describe Blacklight::FacetFieldListComponent, type: :component do
6
- subject(:render) do
7
- render_inline(described_class.new(facet_field: facet_field))
8
- end
9
-
10
- let(:rendered) do
11
- Capybara::Node::Simple.new(render)
6
+ subject(:rendered) do
7
+ render_inline_to_capybara_node(described_class.new(facet_field: facet_field))
12
8
  end
13
9
 
14
10
  let(:facet_field) do
@@ -35,7 +31,7 @@ RSpec.describe Blacklight::FacetFieldListComponent, type: :component do
35
31
  it 'renders a collapsible card' do
36
32
  expect(rendered).to have_selector '.card'
37
33
  expect(rendered).to have_button 'Field'
38
- expect(rendered).to have_selector 'button[data-target="#facet-field"]'
34
+ expect(rendered).to have_selector 'button[data-bs-target="#facet-field"]'
39
35
  expect(rendered).to have_selector '#facet-field.collapse.show'
40
36
  end
41
37
 
@@ -3,12 +3,8 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  RSpec.describe Blacklight::FacetItemComponent, type: :component do
6
- subject(:render) do
7
- render_inline(described_class.new(facet_item: facet_item))
8
- end
9
-
10
- let(:rendered) do
11
- Capybara::Node::Simple.new(render)
6
+ subject(:rendered) do
7
+ render_inline_to_capybara_node(described_class.new(facet_item: facet_item))
12
8
  end
13
9
 
14
10
  let(:facet_item) do
@@ -3,12 +3,8 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  RSpec.describe Blacklight::FacetItemPivotComponent, type: :component do
6
- subject(:render) do
7
- render_inline(described_class.new(facet_item: facet_item))
8
- end
9
-
10
- let(:rendered) do
11
- Capybara::Node::Simple.new(render)
6
+ subject(:rendered) do
7
+ render_inline_to_capybara_node(described_class.new(facet_item: facet_item))
12
8
  end
13
9
 
14
10
  let(:search_state) do
@@ -31,7 +27,7 @@ RSpec.describe Blacklight::FacetItemPivotComponent, type: :component do
31
27
 
32
28
  it 'links to the facet and shows the number of hits' do
33
29
  expect(rendered).to have_selector 'li'
34
- expect(rendered).to have_link 'x', href: '/catalog?f[z]=x'
30
+ expect(rendered).to have_link 'x', href: '/catalog?f%5Bz%5D=x'
35
31
  expect(rendered).to have_selector '.facet-count', text: '10'
36
32
  end
37
33
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  RSpec.describe Blacklight::HiddenSearchStateComponent, type: :component do
4
- subject(:render) { render_inline(instance) }
4
+ subject(:rendered) { render_inline_to_capybara_node(instance) }
5
5
 
6
6
  let(:params) do
7
7
  { q: "query",
@@ -11,14 +11,13 @@ RSpec.describe Blacklight::HiddenSearchStateComponent, type: :component do
11
11
  f: { field1: %w[a b], field2: ["z"] } }
12
12
  end
13
13
  let(:instance) { described_class.new(params: params) }
14
- let(:generated) { Capybara::Node::Simple.new("<div>#{render.to_html}</div>") }
15
14
 
16
15
  it "converts a hash with nested complex data to Rails-style hidden form fields" do
17
- expect(generated).to have_selector("input[type='hidden'][name='q'][value='query']", visible: :hidden)
18
- expect(generated).to have_selector("input[type='hidden'][name='per_page'][value='10']", visible: :hidden)
19
- expect(generated).to have_selector("input[type='hidden'][name='extra_arbitrary_key'][value='arbitrary_value']", visible: :hidden)
20
- expect(generated).to have_selector("input[type='hidden'][name='f[field2][]'][value='z']", visible: :hidden)
21
- expect(generated).to have_selector("input[type='hidden'][name='f[field1][]'][value='a']", visible: :hidden)
22
- expect(generated).to have_selector("input[type='hidden'][name='f[field1][]'][value='b']", visible: :hidden)
16
+ expect(rendered).to have_selector("input[type='hidden'][name='q'][value='query']", visible: :hidden)
17
+ expect(rendered).to have_selector("input[type='hidden'][name='per_page'][value='10']", visible: :hidden)
18
+ expect(rendered).to have_selector("input[type='hidden'][name='extra_arbitrary_key'][value='arbitrary_value']", visible: :hidden)
19
+ expect(rendered).to have_selector("input[type='hidden'][name='f[field2][]'][value='z']", visible: :hidden)
20
+ expect(rendered).to have_selector("input[type='hidden'][name='f[field1][]'][value='a']", visible: :hidden)
21
+ expect(rendered).to have_selector("input[type='hidden'][name='f[field1][]'][value='b']", visible: :hidden)
23
22
  end
24
23
  end
@@ -3,8 +3,8 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  RSpec.describe Blacklight::MetadataFieldComponent, type: :component do
6
- subject(:render) do
7
- render_inline(described_class.new(field: field))
6
+ subject(:rendered) do
7
+ render_inline_to_capybara_node(described_class.new(field: field))
8
8
  end
9
9
 
10
10
  let(:view_context) { controller.view_context }
@@ -15,10 +15,6 @@ RSpec.describe Blacklight::MetadataFieldComponent, type: :component do
15
15
  Blacklight::FieldPresenter.new(view_context, document, field_config)
16
16
  end
17
17
 
18
- let(:rendered) do
19
- Capybara::Node::Simple.new(render)
20
- end
21
-
22
18
  it 'renders the field label' do
23
19
  expect(rendered).to have_selector 'dt.blacklight-field', text: 'Field label'
24
20
  end
@@ -28,8 +24,8 @@ RSpec.describe Blacklight::MetadataFieldComponent, type: :component do
28
24
  end
29
25
 
30
26
  context 'from a show view' do
31
- subject(:render) do
32
- render_inline(described_class.new(field: field, show: true))
27
+ subject(:rendered) do
28
+ render_inline_to_capybara_node(described_class.new(field: field, show: true))
33
29
  end
34
30
 
35
31
  it 'renders the right field label' do
@@ -84,13 +84,13 @@ RSpec.describe "Facets" do
84
84
  pending 'Capybara::NotSupportedByDriverError: Capybara::Driver::Base#evaluate_script'
85
85
  visit root_path
86
86
  page.find('h3.facet-field-heading button', text: 'Format').click
87
- focused_element_data_target = page.evaluate_script("document.activeElement")['data-target']
87
+ focused_element_data_target = page.evaluate_script("document.activeElement")['data-bs-target']
88
88
  expect(focused_element_data_target).to eq '#facet-format'
89
89
  end
90
90
  end
91
91
 
92
92
  describe '"More" links' do
93
- it 'has default more link with sr-only text' do
93
+ it 'has default more link with visually-hidden text' do
94
94
  visit root_path
95
95
  within '#facet-language_ssim' do
96
96
  expect(page).to have_css 'div.more_facets', text: 'more Language'
@@ -33,9 +33,8 @@ RSpec.describe Blacklight::ConfigurationHelperBehavior do
33
33
 
34
34
  describe "#default_document_index_view_type" do
35
35
  it "uses the first view with default set to true" do
36
- blacklight_config.view.a
37
- blacklight_config.view.b
38
- blacklight_config.view.b.default = true
36
+ blacklight_config.view.a({})
37
+ blacklight_config.view.b(default: true)
39
38
  expect(helper.default_document_index_view_type).to eq :b
40
39
  end
41
40
 
@@ -48,8 +47,8 @@ RSpec.describe Blacklight::ConfigurationHelperBehavior do
48
47
  describe "#document_index_views" do
49
48
  before do
50
49
  blacklight_config.view.abc = false
51
- blacklight_config.view.def.if = false
52
- blacklight_config.view.xyz.unless = true
50
+ blacklight_config.view.def(if: false)
51
+ blacklight_config.view.xyz(unless: true)
53
52
  end
54
53
 
55
54
  it "filters views using :if/:unless configuration" do
@@ -62,8 +61,8 @@ RSpec.describe Blacklight::ConfigurationHelperBehavior do
62
61
 
63
62
  describe '#document_index_view_controls' do
64
63
  before do
65
- blacklight_config.view.a
66
- blacklight_config.view.b.display_control = false
64
+ blacklight_config.view.a({})
65
+ blacklight_config.view.b(display_control: false)
67
66
  end
68
67
 
69
68
  it "filters index views to those set to display controls" do
@@ -195,9 +194,9 @@ RSpec.describe Blacklight::ConfigurationHelperBehavior do
195
194
  describe "#per_page_options_for_select" do
196
195
  it "is the per-page values formatted as options_for_select" do
197
196
  allow(helper).to receive_messages(blacklight_config: double(per_page: [11, 22, 33]))
198
- expect(helper.per_page_options_for_select).to include ["11<span class=\"sr-only\"> per page</span>", 11]
199
- expect(helper.per_page_options_for_select).to include ["22<span class=\"sr-only\"> per page</span>", 22]
200
- expect(helper.per_page_options_for_select).to include ["33<span class=\"sr-only\"> per page</span>", 33]
197
+ expect(helper.per_page_options_for_select).to include ["11<span class=\"sr-only visually-hidden\"> per page</span>", 11]
198
+ expect(helper.per_page_options_for_select).to include ["22<span class=\"sr-only visually-hidden\"> per page</span>", 22]
199
+ expect(helper.per_page_options_for_select).to include ["33<span class=\"sr-only visually-hidden\"> per page</span>", 33]
201
200
  end
202
201
  end
203
202
 
@@ -127,7 +127,7 @@ RSpec.describe BlacklightHelper do
127
127
 
128
128
  it "renders view type specific actions" do
129
129
  allow(helper).to receive(:document_index_view_type).and_return(:custom)
130
- config.view.custom.document_actions = []
130
+ config.view.custom(document_actions: [])
131
131
  expect(helper.render_index_doc_actions(document)).to be_blank
132
132
  end
133
133
  end
@@ -315,11 +315,29 @@ RSpec.describe BlacklightHelper do
315
315
  end
316
316
 
317
317
  it "ignores missing templates" do
318
- blacklight_config.view.view_type.partials = %w[index_header a b]
318
+ blacklight_config.view.view_type(partials: %w[index_header a b])
319
319
 
320
320
  response = helper.render_document_index_with_view :view_type, [obj1, obj1]
321
321
  expect(response).to have_selector "div#documents"
322
322
  end
323
+
324
+ context 'with a template partial provided by the view config' do
325
+ before do
326
+ blacklight_config.view.gallery(template: '/my/partial')
327
+ end
328
+
329
+ def stub_template(hash)
330
+ view.view_paths.unshift(ActionView::FixtureResolver.new(hash))
331
+ end
332
+
333
+ it 'renders that template' do
334
+ stub_template 'my/_partial.html.erb' => 'some content'
335
+
336
+ response = helper.render_document_index_with_view :gallery, [obj1, obj1]
337
+
338
+ expect(response).to eq 'some content'
339
+ end
340
+ end
323
341
  end
324
342
 
325
343
  describe "#document_index_view_type" do
@@ -323,7 +323,7 @@ RSpec.describe CatalogHelper do
323
323
 
324
324
  it "supports view-specific field configuration" do
325
325
  allow(helper).to receive(:document_index_view_type).and_return(:some_view_type)
326
- blacklight_config.view.some_view_type.display_type_field = :other_type
326
+ blacklight_config.view.some_view_type(display_type_field: :other_type)
327
327
  doc = { other_type: "document" }
328
328
  expect(helper.render_document_class(doc)).to eq "blacklight-document"
329
329
  end
@@ -1,6 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  RSpec.describe Blacklight::NestedOpenStructWithHashAccess do
4
+ subject { described_class.new(Blacklight::OpenStructWithHashAccess) }
5
+
6
+ describe '#key' do
7
+ context 'for an object provided by the initializer' do
8
+ subject { described_class.new(Blacklight::OpenStructWithHashAccess, a: { b: 1 }) }
9
+
10
+ it 'copies the key to the initialized value' do
11
+ expect(subject.a).to have_attributes key: :a, b: 1
12
+ end
13
+ end
14
+
15
+ context 'for an object provided through assignment' do
16
+ it 'copies the key to the initialized value' do
17
+ subject.a!
18
+
19
+ expect(subject.a).to have_attributes key: :a
20
+ end
21
+ end
22
+ end
23
+
4
24
  describe "#deep_dup" do
5
25
  it "preserves the current class" do
6
26
  expect(described_class.new(described_class).deep_dup).to be_a_kind_of described_class
@@ -23,4 +43,20 @@ RSpec.describe Blacklight::NestedOpenStructWithHashAccess do
23
43
  expect(subject.blah).to have_attributes(key: :blah)
24
44
  end
25
45
  end
46
+
47
+ describe 'adding new parameters' do
48
+ subject { described_class.new(Blacklight::Configuration::Field) }
49
+
50
+ it 'strips the trailing !' do
51
+ subject.blah!
52
+ expect(subject.blah).to have_attributes(key: :blah)
53
+ expect(subject.keys).to eq [:blah]
54
+ end
55
+
56
+ it 'supports direct assignment' do
57
+ subject.blah = '123'
58
+ expect(subject.blah).to eq '123'
59
+ expect(subject.keys).to eq [:blah]
60
+ end
61
+ end
26
62
  end