blacklight 7.10.0 → 7.11.1

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 (147) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +56 -7
  3. data/.rubocop_todo.yml +113 -98
  4. data/.travis.yml +0 -2
  5. data/Gemfile +0 -7
  6. data/README.md +1 -0
  7. data/VERSION +1 -1
  8. data/app/assets/javascripts/blacklight/blacklight.js +1 -2
  9. data/app/components/blacklight/document/bookmark_component.html.erb +16 -0
  10. data/app/components/blacklight/document/bookmark_component.rb +19 -0
  11. data/app/components/blacklight/document/citation_component.html.erb +9 -0
  12. data/app/components/blacklight/document/citation_component.rb +24 -0
  13. data/app/components/blacklight/document/more_like_this_component.html.erb +12 -0
  14. data/app/components/blacklight/document/more_like_this_component.rb +21 -0
  15. data/app/components/blacklight/document_component.html.erb +29 -0
  16. data/app/components/blacklight/document_component.rb +121 -0
  17. data/app/components/blacklight/document_metadata_component.html.erb +5 -0
  18. data/app/components/blacklight/document_metadata_component.rb +21 -0
  19. data/app/components/blacklight/facet_item_component.rb +6 -6
  20. data/app/components/blacklight/metadata_field_component.html.erb +8 -0
  21. data/app/components/blacklight/metadata_field_component.rb +31 -0
  22. data/app/components/blacklight/metadata_field_layout_component.html.erb +2 -0
  23. data/app/components/blacklight/metadata_field_layout_component.rb +16 -0
  24. data/app/components/blacklight/response/facet_group_component.html.erb +25 -0
  25. data/app/components/blacklight/response/facet_group_component.rb +19 -0
  26. data/app/components/blacklight/response/pagination_component.html.erb +3 -0
  27. data/app/components/blacklight/response/pagination_component.rb +17 -0
  28. data/app/components/blacklight/response/sort_component.html.erb +6 -0
  29. data/app/components/blacklight/response/sort_component.rb +16 -0
  30. data/app/components/blacklight/response/spellcheck_component.html.erb +7 -0
  31. data/app/components/blacklight/response/spellcheck_component.rb +20 -0
  32. data/app/components/blacklight/search_bar_component.html.erb +29 -0
  33. data/app/components/blacklight/search_bar_component.rb +45 -0
  34. data/app/components/blacklight/search_context_component.html.erb +10 -0
  35. data/app/components/blacklight/search_context_component.rb +30 -0
  36. data/app/components/blacklight/system/dropdown_component.html.erb +12 -0
  37. data/app/components/blacklight/system/dropdown_component.rb +42 -0
  38. data/app/components/blacklight/system/modal_component.html.erb +25 -0
  39. data/app/components/blacklight/system/modal_component.rb +9 -0
  40. data/app/controllers/concerns/blacklight/catalog.rb +5 -4
  41. data/app/controllers/concerns/blacklight/default_component_configuration.rb +2 -2
  42. data/app/controllers/concerns/blacklight/searchable.rb +11 -0
  43. data/app/helpers/blacklight/blacklight_helper_behavior.rb +14 -3
  44. data/app/helpers/blacklight/catalog_helper_behavior.rb +1 -0
  45. data/app/helpers/blacklight/component_helper_behavior.rb +2 -2
  46. data/app/helpers/blacklight/configuration_helper_behavior.rb +6 -0
  47. data/app/helpers/blacklight/facets_helper_behavior.rb +1 -1
  48. data/app/helpers/blacklight/icon_helper_behavior.rb +2 -2
  49. data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +7 -10
  50. data/app/helpers/blacklight/url_helper_behavior.rb +3 -3
  51. data/app/javascript/blacklight/search_context.js +0 -1
  52. data/app/models/blacklight/icon.rb +1 -0
  53. data/app/models/concerns/blacklight/document.rb +1 -0
  54. data/app/models/record_mailer.rb +1 -1
  55. data/app/presenters/blacklight/document_presenter.rb +7 -1
  56. data/app/presenters/blacklight/field_presenter.rb +1 -0
  57. data/app/presenters/blacklight/rendering/microdata.rb +1 -1
  58. data/app/services/blacklight/field_retriever.rb +1 -0
  59. data/app/services/blacklight/search_service.rb +1 -0
  60. data/app/views/catalog/_bookmark_control.html.erb +1 -36
  61. data/app/views/catalog/_citation.html.erb +4 -25
  62. data/app/views/catalog/_did_you_mean.html.erb +1 -5
  63. data/app/views/catalog/_document.atom.builder +3 -3
  64. data/app/views/catalog/_document.html.erb +5 -5
  65. data/app/views/catalog/_facet_group.html.erb +5 -19
  66. data/app/views/catalog/_index.html.erb +1 -10
  67. data/app/views/catalog/_paginate_compact.html.erb +6 -6
  68. data/app/views/catalog/_per_page_widget.html.erb +9 -12
  69. data/app/views/catalog/_previous_next_doc.html.erb +1 -12
  70. data/app/views/catalog/_results_pagination.html.erb +1 -3
  71. data/app/views/catalog/_search_form.html.erb +6 -27
  72. data/app/views/catalog/_show.html.erb +6 -8
  73. data/app/views/catalog/_show_main_content.html.erb +19 -13
  74. data/app/views/catalog/_show_sidebar.html.erb +1 -11
  75. data/app/views/catalog/_sort_widget.html.erb +5 -12
  76. data/app/views/catalog/email.html.erb +7 -7
  77. data/app/views/catalog/email_success.html.erb +5 -12
  78. data/app/views/catalog/facet.html.erb +14 -17
  79. data/app/views/catalog/index.atom.builder +0 -1
  80. data/app/views/catalog/sms.html.erb +7 -7
  81. data/app/views/catalog/sms_success.html.erb +5 -12
  82. data/blacklight.gemspec +3 -2
  83. data/config/i18n-tasks.yml +3 -0
  84. data/config/locales/blacklight.ar.yml +2 -0
  85. data/config/locales/blacklight.de.yml +2 -0
  86. data/config/locales/blacklight.en.yml +2 -0
  87. data/config/locales/blacklight.es.yml +4 -2
  88. data/config/locales/blacklight.fr.yml +2 -0
  89. data/config/locales/blacklight.hu.yml +2 -0
  90. data/config/locales/blacklight.it.yml +2 -0
  91. data/config/locales/blacklight.nl.yml +2 -0
  92. data/config/locales/blacklight.pt-BR.yml +2 -0
  93. data/config/locales/blacklight.sq.yml +2 -0
  94. data/config/locales/blacklight.zh.yml +2 -0
  95. data/lib/blacklight.rb +10 -0
  96. data/lib/blacklight/configuration.rb +8 -3
  97. data/lib/blacklight/configuration/fields.rb +5 -7
  98. data/lib/blacklight/engine.rb +1 -1
  99. data/lib/blacklight/nested_open_struct_with_hash_access.rb +1 -0
  100. data/lib/blacklight/search_state.rb +21 -7
  101. data/lib/blacklight/solr/response.rb +1 -0
  102. data/lib/blacklight/solr/response/facets.rb +9 -8
  103. data/lib/generators/blacklight/models_generator.rb +2 -0
  104. data/lib/generators/blacklight/templates/config/blacklight.yml +1 -0
  105. data/lib/railties/blacklight.rake +18 -13
  106. data/package.json +1 -1
  107. data/spec/components/blacklight/constraint_layout_component_spec.rb +1 -0
  108. data/spec/components/blacklight/document_component_spec.rb +129 -0
  109. data/spec/components/blacklight/document_metadata_component_spec.rb +0 -0
  110. data/spec/components/blacklight/metadata_field_component_spec.rb +41 -0
  111. data/spec/controllers/blacklight/search_fields_spec.rb +2 -2
  112. data/spec/controllers/catalog_controller_spec.rb +20 -0
  113. data/spec/features/search_context_spec.rb +12 -2
  114. data/spec/features/search_filters_spec.rb +4 -0
  115. data/spec/features/search_results_spec.rb +1 -0
  116. data/spec/features/sitelinks_search_box.rb +1 -0
  117. data/spec/helpers/blacklight/configuration_helper_behavior_spec.rb +3 -0
  118. data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +1 -0
  119. data/spec/helpers/blacklight/search_history_constraints_helper_behavior_spec.rb +2 -0
  120. data/spec/helpers/blacklight/url_helper_behavior_spec.rb +1 -1
  121. data/spec/helpers/blacklight_helper_spec.rb +14 -1
  122. data/spec/helpers/catalog_helper_spec.rb +1 -4
  123. data/spec/lib/blacklight/search_state_spec.rb +32 -0
  124. data/spec/models/blacklight/configuration_spec.rb +5 -0
  125. data/spec/models/blacklight/document/cache_key_spec.rb +1 -0
  126. data/spec/models/blacklight/document/email_spec.rb +2 -0
  127. data/spec/models/blacklight/document/sms_spec.rb +2 -0
  128. data/spec/models/blacklight/facet_paginator_spec.rb +3 -0
  129. data/spec/models/blacklight/icon_spec.rb +6 -0
  130. data/spec/models/blacklight/solr/document_spec.rb +10 -0
  131. data/spec/models/blacklight/solr/response/facets_spec.rb +1 -1
  132. data/spec/models/blacklight/solr/response/group_response_spec.rb +2 -0
  133. data/spec/models/blacklight/solr/search_builder_spec.rb +10 -0
  134. data/spec/models/record_mailer_spec.rb +9 -0
  135. data/spec/models/search_spec.rb +1 -0
  136. data/spec/presenters/blacklight/show_presenter_spec.rb +8 -0
  137. data/spec/routing/catalog_routing_spec.rb +4 -0
  138. data/spec/services/blacklight/search_service_spec.rb +7 -0
  139. data/spec/spec_helper.rb +1 -1
  140. data/spec/views/catalog/_document.html.erb_spec.rb +13 -11
  141. data/spec/views/catalog/_facet_group.html.erb_spec.rb +1 -0
  142. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +1 -0
  143. data/spec/views/catalog/_previous_next_doc.html.erb_spec.rb +4 -0
  144. data/spec/views/catalog/index.atom.builder_spec.rb +40 -3
  145. data/spec/views/catalog/show.html.erb_spec.rb +14 -0
  146. data/tasks/blacklight.rake +7 -7
  147. metadata +56 -6
