blacklight 6.24.0 → 7.0.0.rc1

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 (393) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.npmignore +23 -0
  4. data/.rubocop.yml +15 -3
  5. data/.rubocop_todo.yml +242 -379
  6. data/.solr_wrapper.yml +1 -1
  7. data/.travis.yml +20 -24
  8. data/Gemfile +1 -4
  9. data/README.md +21 -4
  10. data/Rakefile +1 -2
  11. data/VERSION +1 -1
  12. data/app/assets/images/blacklight/list.svg +1 -0
  13. data/app/assets/images/blacklight/search.svg +1 -0
  14. data/app/assets/javascripts/blacklight/blacklight.js +496 -56
  15. data/app/assets/stylesheets/blacklight/_balanced_list.scss +7 -12
  16. data/app/assets/stylesheets/blacklight/_blacklight_base.scss +3 -1
  17. data/app/assets/stylesheets/blacklight/_bookmark.scss +1 -13
  18. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +27 -0
  19. data/app/assets/stylesheets/blacklight/_constraints.scss +17 -25
  20. data/app/assets/stylesheets/blacklight/_controls.scss +8 -16
  21. data/app/assets/stylesheets/blacklight/_facets.scss +74 -92
  22. data/app/assets/stylesheets/blacklight/_header.scss +35 -48
  23. data/app/assets/stylesheets/blacklight/_icons.scss +29 -0
  24. data/app/assets/stylesheets/blacklight/_layout.scss +0 -10
  25. data/app/assets/stylesheets/blacklight/_mixins.scss +15 -0
  26. data/app/assets/stylesheets/blacklight/_modal.scss +9 -17
  27. data/app/assets/stylesheets/blacklight/_pagination.scss +2 -17
  28. data/app/assets/stylesheets/blacklight/_search_history.scss +5 -13
  29. data/app/assets/stylesheets/blacklight/_search_results.scss +9 -8
  30. data/app/assets/stylesheets/blacklight/_twitter_typeahead.scss +1 -2
  31. data/app/builders/blacklight/action_builder.rb +56 -0
  32. data/app/controllers/bookmarks_controller.rb +2 -2
  33. data/app/controllers/catalog_controller.rb +2 -2
  34. data/app/controllers/concerns/blacklight/base.rb +0 -33
  35. data/app/controllers/concerns/blacklight/bookmarks.rb +20 -37
  36. data/app/controllers/concerns/blacklight/catalog.rb +254 -213
  37. data/app/controllers/concerns/blacklight/controller.rb +117 -133
  38. data/app/controllers/concerns/blacklight/default_component_configuration.rb +12 -43
  39. data/app/controllers/concerns/blacklight/search_context.rb +10 -14
  40. data/app/controllers/concerns/blacklight/search_fields.rb +4 -14
  41. data/app/controllers/concerns/blacklight/token_based_user.rb +6 -10
  42. data/app/helpers/blacklight/blacklight_helper_behavior.rb +32 -118
  43. data/app/helpers/blacklight/catalog_helper_behavior.rb +94 -88
  44. data/app/helpers/blacklight/component_helper_behavior.rb +19 -19
  45. data/app/helpers/blacklight/configuration_helper_behavior.rb +25 -54
  46. data/app/helpers/blacklight/facets_helper_behavior.rb +40 -39
  47. data/app/helpers/blacklight/hash_as_hidden_fields_helper_behavior.rb +9 -11
  48. data/app/helpers/blacklight/icon_helper_behavior.rb +16 -0
  49. data/app/helpers/blacklight/layout_helper_behavior.rb +3 -10
  50. data/app/helpers/blacklight/render_constraints_helper_behavior.rb +6 -6
  51. data/app/helpers/blacklight/render_partials_helper_behavior.rb +195 -0
  52. data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +18 -11
  53. data/app/helpers/blacklight/suggest_helper_behavior.rb +1 -0
  54. data/app/helpers/blacklight/url_helper_behavior.rb +21 -27
  55. data/app/{assets/javascripts → javascript}/blacklight/autocomplete.js +3 -2
  56. data/app/javascript/blacklight/autofocus.js +20 -0
  57. data/app/javascript/blacklight/bookmark_toggle.js +25 -0
  58. data/app/javascript/blacklight/checkbox_submit.js +133 -0
  59. data/app/{assets/javascripts → javascript}/blacklight/collapsable.js +1 -1
  60. data/app/javascript/blacklight/core.js +39 -0
  61. data/app/{assets/javascripts → javascript}/blacklight/facet_load.js +6 -6
  62. data/app/{assets/javascripts/blacklight/ajax_modal.js → javascript/blacklight/modal.js} +63 -63
  63. data/app/{assets/javascripts → javascript}/blacklight/search_context.js +10 -2
  64. data/app/models/blacklight/facet_paginator.rb +3 -3
  65. data/app/models/blacklight/icon.rb +53 -0
  66. data/app/models/blacklight/solr/facet_paginator.rb +3 -3
  67. data/app/models/blacklight/suggest_search.rb +15 -4
  68. data/app/models/bookmark.rb +4 -9
  69. data/app/models/concerns/blacklight/configurable.rb +13 -13
  70. data/app/models/concerns/blacklight/document.rb +8 -42
  71. data/app/models/concerns/blacklight/document/active_model_shim.rb +8 -11
  72. data/app/models/concerns/blacklight/document/cache_key.rb +1 -1
  73. data/app/models/concerns/blacklight/document/dublin_core.rb +2 -2
  74. data/app/models/concerns/blacklight/document/email.rb +1 -1
  75. data/app/models/concerns/blacklight/document/extensions.rb +5 -5
  76. data/app/models/concerns/blacklight/document/semantic_fields.rb +9 -9
  77. data/app/models/concerns/blacklight/document/sms.rb +1 -1
  78. data/app/models/concerns/blacklight/solr/document.rb +7 -8
  79. data/app/models/concerns/blacklight/suggest/response.rb +3 -5
  80. data/app/models/concerns/blacklight/user.rb +6 -6
  81. data/app/models/record_mailer.rb +5 -6
  82. data/app/models/search.rb +4 -7
  83. data/app/presenters/blacklight/field_presenter.rb +5 -5
  84. data/app/presenters/blacklight/index_presenter.rb +34 -71
  85. data/app/presenters/blacklight/json_presenter.rb +7 -4
  86. data/app/presenters/blacklight/link_alternate_presenter.rb +1 -1
  87. data/app/presenters/blacklight/rendering/abstract_step.rb +5 -5
  88. data/app/presenters/blacklight/rendering/helper_method.rb +8 -8
  89. data/app/presenters/blacklight/rendering/join.rb +3 -3
  90. data/app/presenters/blacklight/rendering/link_to_facet.rb +19 -19
  91. data/app/presenters/blacklight/rendering/microdata.rb +3 -3
  92. data/app/presenters/blacklight/rendering/pipeline.rb +5 -5
  93. data/app/presenters/blacklight/search_bar_presenter.rb +37 -0
  94. data/app/presenters/blacklight/show_presenter.rb +20 -69
  95. data/app/presenters/blacklight/thumbnail_presenter.rb +72 -0
  96. data/app/services/blacklight/document_factory.rb +11 -0
  97. data/app/services/blacklight/field_retriever.rb +24 -24
  98. data/app/services/blacklight/search_service.rb +154 -0
  99. data/app/views/blacklight/nav/_bookmark.html.erb +2 -2
  100. data/app/views/blacklight/nav/_search_history.html.erb +1 -1
  101. data/app/views/bookmarks/_tools.html.erb +2 -2
  102. data/app/views/bookmarks/index.html.erb +2 -2
  103. data/app/views/catalog/_bookmark_control.html.erb +26 -10
  104. data/app/views/catalog/_citation.html.erb +18 -23
  105. data/app/views/catalog/_constraints.html.erb +5 -8
  106. data/app/views/catalog/_constraints_element.html.erb +6 -6
  107. data/app/views/catalog/{_document_default.atom.builder → _document.atom.builder} +2 -2
  108. data/app/views/catalog/_document.html.erb +5 -3
  109. data/app/views/catalog/{_document_default.rss.builder → _document.rss.builder} +0 -0
  110. data/app/views/catalog/_document_action.html.erb +2 -1
  111. data/app/views/catalog/_email_form.html.erb +8 -4
  112. data/app/views/catalog/_facet_index_navigation.html.erb +3 -3
  113. data/app/views/catalog/_facet_layout.html.erb +5 -7
  114. data/app/views/catalog/_facet_limit.html.erb +3 -2
  115. data/app/views/catalog/_facet_pagination.html.erb +10 -10
  116. data/app/views/catalog/_facet_pivot.html.erb +2 -2
  117. data/app/views/catalog/_facets.html.erb +8 -12
  118. data/app/views/catalog/{_group_default.html.erb → _group.html.erb} +0 -0
  119. data/app/views/catalog/_home_text.html.erb +32 -36
  120. data/app/views/catalog/_index.html.erb +12 -0
  121. data/app/views/catalog/{_index_header_default.html.erb → _index_header.html.erb} +2 -2
  122. data/app/views/catalog/_per_page_widget.html.erb +6 -7
  123. data/app/views/catalog/_previous_next_doc.html.erb +6 -14
  124. data/app/views/catalog/_search_form.html.erb +12 -8
  125. data/app/views/catalog/_search_header.html.erb +0 -3
  126. data/app/views/catalog/_search_results.html.erb +4 -0
  127. data/app/views/catalog/_show.html.erb +10 -0
  128. data/app/views/catalog/{_show_header_default.html.erb → _show_header.html.erb} +0 -0
  129. data/app/views/catalog/_show_main_content.html.erb +4 -4
  130. data/app/views/catalog/_show_sidebar.html.erb +3 -3
  131. data/app/views/catalog/_show_tools.html.erb +9 -11
  132. data/app/views/catalog/_sms_form.html.erb +8 -4
  133. data/app/views/catalog/_sort_and_per_page.html.erb +3 -3
  134. data/app/views/catalog/_sort_widget.html.erb +7 -7
  135. data/app/views/catalog/_thumbnail.html.erb +5 -0
  136. data/app/views/catalog/_view_type_group.html.erb +2 -2
  137. data/app/views/catalog/citation.html.erb +1 -1
  138. data/app/views/catalog/citation.js.erb +9 -1
  139. data/app/views/catalog/email.html.erb +5 -5
  140. data/app/views/catalog/email_success.html.erb +11 -9
  141. data/app/views/catalog/facet.html.erb +5 -6
  142. data/app/views/catalog/index.atom.builder +10 -15
  143. data/app/views/catalog/index.html.erb +9 -11
  144. data/app/views/catalog/index.json.jbuilder +65 -3
  145. data/app/views/catalog/index.rss.builder +5 -5
  146. data/app/views/catalog/opensearch.xml.builder +10 -10
  147. data/app/views/catalog/show.html.erb +11 -6
  148. data/app/views/catalog/sms.html.erb +2 -3
  149. data/app/views/catalog/sms_success.html.erb +11 -10
  150. data/app/views/kaminari/blacklight/_first_page.html.erb +2 -2
  151. data/app/views/kaminari/blacklight/_gap.html.erb +2 -2
  152. data/app/views/kaminari/blacklight/_last_page.html.erb +2 -2
  153. data/app/views/kaminari/blacklight/_next_page.html.erb +4 -4
  154. data/app/views/kaminari/blacklight/_page.html.erb +3 -3
  155. data/app/views/kaminari/blacklight/_prev_page.html.erb +4 -4
  156. data/app/views/kaminari/blacklight_compact/_paginator.html.erb +4 -4
  157. data/app/views/layouts/blacklight.html.erb +14 -41
  158. data/app/views/layouts/blacklight/base.html.erb +43 -0
  159. data/app/views/layouts/catalog_result.html.erb +11 -0
  160. data/app/views/search_history/index.html.erb +16 -21
  161. data/app/views/{_flash_msg.html.erb → shared/_flash_msg.html.erb} +0 -0
  162. data/app/views/shared/_header_navbar.html.erb +8 -13
  163. data/app/views/shared/_modal.html.erb +6 -0
  164. data/app/views/shared/_user_util_links.html.erb +22 -0
  165. data/blacklight.gemspec +10 -11
  166. data/config/locales/blacklight.de.yml +0 -30
  167. data/config/locales/blacklight.en.yml +1 -27
  168. data/config/locales/blacklight.es.yml +0 -30
  169. data/config/locales/blacklight.fr.yml +0 -30
  170. data/config/locales/blacklight.hu.yml +210 -0
  171. data/config/locales/blacklight.it.yml +0 -30
  172. data/config/locales/blacklight.nl.yml +210 -0
  173. data/config/locales/blacklight.pt-BR.yml +6 -32
  174. data/config/locales/blacklight.sq.yml +1 -28
  175. data/config/locales/blacklight.zh.yml +0 -25
  176. data/config/routes.rb +3 -10
  177. data/db/migrate/20140202020202_create_bookmarks.rb +0 -1
  178. data/db/migrate/20140320000000_add_polymorphic_type_to_bookmarks.rb +1 -1
  179. data/lib/blacklight.rb +4 -5
  180. data/lib/blacklight/abstract_repository.rb +9 -21
  181. data/lib/blacklight/configuration.rb +82 -89
  182. data/lib/blacklight/configuration/context.rb +1 -1
  183. data/lib/blacklight/configuration/facet_field.rb +16 -9
  184. data/lib/blacklight/configuration/field.rb +32 -3
  185. data/lib/blacklight/configuration/fields.rb +41 -48
  186. data/lib/blacklight/configuration/search_field.rb +2 -2
  187. data/lib/blacklight/configuration/sort_field.rb +2 -2
  188. data/lib/blacklight/configuration/view_config.rb +4 -0
  189. data/lib/blacklight/engine.rb +6 -10
  190. data/lib/blacklight/exceptions.rb +4 -7
  191. data/lib/blacklight/nested_open_struct_with_hash_access.rb +107 -0
  192. data/lib/blacklight/open_struct_with_hash_access.rb +49 -0
  193. data/lib/blacklight/parameters.rb +1 -1
  194. data/lib/blacklight/routes/searchable.rb +1 -0
  195. data/lib/blacklight/search_builder.rb +26 -35
  196. data/lib/blacklight/search_state.rb +8 -8
  197. data/lib/blacklight/solr/repository.rb +3 -36
  198. data/lib/blacklight/solr/request.rb +1 -1
  199. data/lib/blacklight/solr/response.rb +29 -30
  200. data/lib/blacklight/solr/response/facets.rb +29 -31
  201. data/lib/blacklight/solr/response/group.rb +3 -3
  202. data/lib/blacklight/solr/response/group_response.rb +1 -1
  203. data/lib/blacklight/solr/response/more_like_this.rb +2 -2
  204. data/lib/blacklight/solr/response/response.rb +2 -2
  205. data/lib/blacklight/solr/response/spelling.rb +3 -3
  206. data/lib/blacklight/solr/search_builder_behavior.rb +25 -29
  207. data/lib/blacklight/version.rb +1 -1
  208. data/lib/generators/blacklight/assets_generator.rb +8 -8
  209. data/lib/generators/blacklight/controller_generator.rb +4 -5
  210. data/lib/generators/blacklight/document_generator.rb +1 -1
  211. data/lib/generators/blacklight/install_generator.rb +18 -21
  212. data/lib/generators/blacklight/search_builder_generator.rb +1 -1
  213. data/lib/generators/blacklight/{solr5_generator.rb → solr_generator.rb} +4 -6
  214. data/lib/generators/blacklight/templates/.solr_wrapper.yml +5 -0
  215. data/lib/generators/blacklight/templates/blacklight.scss +0 -2
  216. data/lib/generators/blacklight/templates/catalog_controller.rb +52 -51
  217. data/{solr → lib/generators/blacklight/templates/solr}/conf/_rest_managed.json +0 -0
  218. data/{solr → lib/generators/blacklight/templates/solr}/conf/admin-extra.html +0 -0
  219. data/{solr → lib/generators/blacklight/templates/solr}/conf/elevate.xml +0 -0
  220. data/{solr → lib/generators/blacklight/templates/solr}/conf/mapping-ISOLatin1Accent.txt +0 -0
  221. data/{solr → lib/generators/blacklight/templates/solr}/conf/protwords.txt +0 -0
  222. data/lib/generators/blacklight/templates/solr/conf/schema.xml +390 -0
  223. data/{solr → lib/generators/blacklight/templates/solr}/conf/scripts.conf +0 -0
  224. data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +195 -0
  225. data/{solr → lib/generators/blacklight/templates/solr}/conf/spellings.txt +0 -0
  226. data/{solr → lib/generators/blacklight/templates/solr}/conf/stopwords.txt +0 -0
  227. data/{solr → lib/generators/blacklight/templates/solr}/conf/stopwords_en.txt +0 -0
  228. data/{solr → lib/generators/blacklight/templates/solr}/conf/synonyms.txt +0 -0
  229. data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example.xsl +0 -0
  230. data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example_atom.xsl +0 -0
  231. data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example_rss.xsl +0 -0
  232. data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/luke.xsl +0 -0
  233. data/lib/generators/blacklight/test_support_generator.rb +10 -10
  234. data/lib/generators/blacklight/user_generator.rb +3 -6
  235. data/lib/railties/blacklight.rake +19 -14
  236. data/package-lock.json +2057 -0
  237. data/package.json +28 -0
  238. data/spec/controllers/alternate_controller_spec.rb +1 -1
  239. data/spec/controllers/application_controller_spec.rb +1 -1
  240. data/spec/controllers/blacklight/base_spec.rb +1 -1
  241. data/spec/controllers/blacklight/catalog/component_configuration_spec.rb +11 -7
  242. data/spec/controllers/blacklight/facet_spec.rb +1 -1
  243. data/spec/controllers/blacklight/search_fields_spec.rb +1 -13
  244. data/spec/controllers/bookmarks_controller_spec.rb +1 -36
  245. data/spec/controllers/catalog_controller_spec.rb +153 -53
  246. data/spec/controllers/search_history_controller_spec.rb +2 -2
  247. data/spec/features/alternate_controller_spec.rb +1 -1
  248. data/spec/features/autocomplete_spec.rb +2 -2
  249. data/spec/features/bookmarks_spec.rb +10 -10
  250. data/spec/features/did_you_mean_spec.rb +3 -9
  251. data/spec/features/facets_spec.rb +11 -11
  252. data/spec/features/record_view_spec.rb +1 -6
  253. data/spec/features/search_context_spec.rb +2 -2
  254. data/spec/features/search_filters_spec.rb +41 -41
  255. data/spec/features/search_formats_spec.rb +1 -1
  256. data/spec/features/search_history_spec.rb +1 -26
  257. data/spec/features/search_pagination_spec.rb +1 -1
  258. data/spec/features/search_results_spec.rb +3 -4
  259. data/spec/features/search_sort_spec.rb +2 -2
  260. data/spec/features/search_spec.rb +5 -10
  261. data/{solr → spec/fixtures}/sample_solr_documents.yml +688 -688
  262. data/spec/helpers/{configuration_helper_spec.rb → blacklight/configuration_helper_behavior_spec.rb} +70 -65
  263. data/spec/helpers/{facets_helper_spec.rb → blacklight/facets_helper_behavior_spec.rb} +7 -8
  264. data/spec/helpers/{hash_as_hidden_fields_spec.rb → blacklight/hash_as_hidden_fields_behavior_spec.rb} +1 -1
  265. data/spec/helpers/blacklight/icon_helper_behavior_spec.rb +8 -0
  266. data/spec/helpers/{layout_helper_spec.rb → blacklight/layout_helper_behavior_spec.rb} +5 -15
  267. data/spec/helpers/{render_constraints_helper_spec.rb → blacklight/render_constraints_helper_behavior_spec.rb} +2 -3
  268. data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +80 -0
  269. data/spec/helpers/{search_history_constraints_helper_spec.rb → blacklight/search_history_constraints_helper_behavior_spec.rb} +9 -9
  270. data/spec/helpers/{suggest_helper_spec.rb → blacklight/suggest_helper_behavior_spec.rb} +4 -2
  271. data/spec/helpers/{url_helper_spec.rb → blacklight/url_helper_behavior_spec.rb} +11 -15
  272. data/spec/helpers/blacklight_helper_spec.rb +36 -141
  273. data/spec/helpers/catalog_helper_spec.rb +37 -56
  274. data/spec/integration/generators/blacklight/{solr5_generator_spec.rb → solr_generator_spec.rb} +3 -3
  275. data/spec/lib/blacklight/configuration/facet_field_spec.rb +11 -0
  276. data/spec/lib/blacklight/configuration/field_spec.rb +12 -0
  277. data/spec/lib/blacklight/nested_open_struct_with_hash_access_spec.rb +17 -0
  278. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +153 -0
  279. data/spec/lib/blacklight/parameters_spec.rb +1 -1
  280. data/spec/lib/blacklight/search_state_spec.rb +2 -2
  281. data/spec/lib/blacklight_spec.rb +1 -1
  282. data/spec/lib/tasks/blacklight_task_spec.rb +1 -1
  283. data/spec/models/blacklight/configurable_spec.rb +15 -16
  284. data/spec/models/blacklight/configuration/context_spec.rb +1 -1
  285. data/spec/models/blacklight/configuration_spec.rb +146 -135
  286. data/spec/models/blacklight/document/active_model_shim_spec.rb +11 -1
  287. data/spec/models/blacklight/document/cache_key_spec.rb +1 -1
  288. data/spec/models/blacklight/document/dublin_core_spec.rb +5 -5
  289. data/spec/models/blacklight/document/email_spec.rb +3 -3
  290. data/spec/models/blacklight/document/sms_spec.rb +3 -3
  291. data/spec/models/blacklight/document_spec.rb +3 -16
  292. data/spec/models/blacklight/facet_paginator_spec.rb +1 -1
  293. data/spec/models/blacklight/icon_spec.rb +34 -0
  294. data/spec/models/blacklight/search_builder_spec.rb +33 -27
  295. data/spec/models/blacklight/solr/document_spec.rb +18 -7
  296. data/spec/models/blacklight/solr/facet_paginator_spec.rb +1 -1
  297. data/spec/models/blacklight/solr/repository_spec.rb +32 -27
  298. data/spec/models/blacklight/solr/request_spec.rb +1 -1
  299. data/spec/models/blacklight/solr/response/facets_spec.rb +1 -1
  300. data/spec/models/blacklight/solr/response/group_response_spec.rb +1 -1
  301. data/spec/models/blacklight/solr/response/group_spec.rb +1 -1
  302. data/spec/models/blacklight/solr/response_spec.rb +9 -6
  303. data/spec/models/blacklight/solr/search_builder_spec.rb +35 -48
  304. data/spec/models/blacklight/suggest/response_spec.rb +4 -5
  305. data/spec/models/blacklight/suggest_search_spec.rb +14 -7
  306. data/spec/models/blacklight/user_spec.rb +1 -1
  307. data/spec/models/bookmark_spec.rb +1 -1
  308. data/spec/models/record_mailer_spec.rb +2 -2
  309. data/spec/models/search_spec.rb +1 -1
  310. data/spec/models/solr_document_spec.rb +3 -3
  311. data/spec/presenters/blacklight/search_bar_presenter_spec.rb +72 -0
  312. data/spec/presenters/index_presenter_spec.rb +70 -143
  313. data/spec/presenters/pipeline_spec.rb +4 -4
  314. data/spec/presenters/show_presenter_spec.rb +83 -145
  315. data/spec/presenters/thumbnail_presenter_spec.rb +171 -0
  316. data/spec/routing/catalog_routing_spec.rb +1 -17
  317. data/spec/services/blacklight/search_service_spec.rb +446 -0
  318. data/spec/spec_helper.rb +22 -9
  319. data/spec/test_app_templates/Gemfile.extra +2 -5
  320. data/spec/test_app_templates/lib/generators/test_app_generator.rb +1 -1
  321. data/spec/views/catalog/_constraints.html.erb_spec.rb +1 -3
  322. data/spec/views/catalog/_constraints_element.html.erb_spec.rb +8 -8
  323. data/spec/views/catalog/_document.html.erb_spec.rb +7 -7
  324. data/spec/views/catalog/_document_list.html.erb_spec.rb +1 -1
  325. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +1 -1
  326. data/spec/views/catalog/_facet_layout.html.erb_spec.rb +6 -6
  327. data/spec/views/catalog/_facets.html.erb_spec.rb +2 -2
  328. data/spec/views/catalog/{_index_default.erb_spec.rb → _index.html.erb_spec.rb} +1 -1
  329. data/spec/views/catalog/{_index_header_default.html.erb_spec.rb → _index_header.html.erb_spec.rb} +4 -4
  330. data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +4 -27
  331. data/spec/views/catalog/_search_header.erb_spec.rb +1 -3
  332. data/spec/views/catalog/{_show_default.erb_spec.rb → _show.html.erb_spec.rb} +1 -1
  333. data/spec/views/catalog/_show_sidebar.erb_spec.rb +3 -3
  334. data/spec/views/catalog/_show_tools.html.erb_spec.rb +3 -3
  335. data/spec/views/catalog/_sort_and_per_page.html.erb_spec.rb +1 -1
  336. data/spec/views/catalog/{_thumbnail_default.erb_spec.rb → _thumbnail.html.erb_spec.rb} +3 -3
  337. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +5 -1
  338. data/spec/views/catalog/email_success.html.erb_spec.rb +9 -0
  339. data/spec/views/catalog/facet.html.erb_spec.rb +1 -1
  340. data/spec/views/catalog/facet.json.jbuilder_spec.rb +1 -1
  341. data/spec/views/catalog/index.atom.builder_spec.rb +2 -2
  342. data/spec/views/catalog/index.html.erb_spec.rb +4 -7
  343. data/spec/views/catalog/index.json.jbuilder_spec.rb +66 -21
  344. data/spec/views/catalog/opensearch.xml.builder_spec.rb +1 -1
  345. data/spec/views/catalog/show.html.erb_spec.rb +2 -2
  346. data/spec/views/catalog/sms_success.html.erb_spec.rb +9 -0
  347. data/spec/views/{_user_util_links.html.erb_spec.rb → shared/_user_util_links.html.erb_spec.rb} +4 -4
  348. data/tasks/blacklight.rake +10 -8
  349. data/template.demo.rb +1 -11
  350. metadata +171 -189
  351. data/app/assets/javascripts/blacklight/autofocus.js +0 -16
  352. data/app/assets/javascripts/blacklight/bookmark_toggle.js +0 -23
  353. data/app/assets/javascripts/blacklight/checkbox_submit.js +0 -139
  354. data/app/assets/javascripts/blacklight/core.js +0 -30
  355. data/app/controllers/concerns/blacklight/request_builders.rb +0 -77
  356. data/app/controllers/concerns/blacklight/saved_searches.rb +0 -70
  357. data/app/controllers/concerns/blacklight/search_helper.rb +0 -161
  358. data/app/controllers/concerns/blacklight/suggest.rb +0 -25
  359. data/app/controllers/saved_searches_controller.rb +0 -4
  360. data/app/controllers/suggest_controller.rb +0 -4
  361. data/app/helpers/blacklight/deprecated_url_helper_behavior.rb +0 -57
  362. data/app/helpers/blacklight/render_partials_helper.rb +0 -205
  363. data/app/helpers/blacklight_configuration_helper.rb +0 -4
  364. data/app/helpers/blacklight_url_helper.rb +0 -4
  365. data/app/helpers/component_helper.rb +0 -4
  366. data/app/helpers/facets_helper.rb +0 -4
  367. data/app/helpers/hash_as_hidden_fields_helper.rb +0 -4
  368. data/app/helpers/layout_helper.rb +0 -4
  369. data/app/helpers/render_constraints_helper.rb +0 -4
  370. data/app/helpers/search_history_constraints_helper.rb +0 -4
  371. data/app/helpers/suggest_helper.rb +0 -4
  372. data/app/models/concerns/blacklight/solr/document/more_like_this.rb +0 -6
  373. data/app/presenters/blacklight/document_presenter.rb +0 -153
  374. data/app/views/_user_util_links.html.erb +0 -26
  375. data/app/views/blacklight/nav/_saved_searches.html.erb +0 -1
  376. data/app/views/catalog/_index_default.html.erb +0 -12
  377. data/app/views/catalog/_show_default.html.erb +0 -10
  378. data/app/views/catalog/_thumbnail_default.html.erb +0 -5
  379. data/app/views/saved_searches/index.html.erb +0 -32
  380. data/app/views/shared/_ajax_modal.html.erb +0 -6
  381. data/lib/blacklight/utils.rb +0 -183
  382. data/lib/generators/blacklight/solr4_generator.rb +0 -31
  383. data/solr/conf/schema.xml +0 -627
  384. data/solr/conf/solrconfig.xml +0 -411
  385. data/spec/controllers/blacklight/search_helper_spec.rb +0 -489
  386. data/spec/controllers/saved_searches_controller_spec.rb +0 -32
  387. data/spec/controllers/suggest_controller_spec.rb +0 -17
  388. data/spec/features/saved_searches_spec.rb +0 -47
  389. data/spec/helpers/deprecated_url_helper_behavior_spec.rb +0 -101
  390. data/spec/lib/blacklight/utils_spec.rb +0 -167
  391. data/spec/models/blacklight/solr/document/more_like_this_spec.rb +0 -18
  392. data/spec/presenters/document_presenter_spec.rb +0 -438
  393. data/spec/support/backport_test.rb +0 -14
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
3
3
 
