blacklight 6.2.0 → 6.3.0

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