@@ -7,12 +7,12 @@ RSpec.describe "Search Results context", js: true do
7
7
  click_on 'Pluvial nectar of blessings'
8
8
  expect(page).to have_content "« Previous | 10 of 30 | Next »"
9
9
  prev = page.find(".pagination-search-widgets .previous")
10
- expect(prev['data-context-href']).to eq "/catalog/2003546302/track?counter=9&search_id=#{search_id}"
10
+ expect(prev['data-context-href']).to eq "/catalog/2003546302/track?counter=9&document_id=2003546302&search_id=#{search_id}"
11
11
 
12
12
  click_on "« Previous"
13
13
 
14
14
  prev = page.find(".pagination-search-widgets .previous")
15
- expect(prev['data-context-href']).to eq "/catalog/2004310986/track?counter=8&search_id=#{search_id}"
15
+ expect(prev['data-context-href']).to eq "/catalog/2004310986/track?counter=8&document_id=2004310986&search_id=#{search_id}"
16
16
  end
17
17
 
18
18
  it "redirects context urls to the original url" do
@@ -31,6 +31,16 @@ RSpec.describe "Search Results context", js: true do
31
31
  end
32
32
  end
33
33
 
34
+ it "does not display stale previous and next links for direct item views" do
35
+ search_for ''
36
+ click_on 'Pluvial nectar of blessings'
37
+
38
+ # Go to the number 9 result separately
39
+ visit '/catalog/2003546302'
40
+ expect(page).not_to have_selector '.page-links'
41
+ expect(page).not_to have_content "« Previous | 10 of 30 | Next »"
42
+ end
43
+
34
44
  context "navigating between search results using context pagination" do
