blacklight 6.2.0 → 6.3.0

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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/.solr_wrapper +5 -0
  4. data/.travis.yml +3 -5
  5. data/Gemfile +3 -3
  6. data/VERSION +1 -1
  7. data/app/assets/javascripts/blacklight/core.js +19 -5
  8. data/app/helpers/blacklight/blacklight_helper_behavior.rb +48 -20
  9. data/app/helpers/blacklight/configuration_helper_behavior.rb +1 -1
  10. data/app/helpers/blacklight/url_helper_behavior.rb +2 -1
  11. data/app/presenters/blacklight/document_presenter.rb +58 -150
  12. data/app/presenters/blacklight/field_presenter.rb +31 -0
  13. data/app/presenters/blacklight/index_presenter.rb +69 -0
  14. data/app/presenters/blacklight/link_alternate_presenter.rb +29 -0
  15. data/app/presenters/blacklight/rendering/abstract_step.rb +24 -0
  16. data/app/presenters/blacklight/rendering/helper_method.rb +23 -0
  17. data/app/presenters/blacklight/rendering/join.rb +16 -0
  18. data/app/presenters/blacklight/rendering/link_to_facet.rb +35 -0
  19. data/app/presenters/blacklight/rendering/microdata.rb +17 -0
  20. data/app/presenters/blacklight/rendering/pipeline.rb +32 -0
  21. data/app/presenters/blacklight/rendering/terminator.rb +9 -0
  22. data/app/presenters/blacklight/show_presenter.rb +93 -0
  23. data/app/services/blacklight/field_retriever.rb +58 -0
  24. data/app/views/catalog/_document_default.atom.builder +2 -3
  25. data/app/views/catalog/_document_default.rss.builder +2 -2
  26. data/app/views/kaminari/blacklight/_next_page.html.erb +9 -3
  27. data/app/views/kaminari/blacklight/_prev_page.html.erb +10 -3
  28. data/lib/blacklight/configuration.rb +15 -3
  29. data/lib/blacklight/configuration/null_field.rb +13 -0
  30. data/lib/blacklight/configuration/view_config.rb +6 -0
  31. data/lib/generators/blacklight/templates/catalog_controller.rb +1 -1
  32. data/lib/generators/blacklight/templates/config/blacklight.yml +1 -1
  33. data/lib/generators/blacklight/templates/config/jetty.yml +1 -1
  34. data/spec/controllers/alternate_controller_spec.rb +2 -2
  35. data/spec/controllers/application_controller_spec.rb +1 -1
  36. data/spec/controllers/blacklight/facet_spec.rb +3 -3
  37. data/spec/controllers/blacklight/search_fields_spec.rb +7 -7
  38. data/spec/controllers/blacklight/search_helper_spec.rb +44 -44
  39. data/spec/controllers/blacklight/suggest_search_spec.rb +1 -1
  40. data/spec/controllers/bookmarks_controller_spec.rb +6 -6
  41. data/spec/controllers/catalog_controller_spec.rb +125 -125
  42. data/spec/controllers/saved_searches_controller_spec.rb +4 -9
  43. data/spec/controllers/search_history_controller_spec.rb +3 -6
  44. data/spec/controllers/suggest_controller_spec.rb +2 -2
  45. data/spec/features/alternate_controller_spec.rb +3 -3
  46. data/spec/features/bookmarks_spec.rb +6 -6
  47. data/spec/features/did_you_mean_spec.rb +10 -10
  48. data/spec/features/facets_spec.rb +4 -4
  49. data/spec/features/record_view_spec.rb +4 -4
  50. data/spec/features/saved_searches_spec.rb +4 -4
  51. data/spec/features/search_context_spec.rb +4 -4
  52. data/spec/features/search_filters_spec.rb +10 -10
  53. data/spec/features/search_formats_spec.rb +2 -2
  54. data/spec/features/search_history_spec.rb +5 -5
  55. data/spec/features/search_pagination_spec.rb +4 -4
  56. data/spec/features/search_results_spec.rb +7 -7
  57. data/spec/features/search_sort_spec.rb +2 -2
  58. data/spec/features/search_spec.rb +6 -6
  59. data/spec/helpers/blacklight_helper_spec.rb +105 -65
  60. data/spec/helpers/catalog_helper_spec.rb +36 -36
  61. data/spec/helpers/configuration_helper_spec.rb +28 -28
  62. data/spec/helpers/facets_helper_spec.rb +39 -39
  63. data/spec/helpers/hash_as_hidden_fields_spec.rb +1 -1
  64. data/spec/helpers/render_constraints_helper_spec.rb +1 -1
  65. data/spec/helpers/search_history_constraints_helper_spec.rb +7 -7
  66. data/spec/helpers/url_helper_spec.rb +20 -17
  67. data/spec/lib/blacklight/search_state_spec.rb +2 -2
  68. data/spec/lib/blacklight/utils_spec.rb +15 -15
  69. data/spec/lib/blacklight_spec.rb +1 -1
  70. data/spec/lib/tasks/blacklight_task_spec.rb +1 -1
  71. data/spec/models/blacklight/configurable_spec.rb +3 -3
  72. data/spec/models/blacklight/configuration_spec.rb +52 -52
  73. data/spec/models/blacklight/document_spec.rb +10 -10
  74. data/spec/models/blacklight/facet_paginator_spec.rb +5 -5
  75. data/spec/models/blacklight/search_builder_spec.rb +34 -34
  76. data/spec/models/blacklight/user_spec.rb +4 -4
  77. data/spec/models/bookmark_spec.rb +5 -5
  78. data/spec/models/record_mailer_spec.rb +11 -11
  79. data/spec/models/search_spec.rb +1 -1
  80. data/spec/models/solr_document_spec.rb +4 -4
  81. data/spec/presenters/document_presenter_spec.rb +94 -50
  82. data/spec/presenters/index_presenter_spec.rb +147 -0
  83. data/spec/presenters/pipeline_spec.rb +28 -0
  84. data/spec/presenters/show_presenter_spec.rb +287 -0
  85. data/spec/routing/catalog_routing_spec.rb +11 -11
  86. data/spec/spec_helper.rb +10 -1
  87. data/spec/support/backport_test.rb +38 -0
  88. data/spec/test_app_templates/Gemfile.extra +2 -10
  89. data/spec/views/_user_util_links.html.erb_spec.rb +1 -1
  90. data/spec/views/catalog/_constraints.html.erb_spec.rb +3 -3
  91. data/spec/views/catalog/_constraints_element.html.erb_spec.rb +5 -5
  92. data/spec/views/catalog/_document.html.erb_spec.rb +2 -2
  93. data/spec/views/catalog/_document_list.html.erb_spec.rb +1 -1
  94. data/spec/views/catalog/_facet_layout.html.erb_spec.rb +4 -4
  95. data/spec/views/catalog/_facets.html.erb_spec.rb +4 -4
  96. data/spec/views/catalog/_index_default.erb_spec.rb +5 -4
  97. data/spec/views/catalog/_index_header_default.html.erb_spec.rb +4 -3
  98. data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +3 -3
  99. data/spec/views/catalog/_search_header.erb_spec.rb +1 -1
  100. data/spec/views/catalog/_show_default.erb_spec.rb +6 -5
  101. data/spec/views/catalog/_show_sidebar.erb_spec.rb +2 -1
  102. data/spec/views/catalog/_show_tools.html.erb_spec.rb +8 -8
  103. data/spec/views/catalog/_sort_and_per_page.html.erb_spec.rb +2 -2
  104. data/spec/views/catalog/_thumbnail_default.erb_spec.rb +3 -2
  105. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +3 -3
  106. data/spec/views/catalog/facet.html.erb_spec.rb +3 -3
  107. data/spec/views/catalog/index.atom.builder_spec.rb +15 -14
  108. data/spec/views/catalog/index.html.erb_spec.rb +3 -3
  109. data/spec/views/catalog/opensearch.xml.builder_spec.rb +1 -1
  110. data/spec/views/catalog/show.html.erb_spec.rb +5 -4
  111. data/tasks/blacklight.rake +1 -1
  112. metadata +25 -4
  113. data/config/jetty.yml +0 -13
