blacklight 5.7.2 → 5.8.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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -3
  3. data/Gemfile +1 -4
  4. data/VERSION +1 -1
  5. data/app/assets/stylesheets/blacklight/_catalog.css.scss +38 -1
  6. data/app/assets/stylesheets/blacklight/_facets.css.scss +10 -0
  7. data/app/assets/stylesheets/blacklight/_layout.css.scss +6 -0
  8. data/app/controllers/bookmarks_controller.rb +3 -163
  9. data/app/helpers/blacklight/blacklight_helper_behavior.rb +18 -186
  10. data/app/helpers/blacklight/catalog_helper_behavior.rb +36 -2
  11. data/app/helpers/blacklight/component_helper_behavior.rb +77 -0
  12. data/app/helpers/blacklight/configuration_helper_behavior.rb +30 -21
  13. data/app/helpers/blacklight/render_partials_helper.rb +185 -0
  14. data/app/helpers/blacklight/url_helper_behavior.rb +24 -3
  15. data/app/helpers/component_helper.rb +3 -0
  16. data/app/views/_user_util_links.html.erb +2 -15
  17. data/app/views/blacklight/nav/_bookmark.html.erb +4 -0
  18. data/app/views/blacklight/nav/_saved_searches.html.erb +1 -0
  19. data/app/views/blacklight/nav/_search_history.html.erb +1 -0
  20. data/app/views/bookmarks/_tools.html.erb +6 -9
  21. data/app/views/bookmarks/index.html.erb +1 -1
  22. data/app/views/catalog/_bookmark_control.html.erb +8 -8
  23. data/app/views/catalog/_constraints_element.html.erb +1 -1
  24. data/app/views/catalog/_document_action.html.erb +4 -0
  25. data/app/views/catalog/_email_form.html.erb +1 -1
  26. data/app/views/catalog/_facet_limit.html.erb +1 -1
  27. data/app/views/catalog/_index_header_default.html.erb +5 -6
  28. data/app/views/catalog/_per_page_widget.html.erb +3 -1
  29. data/app/views/catalog/_results_pagination.html.erb +1 -1
  30. data/app/views/catalog/_search_form.html.erb +5 -8
  31. data/app/views/catalog/_show_more_like_this.html.erb +2 -2
  32. data/app/views/catalog/_show_tools.html.erb +5 -34
  33. data/app/views/catalog/_sms_form.html.erb +1 -1
  34. data/app/views/catalog/_sort_and_per_page.html.erb +2 -6
  35. data/app/views/catalog/_sort_widget.html.erb +1 -1
  36. data/app/views/catalog/_zero_results.html.erb +2 -2
  37. data/app/views/catalog/citation.js.erb +1 -1
  38. data/app/views/catalog/email_sent.html.erb +2 -9
  39. data/app/views/catalog/email_success.html.erb +9 -0
  40. data/app/views/catalog/sms_sent.html.erb +2 -9
  41. data/app/views/catalog/sms_success.html.erb +9 -0
  42. data/app/views/kaminari/blacklight/_gap.html.erb +1 -1
  43. data/app/views/kaminari/blacklight/_page.html.erb +5 -1
  44. data/app/views/shared/_header_navbar.html.erb +1 -1
  45. data/config/locales/blacklight.en.yml +1 -1
  46. data/config/locales/blacklight.es.yml +1 -1
  47. data/config/locales/blacklight.fr.yml +1 -1
  48. data/config/locales/blacklight.pt-BR.yml +1 -1
  49. data/lib/blacklight.rb +3 -0
  50. data/lib/blacklight/base.rb +0 -1
  51. data/lib/blacklight/bookmarks.rb +135 -0
  52. data/lib/blacklight/catalog.rb +58 -77
  53. data/lib/blacklight/catalog/component_configuration.rb +99 -0
  54. data/lib/blacklight/configuration.rb +82 -4
  55. data/lib/blacklight/configuration/tool_config.rb +4 -0
  56. data/lib/blacklight/controller.rb +5 -1
  57. data/lib/blacklight/document_presenter.rb +17 -8
  58. data/lib/blacklight/request_builders.rb +136 -4
  59. data/lib/blacklight/routes.rb +5 -0
  60. data/lib/blacklight/solr_helper.rb +90 -208
  61. data/lib/blacklight/solr_repository.rb +69 -0
  62. data/lib/blacklight/token_based_user.rb +58 -0
  63. data/lib/blacklight/utils.rb +13 -1
  64. data/lib/generators/blacklight/install_generator.rb +6 -7
  65. data/spec/controllers/alternate_controller_spec.rb +19 -0
  66. data/spec/controllers/catalog_controller_spec.rb +89 -4
  67. data/spec/features/alternate_controller_spec.rb +0 -1
  68. data/spec/features/bookmarks_spec.rb +31 -6
  69. data/spec/features/search_results_spec.rb +11 -0
  70. data/spec/features/search_spec.rb +5 -0
  71. data/spec/helpers/blacklight_helper_spec.rb +49 -8
  72. data/spec/helpers/catalog_helper_spec.rb +56 -8
  73. data/spec/helpers/configuration_helper_spec.rb +5 -5
  74. data/spec/helpers/url_helper_spec.rb +15 -8
  75. data/spec/lib/blacklight/catalog/component_configuration_spec.rb +29 -0
  76. data/spec/lib/blacklight/configuration_spec.rb +15 -0
  77. data/spec/lib/blacklight/solr_helper_spec.rb +44 -104
  78. data/spec/lib/blacklight/solr_repository_spec.rb +113 -0
  79. data/spec/lib/utils_spec.rb +27 -0
  80. data/spec/views/_user_util_links.html.erb_spec.rb +6 -3
  81. data/spec/views/catalog/_show_sidebar.erb_spec.rb +8 -2
  82. data/spec/views/catalog/_show_tools.html.erb_spec.rb +82 -0
  83. data/spec/views/catalog/_sort_and_per_page.html.erb_spec.rb +15 -1
  84. data/tasks/blacklight.rake +25 -1
  85. metadata +24 -2