35
45
  it "updates the back to search link with the current search pagination context" do
36
46
  search_for ''
@@ -166,6 +166,7 @@ RSpec.describe "Facets" do
166
166
  expect(page).to have_content "history"
167
167
  end
168
168
  end
169
+
169
170
  it "is collapsed when not selected", js: true do
170
171
  skip("Test passes locally but not on Travis.") if ENV['TRAVIS']
171
172
  visit root_path
@@ -178,6 +179,7 @@ RSpec.describe "Facets" do
178
179
  expect(page).not_to have_selector(".card-body", visible: true)
179
180
  end
180
181
  end
182
+
181
183
  it "expands when the heading button is clicked", js: true do
182
184
  skip("Test passes locally but not on Travis.") if ENV['TRAVIS']
183
185
  visit root_path
@@ -192,6 +194,7 @@ RSpec.describe "Facets" do
192
194
  expect(page).to have_selector(".card-body", visible: true)
193
195
  end
194
196
  end
197
+
195
198
  it "expands when the button is clicked", js: true do
196
199
  skip("Test passes locally but not on Travis.") if ENV['TRAVIS']
197
200
  visit root_path
@@ -206,6 +209,7 @@ RSpec.describe "Facets" do
206
209
  expect(page).to have_selector(".card-body", visible: true)