@@ -23,7 +23,7 @@ describe Search do
23
23
 
24
24
  expect(@search).to be_saved
25
25
  end
26
- it "should be false when user_id is NULL or less than 1" do
26
+ it "is false when user_id is NULL or less than 1" do
27
27
  @search = Search.create
28
28
  expect(@search).not_to be_saved
29
29
  end
@@ -10,22 +10,22 @@ describe SolrDocument do
10
10
  end
11
11
 
12
12
  describe "new" do
13
- it "should take a Hash as the argument" do
13
+ it "takes a Hash as the argument" do
14
14
  expect { SolrDocument.new(:id => 1) }.not_to raise_error
15
15
  end
16
16
  end
17
17
 
18
18
  describe "access methods" do
19
19
 
20
- it "should have the right value for title_display" do
20
+ it "has the right value for title_display" do
21
21
  expect(@solrdoc[:title_display]).not_to be_nil
22
22
  end
23
23
 
24
- it "should have the right value for format" do
24
+ it "has the right value for format" do
25
25
  expect(@solrdoc[:format][0]).to eq 'Book'
26
26
  end
27
27
 
28
- it "should provide the item's solr id" do
28
+ it "provides the item's solr id" do
29
29
  expect(@solrdoc.id).to eq '00282214'
30
30
  end
