blacklight 4.4.2 → 4.5.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/VERSION +1 -1
  4. data/app/assets/javascripts/blacklight/search_context.js +2 -0
  5. data/app/controllers/saved_searches_controller.rb +2 -3
  6. data/app/helpers/blacklight/blacklight_helper_behavior.rb +8 -12
  7. data/app/helpers/blacklight/catalog_helper_behavior.rb +4 -1
  8. data/app/models/search.rb +8 -3
  9. data/app/views/catalog/_facets.html.erb +1 -1
  10. data/app/views/catalog/_search_sidebar.html.erb +1 -0
  11. data/app/views/catalog/_zero_results.html.erb +14 -0
  12. data/app/views/catalog/index.atom.builder +4 -2
  13. data/app/views/catalog/index.html.erb +9 -6
  14. data/config/locales/blacklight.en.yml +6 -0
  15. data/config/locales/blacklight.fr.yml +6 -0
  16. data/lib/blacklight.rb +1 -0
  17. data/lib/blacklight/base.rb +48 -0
  18. data/lib/blacklight/catalog.rb +30 -118
  19. data/lib/blacklight/catalog/search_context.rb +124 -0
  20. data/lib/blacklight/configuration.rb +1 -0
  21. data/lib/blacklight/controller.rb +9 -1
  22. data/lib/blacklight/solr_helper.rb +26 -0
  23. data/spec/controllers/catalog_controller_spec.rb +103 -42
  24. data/spec/controllers/saved_searches_controller_spec.rb +40 -0
  25. data/spec/features/search_results_spec.rb +35 -17
  26. data/spec/helpers/blacklight_helper_spec.rb +14 -4
  27. data/spec/lib/solr_helper_spec.rb +32 -0
  28. data/spec/spec_helper.rb +12 -0
  29. data/spec/test_app_templates/Gemfile.extra +1 -0
  30. data/spec/views/catalog/_show_sidebar.erb_spec.rb +1 -0
  31. data/spec/views/catalog/_thumbnail_default.erb_spec.rb +1 -0
  32. data/spec/views/catalog/index.html.erb_spec.rb +18 -0
  33. metadata +13 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 20820db95c02b75fc8e604045248607f45d085bc
4
- data.tar.gz: 6992b7d81e5792a425cd8018d63a50b03c38dae0
3
+ metadata.gz: 8939b4f8da0fd45881552613dba681ddcec93083
4
+ data.tar.gz: 6207de54f96ee4794e2c051f0086691575d4fea4
5
5
  SHA512:
6
- metadata.gz: 78fc07fc10e18251ac027e93034e78c85449cda541953fd9a041bc0e7977139f8da349efe311da67b5032931a875e8dba74a972f1603f5bc11a1e04cd4e4423d
7
- data.tar.gz: edb93872a34964b0381753e4c2ba25d0feb7ec5cd1bccdb24515a1fb71729b15edab4d673a3af1ee693ba7081efee1602535b1173f711dcfd7c4046cf78bf230
6
+ metadata.gz: 146016cf9d6b18fd08741e700a1be242d25adc78d83a8a299dbad03443a7b0f8c83d852e1f88b447442e24bd2dfd8cf92abdf47e323c7d26dfbae7d6950c70b4
7
+ data.tar.gz: 10b7fe255b81f6e4effdb5d2199478c4c8c2b8f702f0e21661ea2130fb3eea7714cacee66dc9ab4a58c808d934dadd307c2fcc521b1f038087372e0bcdbd1681
data/Gemfile CHANGED
@@ -11,6 +11,7 @@ group :test do
11
11
  gem 'devise-guests'
12
12
  gem "bootstrap-sass"
13
13
  gem 'turbolinks'
14
+ gem 'poltergeist'
14
15
  gem "unicode", :platforms => [:mri_18, :mri_19]
15
16
  end
16
17
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 4.4.2
1
+ 4.5.0.rc1
@@ -9,6 +9,8 @@
9
9
  if(event.metaKey || event.ctrlKey){f.target = '_blank';};
10
10
  var d = document.createElement('input'); d.setAttribute('type', 'hidden');
11
11
  d.setAttribute('name', 'counter'); d.setAttribute('value', $(this).data('counter')); f.appendChild(d);
12
+ var id = document.createElement('input'); id.setAttribute('type', 'hidden');
13
+ id.setAttribute('name', 'search_id'); id.setAttribute('value', $(this).data('search_id')); f.appendChild(id);
12
14
  var m = document.createElement('input'); m.setAttribute('type', 'hidden');
13
15
  m.setAttribute('name', '_method'); m.setAttribute('value', 'put'); f.appendChild(m);
14
16
  var m = document.createElement('input'); m.setAttribute('type', 'hidden');
@@ -11,7 +11,7 @@ class SavedSearchesController < ApplicationController
11
11
  end
12
12
 
13
13
  def save
14
- current_user.searches << Search.find(params[:id])
14
+ current_user.searches << searches_from_history.find(params[:id])
15
15
  if current_user.save
16
16
  flash[:notice] = I18n.t('blacklight.saved_searches.add.success')
17
17
  else
@@ -23,8 +23,7 @@ class SavedSearchesController < ApplicationController
23
23
  # Only dereferences the user rather than removing the item in case it
24
24
  # is in the session[:history]
25
25
  def forget
26
- if current_user.search_ids.include?(params[:id].to_i)
27
- search = Search.find(params[:id])
26
+ if search = current_user.searches.find(params[:id])
28
27
  search.user_id = nil
29
28
  search.save
30
29
 
@@ -74,10 +74,6 @@ module Blacklight::BlacklightHelperBehavior
74
74
  render :partial=>'catalog/search_form'
75
75
  end
76
76
 
77
- def search_action_url *args
78
- catalog_index_url *args
79
- end
80
-
81
77
  def extra_body_classes
82
78
  @extra_body_classes ||= ['blacklight-' + controller.controller_name, 'blacklight-' + [controller.controller_name, controller.action_name].join('-')]
83
79
  end
@@ -480,15 +476,17 @@ module Blacklight::BlacklightHelperBehavior
480
476
  def link_to_document(doc, opts={:label=>nil, :counter => nil})
481
477
  opts[:label] ||= blacklight_config.index.show_link.to_sym
482
478
  label = render_document_index_label doc, opts
483
- link_to label, doc, { :'data-counter' => opts[:counter] }.merge(opts.reject { |k,v| [:label, :counter].include? k })
479
+ link_to label, doc, search_session_params(opts[:counter]).merge(opts.reject { |k,v| [:label, :counter].include? k })
480
+ end
481
+
482
+ def search_session_params counter
483
+ { :'data-counter' => counter, :'data-search_id' => current_search_session.try(:id) }
484
484
  end
485
485
 
486
486
  # link_back_to_catalog(:label=>'Back to Search')
487
487
  # Create a link back to the index screen, keeping the user's facet, query and paging choices intact by using session.
488
488
  def link_back_to_catalog(opts={:label=>nil})