207
210
  end
208
211
  end
212
+
209
213
  it "keeps selected facets expanded on page load", js: true do
210
214
  skip("Test passes locally but not on Travis.") if ENV['TRAVIS']
211
215
  visit root_path
@@ -17,6 +17,7 @@ RSpec.describe "Search Results" do
17
17
  search_for 'inmül'
18
18
  expect(number_of_results_from_page(page)).to eq 1
19
19
  end
20
+
20
21
  it "finds same result set for a case-insensitive query" do
21
22
  search_for 'inmul'
22
23
  expect(number_of_results_from_page(page)).to eq 1
@@ -5,6 +5,7 @@ describe 'Sitelinks search box' do
5
5
  visit root_path
6
6
  expect(page).to have_css 'script[type="application/ld+json"]'
7
7
  end
8
+
8
9
  it 'on search page' do
9
10
  visit search_catalog_path q: 'book'
10
11
  expect(page).not_to have_css 'script[type="application/ld+json"]'
@@ -271,9 +271,11 @@ RSpec.describe Blacklight::ConfigurationHelperBehavior do
271
271
  it 'handles a found key' do
272
272
  expect(helper.label_for_search_field('my-key')).to eq 'My Field'
273
273
  end
274
+
274
275
  it 'handles a missing key' do
275
276
  expect(helper.label_for_search_field('not-found')).to eq 'Not Found'
276
277
  end
278
+
277
279
  it 'handles a missing field' do
278
280
  expect(helper.label_for_search_field(nil)).to eq nil
279
281
  end
@@ -285,6 +287,7 @@ RSpec.describe Blacklight::ConfigurationHelperBehavior do
285
287
  it 'handles a found key' do
286
288
  expect(helper.sort_field_label('my-key')).to eq 'My Field'
287
289
  end
290
+
288
291
  it 'handles a missing key' do
289
292
  expect(helper.sort_field_label('not-found')).to eq 'Not Found'
290
293
  end
@@ -70,6 +70,7 @@ RSpec.describe Blacklight::RenderPartialsHelperBehavior do
70
70
  it "uses the value in the configured display type field" do
71
71
  expect(helper.document_partial_name(document)).to eq 'xyz'
72
72
  end
73
+
73
74
  it "uses the value in the configured display type field if the action-specific field is empty" do
74
75
  expect(helper.document_partial_name(document, :some_action)).to eq 'xyz'
75
76
  end
@@ -28,6 +28,7 @@ RSpec.describe Blacklight::SearchHistoryConstraintsHelperBehavior do
28
28
  end
29
29
  expect(response).to be_html_safe
30
30
  end
31
+
31
32
  it "escapes them that need escaping" do
32
33
  response = helper.render_search_to_s_element("key>", "value>")
33
34
  expect(response).to have_selector("span.constraint") do |span|
@@ -43,6 +44,7 @@ RSpec.describe Blacklight::SearchHistoryConstraintsHelperBehavior do
43
44
  end
44
45
  expect(response).to be_html_safe
45
46
  end
47
+
46
48
  it "does not escape with options set thus" do
47
49
  response = helper.render_search_to_s_element("key>", "value>", escape_key: false, escape_value: false)
48
50
  expect(response).to have_selector("span.constraint") do |span|
@@ -233,7 +233,7 @@ RSpec.describe Blacklight::UrlHelperBehavior do
233
233
  end
234
234
 
235
235
  it "passes on the title attribute to the link_to_with_data method" do