@@ -0,0 +1,69 @@
1
+ module Blacklight
2
+ class SolrRepository
3
+ attr_accessor :blacklight_config, :blacklight_solr
4
+
5
+ # ActiveSupport::Benchmarkable requires a logger method
6
+ attr_accessor :logger
7
+
8
+ include ActiveSupport::Benchmarkable
9
+
10
+ def initialize blacklight_config
11
+ @blacklight_config = blacklight_config
12
+ end
13
+
14
+ ##
15
+ # Find a single solr document result (by id) using the document configuration
16
+ # @param [String] document's unique key value
17
+ # @param [Hash] additional solr query parameters
18
+ def find id, params = {}
19
+ solr_response = send_and_receive blacklight_config.document_solr_path || blacklight_config.solr_path, {qt: blacklight_config.document_solr_request_handler}.merge(blacklight_config.default_document_solr_params.merge(params).merge(blacklight_config.document_unique_id_param => id))
20
+ raise Blacklight::Exceptions::InvalidSolrID.new if solr_response.documents.empty?
21
+ solr_response
22
+ end
23
+
24
+ ##
25
+ # Execute a search query against solr
26
+ # @param [Hash] solr query parameters
27
+ def search params = {}
28
+ send_and_receive blacklight_config.solr_path, { qt: blacklight_config.qt }.merge(params)
29
+ end
30
+
31
+ ##
32
+ # Execute a solr query
33
+ # @see [RSolr::Client#send_and_receive]
34
+ # @overload find(solr_path, params)
35
+ # Execute a solr query at the given path with the parameters
36
+ # @param [String] solr path (defaults to blacklight_config.solr_path)
37
+ # @param [Hash] parameters for RSolr::Client#send_and_receive
38
+ # @overload find(params)
39
+ # @param [Hash] parameters for RSolr::Client#send_and_receive
40
+ # @return [Blacklight::SolrResponse] the solr response object
41
+ def send_and_receive(path, solr_params = {})
42
+ benchmark("Solr fetch", level: :debug) do
43
+ key = blacklight_config.http_method == :post ? :data : :params
44
+ res = blacklight_solr.send_and_receive(path, {key=>solr_params.to_hash, method:blacklight_config.http_method})
45
+
46
+ solr_response = blacklight_config.solr_response_model.new(res, solr_params, solr_document_model: blacklight_config.solr_document_model)
47
+
48
+ Rails.logger.debug("Solr query: #{solr_params.inspect}")
49
+ Rails.logger.debug("Solr response: #{solr_response.inspect}") if defined?(::BLACKLIGHT_VERBOSE_LOGGING) and ::BLACKLIGHT_VERBOSE_LOGGING
50
+ solr_response
51
+ end
52
+ rescue Errno::ECONNREFUSED => e
53
+ raise Blacklight::Exceptions::ECONNREFUSED.new("Unable to connect to Solr instance using #{blacklight_solr.inspect}")
54
+ end
55
+
56
+ def blacklight_solr
57
+ @blacklight_solr ||= RSolr.connect(blacklight_solr_config)
58
+ end
59
+
60
+ protected
61
+ def blacklight_solr_config
62
+ @blacklight_solr_config ||= Blacklight.solr_config
63
+ end
64
+
65
+ def logger
66
+ @logger ||= Rails.logger if defined? Rails
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,58 @@
1
+ module Blacklight::TokenBasedUser
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ helper_method :encrypt_user_id
6
+
7
+ rescue_from Blacklight::Exceptions::ExpiredSessionToken do
8
+ head :unauthorized
9
+ end
10
+
11
+ end
12
+
13
+ protected
14
+
15
+ def token_or_current_or_guest_user
16
+ token_user || current_or_guest_user
17
+ end
18
+
19
+ def token_user
20
+ @token_user ||= if params[:encrypted_user_id]
21
+ user_id = decrypt_user_id params[:encrypted_user_id]
22
+ User.find(user_id)
23
+ else
24
+ nil
25
+ end
26
+ end
27
+
28
+ # Used for #export action, with encrypted user_id.
29
+ def decrypt_user_id(encrypted_user_id)
30
+ user_id, timestamp = message_encryptor.decrypt_and_verify(encrypted_user_id)
31
+
32
+ if timestamp < 1.hour.ago
33
+ raise Blacklight::Exceptions::ExpiredSessionToken.new
34
+ end
35
+
36
+ user_id
37
+ end
38
+
39
+ # Used for #export action with encrypted user_id, available
40
+ # as a helper method for views.
41
+ def encrypt_user_id(user_id)
42
+ message_encryptor.encrypt_and_sign([user_id, Time.now])
43
+ end
44
+
45
+ ##
46
+ # This method provides Rails 3 compatibility to our message encryptor.
47
+ # When we drop support for Rails 3, we can just use the AS::KeyGenerator
48
+ # directly instead of this helper.
49
+ def export_secret_token salt
50
+ OpenSSL::PKCS5.pbkdf2_hmac_sha1(Blacklight.secret_key, salt, 1000, 64)
51
+ end
52
+
53
+ def message_encryptor
54
+ derived_secret = export_secret_token("encrypted user session key")
55
+ ActiveSupport::MessageEncryptor.new(derived_secret)
56
+ end
57
+
58
+ end
@@ -13,6 +13,10 @@ module Blacklight
13
13
  def [](key)