31
31
  end
@@ -3,11 +3,13 @@ require 'spec_helper'
3
3
 
4
4
  describe Blacklight::DocumentPresenter do
5
5
  include Capybara::RSpecMatchers
6
+ let(:show_presenter) { Blacklight::ShowPresenter.new(document, request_context, config) }
7
+ let(:index_presenter) { Blacklight::IndexPresenter.new(document, request_context, config) }
6
8
  let(:request_context) { double }
7
9
  let(:config) { Blacklight::Configuration.new }
8
10
 
9
11
  subject { presenter }
10
- let(:presenter) { Blacklight::DocumentPresenter.new(document, request_context, config) }
12
+ let(:presenter) { described_class.new(document, request_context, config) }
11
13
  let(:parameter_class) { ActionController::Parameters }
12
14
  let(:params) { parameter_class.new }
13
15
  let(:search_state) { Blacklight::SearchState.new(params, config) }
@@ -22,6 +24,7 @@ describe Blacklight::DocumentPresenter do
22
24
 
23
25
  before do
24
26
  allow(request_context).to receive(:search_state).and_return(search_state)
27
+ allow(Deprecation).to receive(:warn)
25
28
  end
26
29
 
27
30
  describe "link_rel_alternates" do
@@ -50,6 +53,7 @@ describe Blacklight::DocumentPresenter do
50
53
  allow(request_context).to receive(:polymorphic_url) do |_, opts|
51
54
  "url.#{opts[:format]}"
52
55
  end
56
+ allow(request_context).to receive(:show_presenter).and_return(show_presenter)
53
57
  end
54
58
 
55
59
  let(:document) { MockDocument.new(id: "MOCK_ID1") }
@@ -112,78 +116,85 @@ describe Blacklight::DocumentPresenter do
112
116
  config.add_index_field 'with_default', default: 'value'
113
117
  end
114
118
  end
115
- it "should check for an explicit value" do
119
+ before do
120
+ allow(request_context).to receive(:index_presenter).and_return(index_presenter)
121
+ end
122
+ it "checks for an explicit value" do
116
123
  value = subject.render_index_field_value 'asdf', :value => 'asdf'
117
124
  expect(value).to eq 'asdf'
118
125
  end
119
126
 
120
- it "should check for a helper method to call" do
127
+ it "checks for a helper method to call" do
121
128
  allow(request_context).to receive(:render_asdf_index_field).and_return('custom asdf value')
122
129
  value = subject.render_index_field_value 'asdf'
123
130
  expect(value).to eq 'custom asdf value'
124
131
  end
125
132
 
126
- it "should check for a link_to_search" do
133
+ it "checks for a link_to_search" do
127
134
  allow(request_context).to receive(:search_action_path).with('f' => { 'link_to_search_true' => ['x'] }).and_return('/foo')
128
135
  allow(request_context).to receive(:link_to).with("x", '/foo').and_return('bar')
129
136
  value = subject.render_index_field_value 'link_to_search_true'
130
137
  expect(value).to eq 'bar'
131
138
  end
132
139
 