4
- describe "Routing" do
4
+ RSpec.describe "Routing" do
5
5
  describe "Paths Generated by Custom Routes:" do
6
6
  # paths generated by custom routes
7
7
  it "has a path for showing the email form" do
@@ -21,22 +21,6 @@ describe "Routing" do
21
21
  end
22
22
  end
23
23
 
24
- describe 'tracking' do
25
- context 'when the routing constraint is set to allow periods' do
26
- before do
27
- if Rails.version < '5.2.0'
28
- skip 'requires https://github.com/rails/rails/pull/22435'
29
- end
30
- allow(Blacklight::Engine.config.routes).to receive(:identifier_constraint).and_return(%r{[^/]+})
31
- Rails.application.reload_routes!
32
- end
33
-
34
- it 'routes to #track' do
35
- expect(post('/catalog/gallica.bnf.fr/track')).to route_to('catalog#track', id: 'gallica.bnf.fr')
36
- end
37
- end
38
- end
39
-
40
24
 
41
25
  describe "solr_document_path for SolrDocument", :test => true do
42
26
  it "routes correctly" do
@@ -0,0 +1,446 @@
1
+ # frozen_string_literal: true
2
+
3
+ # check the methods that do solr requests. Note that we are not testing if
4
+ # solr gives "correct" responses, as that's out of scope (it's a part of
5
+ # testing the solr code itself). We *are* testing if blacklight code sends
6
+ # queries to solr such that it gets appropriate results. When a user does a search,
7
+ # do we get data back from solr (i.e. did we properly configure blacklight code
8
+ # to talk with solr and get results)? when we do a document request, does
9
+ # blacklight code get a single document returned?)
10
+ #
11
+ RSpec.describe Blacklight::SearchService do
12
+
13
+ let(:service) { described_class.new(blacklight_config, user_params) }
14
+ let(:repository) { Blacklight::Solr::Repository.new(blacklight_config) }
15
+ let(:user_params) { {} }
16
+ subject { service }
17
+ let(:blacklight_config) { Blacklight::Configuration.new }
18
+ let(:copy_of_catalog_config) { ::CatalogController.blacklight_config.deep_copy }
19
+ let(:blacklight_solr) { RSolr.connect(Blacklight.connection_config.except(:adapter)) }
20
+
21
+ let(:all_docs_query) { '' }
22
+ let(:no_docs_query) { 'zzzzzzzzzzzz' }
23
+ # f[format][]=Book&f[language_facet][]=English
24
+ let(:single_facet) { { format: 'Book' } }
25
+
26
+ before do
27
+ allow(service).to receive(:repository).and_return(repository)
28
+ service.repository.connection = blacklight_solr
29
+ end
30
+
31
+ # SPECS FOR SEARCH RESULTS FOR QUERY
32
+ describe 'Search Results', :integration => true do
33
+
34
+ let(:blacklight_config) { copy_of_catalog_config }
35
+ describe 'for a sample query returning results' do
36
+ let(:user_params) { { q: all_docs_query } }
37
+
38
+ before do
39
+ (@solr_response, @document_list) = service.search_results
40
+ end
41
+
42
+ it "uses the configured request handler" do
43
+ allow(blacklight_config).to receive(:default_solr_params).and_return({:qt => 'custom_request_handler'})
44
+ allow(blacklight_solr).to receive(:send_and_receive) do |path, params|
45
+ expect(path).to eq 'select'
46
+ expect(params[:params]['facet.field']).to eq ["format", "{!ex=pub_date_ssim_single}pub_date_ssim", "subject_ssim", "language_ssim", "lc_1letter_ssim", "subject_geo_ssim", "subject_era_ssim"]
47
+ expect(params[:params]["facet.query"]).to eq ["pub_date_ssim:[#{5.years.ago.year} TO *]", "pub_date_ssim:[#{10.years.ago.year} TO *]", "pub_date_ssim:[#{25.years.ago.year} TO *]"]
48
+ expect(params[:params]).to include('rows' => 10, 'qt'=>"custom_request_handler", 'q'=>"", "f.subject_ssim.facet.limit"=>21, 'sort'=>"score desc, pub_date_si desc, title_si asc")
49
+ end.and_return({'response'=>{'docs'=>[]}})
50
+ service.search_results
51
+ end
52
+
53
+ it 'has a @response.docs list of the same size as @document_list' do
54
+ expect(@solr_response.docs).to have(@document_list.length).docs
55
+ end
56
+
57
+ it 'has @response.docs list representing same documents as SolrDocuments in @document_list' do
58
+ @solr_response.docs.each_index do |index|
59
+ mash = @solr_response.docs[index]
60
+ solr_document = @document_list[index]
61
+
62
+ expect(Set.new(mash.keys)).to eq Set.new(solr_document.keys)
63
+
64
+ mash.keys.each do |key|
65
+ expect(mash[key]).to eq solr_document[key]
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ describe "for a query returning a grouped response" do
72
+ let(:blacklight_config) { copy_of_catalog_config }
73
+ let(:user_params) { { q: all_docs_query } }
74
+ before do
75
+ blacklight_config.default_solr_params[:group] = true
76
+ blacklight_config.default_solr_params[:'group.field'] = 'pub_date_si'
77
+ (@solr_response, @document_list) = service.search_results
78
+ end
79
+
80
+ it "returns a grouped response" do
81
+ expect(@document_list).to be_empty
82
+ expect(@solr_response).to be_a_kind_of Blacklight::Solr::Response::GroupResponse
83
+ end
84
+ end
85
+
86
+ describe "for a query returning multiple groups", integration: true do
87
+ let(:blacklight_config) { copy_of_catalog_config }
88
+ let(:user_params) { { q: all_docs_query } }
89
+ before do
90
+ allow(subject).to receive_messages grouped_key_for_results: 'title_si'
91
+ blacklight_config.default_solr_params[:group] = true
92
+ blacklight_config.default_solr_params[:'group.field'] = ['pub_date_si', 'title_si']
93
+ (@solr_response, @document_list) = service.search_results
94
+ end
95
+
96
+ it "returns a grouped response" do
97
+ expect(@document_list).to be_empty
98
+ expect(@solr_response).to be_a_kind_of Blacklight::Solr::Response::GroupResponse
99
+ expect(@solr_response.group_field).to eq "title_si"
100
+ end
101
+ end
102
+
103
+
104
+ describe "for All Docs Query and One Facet" do
105
+ let(:user_params) { { q: all_docs_query, f: single_facet } }
106
+ it 'has results' do
107
+ (solr_response, document_list) = service.search_results
108
+ expect(solr_response.docs).to have(document_list.size).results
109
+ expect(solr_response.docs).to have_at_least(1).result
110
+ end
111
+ # TODO: check that number of these results < number of results for all docs query
112
+ # BUT can't: num docs isn't total, it's the num docs in the single SOLR response (e.g. 10)
113
+ end
114
+
115
+ describe "for Query Without Results and No Facet" do
116
+ let(:user_params) { { q: no_docs_query } }
117
+ it 'has no results and not raise error' do
118
+ (solr_response, document_list) = service.search_results
119
+ expect(document_list).to have(0).results
120
+ expect(solr_response.docs).to have(0).results
121
+ end
122
+ end
123
+
124
+ describe "for Query Without Results and One Facet" do
125
+ let(:user_params) { { q: no_docs_query, f: single_facet } }
126
+ it 'has no results and not raise error' do
127
+ (solr_response, document_list) = service.search_results
128
+ expect(document_list).to have(0).results
129
+ expect(solr_response.docs).to have(0).results
130
+ end
131
+ end
132
+
133
+ describe "for All Docs Query and Bad Facet" do
134
+ let(:bad_facet) { { format: '666' } }
135
+ let(:user_params) { { q: all_docs_query, f: bad_facet } }
136
+
137
+ it 'has no results and not raise error' do
138
+ (solr_response, document_list) = service.search_results
139
+ expect(document_list).to have(0).results
140
+ expect(solr_response.docs).to have(0).results
141
+ end
142
+ end
143
+ end # Search Results
144
+
145
+
146
+ # SPECS FOR SEARCH RESULTS FOR FACETS
147
+ describe 'Facets in Search Results for All Docs Query', :integration => true do
148
+
149
+ let(:blacklight_config) { copy_of_catalog_config }
150
+ let(:user_params) { { q: all_docs_query } }
151
+
152
+ before do
153
+ (solr_response, document_list) = service.search_results
154
+ @facets = solr_response.aggregations
155
+ end
156
+
157
+ it 'has more than one facet' do
158
+ expect(@facets).to have_at_least(1).facet
159
+ end
160
+ it 'has all facets specified in initializer' do
161
+ expect(@facets.keys).to include *blacklight_config.facet_fields.keys
162
+ expect(@facets.none? { |k, v| v.nil? }).to eq true
163
+ end
164
+
165
+ it 'has at least one value for each facet' do
166
+ @facets.each do |key, facet|
167
+ expect(facet.items).to have_at_least(1).hit
168
+ end
169
+ end
170
+ it 'has multiple values for at least one facet' do
171
+ has_mult_values = false
172
+ @facets.each do |key, facet|
173
+ if facet.items.size > 1
174
+ has_mult_values = true
175
+ break
176
+ end
177
+ end
178
+ expect(has_mult_values).to eq true
179
+ end
180
+ it 'has all value counts > 0' do
181
+ @facets.each do |key, facet|
182
+ facet.items.each do |facet_vals|
183
+ expect(facet_vals.hits).to be > 0
184
+ end
185
+ end
186
+ end
187
+ end # facet specs
188
+
189
+
190
+ # SPECS FOR SEARCH RESULTS FOR PAGING
191
+ describe 'Paging', :integration => true do
192
+ let(:blacklight_config) { copy_of_catalog_config }
193
+ let(:user_params) { { q: all_docs_query } }
194
+
195
+ it 'starts with first results by default' do
196
+ (solr_response, document_list) = service.search_results
197
+ expect(solr_response.params[:start].to_i).to eq 0
198
+ end
199
+ it 'has number of results (per page) set in initializer, by default' do
200
+ (solr_response, document_list) = service.search_results
201
+ expect(solr_response.docs).to have(blacklight_config[:default_solr_params][:rows]).items
202
+ expect(document_list).to have(blacklight_config[:default_solr_params][:rows]).items
203
+ end
204
+
205
+ context "with per page requested" do
206
+ let(:user_params) { { q: all_docs_query, per_page: num_results } }
207
+ let(:num_results) { 3 } # non-default value
208
+ it 'gets number of results per page requested' do
209
+ (solr_response1, document_list1) = service.search_results
210
+ expect(document_list1).to have(num_results).docs
211
+ expect(solr_response1.docs).to have(num_results).docs
212
+ end
213
+ end
214
+
215
+ context "with rows requested" do
216
+ let(:user_params) { { q: all_docs_query, rows: num_results } }
217
+ let(:num_results) { 4 } # non-default value
218
+ it 'gets number of rows requested' do
219
+ (solr_response1, document_list1) = service.search_results
220
+ expect(document_list1).to have(num_results).docs
221
+ expect(solr_response1.docs).to have(num_results).docs
222
+ end
223
+ end
224
+
225
+ context "with page requested" do
226
+ let(:user_params) { { q: all_docs_query, page: page } }
227
+ let(:page) { 3 }
228
+ it 'skips appropriate number of results when requested - default per page' do
229
+ (solr_response2, document_list2) = service.search_results
230
+ expect(solr_response2.params[:start].to_i).to eq blacklight_config[:default_solr_params][:rows] * (page-1)
231
+ end
232
+ end
233
+
234
+ context "with page and num_results requested" do
235
+ let(:user_params) { { q: all_docs_query, page: page, per_page: num_results } }
236
+ let(:page) { 3 }
237
+ let(:num_results) { 3 } # non-default value
238
+ it 'skips appropriate number of results when requested - non-default per page' do
239
+ num_results = 3
240
+ (solr_response2a, document_list2a) = service.search_results
241
+ expect(solr_response2a.params[:start].to_i).to eq num_results * (page-1)
242
+ end
243
+ end
244
+
245
+ context "with page and num_results requested" do
246
+ let(:page) { 5000 }
247
+ let(:rows) { 5000 }
248
+ let(:user_params) { { q: all_docs_query, page: page, rows: rows } }
249
+ it 'has no results when prompted for page after last result' do
250
+ (solr_response3, document_list3) = service.search_results
251
+ expect(document_list3).to have(0).docs
252
+ expect(solr_response3.docs).to have(0).docs
253
+ end
254
+ end
255
+
256
+ context "with negative page" do
257
+ let(:page) { '-1' }
258
+ let(:user_params) { { q: all_docs_query, page: page } }
259
+ it 'shows first results when prompted for page before first result' do
260
+ # FIXME: should it show first results, or should it throw an error for view to deal w?
261
+ # Solr throws an error for a negative start value
262
+ (solr_response4, document_list4) = service.search_results
263
+ expect(solr_response4.params[:start].to_i).to eq 0
264
+ end
265
+ end
266
+
267
+ context "when asking for more rows than are in the reponse" do
268
+ let(:page) { 1 }
269
+ let(:rows) { 5000 }
270
+ let(:user_params) { { q: all_docs_query, page: page, rows: rows } }
271
+ it 'has results available when asked for more than are in response' do
272
+ (solr_response5, document_list5) = service.search_results
273
+ expect(solr_response5.docs).to have(document_list5.length).docs
274
+ expect(solr_response5.docs).to have_at_least(1).doc
275
+ end
276
+ end
277
+ end # page specs
278
+
279
+ # SPECS FOR SINGLE DOCUMENT REQUESTS
280
+ describe 'Get Document By Id', :integration => true do
281
+ let(:doc_id) { '2007020969' }
282
+ let(:bad_id) { 'redrum' }
283
+
284
+ before do
285
+ @response2, @document = service.fetch(doc_id)
286
+ end
287
+
288
+ it "raises Blacklight::RecordNotFound for an unknown id" do
289
+ expect {
290
+ service.fetch(bad_id)
291
+ }.to raise_error(Blacklight::Exceptions::RecordNotFound)
292
+ end
293
+
294
+ it "uses a provided document solr path" do
295
+ allow(blacklight_config).to receive_messages(document_solr_path: 'get')
296
+ allow(blacklight_solr).to receive(:send_and_receive).with('get', kind_of(Hash)).and_return({'response'=>{'docs'=>[]}})
297
+ expect { service.fetch(doc_id)}.to raise_error Blacklight::Exceptions::RecordNotFound
298
+ end
299
+
300
+ it "has a non-nil result for a known id" do
301
+ expect(@document).not_to be_nil
302
+ end
303
+ it "has a single document in the response for a known id" do
304
+ expect(@response2.docs.size).to eq 1
305
+ end
306
+ it 'has the expected value in the id field' do
307
+ expect(@document.id).to eq doc_id
308
+ end
309
+ it 'has non-nil values for required fields set in initializer' do
310
+ expect(@document.fetch(blacklight_config.view_config(:show).display_type_field)).not_to be_nil
311
+ end
312
+ end
313
+
314
+ # SPECS FOR SPELLING SUGGESTIONS VIA SEARCH
315
+ describe "Searches should return spelling suggestions", :integration => true do
316
+
317
+ context "for just-poor-enough-query term" do
318
+ let(:user_params) { { q: 'boo' } }
319
+ it 'has (multiple) spelling suggestions' do
320
+ (solr_response, document_list) = service.search_results
321
+ expect(solr_response.spelling.words).to include('bon')
322
+ expect(solr_response.spelling.words).to include('bod') #for multiple suggestions
323
+ end
324
+ end
325
+
326
+ context "for another just-poor-enough-query term" do
327
+ let(:user_params) { { q: 'politica' } }
328
+ it 'has multiple spelling suggestions' do
329
+ (solr_response, document_list) = service.search_results
330
+ expect(solr_response.spelling.words).to include('policy') # less freq
331
+ expect(solr_response.spelling.words).to include('politics') # more freq
332
+ expect(solr_response.spelling.words).to include('political') # more freq
333
+ =begin
334
+ # when we can have multiple suggestions
335
+ expect(solr_response.spelling.words).to_not include('policy') # less freq
336
+ solr_response.spelling.words).to include('politics') # more freq
337
+ solr_response.spelling.words).to include('political') # more freq
338
+ =end
339
+ end
340
+ end
341
+
342
+ context "for title search" do
343
+ let(:user_params) { { q: 'yehudiyam', qt: 'search', :"spellcheck.dictionary" => "title" } }
344
+ it 'has spelling suggestions' do
345
+ (solr_response, document_list) = service.search_results
346
+ expect(solr_response.spelling.words).to include('yehudiyim')
347
+ end
348
+ end
349
+
350
+ context "for author search" do
351
+ let(:user_params) { { q: 'shirma', qt: 'search', :"spellcheck.dictionary" => "author" } }
352
+ it 'has spelling suggestions' do
353
+ (solr_response, document_list) = service.search_results
354
+ expect(solr_response.spelling.words).to include('sharma')
355
+ end
356
+ end
357
+
358
+ context "for subject search" do
359
+ let(:user_params) { { q: 'wome', qt: 'search', :"spellcheck.dictionary" => "subject" } }
360
+ it 'has spelling suggestions' do
361
+ (solr_response, document_list) = service.search_results
362
+ expect(solr_response.spelling.words).to include('women')
363
+ end
364
+ end
365
+ end
366
+
367
+ # TODO: more complex queries! phrases, offset into search results, non-latin, boosting(?)
368
+ # search within query building (?)
369
+ # search + facets (search done first; facet selected first, both selected)
370
+
371
+ # TODO: maybe eventually check other types of solr requests
372
+ # more like this
373
+ # nearby on shelf
374
+ it "raises a Blacklight exception if RSolr can't connect to the Solr instance" do
375
+ allow(blacklight_solr).to receive(:send_and_receive).and_raise(Errno::ECONNREFUSED)
376
+ expect { service.repository.search }.to raise_exception(/Unable to connect to Solr instance/)
377
+ end
378
+
379
+ describe "#previous_and_next_documents_for_search" do
380
+ let(:user_params) { { q: '', per_page: 100 } }
381
+ before do
382
+ @full_response, @all_docs = service.search_results
383
+ end
384
+
385
+ it "returns the previous and next documents for a search" do
386
+ response, docs = service.previous_and_next_documents_for_search(4, :q => '')
387
+
388
+ expect(docs.first.id).to eq @all_docs[3].id
389
+ expect(docs.last.id).to eq @all_docs[5].id
390
+ end
391
+
392
+ it "returns only the next document if the counter is 0" do
393
+ response, docs = service.previous_and_next_documents_for_search(0, :q => '')
394
+
395
+ expect(docs.first).to be_nil
396
+ expect(docs.last.id).to eq @all_docs[1].id
397
+ end
398
+
399
+ it "returns only the previous document if the counter is the total number of documents" do
400
+ response, docs = service.previous_and_next_documents_for_search(@full_response.total - 1, :q => '')
401
+ expect(docs.first.id).to eq @all_docs.slice(-2).id
402
+ expect(docs.last).to be_nil
403
+ end
404
+
405
+ it "returns an array of nil values if there is only one result" do
406
+ response, docs = service.previous_and_next_documents_for_search(0, :q => 'id:2007020969')
407
+ expect(docs.last).to be_nil
408
+ expect(docs.first).to be_nil
409
+ end
410
+
411
+ it 'returns only the unique key by default' do
412
+ response, docs = service.previous_and_next_documents_for_search(0, :q => '')
413
+ expect(docs.last.to_h).to eq 'id' => @all_docs[1].id
414
+ end
415
+
416
+ it 'allows the query parameters to be customized using configuration' do
417
+ blacklight_config.document_pagination_params[:fl] = 'id,format'
418
+
419
+ response, docs = service.previous_and_next_documents_for_search(0, :q => '')
420
+
421
+ expect(docs.last.to_h).to eq @all_docs[1].to_h.slice('id', 'format')
422
+ end
423
+ end
424
+
425
+ describe '#opensearch_response' do
426
+ let(:user_params) { { q: 'Book' } }
427
+ let(:mock_response) {
428
+ instance_double(Blacklight::Solr::Response, documents: [
429
+ { field: 'A' }, { field: 'B' }, { field: 'C' }
430
+ ])
431
+ }
432
+
433
+ before do
434
+ blacklight_config.view.opensearch.title_field = :field
435
+ allow(repository).to receive(:search).and_return(mock_response)
436
+ end
437
+
438
+ it 'contains the original user query as the first element in the response' do
439
+ expect(service.opensearch_response.first).to eq 'Book'
440
+ end
441
+
442
+ it 'contains the search suggestions as the second element in the response' do
443
+ expect(service.opensearch_response.last).to match_array %w(A B C)
444
+ end
445
+ end
446
+ end