14
14
  send key
15
15
  end
16
+
17
+ def respond_to? method, *args
18
+ super(method, *args) || has_key?(method.to_sym)
19
+ end
16
20
  end
17
21
 
18
22
  ##
@@ -40,7 +44,11 @@ module Blacklight
40
44
  # @return [OpenStructWithHashAccess] a new instance of an OpenStructWithHashAccess
41
45
  def merge! other_hash
42
46
  @table.merge!((other_hash if other_hash.is_a? Hash) || other_hash.to_h)
43
- end
47
+ end
48
+
49
+ def deep_dup
50
+ self.class.new @table.deep_dup
51
+ end
44
52
  end
45
53
 
46
54
 
@@ -119,6 +127,10 @@ module Blacklight
119
127
  set_default_proc!
120
128
  end
121
129
 
130
+ def deep_dup
131
+ self.class.new self.nested_class, @table.deep_dup
132
+ end
133
+
122
134
  def select *args, &block
123
135
  self.class.new nested_class, to_h.select(*args, &block)
124
136
  end
@@ -55,14 +55,13 @@ module Blacklight
55
55
  end
56
56
 
57
57
  # Add Blacklight to the application controller
58
- def inject_blacklight_controller_behavior
59
- # prepend_file("app/controllers/application_controller.rb", "require 'blacklight/controller'\n\n")
58
+ def inject_blacklight_controller_behavior
60
59
  inject_into_class "app/controllers/application_controller.rb", "ApplicationController" do