489
- query_params = session[:search] ? session[:search].dup : {}
490
- query_params.delete :counter
491
- query_params.delete :total
489
+ query_params = current_search_session.try(:query_params) || {}
492
490
  link_url = url_for(query_params)
493
491
  if link_url =~ /bookmarks/
494
492
  opts[:label] ||= t('blacklight.back_to_bookmarks')
@@ -563,16 +561,14 @@ module Blacklight::BlacklightHelperBehavior
563
561
  return hash_as_hidden_fields(my_params)
564
562
  end
565
563
 
566
-
567
-
568
564
  def link_to_previous_document(previous_document)
569
- link_to_unless previous_document.nil?, raw(t('views.pagination.previous')), previous_document, :class => "previous", :rel => 'prev', :'data-counter' => session[:search][:counter].to_i - 1 do
565
+ link_to_unless previous_document.nil?, raw(t('views.pagination.previous')), previous_document, search_session_params(search_session[:counter].to_i - 1).merge(:class => "previous", :rel => 'prev') do
570
566
  content_tag :span, raw(t('views.pagination.previous')), :class => 'previous'
571
567
  end
572
568
  end
573
569
 
574
570
  def link_to_next_document(next_document)
575
- link_to_unless next_document.nil?, raw(t('views.pagination.next')), next_document, :class => "next", :rel => 'next', :'data-counter' => session[:search][:counter].to_i + 1 do
571
+ link_to_unless next_document.nil?, raw(t('views.pagination.next')), next_document, search_session_params(search_session[:counter].to_i + 1).merge(:class => "next", :rel => 'next') do
576
572
  content_tag :span, raw(t('views.pagination.next')), :class => 'next'
577
573
  end
578
574
  end
@@ -56,7 +56,7 @@ module Blacklight::CatalogHelperBehavior
56
56
  # Code should call this method rather than interrogating session directly,
57
57
  # because implementation of where this data is stored/retrieved may change.
58
58
  def item_page_entry_info
59
- t('blacklight.search.entry_pagination_info.other', :current => format_num(session[:search][:counter]), :total => format_num(session[:search][:total]), :count => session[:search][:total].to_i).html_safe
59
+ t('blacklight.search.entry_pagination_info.other', :current => format_num(search_session[:counter]), :total => format_num(search_session[:total]), :count => search_session[:total].to_i).html_safe
60
60
  end
61
61
 
62
62
  # Look up search field user-displayable label
@@ -129,4 +129,7 @@ module Blacklight::CatalogHelperBehavior
129
129
  add_facet_params_and_redirect(group.field, group.key)
130
130
  end
131
131
 
132
+ def response_has_no_search_results?
133
+ @response.total == 0
134
+ end
132
135
  end
@@ -1,11 +1,16 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  class Search < ActiveRecord::Base
3
-
3
+
4
4
  belongs_to :user
5
-
5
+
6
6
  serialize :query_params
7
- attr_accessible :query_params if Rails::VERSION::MAJOR < 4
7
+
8
+ if Rails::VERSION::MAJOR < 4
9
+ attr_accessible :query_params
8
10
 
11
+ scope :none, where(:id => nil).where("id IS NOT ?", nil)
12
+ end
13
+
9
14
  # A Search instance is considered a saved search if it has a user_id.
10
15
  def saved?
11
16
  self.user_id?
@@ -16,4 +16,4 @@
16
16
  <%= render_facet_partials %>
17
17
  </div>
18
18
  </div>
