blacklight 5.9.4 → 5.10.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 (137) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/VERSION +1 -1
  4. data/app/assets/stylesheets/blacklight/_facets.scss +11 -10
  5. data/app/helpers/blacklight/blacklight_helper_behavior.rb +14 -14
  6. data/app/helpers/blacklight/configuration_helper_behavior.rb +16 -10
  7. data/app/helpers/blacklight/facets_helper_behavior.rb +15 -14
  8. data/app/helpers/blacklight/url_helper_behavior.rb +1 -1
  9. data/app/models/bookmark.rb +1 -4
  10. data/app/models/search.rb +3 -6
  11. data/app/views/catalog/_facet_layout.html.erb +2 -2
  12. data/app/views/catalog/_facet_limit.html.erb +5 -3
  13. data/app/views/catalog/_facet_pivot.html.erb +4 -4
  14. data/app/views/catalog/_home_text.html.erb +8 -48
  15. data/app/views/catalog/_index_default.html.erb +3 -3
  16. data/app/views/catalog/_show_default.html.erb +3 -3
  17. data/app/views/catalog/_sms_form.html.erb +1 -1
  18. data/app/views/catalog/facet.html.erb +1 -1
  19. data/blacklight.gemspec +1 -1
  20. data/config/jetty.yml +0 -3
  21. data/config/locales/blacklight.de.yml +2 -0
  22. data/config/locales/blacklight.en.yml +2 -0
  23. data/config/locales/blacklight.es.yml +2 -0
  24. data/config/locales/blacklight.fr.yml +2 -0
  25. data/config/locales/blacklight.pt-BR.yml +2 -0
  26. data/lib/blacklight.rb +70 -26
  27. data/lib/blacklight/abstract_repository.rb +29 -0
  28. data/lib/blacklight/base.rb +7 -7
  29. data/lib/blacklight/bookmarks.rb +5 -5
  30. data/lib/blacklight/catalog.rb +34 -19
  31. data/lib/blacklight/catalog/search_context.rb +1 -1
  32. data/lib/blacklight/configuration.rb +112 -46
  33. data/lib/blacklight/configuration/facet_field.rb +9 -7
  34. data/lib/blacklight/configuration/field.rb +27 -0
  35. data/lib/blacklight/configuration/fields.rb +25 -20
  36. data/lib/blacklight/configuration/search_field.rb +6 -8
  37. data/lib/blacklight/configuration/solr_field.rb +3 -18
  38. data/lib/blacklight/configuration/sort_field.rb +6 -7
  39. data/lib/blacklight/document.rb +156 -0
  40. data/lib/blacklight/document/dublin_core.rb +41 -0
  41. data/lib/blacklight/document/email.rb +16 -0
  42. data/lib/blacklight/document/export.rb +107 -0
  43. data/lib/blacklight/document/extensions.rb +56 -0
  44. data/lib/blacklight/document/schema_org.rb +7 -0
  45. data/lib/blacklight/document/semantic_fields.rb +51 -0
  46. data/lib/blacklight/document/sms.rb +14 -0
  47. data/lib/blacklight/document_presenter.rb +3 -3
  48. data/lib/blacklight/exceptions.rb +9 -2
  49. data/lib/blacklight/facet.rb +21 -16
  50. data/lib/blacklight/request_builders.rb +60 -284
  51. data/lib/blacklight/routes.rb +1 -1
  52. data/lib/blacklight/search_builder.rb +130 -0
  53. data/lib/blacklight/search_helper.rb +316 -0
  54. data/lib/blacklight/solr.rb +1 -0
  55. data/lib/blacklight/solr/document.rb +4 -187
  56. data/lib/blacklight/solr/document/dublin_core.rb +3 -37
  57. data/lib/blacklight/solr/document/email.rb +4 -13
  58. data/lib/blacklight/solr/document/export.rb +3 -103
  59. data/lib/blacklight/solr/document/extensions.rb +4 -52
  60. data/lib/blacklight/solr/document/more_like_this.rb +1 -1
  61. data/lib/blacklight/solr/document/schema_org.rb +4 -4
  62. data/lib/blacklight/solr/document/sms.rb +4 -11
  63. data/lib/blacklight/solr/facet_paginator.rb +2 -2
  64. data/lib/blacklight/solr/search_builder.rb +264 -0
  65. data/lib/blacklight/solr_helper.rb +6 -261
  66. data/lib/blacklight/solr_repository.rb +30 -24
  67. data/lib/blacklight/solr_response.rb +3 -3
  68. data/lib/blacklight/user.rb +1 -2
  69. data/lib/blacklight/utils.rb +0 -23
  70. data/lib/generators/blacklight/controller_generator.rb +38 -0
  71. data/lib/generators/blacklight/document_generator.rb +20 -0
  72. data/lib/generators/blacklight/install_generator.rb +38 -39
  73. data/lib/generators/blacklight/models_generator.rb +2 -62
  74. data/lib/generators/blacklight/templates/catalog_controller.rb +3 -4
  75. data/lib/generators/blacklight/templates/config/{solr.yml → blacklight.yml} +3 -0
  76. data/lib/generators/blacklight/templates/config/jetty.yml +0 -3
  77. data/lib/generators/blacklight/templates/solr_document.rb +6 -6
  78. data/lib/generators/blacklight/test_support_generator.rb +1 -6
  79. data/lib/generators/blacklight/user_generator.rb +59 -0
  80. data/lib/railties/blacklight.rake +16 -7
  81. data/spec/controllers/catalog_controller_spec.rb +9 -15
  82. data/spec/features/facets_spec.rb +8 -0
  83. data/spec/helpers/configuration_helper_spec.rb +6 -13
  84. data/spec/helpers/facets_helper_spec.rb +3 -2
  85. data/spec/lib/blacklight/configuration_spec.rb +11 -38
  86. data/spec/lib/blacklight/{solr/document → document}/dublin_core_spec.rb +4 -4
  87. data/spec/lib/blacklight/{solr/document → document}/email_spec.rb +2 -2
  88. data/spec/lib/blacklight/{solr/document → document}/sms_spec.rb +2 -2
  89. data/spec/lib/blacklight/search_builder_spec.rb +145 -0
  90. data/spec/lib/blacklight/search_helper_spec.rb +775 -0
  91. data/spec/lib/blacklight/solr/document/more_like_this_spec.rb +1 -1
  92. data/spec/lib/blacklight/solr/search_builder_spec.rb +561 -0
  93. data/spec/lib/blacklight/solr_helper_spec.rb +5 -1291
  94. data/spec/lib/blacklight/solr_repository_spec.rb +13 -13
  95. data/spec/models/record_mailer_spec.rb +2 -2
  96. data/spec/spec_helper.rb +1 -0
  97. data/spec/test_app_templates/lib/generators/test_app_generator.rb +1 -1
  98. data/spec/views/catalog/_constraints.html.erb_spec.rb +1 -1
  99. data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +2 -2
  100. data/spec/views/catalog/index.atom.builder_spec.rb +1 -1
  101. data/tasks/blacklight.rake +1 -1
  102. data/template.demo.rb +1 -1
  103. metadata +33 -45
  104. data/doc/Adding-new-document-actions.md +0 -94
  105. data/doc/Atom-Responses.md +0 -90
  106. data/doc/Blacklight-Add-ons.md +0 -23
  107. data/doc/Blacklight-configuration.md +0 -411
  108. data/doc/Blacklight-on-Heroku.md +0 -100
  109. data/doc/Blacklight-out-of-the-box.md +0 -47
  110. data/doc/Bookmarks.md +0 -1
  111. data/doc/Code4Lib-2014.md +0 -94
  112. data/doc/Configuration---Facet-Fields.md +0 -130
  113. data/doc/Configuration---Results-View.md +0 -224
  114. data/doc/Configuration---Solr-fields.md +0 -106
  115. data/doc/Configuring-and-Customizing-Blacklight.md +0 -257
  116. data/doc/Configuring-rails-routes.md +0 -13
  117. data/doc/Contributing-to-Blacklight.md +0 -43
  118. data/doc/Examples.md +0 -120
  119. data/doc/Extending-or-Modifying-Blacklight-Search-Behavior.md +0 -141
  120. data/doc/Home.md +0 -100
  121. data/doc/How-to-release-a-version.md +0 -45
  122. data/doc/Indexing-your-data-into-solr.md +0 -36
  123. data/doc/Internationalization.md +0 -32
  124. data/doc/JSON-API.md +0 -83
  125. data/doc/Pagination.md +0 -52
  126. data/doc/Providing-your-own-view-templates.md +0 -69
  127. data/doc/Quickstart.md +0 -153
  128. data/doc/README_SOLR.md +0 -245
  129. data/doc/Saved-Searches.md +0 -5
  130. data/doc/Solr-Configuration.md +0 -154
  131. data/doc/Sunspot-for-indexing.md +0 -46
  132. data/doc/Support.md +0 -33
  133. data/doc/Theming.md +0 -62
  134. data/doc/Understanding-Rails-and-Blacklight.md +0 -75
  135. data/doc/User-Authentication.md +0 -60
  136. data/doc/_Sidebar.md +0 -9
  137. data/doc/testing.md +0 -58