61
- " # Adds a few additional behaviors into the application controller \n " +
62
- " include Blacklight::Controller\n" +
63
- " # Please be sure to impelement current_user and user_session. Blacklight depends on \n" +
64
- " # these methods in order to perform user specific actions. \n\n" +
65
- " layout 'blacklight'\n\n"
60
+ " # Adds a few additional behaviors into the application controller \n" +
61
+ " include Blacklight::Controller\n" +
62
+ " # Please be sure to impelement current_user and user_session. Blacklight depends on \n" +
63
+ " # these methods in order to perform user specific actions. \n\n" +
64
+ " layout 'blacklight'\n\n"
66
65
  end
67
66
  end
68
67
 
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe AlternateController do
4
+ describe "the search results tools" do
5
+ it "should inherit tools from CatalogController" do
6
+ expect(AlternateController.blacklight_config.index.document_actions).to have_key(:bookmark)
7
+ end
8
+
9
+ context "when deleting partials from the AlternateController" do
10
+ before do
11
+ AlternateController.blacklight_config.index.document_actions.delete(:bookmark)
12
+ end
13
+ it "should not affect the CatalogController" do
14
+ expect(AlternateController.blacklight_config.index.document_actions).to be_empty
15
+ expect(CatalogController.blacklight_config.index.document_actions).to have_key(:bookmark)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -28,6 +28,33 @@ describe CatalogController do
28
28
  expect(session[:history]).to be_empty
29
29
  end
30
30
 
31
+ describe "preferred view" do
32
+ it "should save the view choice" do
33
+ get :index, q: 'foo', view: 'gallery'
34
+ expect(session[:preferred_view]).to eq 'gallery'
35
+ end
36
+
37
+ context "when they have a preferred view" do
38
+ before do
39
+ session[:preferred_view] = 'gallery'
40
+ end
41
+
42
+ context "and no view is specified" do
43
+ it "should use the saved preference" do
44
+ get :index, q: 'foo'
45
+ expect(controller.params[:view]).to eq 'gallery'
46
+ end
47
+ end
48
+
49
+ context "and a view is specified" do
50
+ it "should use the saved preference" do
51
+ get :index, q: 'foo', view: 'list'
52
+ expect(controller.params[:view]).to eq 'list'
53
+ end
54
+ end
55
+ end
56
+ end
57
+
31
58
  # check each user manipulated parameter
32
59
  it "should have docs and facets for query with results", :integration => true do
33
60
  get :index, q: user_query
@@ -425,9 +452,9 @@ describe CatalogController do
425
452
  expect(request.flash[:error]).to be_nil
426
453
  expect(request).to redirect_to(catalog_path(doc_id))
427
454
  end
428
- it "should render email_sent for XHR requests" do
455
+ it "should render email_success for XHR requests" do
429
456
  xhr :post, :email, :id => doc_id, :to => 'test_email@projectblacklight.org'