19
- <% end %>&nbsp;
19
+ <% end %>
@@ -0,0 +1 @@
1
+ <%= render 'facets' %>
@@ -0,0 +1,14 @@
1
+ <h2><%= t 'blacklight.search.zero_results.title' %></h2>
2
+ <div id="documents" class="noresults">
3
+ <h3><%= t 'blacklight.search.zero_results.modify_search' %></h3>
4
+ <ul>
5
+ <li><%= t 'blacklight.search.zero_results.use_fewer_keywords' %></li>
6
+
7
+ <%- if params[:q] and params[:search_field] and params[:search_field] != blacklight_config.default_search_field -%>
8
+ <li><%= t 'blacklight.search.zero_results.search_fields', :search_fields => search_field_label(params) %> -
9
+ <%= link_to t('blacklight.search.zero_results.search_everything'), url_for(params_for_search(:search_field=>blacklight_config.default_search_field.key)) %>
10
+ </li>
11
+ <%- end %>
12
+
13
+ </ul>
14
+ </div>
@@ -45,7 +45,7 @@ xml.feed("xmlns" => "http://www.w3.org/2005/Atom",
45
45
  # updated is required, for now we'll just set it to now, sorry
46
46
  xml.updated Time.now.strftime("%Y-%m-%dT%H:%M:%SZ")
47
47
 
48
- @document_list.each do |doc|
48
+ @document_list.each_with_index do |doc, document_counter|
49
49
  xml.entry do
50
50
  xml.title doc.to_semantic_values[:title][0] || doc.id
51
51
 
@@ -66,7 +66,9 @@ xml.feed("xmlns" => "http://www.w3.org/2005/Atom",
66
66
 
67
67
  with_format("html") do
68
68
  xml.summary "type" => "html" do
69
- xml.text! render_document_partial(doc, :index)
69
+ xml.text! render_document_partial(doc,
70
+ :index,
71
+ :document_counter => document_counter)
70
72
  end
71
73
  end
72
74
 
@@ -1,6 +1,6 @@
1
1
  <div id="sidebar" class="span3">
2
- <%= render :partial=>'facets' %>
3
- </div><!--/well -->
2
+ <%= render 'search_sidebar' %>
3
+ </div>
4
4
 
5
5
  <div id="content" class="span9">
6
6
 
@@ -16,14 +16,17 @@
16
16
 
17
17
  <% extra_head_content << render_opensearch_response_metadata.html_safe %>
18
18
 
19
- <%= render :partial => 'did_you_mean' %>
19
+ <%= render 'did_you_mean' %>
20
+
21
+ <%= render 'constraints' %>
20
22
 
21
- <%= render :partial => 'constraints' %>
23
+ <%= render 'sort_and_per_page' %>
22
24
 
23
- <%= render :partial => 'sort_and_per_page' %>
24
25
  <h2 class="hide-text"><%= t('blacklight.search.search_results') %></h2>
25
26
 
26
- <%- if render_grouped_response? %>
27
+ <%- if response_has_no_search_results? %>
28
+ <%= render "zero_results" %>
29
+ <%- elsif render_grouped_response? %>
27
30
  <%= render_grouped_document_index %>
28
31
  <%- else %>
29
32
  <%= render_document_index %>
@@ -227,6 +227,12 @@ en:
227
227
  present: "In Bookmarks"
228
228
  absent: "Bookmark"
229
229
  inprogress: "Saving..."
230
+ zero_results:
231
+ title: "No results found for your search"
232
+ modify_search: "Try modifying your search"
233
+ use_fewer_keywords: "Use fewer keywords to start, then refine your search using the links on the left."
234
+ search_fields: "you searched by %{search_fields}"
235
+ search_everything: "try searching everything"
230
236
 
231
237
  entry_name:
232
238
  default: 'entry'
@@ -243,6 +243,12 @@ fr:
243
243
  present: "Dans panier"
244
244
  absent: "Ajouter au panier"
245
245
  inprogress: "En cours"
246
+ zero_results:
247
+ title: "Votre recherche ne correspond à aucune ressource."
248
+ modify_search: "Essayez de modifier votre requête de recherche"
249
+ use_fewer_keywords: "Utilisez moins de mots-clés pour commencer, puis affiner votre recherche."
250
+ search_fields: "vous avez cherché par %{search_fields}"
251
+ search_everything: "essayez de rechercher tout"
246
252
 
247
253
  entry_name:
248
254
  default: 'résultat'
@@ -19,6 +19,7 @@ module Blacklight
19
19
 
20
20
  autoload :Controller, 'blacklight/controller'
21
21
  autoload :LegacyControllerMethods, 'blacklight/legacy_controller_methods'
22
+ autoload :Base, 'blacklight/base'
22
23
  autoload :Catalog, 'blacklight/catalog'
23
24
 
24
25
  autoload :Routes, 'blacklight/routes'
@@ -0,0 +1,48 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Blacklight::Base
3
+ extend ActiveSupport::Concern
4
+
5
+ include Blacklight::Configurable
6
+ include Blacklight::SolrHelper
7
+
8
+
9
+ included do
10
+ # When RSolr::RequestError is raised, the rsolr_request_error method is executed.
11
+ # The index action will more than likely throw this one.
12
+ # Example, when the standard query parser is used, and a user submits a "bad" query.
13
+ rescue_from RSolr::Error::Http, :with => :rsolr_request_error if respond_to? :rescue_from
14
+ end
15
+
16
+ protected
17
+
18
+ # when solr (RSolr) throws an error (RSolr::RequestError), this method is executed.
19
+ def rsolr_request_error(exception)
20
+
21
+ if Rails.env.development?
22
+ raise exception # Rails own code will catch and give usual Rails error page with stack trace
23
+ else
24
+
25
+ flash_notice = I18n.t('blacklight.search.errors.request_error')
26
+
27
+ # If there are errors coming from the index page, we want to trap those sensibly
28
+
29
+ if flash[:notice] == flash_notice
30
+ logger.error "Cowardly aborting rsolr_request_error exception handling, because we redirected to a page that raises another exception"
31
+ raise exception
32
+ end
33
+
34
+ logger.error exception
35
+
36
+ flash[:notice] = flash_notice
37
+ redirect_to root_path
38
+ end
39
+ end
40
+
41
+ def blacklight_solr
42
+ @solr ||= RSolr.connect(blacklight_solr_config)
43
+ end
44
+
45
+ def blacklight_solr_config
46
+ Blacklight.solr_config
47
+ end
48
+ end
@@ -2,28 +2,22 @@
2
2
  module Blacklight::Catalog
3
3
  extend ActiveSupport::Concern
4
4
 
5
- include Blacklight::Configurable
6
- include Blacklight::SolrHelper
5
+ include Blacklight::Base
7
6
 
8
- SearchHistoryWindow = 12 # how many searches to save in session history
7
+ require 'blacklight/catalog/search_context'
8
+ include Blacklight::Catalog::SearchContext
9
+
10
+ SearchHistoryWindow = 100 # how many searches to save in session history
9
11
 
10
12
  # The following code is executed when someone includes blacklight::catalog in their
11
13
  # own controller.
12
- included do
13
- helper_method :search_action_url
14
+ included do
14
15
  helper_method :sms_mappings
15
- before_filter :search_session, :history_session
16
- before_filter :delete_or_assign_search_session_params, :only => :index
17
- after_filter :set_additional_search_session_values, :only=>:index
18
16
 
19
17
  # Whenever an action raises SolrHelper::InvalidSolrID, this block gets executed.
20
18
  # Hint: the SolrHelper #get_solr_response_for_doc_id method raises this error,
21
19
  # which is used in the #show action here.
22
20
  rescue_from Blacklight::Exceptions::InvalidSolrID, :with => :invalid_solr_id_error
23
- # When RSolr::RequestError is raised, the rsolr_request_error method is executed.
24
- # The index action will more than likely throw this one.
25
- # Example, when the standard query parser is used, and a user submits a "bad" query.
26
- rescue_from RSolr::Error::Http, :with => :rsolr_request_error
27
21
  end
28
22
 
29
23
  # get search results from the solr index
@@ -36,21 +30,13 @@ module Blacklight::Catalog
36
30
  format.html {
37
31
  extra_head_content << view_context.auto_discovery_link_tag(:rss, url_for(params.merge(:format => 'rss')), :title => t('blacklight.search.rss_feed') )
38
32
  extra_head_content << view_context.auto_discovery_link_tag(:atom, url_for(params.merge(:format => 'atom')), :title => t('blacklight.search.atom_feed') )
39
- save_current_search_params
40
33
  }
41
34
  format.rss { render :layout => false }
42
35
  format.atom { render :layout => false }
43
36
 
44
37
 
45
38
  format.json do
46
- facet = facets_from_request.as_json.each do |f|
47
- f["label"] = facet_configuration_for_field(f["name"]).label
48
- f["items"] = f["items"].as_json.each do |i|
49
- i['label'] ||= i['value']
50
- end
51
- end
52
-
53
- render json: {response: {docs: @document_list, facets: facet, pages: pagination_info(@response)}}
39
+ render json: render_search_results_as_json
54
40
  end
55
41
  end
56
42
  end
@@ -77,7 +63,7 @@ module Blacklight::Catalog
77
63
 
78
64
  # updates the search counter (allows the show view to paginate)
79
65
  def update
80
- session[:search][:counter] = params[:counter]
66
+ search_session[:counter] = params[:counter]
81
67
  redirect_to :action => "show"
82
68
  end
83
69
 
@@ -88,7 +74,7 @@ module Blacklight::Catalog
88
74
  respond_to do |format|
89
75
  # Draw the facet selector for users who have javascript disabled:
90
76
  format.html
91
- format.json { render json: {response: {facets: @pagination }}}
77
+ format.json { render json: render_facet_list_as_json }
92
78
 
93
79
  # Draw the partial for the "more" facet modal window:
94
80
  format.js { render :layout => false }
@@ -185,112 +171,38 @@ module Blacklight::Catalog
185
171
  # non-routable methods ->
186
172
  #
187
173
 
188
- def search_action_url options = {}
189
- url_for(options.merge(:action => 'index', :only_path => true))
174
+ # override this method to change the JSON response from #index
175
+ def render_search_results_as_json
176
+ {response: {docs: @document_list, facets: search_facets_as_json, pages: pagination_info(@response)}}
190
177
  end
191
178
 
192
-
193
- # calls setup_previous_document then setup_next_document.
194
- # used in the show action for single view pagination.
195
- def setup_next_and_previous_documents
196
- setup_previous_document
197
- setup_next_document
198
- end
199
-
200
- # gets a document based on its position within a resultset
201
- def setup_document_by_counter(counter)
202
- return if counter < 1 || session[:search].blank?
203
- search = session[:search] || {}
204
- get_single_doc_via_search(counter, search)
205
- end
206
-
207
- def setup_previous_document
208
- @previous_document = session[:search][:counter] ? setup_document_by_counter(session[:search][:counter].to_i - 1) : nil
209
- end
210
-
211
- def setup_next_document
212
- @next_document = session[:search][:counter] ? setup_document_by_counter(session[:search][:counter].to_i + 1) : nil
213
- end
214
-
215
- # sets up the session[:search] hash if it doesn't already exist
216
- def search_session
217
- session[:search] ||= {}
218
- end
219
-
220
- # sets up the session[:history] hash if it doesn't already exist.
221
- # assigns all Search objects (that match the searches in session[:history]) to a variable @searches.
222
- def history_session
223
- session[:history] ||= []
224
- @searches = searches_from_history # <- in BlacklightController
225
- end
226
-
227
- # This method copies request params to session[:search], omitting certain
228
- # known blacklisted params not part of search, omitting keys with blank
229
- # values. All keys in session[:search] are as symbols rather than strings.
230
- def delete_or_assign_search_session_params
231
- session[:search] = {}
232
- params.each_pair do |key, value|
233
- session[:search][key.to_sym] = value unless ["commit", "counter"].include?(key.to_s) ||
234
- value.blank?
235
- end
179
+ def search_facets_as_json
180
+ facets_from_request.as_json.each do |f|
181
+ f["label"] = facet_configuration_for_field(f["name"]).label
182
+ f["items"] = f["items"].as_json.each do |i|
183
+ i['label'] ||= i['value']
184
+ end
185
+ end
236
186
  end
237
-
238
- # Saves the current search (if it does not already exist) as a models/search object
239
- # then adds the id of the serach object to session[:history]
240
- def save_current_search_params
241
- # If it's got anything other than controller, action, total, we
242
- # consider it an actual search to be saved. Can't predict exactly
243
- # what the keys for a search will be, due to possible extra plugins.
244
- return if (search_session.keys - [:controller, :action, :total, :counter, :commit ]) == []
245
- params_copy = search_session.clone # don't think we need a deep copy for this
246
- params_copy.delete(:page)
247
-
248
- unless @searches.collect { |search| search.query_params }.include?(params_copy)
249
-
250
- new_search = Search.create(:query_params => params_copy)
251
- session[:history].unshift(new_search.id)
252
- # Only keep most recent X searches in history, for performance.
253
- # both database (fetching em all), and cookies (session is in cookie)
254
- session[:history] = session[:history].slice(0, Blacklight::Catalog::SearchHistoryWindow )
255
- end
187
+
188
+ # override this method to change the JSON response from #facet
189
+ def render_facet_list_as_json
190
+ {response: {facets: @pagination }}
256
191
  end
257
-
258
- # sets some additional search metadata so that the show view can display it.
259
- def set_additional_search_session_values
260
- unless @response.nil?
261
- search_session[:total] = @response.total
262
- end
192
+
193
+ # Overrides the Blacklight::Controller provided #search_action_url.
194
+ # By default, any search action from a Blacklight::Catalog controller
195
+ # should use the current controller when constructing the route.
196
+ def search_action_url options = {}
197
+ url_for(options.merge(:action => 'index', :only_path => true))
263
198
  end
264
-
199
+
265
200
  # we need to know if we are viewing the item as part of search results so we know whether to
266
201
  # include certain partials or not
267
202
  def adjust_for_results_view
268
203
  # deprecated in blacklight 4.x
269
204
  ActiveSupport::Deprecation.warn("#adjust_for_results_view helper was deprecated in Blacklight 4.x")
270
205
  end
271
-
272
- # when solr (RSolr) throws an error (RSolr::RequestError), this method is executed.
273
- def rsolr_request_error(exception)
274
-
275
- if Rails.env.development?
276
- raise exception # Rails own code will catch and give usual Rails error page with stack trace
277
- else
278
-
279
- flash_notice = I18n.t('blacklight.search.errors.request_error')
280
-
281
- # If there are errors coming from the index page, we want to trap those sensibly
282
-
283
- if flash[:notice] == flash_notice
284
- logger.error "Cowardly aborting rsolr_request_error exception handling, because we redirected to a page that raises another exception"
285
- raise exception
286
- end
287
-
288
- logger.error exception
289
-
290
- flash[:notice] = flash_notice
291
- redirect_to root_path
292
- end
293
- end
294
206
 
295
207
  # extract the pagination info from the response object
296
208
  def pagination_info response
@@ -0,0 +1,124 @@
1
+ module Blacklight::Catalog::SearchContext
2
+ extend ActiveSupport::Concern
3
+
4
+
5
+ # The following code is executed when someone includes blacklight::catalog::search_session in their
6
+ # own controller.
7
+ included do
8
+ helper_method :current_search_session, :search_session
9
+ before_filter :search_session, :history_session, :current_search_session
10
+ end
11
+
12
+ protected
13
+
14
+ # sets up the session[:history] hash if it doesn't already exist.
15
+ # assigns all Search objects (that match the searches in session[:history]) to a variable @searches.
16
+ def history_session
17
+ session[:history] ||= []
18
+ @searches = searches_from_history # <- in BlacklightController
19
+ end
20
+
21
+ # sets up the session[:search] hash if it doesn't already exist
22
+ def search_session
23
+ session[:search] ||= {}
24
+ end
25
+
26
+ # The current search session
27
+ def current_search_session
28
+
29
+ @current_search_session ||= if action_name == "index"
30
+ find_or_initialize_search_session_from_params params
31
+ elsif params[:search_context] and !params[:search_context].blank?
32
+ find_or_initialize_search_session_from_params JSON.load(params[:search_context])
33
+ elsif params[:search_id] and !params[:search_id].blank?
34
+ # TODO : check the search id signature.
35
+ searches_from_history.find(params[:search_id]) rescue nil
36
+ elsif search_session[:id]
37
+ searches_from_history.find(search_session[:id]) rescue nil
38
+ end
39
+
40
+ if @current_search_session
41
+ search_session[:id] = @current_search_session.id
42
+ end
43
+
44
+ @current_search_session
45
+ end
46
+
47
+ def find_or_initialize_search_session_from_params params
48
+ params_copy = params.reject { |k,v| blacklisted_search_session_params.include?(k.to_sym) or v.blank? }
49
+
50
+ return if params_copy.reject { |k,v| [:action, :controller].include? k.to_sym }.blank?
51
+
52
+ saved_search = searches_from_history.select { |x| x.query_params == params_copy }.first
53
+
54
+ saved_search ||= begin
55
+ s = Search.create(:query_params => params_copy)
56
+ add_to_search_history(s)
57
+ s
58
+ end
59
+ end
60
+
61
+ # Add a search to the in-session search history list
62
+ def add_to_search_history search
63
+ session[:history] ||= []
64
+
65
+ session[:history].unshift(search.id)
66
+
67
+ if session[:history].length > blacklight_config.search_history_window
68
+
69
+ session[:history] = session[:history].slice(0, blacklight_config.search_history_window )
70
+
71
+ end
72
+ end
73
+
74
+ # A list of query parameters that should not be persisted for a search
75
+ def blacklisted_search_session_params
76
+ [:commit, :counter, :total, :search_id, :page, :per_page]
77
+ end
78
+
79
+ # calls setup_previous_document then setup_next_document.
80
+ # used in the show action for single view pagination.
81
+ def setup_next_and_previous_documents
82
+ if search_session[:counter] and current_search_session
83
+ index = search_session[:counter].to_i - 1
84
+ response, documents = get_previous_and_next_documents_for_search index, current_search_session.query_params
85
+
86
+ search_session[:total] = response.total
87
+ @search_context_response = response
88
+ @previous_document = documents.first
89
+ @next_document = documents.last
90
+ end
91
+ end
92
+
93
+ # gets a document based on its position within a resultset
94
+ def setup_document_by_counter(counter)
95
+ ActiveSupport::Deprecation.warn("#setup_document_by_counter helper is deprecated in Blacklight 4.x and will be removed")
96
+
97
+ return if counter < 1 or current_search_session.nil?
98
+ get_single_doc_via_search(counter, current_search_session.query_params)
99
+ end
100
+
101
+ def setup_previous_document
102
+ ActiveSupport::Deprecation.warn("#setup_previous_document helper was deprecated in Blacklight 4.x; now happens automatically as part of #setup_next_and_previous_documents")
103
+ end
104
+
105
+ def setup_next_document
106
+ ActiveSupport::Deprecation.warn("#setup_next_document helper was deprecated in Blacklight 4.x; now happens automatically as part of #setup_next_and_previous_documents")
107
+ end
108
+
109
+ def delete_or_assign_search_session_params
110
+ # deprecated in blacklight 4.x
111
+ ActiveSupport::Deprecation.warn("#delete_or_assign_search_session_params helper was deprecated in Blacklight 4.x; now happens automatically as part of #current_search_session")
112
+ end
113
+
114
+ def save_current_search_params
115
+ # deprecated in blacklight 4.x
116
+ ActiveSupport::Deprecation.warn("#save_current_search_params helper was deprecated in Blacklight 4.x; now happens automatically as part of #current_search_session")
117
+ end
118
+
119
+ # sets some additional search metadata so that the show view can display it.
120
+ def set_additional_search_session_values
121
+ ActiveSupport::Deprecation.warn("#set_additional_search_session_values helper was deprecated in Blacklight 4.x")
122
+ end
123
+
124
+ end
@@ -22,6 +22,7 @@ module Blacklight
22
22
  :spell_max => 5,
23
23
  :max_per_page => 100,
24
24
  :per_page => [10,20,50,100],
25
+ :search_history_window => Blacklight::Catalog::SearchHistoryWindow,
25
26
  :document_index_view_types => ['list'],
26
27
  :add_facet_fields_to_solr_request => false,
27
28
  :add_field_configuration_to_solr_request => false
@@ -24,6 +24,7 @@ module Blacklight::Controller
24
24
  # extra head content
25
25
  helper_method :has_user_authentication_provider?
26
26
  helper_method :blacklight_config
27
+ helper_method :search_action_url
27
28
 
28
29
 
29
30
  # This callback runs when a user first logs in
@@ -43,9 +44,16 @@ module Blacklight::Controller
43
44
 
44
45
  protected
45
46
 
47
+ # Default route to the search action (used e.g. in global partials). Override this method
48
+ # in a controller or in your ApplicationController to introduce custom logic for choosing
49
+ # which action the search form should use
50
+ def search_action_url *args
51
+ catalog_index_url *args
52
+ end
53
+
46
54
  # Returns a list of Searches from the ids in the user's history.
47
55
  def searches_from_history
48
- session[:history].blank? ? [] : Search.where(:id => session[:history]).order("updated_at desc")
56
+ session[:history].blank? ? Search.none : Search.where(:id => session[:history]).order("updated_at desc")
49
57
  end
50
58
 
51
59
  #
@@ -552,6 +552,32 @@ module Blacklight::SolrHelper
552
552
  solr_response = find(blacklight_config.qt, solr_params)
553
553
  SolrDocument.new(solr_response.docs.first, solr_response) unless solr_response.docs.empty?
554
554
  end
555
+
556
+ # Get the previous and next document from a search result
557
+ def get_previous_and_next_documents_for_search(index, request_params, extra_controller_params={})
558
+
559
+ solr_params = solr_search_params(request_params).merge(extra_controller_params)
560
+
561
+ if index > 0
562
+ solr_params[:start] = index - 1 # get one before
563
+ solr_params[:rows] = 3 # and one after
564
+ else
565
+ solr_params[:start] = 0 # there is no previous doc
566
+ solr_params[:rows] = 2 # but there should be one after
567
+ end
568
+
569
+ solr_params[:fl] = '*'
570
+ solr_params[:facet] = false
571
+ solr_response = find(blacklight_config.qt, solr_params)
572
+
573
+ document_list = solr_response.docs.collect{|doc| SolrDocument.new(doc, solr_response) }
574
+
575
+ # only get the previous doc if there is one
576
+ prev_doc = document_list.first if index > 0
577
+ next_doc = document_list.last if (index + 1) < solr_response.total
578
+
579
+ [solr_response, [prev_doc, next_doc]]
580
+ end
555
581
 
556
582
  # returns a solr params hash
557
583
  # if field is nil, the value is fetched from blacklight_config[:index][:show_link]
@@ -81,33 +81,10 @@ describe CatalogController do
81
81
  it "should include search hash with key :q" do
82
82
  get :index, :q => @user_query
83
83
  session[:search].should_not be_nil
84
- session[:search].keys.should include(:q)
85
- session[:search][:q].should == @user_query
86
- end
87
- it "should include search hash with key :f" do
88
- get :index, :f => @facet_query
89
- session[:search].should_not be_nil
90
- session[:search].keys.should include(:f)
91
- session[:search][:f].should == @facet_query
92
- end
93
- it "should include search hash with key :per_page" do
94
- get :index, :per_page => 10
95
- session[:search].should_not be_nil
96
- session[:search].keys.should include(:per_page)
97
- session[:search][:per_page].should == "10"
98
- end
99
- it "should include search hash with key :page" do
100
- get :index, :page => 2
101
- session[:search].should_not be_nil
102
- session[:search].keys.should include(:page)
103
- session[:search][:page].should == "2"
104
- end
105
- it "should include search hash with random key" do
106
- # cause a plugin might add an unpredictable one, we want to preserve it.
107
- get :index, :some_weird_key => "value"
108
- session[:search].should_not be_nil
109
- session[:search].keys.should include(:some_weird_key)
110
- session[:search][:some_weird_key].should == "value"
84
+ session[:search].keys.should include(:id)
85
+
86
+ search = Search.find(session[:search][:id])
87
+ expect(search.query_params[:q]).to eq @user_query
111
88
  end
112
89
  end
113
90
 
@@ -224,40 +201,34 @@ describe CatalogController do
224
201
  @mock_document = double()
225
202
  @mock_document.stub(:export_formats => {})
226
203
  controller.stub(:get_solr_response_for_doc_id => [@mock_response, @mock_document],
227
- :get_single_doc_via_search => @mock_document)
204
+ :get_previous_and_next_documents_for_search => [double(:total => 5), [double("a"), @mock_document, double("b")]])
205
+
206
+ current_search = Search.create(:query_params => { :q => ""})
207
+ controller.stub(:current_search_session => current_search)
208
+
209
+ @search_session = { :id => current_search.id }
228
210
  end
229
211
  it "should set previous document if counter present in session" do
230
- session[:search] = {:q => "", :counter => 2}
212
+ session[:search] = @search_session.merge(:counter => 2)
231
213
  get :show, :id => doc_id
232
214
  assigns[:previous_document].should_not be_nil
233
215
  end
234
- it "should not set previous document if counter is 1" do
235
- session[:search] = {:counter => 1}
236
- get :show, :id => doc_id
237
- assigns[:previous_document].should be_nil
238
- end
239
216
  it "should not set previous or next document if session is blank" do
240
217
  get :show, :id => doc_id
241
218
  assigns[:previous_document].should be_nil
242
219
  assigns[:next_document].should be_nil
243
220
  end
244
221
  it "should not set previous or next document if session[:search][:counter] is nil" do
245
- session[:search] = {:q => ""}
222
+ session[:search] = {}
246
223
  get :show, :id => doc_id
247
224
  assigns[:previous_document].should be_nil
248
225
  assigns[:next_document].should be_nil
249
226
  end
250
227
  it "should set next document if counter present in session" do
251
- session[:search] = {:q => "", :counter => 2}
228
+ session[:search] = @search_session.merge(:counter => 2)
252
229
  get :show, :id => doc_id
253
230
  assigns[:next_document].should_not be_nil
254
231
  end
255
- it "should not set next document if counter is >= number of docs" do
256
- controller.stub(:get_single_doc_via_search => nil)
257
- session[:search] = {:counter => 66666666}
258
- get :show, :id => doc_id
259
- assigns[:next_document].should be_nil
260
- end
261
232
  end
262
233
 
263
234
  # NOTE: status code is always 200 in isolation mode ...
@@ -522,6 +493,96 @@ describe CatalogController do
522
493
  end
523
494
  end
524
495
  end
496
+
497
+ describe 'render_search_results_as_json' do
498
+ before do
499
+ controller.instance_variable_set :@document_list, [{id: '123', title_t: 'Book1'}, {id: '456', title_t: 'Book2'}]
500
+ controller.stub(:pagination_info).and_return({current_page: 1, next_page: 2, prev_page: nil})
501
+ controller.stub(:search_facets_as_json).and_return(
502
+ [{name: "format", label: "Format", items: [{value: 'Book', hits: 30, label: 'Book'}]}])
503
+ end
504
+
505
+ it "should be a hash" do
506
+ expect(controller.send(:render_search_results_as_json)).to eq (
507
+ {response: {docs: [{id: '123', title_t: 'Book1'}, {id: '456', title_t: 'Book2'}],
508
+ facets: [{name: "format", label: "Format", items: [{value: 'Book', hits: 30, label: 'Book'}]}],
509
+ pages: {current_page: 1, next_page: 2, prev_page: nil}}}
510
+ )
511
+ end
512
+ end
513
+
514
+ describe 'render_facet_list_as_json' do
515
+ before do
516
+ controller.instance_variable_set :@pagination, {items: [{value: 'Book'}]}
517
+ end
518
+
519
+ it "should be a hash" do
520
+ expect(controller.send(:render_facet_list_as_json)).to eq (
521
+ {response: {facets: {items: [{value: 'Book'}]}}}
522
+ )
523
+ end
524
+ end
525
+
526
+ describe "#add_to_search_history" do
527
+ it "should prepend the current search to the list" do
528
+ session[:history] = []
529
+ controller.send(:add_to_search_history, double(:id => 1))
530
+ expect(session[:history]).to have(1).item
531
+
532
+ controller.send(:add_to_search_history, double(:id => 2))
533
+ expect(session[:history]).to have(2).items
534
+ expect(session[:history].first).to eq 2
535
+ end
536
+
537
+ it "should remove searches from the list when the list gets too big" do
538
+ controller.stub(:blacklight_config).and_return(double(:search_history_window => 5))
539
+ session[:history] = (0..4).to_a.reverse
540
+
541
+ expect(session[:history]).to have(5).items
542
+ controller.send(:add_to_search_history, double(:id => 5))
543
+ controller.send(:add_to_search_history, double(:id => 6))
544
+ controller.send(:add_to_search_history, double(:id => 7))
545
+ expect(session[:history]).to include(*(3..7).to_a)
546
+
547
+ end
548
+ end
549
+
550
+ describe "current_search_session" do
551
+ it "should create a session if we're on an search action" do
552
+ controller.stub(:action_name => "index")
553
+ controller.stub(:params => { :q => "x", :page => 5})
554
+ session = controller.send(:current_search_session)
555
+ expect(session.query_params).to include(:q => "x")
556
+ expect(session.query_params).to_not include(:page => 5)
557
+ end
558
+
559
+ it "should create a session if a search context was provided" do
560
+ controller.stub(:params => { :search_context => JSON.dump(:q => "x")})
561
+ session = controller.send(:current_search_session)
562
+ expect(session.query_params).to include("q" => "x")
563
+ end
564
+
565
+ it "should use an existing session if a search id was provided" do
566
+ s = Search.create(:query_params => { :q => "x" })
567
+ session[:history] ||= []
568
+ session[:history] << s.id
569
+ controller.stub(:params => { :search_id => s.id})
570
+ session = controller.send(:current_search_session)
571
+ expect(session.query_params).to include(:q => "x")
572
+ expect(session).to eq(s)
573
+ end
574
+
575
+ it "should use an existing search session if the search is in the uri" do
576
+ s = Search.create(:query_params => { :q => "x" })
577
+ session[:search] ||= {}
578
+ session[:search][:id] = s.id
579
+ session[:history] ||= []
580
+ session[:history] << s.id
581
+ session = controller.send(:current_search_session)
582
+ expect(session.query_params).to include(:q => "x")
583
+ expect(session).to eq(s)
584
+ end
585
+ end
525
586
  end
526
587
 
527
588
 
@@ -0,0 +1,40 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
3
+
4
+ describe SavedSearchesController do
5
+ include Devise::TestHelpers
6
+
7
+ before(:all) do
8
+ @one = Search.create
9
+ @two = Search.create
10
+ @three = Search.create
11
+
12
+
13
+ end
14
+
15
+ before(:each) do
16
+ @user = User.create! :email => 'test@example.com', :password => 'abcd12345', :password_confirmation => 'abcd12345'
17
+ sign_in @user
18
+ end
19
+
20
+ describe "save" do
21
+ it "should let you save a search" do
22
+
23
+ request.env["HTTP_REFERER"] = "where_i_came_from"
24
+ session[:history] = [@one.id]
25
+ post :save, :id => @one.id
26
+ expect(response).to redirect_to "where_i_came_from"
27
+ end
28
+
29
+ it "should not let you save a search that isn't in your search history" do
30
+ session[:history] = [@one.id]
31
+ expect {
32
+ post :save, :id => @two.id
33
+ }.to raise_exception
34
+ end
35
+
36
+ end
37
+
38
+
39
+
40
+ end
@@ -3,42 +3,32 @@ require 'spec_helper'
3
3
 
4
4
  describe "Search Results" do
5
5
  it "should have for an empty query" do
6
- visit root_path
7
- click_button 'search'
6
+ search_for ''
8
7
  number_of_results_from_page(page).should == 30
9
8
  page.should have_xpath("//a[contains(@href, #{2007020969})]")
10
- fill_in "q", with: 'korea'
11
- click_button 'search'
9
+ search_for 'korea'
12
10
  number_of_results_from_page(page).should == 4
13
11
  end
14
12
 
15
13
  it "should find same result set with or without diacritcs" do
16
- visit root_path
17
- fill_in "q", with: 'inmul'
18
- click_button 'search'
14
+ search_for 'inmul'
19
15
  number_of_results_from_page(page).should == 1
20
16
  page.should have_xpath("//a[contains(@href, #{77826928})]")
21
17
 
22
- fill_in "q", with: 'inmül'
23
- click_button 'search'
18
+ search_for 'inmül'
24
19
  number_of_results_from_page(page).should == 1
25
20
  end
26
21
  it "should find same result set for a case-insensitive query " do
27
- visit root_path
28
- fill_in "q", with: 'inmul'
29
- click_button 'search'
22
+ search_for 'inmul'
30
23
  number_of_results_from_page(page).should == 1
31
24
  page.should have_xpath("//a[contains(@href, #{77826928})]")
32
25
 
33
- fill_in "q", with: 'INMUL'
34
- click_button 'search'
26
+ search_for 'INMUL'
35
27
  number_of_results_from_page(page).should == 1
36
28
  end
37
29
 
38
30
  it "should order by relevancy" do
39
- visit root_path
40
- fill_in "q", with: 'Korea'
41
- click_button 'search'
31
+ search_for "Korea"
42
32
  position_in_result_page(page, '77826928').should == 1
43
33
  position_in_result_page(page, '94120425').should == 2
44
34
 
@@ -50,9 +40,37 @@ describe "Search Results" do
50
40
  expect(page.find(:xpath, "//link[contains(@rel, 'search')]")[:href]).to eq "http://www.example.com/catalog/opensearch.xml"
51
41
  end
52
42
 
43
+ it "should provide search hints if there are no results" do
44
+ search_for 'asdfghj'
45
+ expect(page).to have_content "No results found for your search"
46
+ end
47
+
48
+ it "should pass the current search id through", :js => true do
49
+ visit root_path
50
+ fill_in "q", with: ''
51
+ click_button 'search'
52
+ search_id = Search.last.id.to_s
53
+ click_on 'Pluvial nectar of blessings'
54
+ expect(page).to have_content "« Previous | 10 of 30 | Next »"
55
+ prev = page.find("#previousNextDocument .previous")
56
+ expect(prev['data-counter']).to eq "9"
57
+ expect(prev['data-search_id']).to eq search_id
58
+
59
+ click_on "« Previous"
60
+
61
+ prev = page.find("#previousNextDocument .previous")
62
+ expect(prev['data-counter']).to eq "8"
63
+ expect(prev['data-search_id']).to eq search_id
64
+ end
65
+
53
66
  end
54
67
 
55
68
 
69
+ def search_for q
70
+ visit root_path
71
+ fill_in "q", with: q
72
+ click_button 'search'
73
+ end
56
74
 
57
75
  def position_in_result_page(page, id)
58
76
  i = -1
@@ -81,6 +81,16 @@ describe BlacklightHelper do
81
81
  #@config ||= {:show => {:html_title => 'title_display', :heading => 'title_display', :display_type => 'format'}, :index => { :show_link => 'title_display', :record_display_type => 'format' } }
82
82
  end
83
83
 
84
+ before(:each) do
85
+ helper.stub(:search_action_url) do |*args|
86
+ catalog_index_url *args
87
+ end
88
+ end
89
+
90
+ def current_search_session
91
+
92
+ end
93
+
84
94
  describe "#application_name", :test => true do
85
95
  it "should use the Rails application config application_name if available" do
86
96
  Rails.application.config.stub(:application_name => 'asdf')
@@ -99,8 +109,8 @@ describe BlacklightHelper do
99
109
  end
100
110
 
101
111
  it "should build a link tag to catalog using session[:search] for query params" do
102
- session[:search] = @query_params
103
- tag = link_back_to_catalog
112
+ helper.stub(:current_search_session).and_return double(:query_params => @query_params)
113
+ tag = helper.link_back_to_catalog
104
114
  tag.should =~ /q=query/
105
115
  tag.should =~ /f=facets/
106
116
  tag.should =~ /per_page=10/
@@ -108,8 +118,8 @@ describe BlacklightHelper do
108
118
  end
109
119
 
110
120
  it "should build a link tag to bookmarks using session[:search] for query params" do
111
- session[:search] = @bookmarks_query_params
112
- tag = link_back_to_catalog
121
+ helper.stub(:current_search_session).and_return double(:query_params => @bookmarks_query_params)
122
+ tag = helper.link_back_to_catalog
113
123
  tag.should =~ /Back to Bookmarks/
114
124
  tag.should =~ /\/bookmarks/
115
125
  tag.should =~ /page=2/
@@ -1118,5 +1118,37 @@ describe 'Blacklight::SolrHelper' do
1118
1118
 
1119
1119
  end
1120
1120
 
1121
+ describe "#get_previous_and_next_documents_for_search" do
1122
+ before(:all) do
1123
+ @full_response, @all_docs = get_search_results({:q => ''}, :rows => 1000)
1124
+ end
1125
+
1126
+ it "should return the previous and next documents for a search" do
1127
+ response, docs = get_previous_and_next_documents_for_search(4, :q => '')
1128
+
1129
+ expect(docs.first.id).to eq @all_docs[3].id
1130
+ expect(docs.last.id).to eq @all_docs[5].id
1131
+ end
1132
+
1133
+ it "should return only the next document if the counter is 0" do
1134
+ response, docs = get_previous_and_next_documents_for_search(0, :q => '')
1135
+
1136
+ expect(docs.first).to eq nil
1137
+ expect(docs.last.id).to eq @all_docs[1].id
1138
+ end
1139
+
1140
+ it "should return only the previous document if the counter is the total number of documents" do
1141
+ response, docs = get_previous_and_next_documents_for_search(@full_response.total - 1, :q => '')
1142
+ expect(docs.first.id).to eq @all_docs.slice(-2).id
1143
+ expect(docs.last).to eq nil
1144
+ end
1145
+
1146
+ it "should return an array of nil values if there is only one result" do
1147
+ response, docs = get_previous_and_next_documents_for_search(0, :q => 'id:2007020969')
1148
+ expect(docs.last).to be_nil
1149
+ expect(docs.first).to be_nil
1150
+ end
1151
+ end
1152
+
1121
1153
  end
1122
1154
 
@@ -22,6 +22,18 @@ require File.expand_path("config/environment", ENV['RAILS_ROOT'] || File.expand_
22
22
 
23
23
  require 'rspec/rails'
24
24
  require 'capybara/rspec'
25
+ require 'capybara/poltergeist'
26
+
27
+
28
+ Capybara.javascript_driver = :poltergeist
29
+
30
+ Capybara.register_driver :poltergeist do |app|
31
+ options = {}
32
+
33
+ options[:timeout] = 120 if RUBY_PLATFORM == "java"
34
+
35
+ Capybara::Poltergeist::Driver.new(app, options)
36
+ end
25
37
 
26
38
  # Requires supporting ruby files with custom matchers and macros, etc,
27
39
  # in spec/support/ and its subdirectories.
@@ -13,6 +13,7 @@ gem 'jquery-rails'
13
13
  group :test do
14
14
  gem 'rspec-rails', '~> 2.13'
15
15
  gem 'generator_spec'
16
+ gem 'poltergeist'
16
17
  if defined? :JRUBY_VERSION
17
18
  gem 'capybara', '~> 1.0'
18
19
  else
@@ -13,6 +13,7 @@ describe "/catalog/_show_sidebar.html.erb" do
13
13
 
14
14
  view.stub(:blacklight_config).and_return(CatalogController.blacklight_config)
15
15
  view.stub(:has_user_authentication_provider?).and_return(false)
16
+ view.stub(:current_search_session).and_return nil
16
17
  end
17
18
 
18
19
  it "should show more-like-this titles in the sidebar" do
@@ -20,6 +20,7 @@ describe "catalog/_thumbnail_default" do
20
20
  assign :response, double(:params => {})
21
21
  view.stub(:render_grouped_response?).and_return false
22
22
  view.stub(:blacklight_config).and_return(blacklight_config)
23
+ view.stub(:current_search_session).and_return nil
23
24
  end
24
25
 
25
26
  it "should render the thumbnail if the document has one" do
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe "catalog/index.html.erb" do
4
+ it "should render the sidebar and content panes" do
5
+ view.stub(:blacklight_config).and_return(Blacklight::Configuration.new)
6
+ render
7
+ expect(rendered).to match /id="sidebar"/
8
+ expect(rendered).to match /id="content"/
9
+ end
10
+
11
+ it "should render the search_sidebar partial " do
12
+ stub_template "catalog/_search_sidebar.html.erb" => "sidebar_content"
13
+
14
+ view.stub(:blacklight_config).and_return(Blacklight::Configuration.new)
15
+ render
16
+ expect(rendered).to match /sidebar_content/
17
+ end
18
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blacklight
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.4.2
4
+ version: 4.5.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Rochkind
@@ -17,7 +17,7 @@ authors:
17
17
  autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
- date: 2013-09-27 00:00:00.000000000 Z
20
+ date: 2013-10-18 00:00:00.000000000 Z
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
23
23
  name: rails
@@ -278,6 +278,7 @@ files:
278
278
  - app/views/catalog/_refworks_form.html.erb
279
279
  - app/views/catalog/_results_pagination.html.erb
280
280
  - app/views/catalog/_search_form.html.erb
281
+ - app/views/catalog/_search_sidebar.html.erb
281
282
  - app/views/catalog/_show_default.html.erb
282
283
  - app/views/catalog/_show_more_like_this.html.erb
283
284
  - app/views/catalog/_show_sidebar.html.erb
@@ -286,6 +287,7 @@ files:
286
287
  - app/views/catalog/_sort_and_per_page.html.erb
287
288
  - app/views/catalog/_sort_widget.html.erb
288
289
  - app/views/catalog/_thumbnail_default.html.erb
290
+ - app/views/catalog/_zero_results.html.erb
289
291
  - app/views/catalog/citation.html.erb
290
292
  - app/views/catalog/citation.js.erb
291
293
  - app/views/catalog/email.html.erb
@@ -332,7 +334,9 @@ files:
332
334
  - gemfiles/rails4.gemfile
333
335
  - lib/SolrMarc.jar
334
336
  - lib/blacklight.rb
337
+ - lib/blacklight/base.rb
335
338
  - lib/blacklight/catalog.rb
339
+ - lib/blacklight/catalog/search_context.rb
336
340
  - lib/blacklight/configurable.rb
337
341
  - lib/blacklight/configuration.rb
338
342
  - lib/blacklight/configuration/facet_field.rb
@@ -405,6 +409,7 @@ files:
405
409
  - spec/controllers/application_controller_spec.rb
406
410
  - spec/controllers/bookmarks_controller_spec.rb
407
411
  - spec/controllers/catalog_controller_spec.rb
412
+ - spec/controllers/saved_searches_controller_spec.rb
408
413
  - spec/controllers/search_history_controller_spec.rb
409
414
  - spec/data/sample_docs.yml
410
415
  - spec/data/test_data.utf8.mrc
@@ -472,6 +477,7 @@ files:
472
477
  - spec/views/catalog/_show_sidebar.erb_spec.rb
473
478
  - spec/views/catalog/_thumbnail_default.erb_spec.rb
474
479
  - spec/views/catalog/index.atom.builder_spec.rb
480
+ - spec/views/catalog/index.html.erb_spec.rb
475
481
  - tasks/blacklight.rake
476
482
  - test_support/data/test_data.utf8.mrc
477
483
  homepage: http://projectblacklight.org/
@@ -488,12 +494,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
488
494
  version: '0'
489
495
  required_rubygems_version: !ruby/object:Gem::Requirement
490
496
  requirements:
491
- - - '>='
497
+ - - '>'
492
498
  - !ruby/object:Gem::Version
493
- version: '0'
499
+ version: 1.3.1
494
500
  requirements: []
495
501
  rubyforge_project: blacklight
496
- rubygems_version: 2.0.3
502
+ rubygems_version: 2.1.7
497
503
  signing_key:
498
504
  specification_version: 4
499
505
  summary: Blacklight provides a discovery interface for any Solr (http://lucene.apache.org/solr)
@@ -502,6 +508,7 @@ test_files:
502
508
  - spec/controllers/application_controller_spec.rb
503
509
  - spec/controllers/bookmarks_controller_spec.rb
504
510
  - spec/controllers/catalog_controller_spec.rb
511
+ - spec/controllers/saved_searches_controller_spec.rb
505
512
  - spec/controllers/search_history_controller_spec.rb
506
513
  - spec/data/sample_docs.yml
507
514
  - spec/data/test_data.utf8.mrc
@@ -569,3 +576,4 @@ test_files:
569
576
  - spec/views/catalog/_show_sidebar.erb_spec.rb
570
577
  - spec/views/catalog/_thumbnail_default.erb_spec.rb
571
578
  - spec/views/catalog/index.atom.builder_spec.rb
579
+ - spec/views/catalog/index.html.erb_spec.rb