133
- it "should check for a link_to_search with a field name" do
140
+ it "checks for a link_to_search with a field name" do
134
141
  allow(request_context).to receive(:search_action_path).with('f' => { 'some_field' => ['x'] }).and_return('/foo')
135
142
  allow(request_context).to receive(:link_to).with("x", '/foo').and_return('bar')
136
143
  value = subject.render_index_field_value 'link_to_search_named'
137
144
  expect(value).to eq 'bar'
138
145
  end
139
146
 
140
- it "should gracefully handle when no highlight field is available" do
141
- allow(document).to receive(:has_highlight_field?).and_return(false)
142
- value = subject.render_index_field_value 'highlight'
143
- expect(value).to be_blank
147
+ context "when no highlight field is available" do
148
+ before do
149
+ allow(document).to receive(:has_highlight_field?).and_return(false)
150
+ end
151
+ let(:value) { subject.render_index_field_value 'highlight' }
152
+ it "is blank" do
153
+ expect(value).to be_blank
154
+ end
144
155
  end
145
156
 
146
- it "should check for a highlighted field" do
157
+ it "checks for a highlighted field" do
147
158
  allow(document).to receive(:has_highlight_field?).and_return(true)
148
159
  allow(document).to receive(:highlight_field).with('highlight').and_return(['<em>highlight</em>'.html_safe])
149
160
  value = subject.render_index_field_value 'highlight'
150
161
  expect(value).to eq '<em>highlight</em>'
151
162
  end
152
163
 
153
- it "should check the document field value" do
164
+ it "checks the document field value" do
154
165
  value = subject.render_index_field_value 'qwer'
155
166
  expect(value).to eq 'document qwer value'
156
167
  end
157
168
 
158
- it "should work with index fields that aren't explicitly defined" do
169
+ it "works with index fields that aren't explicitly defined" do
159
170
  value = subject.render_index_field_value 'mnbv'
160
171
  expect(value).to eq 'document mnbv value'
161
172
  end
162
173
 
163
- it "should call an accessor on the solr document" do
174
+ it "calls an accessor on the solr document" do
164
175
  allow(document).to receive_messages(solr_doc_accessor: "123")
165
176
  value = subject.render_index_field_value 'solr_doc_accessor'
166
177
  expect(value).to eq "123"
167
178
  end
168
179
 
169
- it "should call an explicit accessor on the solr document" do
180
+ it "calls an explicit accessor on the solr document" do
170
181
  allow(document).to receive_messages(solr_doc_accessor: "123")
171
182
  value = subject.render_index_field_value 'explicit_accessor'
172
183
  expect(value).to eq "123"
173
184
  end
174
185
 
175
- it "should call an accessor on the solr document with the field as an argument" do
186
+ it "calls an accessor on the solr document with the field as an argument" do
176
187
  allow(document).to receive(:solr_doc_accessor_with_arg).with('explicit_accessor_with_arg').and_return("123")
177
188
  value = subject.render_index_field_value 'explicit_accessor_with_arg'
178
189
  expect(value).to eq "123"
179
190
  end
180
191
 
181
- it "should support solr field configuration" do
192
+ it "supports solr field configuration" do
182
193
  value = subject.render_index_field_value 'alias'
183
194
  expect(value).to eq "document qwer value"
184
195
  end
185
196
 
186
- it "should support default values in the field configuration" do
197
+ it "supports default values in the field configuration" do
187
198
  value = subject.render_index_field_value 'with_default'
188
199
  expect(value).to eq "value"
189
200
  end
@@ -204,6 +215,10 @@ describe Blacklight::DocumentPresenter do
204
215
  end
205
216
  end
206
217
 
218
+ before do
219
+ allow(request_context).to receive(:show_presenter).and_return(show_presenter)
220
+ end
221
+
207
222
  it 'html-escapes values' do
208
223
  value = subject.render_document_show_field_value 'asdf', value: '<b>val1</b>'
209
224
  expect(value).to eq '&lt;b&gt;val1&lt;/b&gt;'
@@ -219,39 +234,43 @@ describe Blacklight::DocumentPresenter do
219
234
  expect(value).to eq 'a, b, and c'
220
235
  end
221
236
 
222
- it "should check for an explicit value" do
237
+ it "checks for an explicit value" do
223
238
  expect(request_context).to_not receive(:render_asdf_document_show_field)