236
- expect(helper.link_to_document(document, "Some crazy long label...", title: "Some crazy longer label")).to match(/title=\"Some crazy longer label\"/)
236
+ expect(helper.link_to_document(document, "Some crazy long label...", title: "Some crazy longer label")).to match(/title="Some crazy longer label"/)
237
237
  end
238
238
 
239
239
  it "doesn't add an erroneous title attribute if one isn't provided" do
@@ -48,10 +48,12 @@ RSpec.describe BlacklightHelper do
48
48
  helper.content_for(:page_title) { "xyz" }
49
49
  expect(helper.render_page_title).to eq "xyz"
50
50
  end
51
+
51
52
  it "looks in the @page_title ivar" do
52
53
  assign(:page_title, "xyz")
53
54
  expect(helper.render_page_title).to eq "xyz"
54
55
  end
56
+
55
57
  it "defaults to the application name" do
56
58
  expect(helper.render_page_title).to eq helper.application_name
57
59
  end
@@ -194,12 +196,14 @@ RSpec.describe BlacklightHelper do
194
196
  field_config = double(field: 'asdf')
195
197
  expect(helper.document_has_value?(doc, field_config)).to eq true
196
198
  end
199
+
197
200
  it "ifs the document has a highlight field value" do
198
201
  allow(doc).to receive(:has?).with('asdf').and_return(false)
199
202
  allow(doc).to receive(:has_highlight_field?).with('asdf').and_return(true)
200
203
  field_config = double(field: 'asdf', highlight: true)
201
204
  expect(helper.document_has_value?(doc, field_config)).to eq true
202
205
  end
206
+
203
207
  it "ifs the field has a model accessor" do
204
208
  allow(doc).to receive(:has?).with('asdf').and_return(false)
205
209
  allow(doc).to receive(:has_highlight_field?).with('asdf').and_return(false)
@@ -250,14 +254,17 @@ RSpec.describe BlacklightHelper do
250
254
  response = double(total: 10)
251
255
  expect(helper.should_show_spellcheck_suggestions?(response)).to be false
252
256
  end
257
+
253
258
  it "only shows suggestions if there are very few results" do
254
259
  response = double(total: 4, spelling: double(words: [1]))
255
260
  expect(helper.should_show_spellcheck_suggestions?(response)).to be true
256
261
  end
262
+
257
263
  it "shows suggestions only if there are spelling suggestions available" do
258
264
  response = double(total: 4, spelling: double(words: []))
259
265
  expect(helper.should_show_spellcheck_suggestions?(response)).to be false
260
266
  end
267
+
261
268
  it "does not show suggestions if spelling is not available" do
262
269
  response = double(total: 4, spelling: nil)
263
270
  expect(helper.should_show_spellcheck_suggestions?(response)).to be false
@@ -270,12 +277,15 @@ RSpec.describe BlacklightHelper do
270
277
  it "has a search rel" do
271
278
  expect(subject).to have_selector "link[rel='search']", visible: false
272
279
  end
280
+
273
281
  it "has the correct mime type" do
274
282
  expect(subject).to have_selector "link[type='application/opensearchdescription+xml']", visible: false
275
283
  end
284
+
276
285
  it "has a title attribute" do
277
286
  expect(subject).to have_selector "link[title='title']", visible: false
278
287
  end
288
+
279
289
  it "has an href attribute" do
280
290
  expect(subject).to have_selector "link[href='href']", visible: false
281
291
  end
@@ -291,15 +301,18 @@ RSpec.describe BlacklightHelper do
291
301
 
292
302
  describe "#render_document_index_with_view" do
293
303
  let(:obj1) { SolrDocument.new }
304
+ let(:blacklight_config) { CatalogController.blacklight_config.deep_copy }
294
305
 
295
306
  before do
296
- allow(helper).to receive(:blacklight_config).and_return(CatalogController.blacklight_config)
307
+ allow(helper).to receive(:blacklight_config).and_return(blacklight_config)
297
308
  assign(:response, instance_double(Blacklight::Solr::Response, grouped?: false, start: 0))
298
309
  allow(helper).to receive(:link_to_document).and_return('<a/>')
299
310
  allow(helper).to receive(:render_index_doc_actions).and_return('<div/>')
300
311
  end
301
312
 
302
313
  it "ignores missing templates" do
314
+ blacklight_config.view.view_type.partials = %w[index_header a b]
315
+
303
316
  response = helper.render_document_index_with_view :view_type, [obj1, obj1]
304
317
  expect(response).to have_selector "div#documents"
305
318
  end
@@ -18,10 +18,6 @@ RSpec.describe CatalogHelper do
18
18
  mock_response
19
19
  end
20
20
 
21
- def render_grouped_response?
22
- false
23
- end
24
-
25
21
  describe "page_entries_info" do
26
22
  it "with no results" do
27
23
  @response = mock_response total: 0
@@ -97,6 +93,7 @@ RSpec.describe CatalogHelper do
97
93
  expect(html).to eq "<strong>41</strong> - <strong>47</strong> of <strong>47</strong>"
98
94
  expect(html).to be_html_safe
99
95
  end
96
+
100
97
  it "works with rows the same as per_page" do
101
98
  @response = mock_response total: 47, rows: 20, current_page: 2
102
99
 
@@ -46,6 +46,38 @@ RSpec.describe Blacklight::SearchState do
46
46
  expect(search_state.to_h).to eq data.with_indifferent_access
47
47
  end
48
48
  end
49
+
50
+ context 'with facebooks badly mangled query parameters' do
51
+ let(:params) { { f: { field: { '0': 'first', '1': 'second' } } } }
52
+
53
+ it 'normalizes the facets to the expected format' do
54
+ expect(search_state.to_h).to include f: { field: %w[first second] }
55
+ end
56
+ end
57
+
58
+ context 'deleting item from to_h' do
59
+ let(:params) { { q: 'foo', q_1: 'bar' } }
60
+
61
+ it 'does not mutate search_state to mutate search_state.to_h' do
62
+ params = search_state.to_h
63
+ params.delete(:q_1)
64
+
65
+ expect(search_state.to_h).to eq('q' => 'foo', 'q_1' => 'bar')
66
+ expect(params).to eq('q' => 'foo')
67
+ end
68
+ end
69
+
70
+ context 'deleting deep item from to_h' do
71
+ let(:params) { { foo: { bar: [] } } }
72
+
73
+ it 'does not mutate search_state to deep mutate search_state.to_h' do
74
+ params = search_state.to_h
75
+ params[:foo][:bar] << 'buzz'
76
+
77
+ expect(search_state.to_h).to eq('foo' => { 'bar' => [] })
78
+ expect(params).to eq('foo' => { 'bar' => ['buzz'] })
79
+ end
80
+ end
49
81
  end
50
82
 
51
83
  describe 'interface compatibility with params' do
@@ -55,6 +55,7 @@ RSpec.describe "Blacklight::Configuration", api: true do
55
55
  it "has the global blacklight configuration" do
56
56
  expect(config.connection_config).to eq Blacklight.connection_config
57
57
  end
58
+
58
59
  it "is overridable with custom configuration" do
59
60
  config.connection_config = custom_config
60
61
  expect(config.connection_config).to eq custom_config
@@ -340,12 +341,14 @@ RSpec.describe "Blacklight::Configuration", api: true do
340
341
  expect(config.index_fields["title_tsim"]).not_to be_nil
341
342
  expect(config.index_fields["title_tsim"].label).to eq "Title"
342
343
  end
344
+
343
345
  it "takes IndexField param" do
344
346
  config.add_index_field("title_tsim", Blacklight::Configuration::IndexField.new(field: "title_display", label: "Title"))
345
347
 
346
348
  expect(config.index_fields["title_tsim"]).not_to be_nil
347
349
  expect(config.index_fields["title_tsim"].label).to eq "Title"
348
350
  end
351
+
349
352
  it "takes block form" do
350
353
  config.add_index_field("title_tsim") do |field|
351
354
  field.label = "Title"
@@ -388,12 +391,14 @@ RSpec.describe "Blacklight::Configuration", api: true do
388
391
  expect(config.show_fields["title_tsim"]).not_to be_nil
389
392
  expect(config.show_fields["title_tsim"].label).to eq "Title"
390
393
  end
394
+
391
395
  it "takes ShowField argument" do
392
396
  config.add_show_field("title_tsim", Blacklight::Configuration::ShowField.new(field: "title_display", label: "Title"))
393
397
 
394
398
  expect(config.show_fields["title_tsim"]).not_to be_nil
395
399
  expect(config.show_fields["title_tsim"].label).to eq "Title"
396
400
  end
401
+
397
402
  it "takes block form" do
398
403
  config.add_show_field("title_tsim") do |f|
399
404
  f.label = "Title"
@@ -24,6 +24,7 @@ RSpec.describe Blacklight::Document::CacheKey, api: true do
24
24
  it 'provides a cache key with the id and version' do
25
25
  expect(subject.cache_key).to eq 'solr_documents/12345-1497353774427013120'
26
26
  end
27
+
27
28
  describe 'as array' do
28
29
  let(:attributes) { { id: '12345', _version_: %w[1234 4321] } }
29
30
 
@@ -11,11 +11,13 @@ RSpec.describe "Blacklight::Document::Email" do
11
11
  expect(email_body).to match(/Title: My Title/)
12
12
  expect(email_body).not_to match(/Author/)
13
13
  end
14
+
14
15
  it "handles multi-values fields correctly" do
15
16
  doc = SolrDocument.new(id: "1234", title_tsim: ["My Title", "My Alt. Title"])
16
17
  email_body = doc.to_email_text
17
18
  expect(email_body).to match(/Title: My Title My Alt. Title/)
18
19
  end
20
+
19
21
  it "returns nil if there are no valid field semantics to build the email body from" do
20
22
  doc = SolrDocument.new(id: "1234")
21
23
  expect(doc.to_email_text).to be_nil
@@ -10,12 +10,14 @@ RSpec.describe "Blacklight::Document::Email" do
10
10
  sms_text = doc.to_sms_text
11
11
  expect(sms_text).to match(/My Title by Joe Schmoe/)
12
12
  end
13
+
13
14
  it "handles multi-values fields correctly and only take the first" do
14
15
  doc = SolrDocument.new(id: "1234", title_tsim: ["My Title", "My Alt. Title"])
15
16
  sms_text = doc.to_sms_text
16
17
  expect(sms_text).to match(/My Title/)
17
18
  expect(sms_text).not_to match(/My Alt\. Title/)
18
19
  end
20
+
19
21
  it "returns nil if there are no valid field semantics to build the email body from" do
20
22
  doc = SolrDocument.new(id: "1234")
21
23
  expect(doc.to_sms_text).to be_nil
@@ -20,6 +20,7 @@ RSpec.describe Blacklight::FacetPaginator, api: true do
20
20
  its(:current_page) { is_expected.to eq 1 }
21
21
  its(:prev_page) { is_expected.to be_nil }
22
22
  its(:next_page) { is_expected.to eq 2 }
23
+
23
24
  it 'limits items to limit, if limit is smaller than items.length' do
24
25
  expect(subject.items.size).to eq 6
25
26
  end
@@ -33,6 +34,7 @@ RSpec.describe Blacklight::FacetPaginator, api: true do
33
34
  its(:current_page) { is_expected.to eq 2 }
34
35
  its(:prev_page) { is_expected.to eq 1 }
35
36
  its(:next_page) { is_expected.to be_nil }
37
+
36
38
  it 'returns all items when limit is greater than items.length' do
37
39
  expect(subject.items.size).to eq 1
38
40
  end
@@ -46,6 +48,7 @@ RSpec.describe Blacklight::FacetPaginator, api: true do
46
48
  its(:current_page) { is_expected.to eq 2 }
47
49
  its(:prev_page) { is_expected.to eq 1 }
48
50
  its(:next_page) { is_expected.to eq 3 }
51
+
49
52
  it 'limits items to limit, if limit is smaller than items.length' do
50
53
  expect(subject.items.size).to eq 6
51
54
  end
@@ -7,18 +7,22 @@ RSpec.describe Blacklight::Icon do
7
7
  it 'returns a string' do
8
8
  expect(subject.svg).to be_an String
9
9
  end
10
+
10
11
  it 'returns raw svg' do
11
12
  expect(Capybara.string(subject.svg))
12
13
  .to have_css 'svg[width="24"]'
13
14
  end
15
+
14
16
  it 'adds role="img"' do
15
17
  expect(Capybara.string(subject.svg))
16
18
  .to have_css 'svg[role="img"]'
17
19
  end
20
+
18
21
  it 'adds title' do
19
22
  expect(Capybara.string(subject.svg))
20
23
  .to have_css 'title', text: 'Search'
21
24
  end
25
+
22
26
  context 'when label is false' do
23
27
  subject { described_class.new(:search, classes: 'awesome', aria_hidden: true, label: false) }
24
28
 
@@ -42,9 +46,11 @@ RSpec.describe Blacklight::Icon do
42
46
  it 'applies options classes and default class' do
43
47
  expect(subject.options[:class]).to eq 'blacklight-icons blacklight-icon-search awesome'
44
48
  end
49
+
45
50
  it 'applies options aria-hidden=true' do
46
51
  expect(subject.options[:'aria-hidden']).to be true
47
52
  end
53
+
48
54
  context 'no options provided' do
49
55
  subject { described_class.new(:view) }
50
56
 
@@ -80,10 +80,12 @@ RSpec.describe "Blacklight::Solr::Document", api: true do
80
80
 
81
81
  expect(MockDocument.registered_extensions.find { |a| a[:module_obj] == MockExtension }).not_to be_nil
82
82
  end
83
+
83
84
  it "lets you register an extension with a nil condition proc" do
84
85
  MockDocument.use_extension(MockExtension) { |_doc| true }
85
86
  expect(MockDocument.registered_extensions.find { |a| a[:module_obj] == MockExtension }).not_to be_nil
86
87
  end
88
+
87
89
  it "applies an extension whose condition is met" do
88
90
  MockDocument.use_extension(MockExtension) { |_doc| true }
89
91
  doc = MockDocument.new
@@ -91,6 +93,7 @@ RSpec.describe "Blacklight::Solr::Document", api: true do
91
93
  expect(doc.methods.find { |name| name.to_s == "my_extension_method" }).not_to be_nil
92
94
  expect(doc.my_extension_method.to_s).to eq "my_extension_results"
93
95
  end
96
+
94
97
  it "applies an extension based on a Solr field" do
95
98
  MockDocument.use_extension(MockExtension) { |doc| doc.key?(:required_key) }
96
99
 
@@ -100,12 +103,14 @@ RSpec.describe "Blacklight::Solr::Document", api: true do
100
103
  without_extension = MockDocument.new(other_key: "value")
101
104
  expect(without_extension.methods.find { |name| name.to_s == "my_extension_method" }).to be_nil
102
105
  end
106
+
103
107
  it "does not apply an extension whose condition is not met" do
104
108
  MockDocument.use_extension(MockExtension) { |_doc| false }
105
109
  doc = MockDocument.new
106
110
 
107
111
  expect(doc.methods.find { |name| name.to_s == "my_extension_method" }).to be_nil
108
112
  end
113
+
109
114
  it "treats a nil condition as always applyable" do
110
115
  MockDocument.use_extension(MockExtension)
111
116
 
@@ -114,6 +119,7 @@ RSpec.describe "Blacklight::Solr::Document", api: true do
114
119
  expect(doc.methods.find { |name| name.to_s == "my_extension_method" }).not_to be_nil
115
120
  expect(doc.my_extension_method).to eq "my_extension_results"
116
121
  end
122
+
117
123
  it "lets last extension applied override earlier extensions" do
118
124
  MockDocument.use_extension(MockExtension)
119
125
  MockDocument.use_extension(MockSecondExtension)
@@ -176,6 +182,7 @@ RSpec.describe "Blacklight::Solr::Document", api: true do
176
182
  it "registers format" do
177
183
  expect(defined?("Mime::MOCK2")).to be_truthy
178
184
  end
185
+
179
186
  it "registers as alias only" do
180
187
  expect(Mime::Type.lookup("application/mock2")).not_to equal Mime::Type.lookup_by_extension("mock2")
181
188
  end
@@ -217,13 +224,16 @@ RSpec.describe "Blacklight::Solr::Document", api: true do
217
224
  expect(@doc1.to_semantic_values)
218
225
  .to eq title: ["doc1 title", "doc1 title other"], something: %w[val1 val2]
219
226
  end
227
+
220
228
  it "returns empty array for a key without a value" do
221
229
  expect(@doc1.to_semantic_values[:author]).to be_empty
222
230
  expect(@doc1.to_semantic_values[:nonexistent_token]).to be_empty
223
231
  end
232
+
224
233
  it "returns an array even for a single-value field" do
225
234
  expect(@doc1.to_semantic_values[:title]).to be_kind_of(Array)
226
235
  end
236
+
227
237
  it "returns complete array for a multi-value field" do
228
238
  expect(@doc1.to_semantic_values[:something]).to eq %w[val1 val2]
229
239
  end