blacklight 7.17.2 → 7.19.2

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