224
239
  value = subject.render_document_show_field_value 'asdf', :value => 'val1'
225
240
  expect(value).to eq 'val1'
226
241
  end
227
242
 
228
- it "should check for a helper method to call" do
243
+ it "checks for a helper method to call" do
229
244
  allow(request_context).to receive(:render_asdf_document_show_field).and_return('custom asdf value')
230
245
  value = subject.render_document_show_field_value 'asdf'
231
246
  expect(value).to eq 'custom asdf value'
232
247
  end
233
248
 
234
- it "should check for a link_to_search" do
249
+ it "checks for a link_to_search" do
235
250
  allow(request_context).to receive(:search_action_path).and_return('/foo')
236
251
  allow(request_context).to receive(:link_to).with("x", '/foo').and_return('bar')
237
252
  value = subject.render_document_show_field_value 'link_to_search_true'
238
253
  expect(value).to eq 'bar'
239
254
  end
240
255
 
241
- it "should check for a link_to_search with a field name" do
256
+ it "checks for a link_to_search with a field name" do
242
257
  allow(request_context).to receive(:search_action_path).and_return('/foo')
243
258
  allow(request_context).to receive(:link_to).with("x", '/foo').and_return('bar')
244
259
  value = subject.render_document_show_field_value 'link_to_search_named'
245
260
  expect(value).to eq 'bar'
246
261
  end
247
262
 
248
- it "should gracefully handle when no highlight field is available" do
249
- allow(document).to receive(:has_highlight_field?).and_return(false)
250
- value = subject.render_document_show_field_value 'highlight'
251
- expect(value).to be_blank
263
+ context "when no highlight field is available" do
264
+ before do
265
+ allow(document).to receive(:has_highlight_field?).and_return(false)
266
+ end
267
+ let(:value) { subject.render_document_show_field_value 'highlight' }
268
+ it "is blank" do
269
+ expect(value).to be_blank
270
+ end
252
271
  end
253
272
 
254
- it "should check for a highlighted field" do
273
+ it "checks for a highlighted field" do
255
274
  allow(document).to receive(:has_highlight_field?).and_return(true)
256
275
  allow(document).to receive(:highlight_field).with('highlight').and_return(['<em>highlight</em>'.html_safe])
257
276
  value = subject.render_document_show_field_value 'highlight'
@@ -265,68 +284,80 @@ describe Blacklight::DocumentPresenter do
265
284
  expect(value).to eq '<em>highlight</em> and <em>other highlight</em>'
266
285
  end
267
286
 
268
- it "should check the document field value" do
287
+ it "checks the document field value" do
269
288
  value = subject.render_document_show_field_value 'qwer'
270
289
  expect(value).to eq 'document qwer value'
271
290
  end
272
291
 
273
- it "should work with show fields that aren't explicitly defined" do
292
+ it "works with show fields that aren't explicitly defined" do
274
293
  value = subject.render_document_show_field_value 'mnbv'
275
294
  expect(value).to eq 'document mnbv value'
276
295
  end
277
296
 
278
- it "should call an accessor on the solr document" do
297
+ it "calls an accessor on the solr document" do
279
298
  allow(document).to receive_messages(solr_doc_accessor: "123")
280
299
  value = subject.render_document_show_field_value 'solr_doc_accessor'
281
300
  expect(value).to eq "123"
282
301
  end
283
302
 
284
- it "should call an explicit accessor on the solr document" do
303
+ it "calls an explicit accessor on the solr document" do
285
304
  allow(document).to receive_messages(solr_doc_accessor: "123")
286
305
  value = subject.render_document_show_field_value 'explicit_accessor'
287
306
  expect(value).to eq "123"
288
307
  end
289
308
 
290
- it "should call an explicit array-style accessor on the solr document" do
309
+ it "calls an explicit array-style accessor on the solr document" do
291
310
  allow(document).to receive_message_chain(:solr_doc_accessor, some_method: "123")
292
311
  value = subject.render_document_show_field_value 'explicit_array_accessor'
293
312
  expect(value).to eq "123"
294
313
  end
295
314
 