@@ -0,0 +1,145 @@
1
+ require 'spec_helper'
2
+
3
+ describe Blacklight::SearchBuilder do
4
+ let(:processor_chain) { [] }
5
+ let(:blacklight_config) { Blacklight::Configuration.new }
6
+ let(:scope) { double blacklight_config: blacklight_config }
7
+ subject { described_class.new processor_chain, scope }
8
+ describe "#with" do
9
+ it "should set the blacklight params" do
10
+ params = {}
11
+ subject.with(params)
12
+ expect(subject.blacklight_params).to eq params
13
+ end
14
+
15
+ it "should dup the params" do
16
+ params = {}
17
+ subject.with(params).where('asdf')
18
+ expect(subject.blacklight_params).not_to eq params
19
+ expect(subject.blacklight_params[:q]).to eq 'asdf'
20
+ expect(params[:q]).not_to eq 'asdf'
21
+ end
22
+ end
23
+
24
+ describe "#processor_chain" do
25
+ let(:processor_chain) { [:a, :b, :c] }
26
+ it "should be mutable" do
27
+ subject.processor_chain.insert(-1, :d)
28
+ expect(subject.processor_chain).to match_array [:a, :b, :c, :d]
29
+ end
30
+ end
31
+
32
+ describe "#append" do
33
+ let(:processor_chain) { [:a, :b, :c] }
34
+ it "should provide a new search builder with the processor chain" do
35
+ builder = subject.append(:d, :e)
36
+ expect(subject.processor_chain).to eq processor_chain
37
+ expect(builder.processor_chain).not_to eq subject.processor_chain
38
+ expect(builder.processor_chain).to match_array [:a, :b, :c, :d, :e]
39
+ end
40
+ end
41
+
42
+ describe "#query" do
43
+ it "should append the extra parameters to the result" do
44
+ actual = subject.query({a: 1})
45
+ expect(actual).to include a: 1
46
+ end
47
+ end
48
+
49
+ describe "#processed_parameters" do
50
+ let(:processor_chain) { [:step_1] }
51
+ it "should try to run the processor method on the provided scope" do
52
+ allow(scope).to receive(:respond_to?).and_return(true)
53
+ allow(scope).to receive(:step_1) do |req_params, user_params|
54
+ req_params[:step_1] = 'scope'
55
+ req_params[:user_params] = user_params
56
+ end
57
+
58
+ Deprecation.silence(Blacklight::SearchBuilder) do
59
+ subject.with(a: 1)
60
+ expect(subject.processed_parameters).to include step_1: 'scope', user_params: { a: 1 }
61
+ end
62
+ end
63
+
64
+ it "should try to run the processor method on the search builder" do
65
+ allow(subject).to receive(:step_1) do |req_params|
66
+ req_params[:step_1] = 'builder'
67
+ end
68
+
69
+ subject.with(a: 1)
70
+ expect(subject.processed_parameters).to include step_1: 'builder'
71
+ end
72
+ end
73
+
74
+ describe "#blacklight_config" do
75
+ it "should get the blacklight_config from the scope" do
76
+ expect(subject.blacklight_config).to eq scope.blacklight_config
77
+ end
78
+ end
79
+
80
+ describe "#page" do
81
+ it "should be the current user parameter page number" do
82
+ expect(subject.with(page: 2).send(:page)).to eq 2
83
+ end
84
+
85
+ it "should be page 1 if not page number given" do
86
+ expect(subject.send(:page)).to eq 1
87
+ end
88
+
89
+ it "should coerce parameters to integers" do
90
+ expect(subject.with(page: '2b').send(:page)).to eq 2
91
+ end
92
+ end
93
+
94
+ describe "#rows" do
95
+ it "should be the per_page parameter" do
96
+ expect(subject.with(per_page: 5).send(:rows)).to eq 5
97
+ end
98
+
99
+ it "should support the legacy 'rows' parameter" do
100
+ expect(subject.with(rows: 10).send(:rows)).to eq 10
101
+ end
102
+
103
+ it "should use the provided default" do
104
+ expect(subject.send(:rows, 17)).to eq 17
105
+ end
106
+
107
+ it "should be set to the configured default" do
108
+ blacklight_config.default_per_page = 42
109
+ expect(subject.send(:rows)).to eq 42
110
+ end
111
+
112
+ it "should default to 10" do
113
+ blacklight_config.default_per_page = nil
114
+ expect(subject.send(:rows)).to eq 10
115
+ end
116
+
117
+ it "should limit the number of rows to the configured maximum" do
118
+ blacklight_config.max_per_page = 1000
119
+ expect(subject.send(:rows, 1001)).to eq 1000
120
+ end
121
+ end
122
+
123
+ describe "#sort" do
124
+ it "should pass through the sort parameter" do
125
+ expect(subject.with(sort: 'x').send(:sort)).to eq 'x'
126
+ end
127
+
128
+ it "should use the default if no sort parameter is given" do
129
+ blacklight_config.default_sort_field = double(sort: 'x desc')
130
+ expect(subject.send(:sort)).to eq 'x desc'
131
+ end
132
+
133
+ it "should use the requested sort field" do
134
+ blacklight_config.add_sort_field 'x', sort: 'x asc'
135
+ expect(subject.with(sort: 'x').send(:sort)).to eq 'x asc'
136
+ end
137
+ end
138
+
139
+ describe "#search_field" do
140
+ it "should use the requested search field" do
141
+ blacklight_config.add_search_field 'x'
142
+ expect(subject.with(search_field: 'x').send(:search_field)).to eq blacklight_config.search_fields['x']
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,775 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ # check the methods that do solr requests. Note that we are not testing if
5
+ # solr gives "correct" responses, as that's out of scope (it's a part of
6
+ # testing the solr code itself). We *are* testing if blacklight code sends
7
+ # queries to solr such that it gets appropriate results. When a user does a search,
8
+ # do we get data back from solr (i.e. did we properly configure blacklight code
9
+ # to talk with solr and get results)? when we do a document request, does
10
+ # blacklight code get a single document returned?)
11
+ #
12
+ describe Blacklight::SearchHelper do
13
+
14
+ let(:default_method_chain) { CatalogController.search_params_logic }
15
+
16
+ # SearchHelper is a controller layer mixin, which depends
17
+ # on being mixed into a class which has #params (from Rails)
18
+ # and #blacklight_config
19
+ class SearchHelperTestClass
20
+ include Blacklight::SearchHelper
21
+
22
+ attr_accessor :blacklight_config
23
+ attr_accessor :repository
24
+
25
+ def initialize blacklight_config, conn
26
+ self.blacklight_config = blacklight_config
27
+ self.repository = Blacklight::SolrRepository.new(blacklight_config)
28
+ self.repository.connection = conn
29
+ end
30
+
31
+ def params
32
+ {}
33
+ end
34
+ end
35
+
36
+ subject { SearchHelperTestClass.new blacklight_config, blacklight_solr }
37
+
38
+ let(:blacklight_config) { Blacklight::Configuration.new }
39
+ let(:copy_of_catalog_config) { ::CatalogController.blacklight_config.deep_copy }
40
+ let(:blacklight_solr) { RSolr.connect(Blacklight.connection_config) }
41
+
42
+ before(:each) do
43
+ @all_docs_query = ''
44
+ @no_docs_query = 'zzzzzzzzzzzz'
45
+ @single_word_query = 'include'
46
+ @mult_word_query = 'tibetan history'
47
+ # f[format][]=Book&f[language_facet][]=English
48
+ @single_facet = {:format=>'Book'}
49
+ @multi_facets = {:format=>'Book', :language_facet=>'Tibetan'}
50
+ @bad_facet = {:format=>'666'}
51
+ @subject_search_params = {:commit=>"search", :search_field=>"subject", :action=>"index", :"controller"=>"catalog", :"rows"=>"10", :"q"=>"wome"}
52
+ end
53
+
54
+ describe "solr_search_params" do
55
+ it "allows customization of the filter pipeline" do
56
+ # Normally you'd include a new module into (eg) your CatalogController
57
+ # but a sub-class defininig it directly is simpler for test.
58
+ allow(subject).to receive(:add_foo_to_solr_params) do |solr_params, user_params|
59
+ solr_params[:wt] = "TESTING"
60
+ end
61
+
62
+ allow(Deprecation).to receive(:warn)
63
+ expect(subject.solr_search_params({}, [:add_foo_to_solr_params])[:wt]).to eq "TESTING"
64
+ end
65
+ end
66
+
67
+ describe "solr_facet_params" do
68
+ before do
69
+ @facet_field = 'format'
70
+ @generated_solr_facet_params = subject.solr_facet_params(@facet_field)
71
+
72
+ @sort_key = Blacklight::Solr::FacetPaginator.request_keys[:sort]
73
+ @page_key = Blacklight::Solr::FacetPaginator.request_keys[:page]
74
+ end
75
+ let(:blacklight_config) do
76
+ Blacklight::Configuration.new do |config|
77
+ config.add_facet_fields_to_solr_request!
78
+ config.add_facet_field 'format'
79
+ config.add_facet_field 'format_ordered', :sort => :count
80
+ config.add_facet_field 'format_limited', :limit => 5
81
+
82
+ end
83
+ end
84
+
85
+ it 'sets rows to 0' do
86
+ expect(@generated_solr_facet_params[:rows]).to eq 0
87
+ end
88
+ it 'sets facets requested to facet_field argument' do
89
+ expect(@generated_solr_facet_params["facet.field".to_sym]).to eq @facet_field
90
+ end
91
+ it 'defaults offset to 0' do
92
+ expect(@generated_solr_facet_params[:"f.#{@facet_field}.facet.offset"]).to eq 0
93
+ end
94
+ it 'uses offset manually set, and converts it to an integer' do
95
+ solr_params = subject.solr_facet_params(@facet_field, @page_key => 2)
96
+ expect(solr_params[:"f.#{@facet_field}.facet.offset"]).to eq 20
97
+ end
98
+ it 'defaults limit to 20' do
99
+ solr_params = subject.solr_facet_params(@facet_field)
100
+ expect(solr_params[:"f.#{@facet_field}.facet.limit"]).to eq 21
101
+ end
102
+
103
+ describe 'if facet_list_limit is defined in controller' do
104
+ before do
105
+ allow(subject).to receive_messages facet_list_limit: 1000
106
+ end
107
+ it 'uses controller method for limit' do
108
+ solr_params = subject.solr_facet_params(@facet_field)
109
+ expect(solr_params[:"f.#{@facet_field}.facet.limit"]).to eq 1001
110
+ end
111
+
112
+ it 'uses controller method for limit when a ordinary limit is set' do
113
+ solr_params = subject.solr_facet_params(@facet_field)
114
+ expect(solr_params[:"f.#{@facet_field}.facet.limit"]).to eq 1001
115
+ end
116
+ end
117
+
118
+ it 'uses the default sort' do
119
+ solr_params = subject.solr_facet_params(@facet_field)
120
+ expect(solr_params[:"f.#{@facet_field}.facet.sort"]).to be_blank
121
+ end
122
+
123
+ it 'uses sort provided in the parameters' do
124
+ solr_params = subject.solr_facet_params(@facet_field, @sort_key => "index")
125
+ expect(solr_params[:"f.#{@facet_field}.facet.sort"]).to eq 'index'
126
+ end
127
+
128
+ it "comes up with the same params as #solr_search_params to constrain context for facet list" do
129
+ search_params = {:q => 'tibetan history', :f=> {:format=>'Book', :language_facet=>'Tibetan'}}
130
+ solr_facet_params = subject.solr_facet_params('format', search_params)
131
+
132
+ expect(solr_facet_params).to include :"facet.field" => "format"
133
+ expect(solr_facet_params).to include :"f.format.facet.limit" => 21
134
+ expect(solr_facet_params).to include :"f.format.facet.offset" => 0
135
+ expect(solr_facet_params).to include :"rows" => 0
136
+ end
137
+ end
138
+
139
+ describe "get_facet_pagination", :integration => true do
140
+ before do
141
+ Deprecation.silence(Blacklight::SearchHelper) do
142
+ @facet_paginator = subject.get_facet_pagination(@facet_field)
143
+ end
144
+ end
145
+ it 'should return a facet paginator' do
146
+ expect(@facet_paginator).to be_a_kind_of(Blacklight::Solr::FacetPaginator)
147
+ end
148
+ it 'with a limit set' do
149
+ expect(@facet_paginator.limit).not_to be_nil
150
+ end
151
+ end
152
+
153
+ # SPECS FOR SEARCH RESULTS FOR QUERY
154
+ describe 'Search Results', :integration => true do
155
+
156
+ let(:blacklight_config) { copy_of_catalog_config }
157
+ describe 'for a sample query returning results' do
158
+
159
+ before do
160
+ (@solr_response, @document_list) = subject.search_results({ q: @all_docs_query }, default_method_chain)
161
+ end
162
+
163
+ it "should use the configured request handler " do
164
+ allow(blacklight_config).to receive(:default_solr_params).and_return({:qt => 'custom_request_handler'})
165
+ allow(blacklight_solr).to receive(:send_and_receive) do |path, params|
166
+ expect(path).to eq 'select'
167
+ expect(params[:params]['facet.field']).to eq ["format", "{!ex=pub_date_single}pub_date", "subject_topic_facet", "language_facet", "lc_1letter_facet", "subject_geo_facet", "subject_era_facet"]
168
+ expect(params[:params]["facet.query"]).to eq ["pub_date:[#{5.years.ago.year} TO *]", "pub_date:[#{10.years.ago.year} TO *]", "pub_date:[#{25.years.ago.year} TO *]"]
169
+ expect(params[:params]).to include('rows' => 10, 'qt'=>"custom_request_handler", 'q'=>"", "f.subject_topic_facet.facet.limit"=>21, 'sort'=>"score desc, pub_date_sort desc, title_sort asc")
170
+ end.and_return({'response'=>{'docs'=>[]}})
171
+ subject.search_results({ q: @all_docs_query }, default_method_chain)
172
+ end
173
+
174
+ it 'should have a @response.docs list of the same size as @document_list' do
175
+ expect(@solr_response.docs).to have(@document_list.length).docs
176
+ end
177
+
178
+ it 'should have @response.docs list representing same documents as SolrDocuments in @document_list' do
179
+ @solr_response.docs.each_index do |index|
180
+ mash = @solr_response.docs[index]
181
+ solr_document = @document_list[index]
182
+
183
+ expect(Set.new(mash.keys)).to eq Set.new(solr_document.keys)
184
+
185
+ mash.each_key do |key|
186
+ expect(mash[key]).to eq solr_document[key]
187
+ end
188
+ end
189
+ end
190
+ end
191
+
192
+ describe "#get_search_results " do
193
+ it "should be deprecated and return results" do
194
+ expect(Deprecation).to receive(:warn)
195
+ (solr_response, document_list) = subject.get_search_results(q: @all_docs_query)
196
+ result_docs = document_list
197
+ document = result_docs.first
198
+ expect(document.get(blacklight_config.index.title_field)).not_to be_nil
199
+ expect(document.get(blacklight_config.index.display_type_field)).not_to be_nil
200
+ end
201
+ end
202
+
203
+ describe "for a query returning a grouped response" do
204
+ let(:blacklight_config) { copy_of_catalog_config }
205
+ before do
206
+ blacklight_config.default_solr_params[:group] = true
207
+ blacklight_config.default_solr_params[:'group.field'] = 'pub_date_sort'
208
+ (@solr_response, @document_list) = subject.search_results({ q: @all_docs_query }, default_method_chain)
209
+ end
210
+
211
+ it "should have an empty document list" do
212
+ expect(@document_list).to be_empty
213
+ end
214
+
215
+ it "should return a grouped response" do
216
+ expect(@solr_response).to be_a_kind_of Blacklight::SolrResponse::GroupResponse
217
+
218
+ end
219
+ end
220
+
221
+ describe "for a query returning multiple groups", integration: true do
222
+ let(:blacklight_config) { copy_of_catalog_config }
223
+
224
+ before do
225
+ allow(subject).to receive_messages grouped_key_for_results: 'title_sort'
226
+ blacklight_config.default_solr_params[:group] = true
227
+ blacklight_config.default_solr_params[:'group.field'] = ['pub_date_sort', 'title_sort']
228
+ (@solr_response, @document_list) = subject.search_results({ q: @all_docs_query }, default_method_chain)
229
+ end
230
+
231
+ it "should have an empty document list" do
232
+ expect(@document_list).to be_empty
233
+ end
234
+
235
+ it "should return a grouped response" do
236
+ expect(@solr_response).to be_a_kind_of Blacklight::SolrResponse::GroupResponse
237
+ expect(@solr_response.group_field).to eq "title_sort"
238
+ end
239
+ end
240
+
241
+ describe '#query_solr' do
242
+ it 'should have results' do
243
+ expect(Deprecation).to receive(:warn)
244
+ solr_response = subject.query_solr(q: @single_word_query)
245
+ expect(solr_response.docs).to have_at_least(1).result
246
+ end
247
+
248
+ end
249
+
250
+ describe 'for All Docs Query, No Facets' do
251
+ it 'should have non-nil values for required doc fields set in initializer' do
252
+ (solr_response, document_list) = subject.search_results({ q: @all_docs_query }, default_method_chain)
253
+ result_docs = document_list
254
+ document = result_docs.first
255
+ expect(document.get(blacklight_config.index.title_field)).not_to be_nil
256
+ expect(document.get(blacklight_config.index.display_type_field)).not_to be_nil
257
+ end
258
+ end
259
+
260
+
261
+
262
+ describe "Single Word Query with no Facets" do
263
+ it 'should have results' do
264
+ expect(Deprecation).to receive(:warn)
265
+ solr_response = subject.query_solr( q: @single_word_query)
266
+ expect(solr_response.docs).to have_at_least(1).result
267
+ end
268
+
269
+ it 'should have results' do
270
+ (solr_response, document_list) = subject.search_results({ q: @single_word_query }, default_method_chain)
271
+ expect(solr_response.docs).to have(document_list.size).results
272
+ expect(solr_response.docs).to have_at_least(1).result
273
+ end
274
+ end
275
+
276
+ describe "Multiple Words Query with No Facets" do
277
+ it 'should have results' do
278
+
279
+ (solr_response, document_list) = subject.search_results({ q: @mult_word_query }, default_method_chain)
280
+ expect(solr_response.docs).to have(document_list.size).results
281
+ expect(solr_response.docs).to have_at_least(1).result
282
+ end
283
+ end
284
+
285
+ describe "One Facet, No Query" do
286
+ it 'should have results' do
287
+ (solr_response, document_list) = subject.search_results({ f: @single_facet }, default_method_chain)
288
+ expect(solr_response.docs).to have(document_list.size).results
289
+ expect(solr_response.docs).to have_at_least(1).result
290
+ end
291
+ end
292
+
293
+ describe "Mult Facets, No Query" do
294
+ it 'should have results' do
295
+ (solr_response, document_list) = subject.search_results({ f: @multi_facets }, default_method_chain)
296
+ expect(solr_response.docs).to have(document_list.size).results
297
+ expect(solr_response.docs).to have_at_least(1).result
298
+ end
299
+ end
300
+
301
+ describe "Single Word Query with One Facet" do
302
+ it 'should have results' do
303
+ (solr_response, document_list) = subject.search_results({ q: @single_word_query, f: @single_facet }, default_method_chain)
304
+ expect(solr_response.docs).to have(document_list.size).results
305
+ expect(solr_response.docs).to have_at_least(1).result
306
+ end
307
+ end
308
+
309
+ describe "Multiple Words Query with Multiple Facets" do
310
+ it 'should have results' do
311
+ (solr_response, document_list) = subject.search_results({ q: @mult_word_query, f: @multi_facets }, default_method_chain)
312
+ expect(solr_response.docs).to have(document_list.size).results
313
+ expect(solr_response.docs).to have_at_least(1).result
314
+ end
315
+ end
316
+
317
+ describe "for All Docs Query and One Facet" do
318
+ it 'should have results' do
319
+ (solr_response, document_list) = subject.search_results({ q: @all_docs_query, f: @single_facet }, default_method_chain)
320
+ expect(solr_response.docs).to have(document_list.size).results
321
+ expect(solr_response.docs).to have_at_least(1).result
322
+ end
323
+ # TODO: check that number of these results < number of results for all docs query
324
+ # BUT can't: num docs isn't total, it's the num docs in the single SOLR response (e.g. 10)
325
+ end
326
+
327
+ describe "for Query Without Results and No Facet" do
328
+ it 'should have no results and not raise error' do
329
+ (solr_response, document_list) = subject.search_results({ q: @no_docs_query }, default_method_chain)
330
+ expect(document_list).to have(0).results
331
+ expect(solr_response.docs).to have(0).results
332
+ end
333
+ end
334
+
335
+ describe "for Query Without Results and One Facet" do
336
+ it 'should have no results and not raise error' do
337
+ (solr_response, document_list) = subject.search_results({ q: @no_docs_query, f: @single_facet }, default_method_chain)
338
+ expect(document_list).to have(0).results
339
+ expect(solr_response.docs).to have(0).results
340
+ end
341
+ end
342
+
343
+ describe "for All Docs Query and Bad Facet" do
344
+ it 'should have no results and not raise error' do
345
+ (solr_response, document_list) = subject.search_results({ q: @all_docs_query, f: @bad_facet }, default_method_chain)
346
+ expect(document_list).to have(0).results
347
+ expect(solr_response.docs).to have(0).results
348
+ end
349
+ end
350
+ end # Search Results
351
+
352
+
353
+ # SPECS FOR SEARCH RESULTS FOR FACETS
354
+ describe 'Facets in Search Results for All Docs Query', :integration => true do
355
+
356
+ let(:blacklight_config) { copy_of_catalog_config }
357
+
358
+ before do
359
+ (solr_response, document_list) = subject.search_results({ q: @all_docs_query}, default_method_chain)
360
+ @facets = solr_response.facets
361
+ end
362
+
363
+ it 'should have more than one facet' do
364
+ expect(@facets).to have_at_least(1).facet
365
+ end
366
+ it 'should have all facets specified in initializer' do
367
+ fields = blacklight_config.facet_fields.reject { |k,v| v.query || v.pivot }
368
+ expect(@facets.map { |f| f.name }).to match_array fields.map { |k, v| v.field }
369
+ fields.each do |key, field|
370
+ expect(@facets.find {|f| f.name == field.field}).not_to be_nil
371
+ end
372
+ end
373
+ it 'should have at least one value for each facet' do
374
+ @facets.each do |facet|
375
+ expect(facet.items).to have_at_least(1).hit
376
+ end
377
+ end
378
+ it 'should have multiple values for at least one facet' do
379
+ has_mult_values = false
380
+ @facets.each do |facet|
381
+ if facet.items.size > 1
382
+ has_mult_values = true
383
+ break
384
+ end
385
+ end
386
+ expect(has_mult_values).to eq true
387
+ end
388
+ it 'should have all value counts > 0' do
389
+ @facets.each do |facet|
390
+ facet.items.each do |facet_vals|
391
+ expect(facet_vals.hits).to be > 0
392
+ end
393
+ end
394
+ end
395
+ end # facet specs
396
+
397
+
398
+ # SPECS FOR SEARCH RESULTS FOR PAGING
399
+ describe 'Paging', :integration => true do
400
+ let(:blacklight_config) { copy_of_catalog_config }
401
+
402
+ it 'should start with first results by default' do
403
+ (solr_response, document_list) = subject.search_results({ q: @all_docs_query }, default_method_chain)
404
+ expect(solr_response.params[:start].to_i).to eq 0
405
+ end
406
+ it 'should have number of results (per page) set in initializer, by default' do
407
+ (solr_response, document_list) = subject.search_results({ q: @all_docs_query }, default_method_chain)
408
+ expect(solr_response.docs).to have(blacklight_config[:default_solr_params][:rows]).items
409
+ expect(document_list).to have(blacklight_config[:default_solr_params][:rows]).items
410
+ end
411
+
412
+ it 'should get number of results per page requested' do
413
+ num_results = 3 # non-default value
414
+ (solr_response1, document_list1) = subject.search_results({ q: @all_docs_query, per_page: num_results }, default_method_chain)
415
+ expect(document_list1).to have(num_results).docs
416
+ expect(solr_response1.docs).to have(num_results).docs
417
+ end
418
+
419
+ it 'should get number of rows requested' do
420
+ num_results = 4 # non-default value
421
+ (solr_response1, document_list1) = subject.search_results({ q: @all_docs_query, rows: num_results }, default_method_chain)
422
+ expect(document_list1).to have(num_results).docs
423
+ expect(solr_response1.docs).to have(num_results).docs
424
+ end
425
+
426
+ it 'should skip appropriate number of results when requested - default per page' do
427
+ page = 3
428
+ (solr_response2, document_list2) = subject.search_results({ q: @all_docs_query, page: page }, default_method_chain)
429
+ expect(solr_response2.params[:start].to_i).to eq blacklight_config[:default_solr_params][:rows] * (page-1)
430
+ end
431
+ it 'should skip appropriate number of results when requested - non-default per page' do
432
+ page = 3
433
+ num_results = 3
434
+ (solr_response2a, document_list2a) = subject.search_results({ q: @all_docs_query, per_page: num_results, page: page }, default_method_chain)
435
+ expect(solr_response2a.params[:start].to_i).to eq num_results * (page-1)
436
+ end
437
+
438
+ it 'should have no results when prompted for page after last result' do
439
+ big = 5000
440
+ (solr_response3, document_list3) = subject.search_results({ q: @all_docs_query, rows: big, page: big }, default_method_chain)
441
+ expect(document_list3).to have(0).docs
442
+ expect(solr_response3.docs).to have(0).docs
443
+ end
444
+
445
+ it 'should show first results when prompted for page before first result' do
446
+ # FIXME: should it show first results, or should it throw an error for view to deal w?
447
+ # Solr throws an error for a negative start value
448
+ (solr_response4, document_list4) = subject.search_results({ q: @all_docs_query, page: '-1' }, default_method_chain)
449
+ expect(solr_response4.params[:start].to_i).to eq 0
450
+ end
451
+ it 'should have results available when asked for more than are in response' do
452
+ big = 5000
453
+ (solr_response5, document_list5) = subject.search_results({ q: @all_docs_query, rows: big, page: 1 }, default_method_chain)
454
+ expect(solr_response5.docs).to have(document_list5.length).docs
455
+ expect(solr_response5.docs).to have_at_least(1).doc
456
+ end
457
+
458
+ end # page specs
459
+
460
+ # SPECS FOR SINGLE DOCUMENT REQUESTS
461
+ describe 'Get Document By Id', :integration => true do
462
+
463
+ describe "#get_solr_response_for_doc_id" do
464
+ let(:doc_id) { '2007020969' }
465
+ it "should be deprecated" do
466
+ expect(Deprecation).to receive(:warn).at_least(1).times
467
+ expect(subject.repository).to receive(:find).with(@doc_id, {}).and_call_original
468
+ subject.get_solr_response_for_doc_id(@doc_id)
469
+ end
470
+ end
471
+
472
+ before do
473
+ @doc_id = '2007020969'
474
+ @bad_id = "redrum"
475
+ @response2, @document = subject.fetch(@doc_id)
476
+ end
477
+
478
+ it "should raise Blacklight::RecordNotFound for an unknown id" do
479
+ expect {
480
+ subject.fetch(@bad_id)
481
+ }.to raise_error(Blacklight::Exceptions::RecordNotFound)
482
+ end
483
+
484
+ it "should use a provided document request handler " do
485
+ allow(blacklight_config).to receive_messages(:document_solr_request_handler => 'document')
486
+ allow(blacklight_solr).to receive(:send_and_receive).with('select', kind_of(Hash)).and_return({'response'=>{'docs'=>[]}})
487
+ expect { subject.fetch(@doc_id)}.to raise_error Blacklight::Exceptions::RecordNotFound
488
+ end
489
+
490
+ it "should use a provided document solr path " do
491
+ allow(blacklight_config).to receive_messages(:document_solr_path => 'get')
492
+ allow(blacklight_solr).to receive(:send_and_receive).with('get', kind_of(Hash)).and_return({'response'=>{'docs'=>[]}})
493
+ expect { subject.fetch(@doc_id)}.to raise_error Blacklight::Exceptions::RecordNotFound
494
+ end
495
+
496
+ it "should have a non-nil result for a known id" do
497
+ expect(@document).not_to be_nil
498
+ end
499
+ it "should have a single document in the response for a known id" do
500
+ expect(@response2.docs.size).to eq 1
501
+ end
502
+ it 'should have the expected value in the id field' do
503
+ expect(@document.id).to eq @doc_id
504
+ end
505
+ it 'should have non-nil values for required fields set in initializer' do
506
+ expect(@document.get(blacklight_config.view_config(:show).display_type_field)).not_to be_nil
507
+ end
508
+ end
509
+
510
+ describe "solr_doc_params" do
511
+ it "should default to using the 'document' requestHandler" do
512
+ Deprecation.silence(Blacklight::SearchHelper) do
513
+ doc_params = subject.solr_doc_params('asdfg')
514
+ expect(doc_params[:qt]).to eq 'document'
515
+ end
516
+ end
517
+
518
+ it "should default to using the id parameter when sending solr queries" do
519
+ Deprecation.silence(Blacklight::SearchHelper) do
520
+ doc_params = subject.solr_doc_params('asdfg')
521
+ expect(doc_params[:id]).to eq 'asdfg'
522
+ end
523
+ end
524
+
525
+ it "should use the document_unique_id_param configuration" do
526
+ Deprecation.silence(Blacklight::SearchHelper) do
527
+ allow(blacklight_config).to receive_messages(document_unique_id_param: :ids)
528
+ doc_params = subject.solr_doc_params('asdfg')
529
+ expect(doc_params[:ids]).to eq 'asdfg'
530
+ end
531
+ end
532
+
533
+ describe "blacklight config's default_document_solr_parameters" do
534
+ it "should use parameters from the controller's default_document_solr_parameters" do
535
+ Deprecation.silence(Blacklight::SearchHelper) do
536
+ blacklight_config.default_document_solr_params = { :qt => 'my_custom_handler', :asdf => '1234' }
537
+ doc_params = subject.solr_doc_params('asdfg')
538
+ expect(doc_params[:qt]).to eq 'my_custom_handler'
539
+ expect(doc_params[:asdf]).to eq '1234'
540
+ end
541
+ end
542
+ end
543
+
544
+ end
545
+
546
+ describe "Get Document by custom unique id" do
547
+ =begin
548
+ # Can't test this properly without updating the "document" request handler in solr
549
+ it "should respect the configuration-supplied unique id" do
550
+ allow(SolrDocument).to receive(:unique_key).and_return("title_display")
551
+ @response, @document = @solr_helper.fetch('"Strong Medicine speaks"')
552
+ @document.id).to eq '"Strong Medicine speaks"'
553
+ @document.get(:id)).to eq 2007020969
554
+ end
555
+ =end
556
+ it "should respect the configuration-supplied unique id" do
557
+ Deprecation.silence(Blacklight::SearchHelper) do
558
+ doc_params = subject.solr_doc_params('"Strong Medicine speaks"')
559
+ expect(doc_params[:id]).to eq '"Strong Medicine speaks"'
560
+ end
561
+ end
562
+ end
563
+
564
+
565
+
566
+ # SPECS FOR SINGLE DOCUMENT VIA SEARCH
567
+ describe "Get Document Via Search", :integration => true do
568
+ before do
569
+ @doc_row = 3
570
+ Deprecation.silence(Blacklight::SearchHelper) do
571
+ @doc = subject.get_single_doc_via_search(@doc_row, :q => @all_docs_query)
572
+ end
573
+ end
574
+ =begin
575
+ # can't test these here, because the method only returns the document
576
+ it "should get a single document" do
577
+ response.docs.size).to eq 1
578
+ end
579
+
580
+ doc2 = get_single_doc_via_search(@all_docs_query, nil, @doc_row, @multi_facets)
581
+ it "should limit search result by facets when supplied" do
582
+ response2expect(.docs.numFound).to_be < response.docs.numFound
583
+ end
584
+
585
+ it "should not have facets in the response" do
586
+ response.facets.size).to eq 0
587
+ end
588
+ =end
589
+
590
+ it 'should have a doc id field' do
591
+ expect(@doc[:id]).not_to be_nil
592
+ end
593
+
594
+ it 'should have non-nil values for required fields set in initializer' do
595
+ expect(@doc[blacklight_config.view_config(:show).display_type_field]).not_to be_nil
596
+ end
597
+
598
+ it "should limit search result by facets when supplied" do
599
+ Deprecation.silence(Blacklight::SearchHelper) do
600
+ doc2 = subject.get_single_doc_via_search(@doc_row , :q => @all_docs_query, :f => @multi_facets)
601
+ expect(doc2[:id]).not_to be_nil
602
+ end
603
+ end
604
+
605
+ end
606
+
607
+ # SPECS FOR SPELLING SUGGESTIONS VIA SEARCH
608
+ describe "Searches should return spelling suggestions", :integration => true do
609
+ it 'search results for just-poor-enough-query term should have (multiple) spelling suggestions' do
610
+ (solr_response, document_list) = subject.search_results({ q: 'boo' }, default_method_chain)
611
+ expect(solr_response.spelling.words).to include('bon')
612
+ expect(solr_response.spelling.words).to include('bod') #for multiple suggestions
613
+ end
614
+
615
+ it 'search results for just-poor-enough-query term should have multiple spelling suggestions' do
616
+ (solr_response, document_list) = subject.search_results({ q: 'politica' }, default_method_chain)
617
+ expect(solr_response.spelling.words).to include('policy') # less freq
618
+ expect(solr_response.spelling.words).to include('politics') # more freq
619
+ expect(solr_response.spelling.words).to include('political') # more freq
620
+ =begin
621
+ # when we can have multiple suggestions
622
+ expect(solr_response.spelling.words).to_not include('policy') # less freq
623
+ solr_response.spelling.words).to include('politics') # more freq
624
+ solr_response.spelling.words).to include('political') # more freq
625
+ =end
626
+ end
627
+
628
+ it "title search results for just-poor-enough query term should have spelling suggestions" do
629
+ (solr_response, document_list) = subject.search_results({ q: 'yehudiyam', qt: 'search', :"spellcheck.dictionary" => "title" }, default_method_chain)
630
+ expect(solr_response.spelling.words).to include('yehudiyim')
631
+ end
632
+
633
+ it "author search results for just-poor-enough-query term should have spelling suggestions" do
634
+ (solr_response, document_list) = subject.search_results({ q: 'shirma', qt: 'search', :"spellcheck.dictionary" => "author" }, default_method_chain)
635
+ expect(solr_response.spelling.words).to include('sharma')
636
+ end
637
+
638
+ it "subject search results for just-poor-enough-query term should have spelling suggestions" do
639
+ (solr_response, document_list) = subject.search_results({ q: 'wome', qt: 'search', :"spellcheck.dictionary" => "subject" }, default_method_chain)
640
+ expect(solr_response.spelling.words).to include('women')
641
+ end
642
+
643
+ it 'search results for multiple terms query with just-poor-enough-terms should have spelling suggestions for each term' do
644
+ skip
645
+ # get_spelling_suggestion("histo politica").should_not be_nil
646
+ end
647
+
648
+ end
649
+
650
+ describe "facet_limit_for" do
651
+ let(:blacklight_config) { copy_of_catalog_config }
652
+
653
+ it "should return specified value for facet_field specified" do
654
+ expect(subject.facet_limit_for("subject_topic_facet")).to eq blacklight_config.facet_fields["subject_topic_facet"].limit
655
+ end
656
+
657
+ it "facet_limit_hash should return hash with key being facet_field and value being configured limit" do
658
+ # facet_limit_hash has been removed from solrhelper in refactor. should it go back?
659
+ skip "facet_limit_hash has been removed from solrhelper in refactor. should it go back?"
660
+ expect(subject.facet_limit_hash).to eq blacklight_config[:facet][:limits]
661
+ end
662
+
663
+ it "should handle no facet_limits in config" do
664
+ blacklight_config.facet_fields = {}
665
+ expect(subject.facet_limit_for("subject_topic_facet")).to be_nil
666
+ end
667
+
668
+ describe "for 'true' configured values" do
669
+ let(:blacklight_config) do
670
+ config = Blacklight::Configuration.new
671
+ config.add_facet_field "language_facet", limit: true
672
+ config
673
+ end
674
+ it "should return nil if no @response available" do
675
+ expect(subject.facet_limit_for("some_unknown_field")).to be_nil
676
+ end
677
+ it "should get from @response facet.limit if available" do
678
+ @response = double()
679
+ allow(@response).to receive(:facet_by_field_name).with("language_facet").and_return(double(limit: nil))
680
+ subject.instance_variable_set(:@response, @response)
681
+ blacklight_config.facet_fields['language_facet'].limit = 10
682
+ expect(subject.facet_limit_for("language_facet")).to eq 10
683
+ end
684
+ it "should get the limit from the facet field in @response" do
685
+ @response = double()
686
+ allow(@response).to receive(:facet_by_field_name).with("language_facet").and_return(double(limit: 16))
687
+ subject.instance_variable_set(:@response, @response)
688
+ expect(subject.facet_limit_for("language_facet")).to eq 15
689
+ end
690
+ it "should default to 10" do
691
+ expect(subject.facet_limit_for("language_facet")).to eq 10
692
+ end
693
+ end
694
+ end
695
+
696
+ describe "#get_solr_response_for_field_values" do
697
+ before do
698
+ @mock_response = double()
699
+ allow(@mock_response).to receive_messages(documents: [])
700
+ end
701
+ it "should contruct a solr query based on the field and value pair" do
702
+ Deprecation.silence(Blacklight::SearchHelper) do
703
+ allow(subject.repository).to receive(:send_and_receive).with('select', hash_including("q" => "{!lucene}field_name:(value)")).and_return(@mock_response)
704
+ subject.get_solr_response_for_field_values('field_name', 'value')
705
+ end
706
+ end
707
+
708
+ it "should OR multiple values together" do
709
+ Deprecation.silence(Blacklight::SearchHelper) do
710
+ allow(subject.repository).to receive(:send_and_receive).with('select', hash_including("q" => "{!lucene}field_name:(a OR b)")).and_return(@mock_response)
711
+ subject.get_solr_response_for_field_values('field_name', ['a', 'b'])
712
+ end
713
+ end
714
+
715
+ it "should escape crazy identifiers" do
716
+ Deprecation.silence(Blacklight::SearchHelper) do
717
+ allow(subject.repository).to receive(:send_and_receive).with('select', hash_including("q" => "{!lucene}field_name:(\"h://\\\"\\\'\")")).and_return(@mock_response)
718
+ subject.get_solr_response_for_field_values('field_name', 'h://"\'')
719
+ end
720
+ end
721
+ end
722
+
723
+ # TODO: more complex queries! phrases, offset into search results, non-latin, boosting(?)
724
+ # search within query building (?)
725
+ # search + facets (search done first; facet selected first, both selected)
726
+
727
+ # TODO: maybe eventually check other types of solr requests
728
+ # more like this
729
+ # nearby on shelf
730
+ it "should raise a Blacklight exception if RSolr can't connect to the Solr instance" do
731
+ allow(blacklight_solr).to receive(:send_and_receive).and_raise(Errno::ECONNREFUSED)
732
+ expect(Deprecation).to receive(:warn)
733
+ expect { subject.query_solr }.to raise_exception(/Unable to connect to Solr instance/)
734
+ end
735
+
736
+ describe "grouped_key_for_results" do
737
+ it "should pull the grouped key out of the config" do
738
+ blacklight_config.index.group = 'xyz'
739
+ expect(subject.grouped_key_for_results).to eq('xyz')
740
+ end
741
+ end
742
+
743
+ describe "#get_previous_and_next_documents_for_search" do
744
+ let(:pre_query) { SearchHelperTestClass.new blacklight_config, blacklight_solr }
745
+ before do
746
+ @full_response, @all_docs = pre_query.search_results({ q: '', per_page: '100' }, default_method_chain)
747
+ end
748
+
749
+ it "should return the previous and next documents for a search" do
750
+ response, docs = subject.get_previous_and_next_documents_for_search(4, :q => '')
751
+
752
+ expect(docs.first.id).to eq @all_docs[3].id
753
+ expect(docs.last.id).to eq @all_docs[5].id
754
+ end
755
+
756
+ it "should return only the next document if the counter is 0" do
757
+ response, docs = subject.get_previous_and_next_documents_for_search(0, :q => '')
758
+
759
+ expect(docs.first).to be_nil
760
+ expect(docs.last.id).to eq @all_docs[1].id
761
+ end
762
+
763
+ it "should return only the previous document if the counter is the total number of documents" do
764
+ response, docs = subject.get_previous_and_next_documents_for_search(@full_response.total - 1, :q => '')
765
+ expect(docs.first.id).to eq @all_docs.slice(-2).id
766
+ expect(docs.last).to be_nil
767
+ end
768
+
769
+ it "should return an array of nil values if there is only one result" do
770
+ response, docs = subject.get_previous_and_next_documents_for_search(0, :q => 'id:2007020969')
771
+ expect(docs.last).to be_nil
772
+ expect(docs.first).to be_nil
773
+ end
774
+ end
775
+ end