430
- expect(request).to render_template 'email_sent'
457
+ expect(request).to render_template 'email_success'
431
458
  expect(request.flash[:success]).to eq "Email Sent"
432
459
  end
433
460
  end
@@ -465,9 +492,9 @@ describe CatalogController do
465
492
  expect(request).to redirect_to(catalog_path(doc_id))
466
493
  end
467
494
 
468
- it "should render sms_sent template for XHR requests" do
495
+ it "should render sms_success template for XHR requests" do
469
496
  xhr :post, :sms, :id => doc_id, :to => '5555555555', :carrier => 'txt.att.net'
470
- expect(request).to render_template 'sms_sent'
497
+ expect(request).to render_template 'sms_success'
471
498
  expect(request.flash[:success]).to eq "SMS Sent"
472
499
  end
473
500
  end
@@ -665,6 +692,64 @@ describe CatalogController do
665
692
  end
666
693
  end
667
694
 
695
+ describe "#add_show_tools_partial" do
696
+ before do
697
+ CatalogController.add_show_tools_partial(:like, callback: :perform_like, validator: :validate_like_params)
698
+ allow(controller).to receive(:perform_like)
699
+ allow(controller).to receive(:catalog_path).and_return('catalog/1')
700
+ Rails.application.routes.draw do
701
+ get 'catalog/like', as: :catalog_like
702
+ end
703
+ end
704
+
705
+ after do
706
+ CatalogController.blacklight_config.show.document_actions.delete(:like)
707
+ Rails.application.reload_routes!
708
+ end
709
+
710
+ it "should add the action to a list" do
711
+ expect(CatalogController.blacklight_config.show.document_actions).to have_key(:like)
712
+ end
713
+
714
+ it "should define the action method" do
715
+ expect(controller.respond_to?(:like)).to be true
716
+ end
717
+
718
+ describe "when posting to the action" do
719
+ describe "with success" do
720
+ before do
721
+ allow(controller).to receive(:validate_like_params).and_return(true)
722
+ post :like
723
+ end
724
+ it "should call the supplied method on post" do
725
+ expect(controller).to have_received(:perform_like)
726
+ end
727
+ end
728
+
729
+ describe "with failure" do
730
+ describe "with invalid params" do
731
+ before { allow(controller).to receive(:validate_like_params).and_return(false) }
732
+ it "should not call the supplied method if validation failed" do
733
+ expect(controller).not_to have_received(:perform_like)
734
+ end
735
+ end
736
+ end
737
+ end
738
+ end
739
+
740
+ describe "search_action_url" do
741
+ it "should be the same as the catalog url" do
742
+ get :index, :page => 1
743
+ expect(controller.send(:search_action_url, q: "xyz")).to eq root_url(q: "xyz")
744
+ end
745
+ end
746
+
747
+ describe "search_facet_url" do
748
+ it "should be the same as the catalog url" do
749
+ get :index, :page => 1
750
+ expect(controller.send(:search_facet_url, id: "some_facet", page: 5)).to eq catalog_facet_url(id: "some_facet")
751
+ end
752
+ end
668
753
  end
669
754
 
670
755
 
@@ -31,6 +31,5 @@ describe "Alternate Controller Behaviors" do
31
31
  expect(page).to have_selector ".document-thumbnail"
32
32
  expect(page).to have_selector ".document-thumbnail a[data-context-href]"
33
33
  expect(page).to have_selector ".document-thumbnail a img"
34
-
35
34
  end
36
35
  end
@@ -18,6 +18,7 @@ describe "Bookmarks" do
18
18
  expect(page).to have_content 'Cleared your bookmarks.'
19
19
  expect(page).to have_content 'You have no bookmarks'
20
20
  end
21
+
21
22
  it "add and remove bookmarks from search results" do
22
23
  sign_in 'user1'
23
24
  visit root_path
@@ -30,7 +31,7 @@ describe "Bookmarks" do
30
31
  click_button 'Remove bookmark'