296
- it "should call an accessor on the solr document with the field as an argument" do
315
+ it "calls an accessor on the solr document with the field as an argument" do
297
316
  allow(document).to receive(:solr_doc_accessor_with_arg).with('explicit_accessor_with_arg').and_return("123")
298
317
  value = subject.render_document_show_field_value 'explicit_accessor_with_arg'
299
318
  expect(value).to eq "123"
300
319
  end
301
320
  end
302
321
  describe "render_field_value" do
303
- it "should join and html-safe values" do
322
+ before do
323
+ expect(Deprecation).to receive(:warn)
324
+ end
325
+ it "joins and html-safe values" do
304
326
  expect(subject.render_field_value(['a', 'b'])).to eq "a and b"
305
327
  end
306
328
 
307
- it "should use the field_config.separator_options from the Blacklight field configuration" do
308
- expect(subject.render_field_value(['c', 'd'], double(separator: nil, itemprop: nil, separator_options: { two_words_connector: '; '}))).to eq "c; d"
329
+ context "with separator_options" do
330
+ let(:field_config) { double(to_h: { field: 'foo', separator: nil, itemprop: nil, separator_options: { two_words_connector: '; '}}) }
331
+ it "uses the field_config.separator_options" do
332
+ expect(subject.render_field_value(['c', 'd'], field_config)).to eq "c; d"
333
+ end
309
334
  end
310
335
 
311
- it "should include schema.org itemprop attributes" do
312
- expect(subject.render_field_value('a', double(separator: nil, itemprop: 'some-prop', separator_options: nil))).to have_selector("span[@itemprop='some-prop']", :text => "a")
336
+ context "with itemprop attributes" do
337
+ let(:field_config) { double(to_h: { field: 'bar', separator: nil, itemprop: 'some-prop', separator_options: nil }) }
338
+ it "includes schema.org itemprop attributes" do
339
+ expect(subject.render_field_value('a', field_config)).to have_selector("span[@itemprop='some-prop']", :text => "a")
340
+ end
313
341
  end
314
342
  end
315
343
 
316
344
  describe "#document_heading" do
317
- it "should fallback to an id" do
318
- allow(document).to receive(:id).and_return "xyz"
345
+ before do
346
+ allow(request_context).to receive(:show_presenter).and_return(show_presenter)
347
+ end
348
+ it "falls back to an id" do
349
+ allow(document).to receive(:[]).with('id').and_return "xyz"
319
350
  expect(subject.document_heading).to eq document.id
320
351
  end
321
352
 
322
- it "should return the value of the field" do
353
+ it "returns the value of the field" do
323
354
  config.show.title_field = :x
324
355
  allow(document).to receive(:has?).with(:x).and_return(true)
325
356
  allow(document).to receive(:[]).with(:x).and_return("value")
326
357
  expect(subject.document_heading).to eq "value"
327
358
  end
328
359
 
329
- it "should return the first present value" do
360
+ it "returns the first present value" do
330
361
  config.show.title_field = [:x, :y]
331
362
  allow(document).to receive(:has?).with(:x).and_return(false)
332
363
  allow(document).to receive(:has?).with(:y).and_return(true)
@@ -336,28 +367,41 @@ describe Blacklight::DocumentPresenter do
336
367
  end
337
368
 
338
369
  describe "#document_show_html_title" do
339
- it "should fallback to an id" do
340
- allow(document).to receive(:id).and_return "xyz"
370
+ before do
371
+ allow(request_context).to receive(:show_presenter).and_return(show_presenter)
372
+ end
373
+ it "falls back to an id" do
374
+ allow(document).to receive(:[]).with('id').and_return "xyz"
341
375
  expect(subject.document_show_html_title).to eq document.id
342
376
  end
343
377
 
344
- it "should return the value of the field" do
378
+ it "returns the value of the field" do
345
379
  config.show.html_title_field = :x
346
380
  allow(document).to receive(:has?).with(:x).and_return(true)
347
- allow(document).to receive(:[]).with(:x).and_return("value")
381
+ allow(document).to receive(:fetch).with(:x, nil).and_return("value")
348
382
  expect(subject.document_show_html_title).to eq "value"
349
383
  end
350
384
 
351
- it "should return the first present value" do
385
+ it "returns the first present value" do
352
386
  config.show.html_title_field = [:x, :y]
353
387
  allow(document).to receive(:has?).with(:x).and_return(false)
354
388
  allow(document).to receive(:has?).with(:y).and_return(true)
355
- allow(document).to receive(:[]).with(:y).and_return("value")
389
+ allow(document).to receive(:fetch).with(:y, nil).and_return("value")
356
390
  expect(subject.document_show_html_title).to eq "value"
357
391
  end
358
392
  end
359
393
 
360
394
  describe '#get_field_values' do
395
+ let(:field_config) { double }
396
+ let(:options) { double }
397
+ it "calls field_values" do
398
+ expect(Deprecation).to receive(:warn)
399
+ expect(presenter).to receive(:field_values).with(field_config, options)
400
+ presenter.get_field_values('name', field_config, options)
401
+ end
402
+ end
403
+
404
+ describe '#field_values' do
361
405
  context 'for a field with the helper_method option' do
362
406
  let(:field_name) { 'field_with_helper' }
363
407
  let(:field_config) { config.add_facet_field 'field_with_helper', helper_method: 'render_field_with_helper' }
@@ -366,19 +410,19 @@ describe Blacklight::DocumentPresenter do
366
410
  document['field_with_helper'] = 'value'
367
411
  end
368
412
 
369
- it "should check call the helper method with arguments" do
413
+ it "checks call the helper method with arguments" do
370
414
  allow(request_context).to receive(:render_field_with_helper) do |*args|
371
415
  args.first
372
416
  end
373
417
 
374
418
  render_options = { a: 1 }
375
419
 
376
- options = subject.get_field_values field_name, field_config, a: 1
420
+ options = subject.field_values field_config, a: 1
377
421
 
378
422
  expect(options).to include :document, :field, :value, :config, :a
379
423
  expect(options[:document]).to eq document
380
424
  expect(options[:field]).to eq 'field_with_helper'
381
- expect(options[:value]).to eq 'value'
425
+ expect(options[:value]).to eq ['value']
382
426
  expect(options[:config]).to eq field_config
383
427
  expect(options[:a]).to eq 1
384
428
  end