31
32
  expect(page).to have_content 'Successfully removed bookmark.'
32
33
  end
33
-
34
+
34
35
  it "should add and delete bookmarks from the show page" do
35
36
  sign_in 'user1'
36
37
  visit catalog_path('2007020969')
@@ -38,7 +39,7 @@ describe "Bookmarks" do
38
39
  click_button 'Remove bookmark'
39
40
  expect(page).to have_content 'Successfully removed bookmark.'
40
41
  end
41
-
42
+
42
43
  it "should add bookmarks after a user logs in" do
43
44
  visit catalog_path('2007020969')
44
45
  click_button 'Bookmark'
@@ -55,18 +56,42 @@ describe "Bookmarks" do
55
56
  click_link 'Cite'
56
57
  expect(page).to have_content 'Strong Medicine speaks'
57
58
  end
58
-
59
+
60
+ it "should cite items in current bookmarks page" do
61
+ visit catalog_path('2009373513')
62
+ click_button 'Bookmark'
63
+
64
+ visit catalog_path('2007020969')
65
+ click_button 'Bookmark'
66
+
67
+ visit "/bookmarks?per_page=1"
68
+ expect(page).to have_content 'Ci an zhou bian'
69
+ expect(page).not_to have_content 'Strong Medicine speaks'
70
+
71
+ click_link 'Cite'
72
+ expect(page).to have_content 'Ci an zhou bian'
73
+ expect(page).not_to have_content 'Strong Medicine speaks'
74
+
75
+ visit "/bookmarks?per_page=1"
76
+ click_link "2"
77
+ expect(page).to have_content 'Strong Medicine speaks'
78
+
79
+ click_link 'Cite'
80
+ expect(page).to have_content 'Strong Medicine speaks'
81
+ expect(page).not_to have_content 'Ci an zhou bian'
82
+ end
83
+
59
84
  it "should have an endnote export" do
60
85
  visit catalog_path('2007020969')
61
86
  click_button 'Bookmark'
62
- visit "/bookmarks.endnote?q="
87
+ visit "/bookmarks.endnote?q="
63
88
  expect(page).to have_content " %@ 9780743297790"
64
89
  end
65
-
90
+
66
91
  it "should have a refworks export" do
67
92
  visit catalog_path('2007020969')
68
93
  click_button 'Bookmark'
69
- visit "/bookmarks.refworks_marc_txt?q="
94
+ visit "/bookmarks.refworks_marc_txt?q="
70
95
  expect(page).to have_content "LEADER 01490cam a2200361 a 4500001 2007020969"
71
96
  end
72
97
  end
@@ -48,6 +48,17 @@ describe "Search Results" do
48
48
  search_for 'asdfghj'
49
49
  expect(page).to have_content "No results found for your search"
50
50
  end
51
+
52
+ it "should provide search hints if there are no results" do
53
+ visit root_path
54
+ fill_in "q", with: "inmul"
55
+ select "Author", from: "search_field"
56
+ click_button 'search'
57
+ expect(page).to have_content "No results found for your search"
58
+ expect(page).to have_content "you searched by Author"
59
+ click_on "try searching everything"
60
+ expect(page).to have_xpath("//a[contains(@href, #{77826928})]")
61
+ end
51
62
  end
52
63
 
53
64
 
@@ -111,5 +111,10 @@ describe "Search Page" do
111
111
  expect(page).to have_content "Welcome!"
112
112
  expect(page).to_not have_selector "#q[value='history']"
113
113
  end
114
+
115
+ it "should gracefully handle searches with invalid facet parameters" do
116
+ visit root_path f: { missing_s: [1]}
117
+ expect(page).to have_content "No results found for your search"
118
+ end
114
119
  end
115
120
 
@@ -111,37 +111,54 @@ describe BlacklightHelper do
111
111
  end
112
112
 
113
113
  describe "with a config" do
114
- before do
115
- @config = Blacklight::Configuration.new.configure do |config|
114
+ let(:config) do
115
+ Blacklight::Configuration.new.configure do |config|
116
116
  config.index.title_field = 'title_display'