@@ -0,0 +1,147 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ describe Blacklight::IndexPresenter do
5
+ include Capybara::RSpecMatchers
6
+ let(:request_context) { double }
7
+ let(:config) { Blacklight::Configuration.new }
8
+
9
+ subject { presenter }
10
+ let(:presenter) { described_class.new(document, request_context, config) }
11
+ let(:parameter_class) { ActionController::Parameters }
12
+ let(:params) { parameter_class.new }
13
+ let(:search_state) { Blacklight::SearchState.new(params, config) }
14
+
15
+ let(:document) do
16
+ SolrDocument.new(id: 1,
17
+ 'link_to_search_true' => 'x',
18
+ 'link_to_search_named' => 'x',
19
+ 'qwer' => 'document qwer value',
20
+ 'mnbv' => 'document mnbv value')
21
+ end
22
+
23
+ before do
24
+ allow(request_context).to receive(:search_state).and_return(search_state)
25
+ end
26
+
27
+ describe "field_value" do
28
+ let(:config) do
29
+ Blacklight::Configuration.new.configure do |config|
30
+ config.add_index_field 'qwer'
31
+ config.add_index_field 'asdf', :helper_method => :render_asdf_index_field
32
+ config.add_index_field 'link_to_search_true', :link_to_search => true
33
+ config.add_index_field 'link_to_search_named', :link_to_search => :some_field
34
+ config.add_index_field 'highlight', :highlight => true
35
+ config.add_index_field 'solr_doc_accessor', :accessor => true
36
+ config.add_index_field 'explicit_accessor', :accessor => :solr_doc_accessor
37
+ config.add_index_field 'explicit_accessor_with_arg', :accessor => :solr_doc_accessor_with_arg
38
+ config.add_index_field 'alias', field: 'qwer'
39
+ config.add_index_field 'with_default', default: 'value'
40
+ end
41
+ end
42
+ it "checks for an explicit value" do
43
+ value = subject.field_value 'asdf', :value => 'asdf'
44
+ expect(value).to eq 'asdf'
45
+ end
46
+
47
+ it "checks for a helper method to call" do
48
+ allow(request_context).to receive(:render_asdf_index_field).and_return('custom asdf value')
49
+ value = subject.field_value 'asdf'
50
+ expect(value).to eq 'custom asdf value'
51
+ end
52
+
53
+ it "checks for a link_to_search" do
54
+ allow(request_context).to receive(:search_action_path).with('f' => { 'link_to_search_true' => ['x'] }).and_return('/foo')
55
+ allow(request_context).to receive(:link_to).with("x", '/foo').and_return('bar')
56
+ value = subject.field_value 'link_to_search_true'
57
+ expect(value).to eq 'bar'
58
+ end
59
+
60
+ it "checks for a link_to_search with a field name" do
61
+ allow(request_context).to receive(:search_action_path).with('f' => { 'some_field' => ['x'] }).and_return('/foo')
62
+ allow(request_context).to receive(:link_to).with("x", '/foo').and_return('bar')
63
+ value = subject.field_value 'link_to_search_named'
64
+ expect(value).to eq 'bar'
65
+ end
66
+
67
+ it "gracefully handles when no highlight field is available" do
68
+ allow(document).to receive(:has_highlight_field?).and_return(false)
69
+ value = subject.field_value 'highlight'
70
+ expect(value).to be_blank
71
+ end
72
+
73
+ it "checks for a highlighted field" do
74
+ allow(document).to receive(:has_highlight_field?).and_return(true)
75
+ allow(document).to receive(:highlight_field).with('highlight').and_return(['<em>highlight</em>'.html_safe])
76
+ value = subject.field_value 'highlight'
77
+ expect(value).to eq '<em>highlight</em>'
78
+ end
79
+
80
+ it "checks the document field value" do
81
+ value = subject.field_value 'qwer'
82
+ expect(value).to eq 'document qwer value'
83
+ end
84
+
85
+ it "works with index fields that aren't explicitly defined" do
86
+ value = subject.field_value 'mnbv'
87
+ expect(value).to eq 'document mnbv value'
88
+ end
89
+
90
+ it "calls an accessor on the solr document" do
91
+ allow(document).to receive_messages(solr_doc_accessor: "123")
92
+ value = subject.field_value 'solr_doc_accessor'
93
+ expect(value).to eq "123"
94
+ end
95
+
96
+ it "calls an explicit accessor on the solr document" do
97
+ allow(document).to receive_messages(solr_doc_accessor: "123")
98
+ value = subject.field_value 'explicit_accessor'
99
+ expect(value).to eq "123"
100
+ end
101
+
102
+ it "calls an accessor on the solr document with the field as an argument" do
103
+ allow(document).to receive(:solr_doc_accessor_with_arg).with('explicit_accessor_with_arg').and_return("123")
104
+ value = subject.field_value 'explicit_accessor_with_arg'
105
+ expect(value).to eq "123"
106
+ end
107
+
108
+ it "supports solr field configuration" do
109
+ value = subject.field_value 'alias'
110
+ expect(value).to eq "document qwer value"
111
+ end
112
+
113
+ it "supports default values in the field configuration" do
114
+ value = subject.field_value 'with_default'
115
+ expect(value).to eq "value"
116
+ end
117
+ end
118
+
119
+ describe '#field_values' do
120
+ context 'for a field with the helper_method option' do
121
+ let(:field_name) { 'field_with_helper' }
122
+ let(:field_config) { config.add_facet_field 'field_with_helper', helper_method: 'render_field_with_helper' }
123
+
124
+ before do
125
+ document['field_with_helper'] = 'value'
126
+ end
127
+
128
+ it "checks call the helper method with arguments" do
129
+ allow(request_context).to receive(:render_field_with_helper) do |*args|
130
+ args.first
131
+ end
132
+
133
+ render_options = { a: 1 }
134
+
135
+ options = subject.send(:field_values, field_config, a: 1)
136
+
137
+ expect(options).to include :document, :field, :value, :config, :a
138
+ expect(options[:document]).to eq document
139
+ expect(options[:field]).to eq 'field_with_helper'
140
+ expect(options[:value]).to eq ['value']
141
+ expect(options[:config]).to eq field_config
142
+ expect(options[:a]).to eq 1
143
+ end
144
+ end
145
+ end
146
+ end
147
+