117
117
  config.index.display_type_field = 'format'
118
118
  end
119
+ end
119
120
 
120
- @document = SolrDocument.new('title_display' => "A Fake Document", 'id'=>'8')
121
- allow(helper).to receive(:blacklight_config).and_return(@config)
121
+ let(:document) { SolrDocument.new('title_display' => "A Fake Document", 'id'=>'8') }
122
+
123
+ before do
124
+ config.add_show_tools_partial(:bookmark, partial: 'catalog/bookmark_control', if: :render_bookmarks_control?)
125
+ config.add_results_document_tool(:bookmark, partial: 'catalog/bookmark_control', if: :render_bookmarks_control?)
126
+ config.add_nav_action(:bookmark, partial: 'blacklight/nav/bookmark', if: :render_bookmarks_control?)
127
+ allow(helper).to receive(:blacklight_config).and_return(config)
122
128
  allow(helper).to receive(:has_user_authentication_provider?).and_return(true)
123
129
  allow(helper).to receive(:current_or_guest_user).and_return(User.new)
124
130
  allow(helper).to receive_messages(current_bookmarks: [])
125
131
  end
132
+
133
+ describe "render_nav_actions" do
134
+ it "should render partials" do
135
+ buff = ''
136
+ helper.render_nav_actions { |config, item| buff << "<foo>#{item}</foo>" }
137
+ expect(buff).to have_selector "foo a#bookmarks_nav[href=\"/bookmarks\"]"
138
+ expect(buff).to have_selector "foo a span[data-role='bookmark-counter']", text: '0'
139
+ end
140
+ end
141
+
126
142
  describe "render_index_doc_actions" do
127
143
  it "should render partials" do
128
- response = helper.render_index_doc_actions(@document)
144
+ response = helper.render_index_doc_actions(document)
129
145
  expect(response).to have_selector(".bookmark_toggle")
130
146
  end
131
147
  end
148
+
132
149
  describe "render_show_doc_actions" do
133
150
  it "should render partials" do
134
- response = helper.render_show_doc_actions(@document)
151
+ response = helper.render_show_doc_actions(document)
135
152
  expect(response).to have_selector(".bookmark_toggle")
136
153
  end
137
154
  end
138
155
  end
139
-
156
+
140
157
  describe "#should_render_index_field?" do
141
158
  before do
142
159
  allow(helper).to receive_messages(should_render_field?: true, document_has_value?: true)
143
160
  end
144
-
161
+
145
162
  it "should be true" do
146
163
  expect(helper.should_render_index_field?(double, double)).to be true
147
164
  end
@@ -467,6 +484,7 @@ describe BlacklightHelper do
467
484
  let(:doc) { double }
468
485
  before do
469
486
  allow(helper).to receive_messages(document_partial_path_templates: [])
487
+ allow(helper).to receive_messages(document_index_view_type: 'index_header')
470
488
  end
471
489
 
472
490
  it "should get the document format from document_partial_name" do
@@ -593,4 +611,27 @@ describe BlacklightHelper do
593
611
  expect(response).to match /<div id="documents">/
594
612
  end
595
613
  end
614
+
615
+ describe "#presenter_class" do
616
+ before do
617
+ allow(helper).to receive(:blacklight_config).and_return(blacklight_config)
618
+ end
619
+
620
+ let :blacklight_config do
621
+ Blacklight::Configuration.new
622
+ end
623
+
624
+ let :presenter_class do
625
+ double
626
+ end
627
+
628
+ it "should use the value defined in the blacklight configuration" do
629
+ blacklight_config.document_presenter_class = presenter_class
630
+ expect(helper.presenter_class).to eq presenter_class
631
+ end
632
+
633
+ it "should default to Blacklight::DocumentPresenter" do
634
+ expect(helper.presenter_class).to eq Blacklight::DocumentPresenter
635
+ end
636
+ end
596
637
  end