blacklight 6.14.0 → 7.0.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 (422) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/.npmignore +23 -0
  4. data/.rubocop.yml +40 -16
  5. data/.rubocop_todo.yml +479 -375
  6. data/.solr_wrapper.yml +9 -2
  7. data/.travis.yml +27 -20
  8. data/Gemfile +3 -1
  9. data/README.md +22 -5
  10. data/Rakefile +3 -2
  11. data/VERSION +1 -1
  12. data/Vagrantfile +2 -0
  13. data/app/assets/images/blacklight/list.svg +1 -0
  14. data/app/assets/images/blacklight/search.svg +1 -0
  15. data/app/assets/javascripts/blacklight/blacklight.js +497 -57
  16. data/app/assets/stylesheets/blacklight/_balanced_list.scss +7 -12
  17. data/app/assets/stylesheets/blacklight/_blacklight_base.scss +18 -15
  18. data/app/assets/stylesheets/blacklight/_bookmark.scss +1 -13
  19. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +27 -0
  20. data/app/assets/stylesheets/blacklight/_constraints.scss +17 -25
  21. data/app/assets/stylesheets/blacklight/_controls.scss +8 -16
  22. data/app/assets/stylesheets/blacklight/_facets.scss +64 -93
  23. data/app/assets/stylesheets/blacklight/_header.scss +35 -48
  24. data/app/assets/stylesheets/blacklight/_icons.scss +35 -0
  25. data/app/assets/stylesheets/blacklight/_layout.scss +0 -10
  26. data/app/assets/stylesheets/blacklight/_mixins.scss +15 -0
  27. data/app/assets/stylesheets/blacklight/_modal.scss +9 -17
  28. data/app/assets/stylesheets/blacklight/_pagination.scss +2 -17
  29. data/app/assets/stylesheets/blacklight/_search_form.scss +7 -0
  30. data/app/assets/stylesheets/blacklight/_search_history.scss +5 -13
  31. data/app/assets/stylesheets/blacklight/_search_results.scss +9 -8
  32. data/app/assets/stylesheets/blacklight/_twitter_typeahead.scss +1 -2
  33. data/app/assets/stylesheets/blacklight/blacklight.scss +1 -1
  34. data/app/builders/blacklight/action_builder.rb +57 -0
  35. data/app/controllers/bookmarks_controller.rb +2 -2
  36. data/app/controllers/catalog_controller.rb +2 -2
  37. data/app/controllers/concerns/blacklight/base.rb +0 -33
  38. data/app/controllers/concerns/blacklight/bookmarks.rb +36 -33
  39. data/app/controllers/concerns/blacklight/catalog.rb +266 -210
  40. data/app/controllers/concerns/blacklight/controller.rb +111 -126
  41. data/app/controllers/concerns/blacklight/default_component_configuration.rb +12 -43
  42. data/app/controllers/concerns/blacklight/facet.rb +3 -0
  43. data/app/controllers/concerns/blacklight/search_context.rb +16 -14
  44. data/app/controllers/concerns/blacklight/search_fields.rb +4 -14
  45. data/app/controllers/concerns/blacklight/search_history.rb +1 -6
  46. data/app/controllers/concerns/blacklight/token_based_user.rb +24 -9
  47. data/app/helpers/blacklight/blacklight_helper_behavior.rb +39 -119
  48. data/app/helpers/blacklight/catalog_helper_behavior.rb +94 -88
  49. data/app/helpers/blacklight/component_helper_behavior.rb +21 -19
  50. data/app/helpers/blacklight/configuration_helper_behavior.rb +30 -57
  51. data/app/helpers/blacklight/facets_helper_behavior.rb +55 -51
  52. data/app/helpers/blacklight/hash_as_hidden_fields_helper_behavior.rb +9 -11
  53. data/app/helpers/blacklight/icon_helper_behavior.rb +18 -0
  54. data/app/helpers/blacklight/layout_helper_behavior.rb +3 -3
  55. data/app/helpers/blacklight/render_constraints_helper_behavior.rb +8 -6
  56. data/app/helpers/blacklight/render_partials_helper_behavior.rb +195 -0
  57. data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +19 -11
  58. data/app/helpers/blacklight/suggest_helper_behavior.rb +1 -0
  59. data/app/helpers/blacklight/url_helper_behavior.rb +50 -41
  60. data/app/{assets/javascripts → javascript}/blacklight/autocomplete.js +3 -2
  61. data/app/javascript/blacklight/bookmark_toggle.js +25 -0
  62. data/app/javascript/blacklight/checkbox_submit.js +134 -0
  63. data/app/{assets/javascripts → javascript}/blacklight/collapsable.js +1 -1
  64. data/app/{assets/javascripts → javascript}/blacklight/core.js +10 -8
  65. data/app/{assets/javascripts → javascript}/blacklight/facet_load.js +6 -6
  66. data/app/{assets/javascripts/blacklight/ajax_modal.js → javascript/blacklight/modal.js} +62 -64
  67. data/app/{assets/javascripts → javascript}/blacklight/search_context.js +10 -3
  68. data/app/models/blacklight/facet_paginator.rb +3 -3
  69. data/app/models/blacklight/icon.rb +56 -0
  70. data/app/models/blacklight/solr/facet_paginator.rb +3 -3
  71. data/app/models/blacklight/suggest_search.rb +4 -15
  72. data/app/models/bookmark.rb +5 -10
  73. data/app/models/concerns/blacklight/configurable.rb +13 -13
  74. data/app/models/concerns/blacklight/document/active_model_shim.rb +13 -11
  75. data/app/models/concerns/blacklight/document/cache_key.rb +1 -1
  76. data/app/models/concerns/blacklight/document/dublin_core.rb +2 -2
  77. data/app/models/concerns/blacklight/document/email.rb +1 -1
  78. data/app/models/concerns/blacklight/document/extensions.rb +5 -5
  79. data/app/models/concerns/blacklight/document/semantic_fields.rb +9 -9
  80. data/app/models/concerns/blacklight/document/sms.rb +1 -1
  81. data/app/models/concerns/blacklight/document.rb +26 -40
  82. data/app/models/concerns/blacklight/solr/document.rb +8 -8
  83. data/app/models/concerns/blacklight/suggest/response.rb +5 -3
  84. data/app/models/concerns/blacklight/user.rb +7 -6
  85. data/app/models/record_mailer.rb +5 -6
  86. data/app/models/search.rb +5 -7
  87. data/app/presenters/blacklight/document_presenter.rb +25 -140
  88. data/app/presenters/blacklight/field_presenter.rb +7 -5
  89. data/app/presenters/blacklight/index_presenter.rb +41 -58
  90. data/app/presenters/blacklight/json_presenter.rb +10 -14
  91. data/app/presenters/blacklight/link_alternate_presenter.rb +3 -1
  92. data/app/presenters/blacklight/rendering/abstract_step.rb +7 -5
  93. data/app/presenters/blacklight/rendering/helper_method.rb +10 -8
  94. data/app/presenters/blacklight/rendering/join.rb +5 -3
  95. data/app/presenters/blacklight/rendering/link_to_facet.rb +23 -19
  96. data/app/presenters/blacklight/rendering/microdata.rb +6 -3
  97. data/app/presenters/blacklight/rendering/pipeline.rb +7 -5
  98. data/app/presenters/blacklight/rendering/terminator.rb +2 -0
  99. data/app/presenters/blacklight/search_bar_presenter.rb +39 -0
  100. data/app/presenters/blacklight/show_presenter.rb +26 -63
  101. data/app/presenters/blacklight/thumbnail_presenter.rb +74 -0
  102. data/app/services/blacklight/document_factory.rb +13 -0
  103. data/app/services/blacklight/field_retriever.rb +26 -24
  104. data/app/services/blacklight/search_service.rb +152 -0
  105. data/app/values/blacklight/types.rb +31 -0
  106. data/app/views/blacklight/nav/_bookmark.html.erb +2 -2
  107. data/app/views/blacklight/nav/_search_history.html.erb +1 -1
  108. data/app/views/bookmarks/_tools.html.erb +2 -2
  109. data/app/views/bookmarks/index.html.erb +12 -13
  110. data/app/views/catalog/_bookmark_control.html.erb +26 -10
  111. data/app/views/catalog/_citation.html.erb +4 -4
  112. data/app/views/catalog/_constraints.html.erb +6 -7
  113. data/app/views/catalog/_constraints_element.html.erb +6 -6
  114. data/app/views/catalog/_did_you_mean.html.erb +1 -1
  115. data/app/views/catalog/{_document_default.atom.builder → _document.atom.builder} +19 -18
  116. data/app/views/catalog/_document.html.erb +5 -3
  117. data/app/views/catalog/{_document_default.rss.builder → _document.rss.builder} +2 -0
  118. data/app/views/catalog/_document_action.html.erb +2 -1
  119. data/app/views/catalog/_email_form.html.erb +8 -4
  120. data/app/views/catalog/_facet_index_navigation.html.erb +5 -4
  121. data/app/views/catalog/_facet_layout.html.erb +6 -10
  122. data/app/views/catalog/_facet_limit.html.erb +3 -2
  123. data/app/views/catalog/_facet_pagination.html.erb +8 -8
  124. data/app/views/catalog/_facet_pivot.html.erb +2 -2
  125. data/app/views/catalog/_facets.html.erb +9 -12
  126. data/app/views/catalog/_field.json.jbuilder +10 -0
  127. data/app/views/catalog/{_group_default.html.erb → _group.html.erb} +1 -1
  128. data/app/views/catalog/_home_text.html.erb +32 -36
  129. data/app/views/catalog/_index.html.erb +10 -0
  130. data/app/views/catalog/{_index_header_default.html.erb → _index_header.html.erb} +3 -3
  131. data/app/views/catalog/_per_page_widget.html.erb +6 -7
  132. data/app/views/catalog/_previous_next_doc.html.erb +6 -14
  133. data/app/views/catalog/_results_pagination.html.erb +2 -2
  134. data/app/views/catalog/_search_form.html.erb +12 -8
  135. data/app/views/catalog/_search_header.html.erb +0 -3
  136. data/app/views/catalog/_search_results.html.erb +6 -2
  137. data/app/views/catalog/_show.html.erb +8 -0
  138. data/app/views/catalog/_show_main_content.html.erb +4 -4
  139. data/app/views/catalog/_show_more_like_this.html.erb +1 -1
  140. data/app/views/catalog/_show_sidebar.html.erb +3 -3
  141. data/app/views/catalog/_show_tools.html.erb +10 -12
  142. data/app/views/catalog/_sms_form.html.erb +8 -4
  143. data/app/views/catalog/_sort_and_per_page.html.erb +3 -3
  144. data/app/views/catalog/_sort_widget.html.erb +7 -7
  145. data/app/views/catalog/_thumbnail.html.erb +5 -0
  146. data/app/views/catalog/_view_type_group.html.erb +2 -2
  147. data/app/views/catalog/_zero_results.html.erb +1 -1
  148. data/app/views/catalog/citation.js.erb +4 -2
  149. data/app/views/catalog/email.html.erb +5 -3
  150. data/app/views/catalog/email_success.html.erb +12 -8
  151. data/app/views/catalog/facet.html.erb +10 -8
  152. data/app/views/catalog/facet.json.jbuilder +2 -0
  153. data/app/views/catalog/index.atom.builder +13 -16
  154. data/app/views/catalog/index.html.erb +9 -11
  155. data/app/views/catalog/index.json.jbuilder +84 -3
  156. data/app/views/catalog/index.rss.builder +7 -5
  157. data/app/views/catalog/opensearch.xml.builder +12 -10
  158. data/app/views/catalog/show.html.erb +11 -6
  159. data/app/views/catalog/show.json.jbuilder +21 -0
  160. data/app/views/catalog/sms.html.erb +3 -1
  161. data/app/views/catalog/sms_success.html.erb +12 -8
  162. data/app/views/kaminari/blacklight/_first_page.html.erb +2 -2
  163. data/app/views/kaminari/blacklight/_gap.html.erb +2 -2
  164. data/app/views/kaminari/blacklight/_last_page.html.erb +2 -2
  165. data/app/views/kaminari/blacklight/_next_page.html.erb +5 -5
  166. data/app/views/kaminari/blacklight/_page.html.erb +5 -3
  167. data/app/views/kaminari/blacklight/_prev_page.html.erb +4 -4
  168. data/app/views/kaminari/blacklight_compact/_paginator.html.erb +4 -4
  169. data/app/views/layouts/blacklight/base.html.erb +35 -0
  170. data/app/views/layouts/blacklight.html.erb +14 -41
  171. data/app/views/layouts/catalog_result.html.erb +11 -0
  172. data/app/views/search_history/index.html.erb +16 -21
  173. data/app/views/shared/_header_navbar.html.erb +8 -13
  174. data/app/views/shared/_modal.html.erb +6 -0
  175. data/app/views/shared/_user_util_links.html.erb +22 -0
  176. data/blacklight.gemspec +10 -11
  177. data/config/i18n-tasks.yml +17 -0
  178. data/config/locales/blacklight.de.yml +71 -82
  179. data/config/locales/blacklight.en.yml +15 -27
  180. data/config/locales/blacklight.es.yml +14 -26
  181. data/config/locales/blacklight.fr.yml +16 -33
  182. data/config/locales/blacklight.hu.yml +212 -0
  183. data/config/locales/blacklight.it.yml +15 -26
  184. data/config/locales/blacklight.nl.yml +212 -0
  185. data/config/locales/blacklight.pt-BR.yml +24 -29
  186. data/config/locales/blacklight.sq.yml +4 -28
  187. data/config/locales/blacklight.zh.yml +3 -25
  188. data/config/routes.rb +2 -10
  189. data/db/migrate/20140202020202_create_bookmarks.rb +0 -1
  190. data/db/migrate/20140320000000_add_polymorphic_type_to_bookmarks.rb +1 -1
  191. data/lib/blacklight/abstract_repository.rb +22 -10
  192. data/lib/blacklight/configuration/context.rb +12 -1
  193. data/lib/blacklight/configuration/facet_field.rb +16 -9
  194. data/lib/blacklight/configuration/field.rb +32 -3
  195. data/lib/blacklight/configuration/fields.rb +61 -58
  196. data/lib/blacklight/configuration/null_field.rb +2 -0
  197. data/lib/blacklight/configuration/search_field.rb +2 -2
  198. data/lib/blacklight/configuration/sort_field.rb +2 -2
  199. data/lib/blacklight/configuration/view_config.rb +4 -0
  200. data/lib/blacklight/configuration.rb +101 -88
  201. data/lib/blacklight/engine.rb +11 -7
  202. data/lib/blacklight/exceptions.rb +4 -7
  203. data/lib/blacklight/{utils.rb → nested_open_struct_with_hash_access.rb} +9 -81
  204. data/lib/blacklight/open_struct_with_hash_access.rb +49 -0
  205. data/lib/blacklight/parameters.rb +1 -1
  206. data/lib/blacklight/routes/exportable.rb +1 -3
  207. data/lib/blacklight/routes/searchable.rb +3 -3
  208. data/lib/blacklight/runtime_registry.rb +2 -0
  209. data/lib/blacklight/search_builder.rb +28 -35
  210. data/lib/blacklight/search_state.rb +10 -8
  211. data/lib/blacklight/solr/repository.rb +40 -6
  212. data/lib/blacklight/solr/request.rb +1 -1
  213. data/lib/blacklight/solr/response/facets.rb +29 -31
  214. data/lib/blacklight/solr/response/group.rb +3 -3
  215. data/lib/blacklight/solr/response/group_response.rb +1 -1
  216. data/lib/blacklight/solr/response/more_like_this.rb +2 -2
  217. data/lib/blacklight/solr/response/response.rb +2 -2
  218. data/lib/blacklight/solr/response/spelling.rb +4 -3
  219. data/lib/blacklight/solr/response.rb +29 -30
  220. data/lib/blacklight/solr/search_builder_behavior.rb +25 -29
  221. data/lib/blacklight/version.rb +1 -1
  222. data/lib/blacklight.rb +10 -8
  223. data/lib/generators/blacklight/assets_generator.rb +18 -12
  224. data/lib/generators/blacklight/controller_generator.rb +4 -5
  225. data/lib/generators/blacklight/document_generator.rb +1 -1
  226. data/lib/generators/blacklight/install_generator.rb +18 -28
  227. data/lib/generators/blacklight/search_builder_generator.rb +1 -1
  228. data/lib/generators/blacklight/{solr5_generator.rb → solr_generator.rb} +12 -6
  229. data/lib/generators/blacklight/templates/.solr_wrapper.yml +5 -0
  230. data/lib/generators/blacklight/templates/alternate_controller.rb +4 -4
  231. data/lib/generators/blacklight/templates/blacklight.scss +0 -2
  232. data/lib/generators/blacklight/templates/catalog_controller.rb +59 -49
  233. data/lib/generators/blacklight/templates/config/blacklight.yml +1 -13
  234. data/lib/generators/blacklight/templates/solr/conf/schema.xml +388 -0
  235. data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +195 -0
  236. data/lib/generators/blacklight/test_support_generator.rb +10 -10
  237. data/lib/generators/blacklight/user_generator.rb +5 -6
  238. data/lib/railties/blacklight.rake +17 -21
  239. data/package-lock.json +2195 -0
  240. data/package.json +29 -0
  241. data/spec/controllers/alternate_controller_spec.rb +5 -4
  242. data/spec/controllers/application_controller_spec.rb +1 -5
  243. data/spec/controllers/blacklight/base_spec.rb +6 -3
  244. data/spec/controllers/blacklight/catalog/component_configuration_spec.rb +11 -7
  245. data/spec/controllers/blacklight/facet_spec.rb +1 -2
  246. data/spec/controllers/blacklight/search_fields_spec.rb +25 -34
  247. data/spec/controllers/bookmarks_controller_spec.rb +46 -11
  248. data/spec/controllers/catalog_controller_spec.rb +334 -161
  249. data/spec/controllers/search_history_controller_spec.rb +6 -6
  250. data/spec/features/alternate_controller_spec.rb +4 -4
  251. data/spec/features/autocomplete_spec.rb +4 -2
  252. data/spec/features/bookmarks_spec.rb +10 -10
  253. data/spec/features/did_you_mean_spec.rb +7 -12
  254. data/spec/features/facets_spec.rb +29 -17
  255. data/spec/features/record_view_spec.rb +12 -18
  256. data/spec/features/search_context_spec.rb +6 -7
  257. data/spec/features/search_crawler_spec.rb +3 -5
  258. data/spec/features/search_filters_spec.rb +80 -80
  259. data/spec/features/search_formats_spec.rb +1 -1
  260. data/spec/features/search_history_spec.rb +6 -29
  261. data/spec/features/search_pagination_spec.rb +4 -2
  262. data/spec/features/search_results_spec.rb +14 -12
  263. data/spec/features/search_sort_spec.rb +2 -2
  264. data/spec/features/search_spec.rb +8 -9
  265. data/spec/features/sitelinks_search_box.rb +4 -4
  266. data/{solr → spec/fixtures}/sample_solr_documents.yml +688 -688
  267. data/spec/helpers/{configuration_helper_spec.rb → blacklight/configuration_helper_behavior_spec.rb} +97 -92
  268. data/spec/helpers/{facets_helper_spec.rb → blacklight/facets_helper_behavior_spec.rb} +72 -67
  269. data/spec/helpers/{hash_as_hidden_fields_spec.rb → blacklight/hash_as_hidden_fields_behavior_spec.rb} +2 -2
  270. data/spec/helpers/blacklight/icon_helper_behavior_spec.rb +10 -0
  271. data/spec/helpers/{layout_helper_spec.rb → blacklight/layout_helper_behavior_spec.rb} +5 -5
  272. data/spec/helpers/{render_constraints_helper_spec.rb → blacklight/render_constraints_helper_behavior_spec.rb} +10 -6
  273. data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +92 -0
  274. data/spec/helpers/{search_history_constraints_helper_spec.rb → blacklight/search_history_constraints_helper_behavior_spec.rb} +29 -30
  275. data/spec/helpers/{suggest_helper_spec.rb → blacklight/suggest_helper_behavior_spec.rb} +9 -2
  276. data/spec/helpers/{url_helper_spec.rb → blacklight/url_helper_behavior_spec.rb} +56 -54
  277. data/spec/helpers/blacklight_helper_spec.rb +65 -150
  278. data/spec/helpers/catalog_helper_spec.rb +80 -96
  279. data/spec/i18n_spec.rb +18 -0
  280. data/spec/integration/generators/blacklight/{solr5_generator_spec.rb → solr_generator_spec.rb} +21 -13
  281. data/spec/lib/blacklight/configuration/facet_field_spec.rb +13 -0
  282. data/spec/lib/blacklight/configuration/field_spec.rb +15 -0
  283. data/spec/lib/blacklight/nested_open_struct_with_hash_access_spec.rb +17 -0
  284. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +148 -0
  285. data/spec/lib/blacklight/parameters_spec.rb +4 -2
  286. data/spec/lib/blacklight/search_state_spec.rb +53 -36
  287. data/spec/lib/blacklight_spec.rb +14 -15
  288. data/spec/lib/tasks/blacklight_task_spec.rb +4 -6
  289. data/spec/models/blacklight/configurable_spec.rb +24 -27
  290. data/spec/models/blacklight/configuration/context_spec.rb +9 -10
  291. data/spec/models/blacklight/configuration_spec.rb +248 -223
  292. data/spec/models/blacklight/document/active_model_shim_spec.rb +15 -6
  293. data/spec/models/blacklight/document/cache_key_spec.rb +9 -2
  294. data/spec/models/blacklight/document/dublin_core_spec.rb +17 -20
  295. data/spec/models/blacklight/document/email_spec.rb +10 -10
  296. data/spec/models/blacklight/document/sms_spec.rb +10 -10
  297. data/spec/models/blacklight/document_spec.rb +10 -22
  298. data/spec/models/blacklight/facet_paginator_spec.rb +40 -30
  299. data/spec/models/blacklight/icon_spec.rb +44 -0
  300. data/spec/models/blacklight/search_builder_spec.rb +41 -26
  301. data/spec/models/blacklight/solr/document_spec.rb +224 -216
  302. data/spec/models/blacklight/solr/facet_paginator_spec.rb +6 -4
  303. data/spec/models/blacklight/solr/repository_spec.rb +61 -46
  304. data/spec/models/blacklight/solr/request_spec.rb +17 -18
  305. data/spec/models/blacklight/solr/response/facets_spec.rb +58 -58
  306. data/spec/models/blacklight/solr/response/group_response_spec.rb +16 -22
  307. data/spec/models/blacklight/solr/response/group_spec.rb +18 -25
  308. data/spec/models/blacklight/solr/response_spec.rb +56 -55
  309. data/spec/models/blacklight/solr/search_builder_spec.rb +150 -164
  310. data/spec/models/blacklight/suggest/response_spec.rb +6 -4
  311. data/spec/models/blacklight/suggest_search_spec.rb +9 -16
  312. data/spec/models/blacklight/user_spec.rb +9 -11
  313. data/spec/models/bookmark_spec.rb +7 -6
  314. data/spec/models/record_mailer_spec.rb +23 -21
  315. data/spec/models/search_spec.rb +19 -18
  316. data/spec/models/solr_document_spec.rb +33 -5
  317. data/spec/presenters/blacklight/document_presenter_spec.rb +86 -0
  318. data/spec/presenters/blacklight/index_presenter_spec.rb +186 -0
  319. data/spec/presenters/blacklight/json_presenter_spec.rb +59 -0
  320. data/spec/presenters/blacklight/link_alternate_presenter_spec.rb +3 -0
  321. data/spec/presenters/blacklight/search_bar_presenter_spec.rb +79 -0
  322. data/spec/presenters/blacklight/show_presenter_spec.rb +333 -0
  323. data/spec/presenters/pipeline_spec.rb +18 -11
  324. data/spec/presenters/thumbnail_presenter_spec.rb +174 -0
  325. data/spec/routing/catalog_routing_spec.rb +13 -15
  326. data/spec/services/blacklight/search_service_spec.rb +488 -0
  327. data/spec/spec_helper.rb +20 -19
  328. data/spec/support/features/session_helpers.rb +4 -4
  329. data/spec/support/features.rb +1 -1
  330. data/spec/test_app_templates/Gemfile.extra +2 -4
  331. data/spec/test_app_templates/lib/generators/test_app_generator.rb +12 -13
  332. data/spec/views/catalog/_constraints.html.erb_spec.rb +3 -6
  333. data/spec/views/catalog/_constraints_element.html.erb_spec.rb +17 -13
  334. data/spec/views/catalog/_document.html.erb_spec.rb +11 -11
  335. data/spec/views/catalog/_document_list.html.erb_spec.rb +2 -1
  336. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +5 -5
  337. data/spec/views/catalog/_facet_layout.html.erb_spec.rb +6 -6
  338. data/spec/views/catalog/_facets.html.erb_spec.rb +10 -12
  339. data/spec/views/catalog/{_index_default.erb_spec.rb → _index.html.erb_spec.rb} +14 -15
  340. data/spec/views/catalog/{_index_header_default.html.erb_spec.rb → _index_header.html.erb_spec.rb} +6 -9
  341. data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +7 -30
  342. data/spec/views/catalog/_search_header.erb_spec.rb +1 -3
  343. data/spec/views/catalog/{_show_default.erb_spec.rb → _show.html.erb_spec.rb} +13 -14
  344. data/spec/views/catalog/_show_sidebar.erb_spec.rb +6 -9
  345. data/spec/views/catalog/_show_tools.html.erb_spec.rb +5 -5
  346. data/spec/views/catalog/_sort_and_per_page.html.erb_spec.rb +1 -2
  347. data/spec/views/catalog/_sort_widget.html.erb_spec.rb +3 -1
  348. data/spec/views/catalog/{_thumbnail_default.erb_spec.rb → _thumbnail.html.erb_spec.rb} +7 -9
  349. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +12 -10
  350. data/spec/views/catalog/email_success.html.erb_spec.rb +8 -0
  351. data/spec/views/catalog/facet.html.erb_spec.rb +4 -3
  352. data/spec/views/catalog/facet.json.jbuilder_spec.rb +3 -2
  353. data/spec/views/catalog/index.atom.builder_spec.rb +11 -6
  354. data/spec/views/catalog/index.html.erb_spec.rb +6 -8
  355. data/spec/views/catalog/index.json.jbuilder_spec.rb +119 -26
  356. data/spec/views/catalog/opensearch.xml.builder_spec.rb +1 -1
  357. data/spec/views/catalog/show.html.erb_spec.rb +8 -8
  358. data/spec/views/catalog/show.json.jbuilder_spec.rb +40 -0
  359. data/spec/views/catalog/sms_success.html.erb_spec.rb +8 -0
  360. data/spec/views/{_user_util_links.html.erb_spec.rb → shared/_user_util_links.html.erb_spec.rb} +4 -7
  361. data/tasks/blacklight.rake +10 -8
  362. data/template.demo.rb +3 -11
  363. metadata +188 -189
  364. data/app/assets/javascripts/blacklight/autofocus.js +0 -16
  365. data/app/assets/javascripts/blacklight/bookmark_toggle.js +0 -23
  366. data/app/assets/javascripts/blacklight/checkbox_submit.js +0 -135
  367. data/app/controllers/concerns/blacklight/request_builders.rb +0 -77
  368. data/app/controllers/concerns/blacklight/saved_searches.rb +0 -70
  369. data/app/controllers/concerns/blacklight/search_helper.rb +0 -155
  370. data/app/controllers/concerns/blacklight/suggest.rb +0 -25
  371. data/app/controllers/saved_searches_controller.rb +0 -4
  372. data/app/controllers/suggest_controller.rb +0 -4
  373. data/app/helpers/blacklight/deprecated_url_helper_behavior.rb +0 -57
  374. data/app/helpers/blacklight/render_partials_helper.rb +0 -205
  375. data/app/helpers/blacklight_configuration_helper.rb +0 -4
  376. data/app/helpers/blacklight_url_helper.rb +0 -4
  377. data/app/helpers/component_helper.rb +0 -4
  378. data/app/helpers/facets_helper.rb +0 -4
  379. data/app/helpers/hash_as_hidden_fields_helper.rb +0 -4
  380. data/app/helpers/layout_helper.rb +0 -4
  381. data/app/helpers/render_constraints_helper.rb +0 -4
  382. data/app/helpers/search_history_constraints_helper.rb +0 -4
  383. data/app/helpers/suggest_helper.rb +0 -4
  384. data/app/models/concerns/blacklight/solr/document/more_like_this.rb +0 -6
  385. data/app/views/_user_util_links.html.erb +0 -26
  386. data/app/views/blacklight/nav/_saved_searches.html.erb +0 -1
  387. data/app/views/catalog/_index_default.html.erb +0 -12
  388. data/app/views/catalog/_show_default.html.erb +0 -10
  389. data/app/views/catalog/_thumbnail_default.html.erb +0 -5
  390. data/app/views/saved_searches/index.html.erb +0 -32
  391. data/app/views/shared/_ajax_modal.html.erb +0 -6
  392. data/lib/generators/blacklight/solr4_generator.rb +0 -31
  393. data/lib/generators/blacklight/templates/config/jetty.yml +0 -13
  394. data/solr/conf/schema.xml +0 -629
  395. data/solr/conf/solrconfig.xml +0 -411
  396. data/spec/controllers/blacklight/search_helper_spec.rb +0 -470
  397. data/spec/controllers/saved_searches_controller_spec.rb +0 -32
  398. data/spec/controllers/suggest_controller_spec.rb +0 -17
  399. data/spec/features/saved_searches_spec.rb +0 -47
  400. data/spec/helpers/deprecated_url_helper_behavior_spec.rb +0 -101
  401. data/spec/lib/blacklight/utils_spec.rb +0 -167
  402. data/spec/models/blacklight/solr/document/more_like_this_spec.rb +0 -18
  403. data/spec/presenters/document_presenter_spec.rb +0 -438
  404. data/spec/presenters/index_presenter_spec.rb +0 -173
  405. data/spec/presenters/show_presenter_spec.rb +0 -313
  406. data/spec/support/backport_test.rb +0 -14
  407. /data/app/views/catalog/{_show_header_default.html.erb → _show_header.html.erb} +0 -0
  408. /data/app/views/{_flash_msg.html.erb → shared/_flash_msg.html.erb} +0 -0
  409. /data/{solr → lib/generators/blacklight/templates/solr}/conf/_rest_managed.json +0 -0
  410. /data/{solr → lib/generators/blacklight/templates/solr}/conf/admin-extra.html +0 -0
  411. /data/{solr → lib/generators/blacklight/templates/solr}/conf/elevate.xml +0 -0
  412. /data/{solr → lib/generators/blacklight/templates/solr}/conf/mapping-ISOLatin1Accent.txt +0 -0
  413. /data/{solr → lib/generators/blacklight/templates/solr}/conf/protwords.txt +0 -0
  414. /data/{solr → lib/generators/blacklight/templates/solr}/conf/scripts.conf +0 -0
  415. /data/{solr → lib/generators/blacklight/templates/solr}/conf/spellings.txt +0 -0
  416. /data/{solr → lib/generators/blacklight/templates/solr}/conf/stopwords.txt +0 -0
  417. /data/{solr → lib/generators/blacklight/templates/solr}/conf/stopwords_en.txt +0 -0
  418. /data/{solr → lib/generators/blacklight/templates/solr}/conf/synonyms.txt +0 -0
  419. /data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example.xsl +0 -0
  420. /data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example_atom.xsl +0 -0
  421. /data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example_rss.xsl +0 -0
  422. /data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/luke.xsl +0 -0
@@ -0,0 +1,488 @@
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, api: true do
12
+ subject { service }
13
+
14
+ let(:service) { described_class.new(config: blacklight_config, user_params: user_params) }
15
+ let(:repository) { Blacklight::Solr::Repository.new(blacklight_config) }
16
+ let(:user_params) { {} }
17
+
18
+ let(:blacklight_config) { Blacklight::Configuration.new }
19
+ let(:copy_of_catalog_config) { ::CatalogController.blacklight_config.deep_copy }
20
+ let(:blacklight_solr) { RSolr.connect(Blacklight.connection_config.except(:adapter)) }
21
+
22
+ let(:all_docs_query) { '' }
23
+ let(:no_docs_query) { 'zzzzzzzzzzzz' }
24
+ # f[format][]=Book&f[language_facet][]=English
25
+ let(:single_facet) { { format: 'Book' } }
26
+
27
+ before do
28
+ allow(service).to receive(:repository).and_return(repository)
29
+ service.repository.connection = blacklight_solr
30
+ end
31
+
32
+ describe '#search_builder_class' do
33
+ subject { service.send(:search_builder_class) }
34
+
35
+ it 'defaults to the value in the config' do
36
+ expect(subject).to eq SearchBuilder
37
+ end
38
+
39
+ context 'when the search_builder_class is passed in' do
40
+ let(:klass) { double("Search builder") }
41
+
42
+ let(:service) { described_class.new(config: blacklight_config, user_params: user_params, search_builder_class: klass) }
43
+
44
+ it 'uses the passed value' do
45
+ expect(subject).to eq klass
46
+ end
47
+ end
48
+ end
49
+
50
+ # SPECS FOR SEARCH RESULTS FOR QUERY
51
+ describe 'Search Results', integration: true do
52
+ let(:blacklight_config) { copy_of_catalog_config }
53
+
54
+ describe 'for a sample query returning results' do
55
+ let(:user_params) { { q: all_docs_query } }
56
+
57
+ before do
58
+ (@solr_response, @document_list) = service.search_results
59
+ end
60
+
61
+ it "uses the configured request handler" do
62
+ allow(blacklight_config).to receive(:default_solr_params).and_return(qt: 'custom_request_handler')
63
+ allow(blacklight_solr).to receive(:send_and_receive) do |path, params|
64
+ expect(path).to eq 'select'
65
+ 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"]
66
+ 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 *]"]
67
+ 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")
68
+ end.and_return('response' => { 'docs' => [] })
69
+ service.search_results
70
+ end
71
+
72
+ it 'has a @response.docs list of the same size as @document_list' do
73
+ expect(@solr_response.docs).to have(@document_list.length).docs
74
+ end
75
+
76
+ it 'has @response.docs list representing same documents as SolrDocuments in @document_list' do
77
+ @solr_response.docs.each_index do |index|
78
+ mash = @solr_response.docs[index]
79
+ solr_document = @document_list[index]
80
+
81
+ expect(Set.new(mash.keys)).to eq Set.new(solr_document.keys)
82
+
83
+ mash.keys.each do |key|
84
+ expect(mash[key]).to eq solr_document[key]
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+ describe "for a query returning a grouped response" do
91
+ let(:blacklight_config) { copy_of_catalog_config }
92
+ let(:user_params) { { q: all_docs_query } }
93
+
94
+ before do
95
+ blacklight_config.default_solr_params[:group] = true
96
+ blacklight_config.default_solr_params[:'group.field'] = 'pub_date_si'
97
+ (@solr_response, @document_list) = service.search_results
98
+ end
99
+
100
+ it "returns a grouped response" do
101
+ expect(@document_list).to be_empty
102
+ expect(@solr_response).to be_a_kind_of Blacklight::Solr::Response::GroupResponse
103
+ end
104
+ end
105
+
106
+ describe "for a query returning multiple groups", integration: true do
107
+ let(:blacklight_config) { copy_of_catalog_config }
108
+ let(:user_params) { { q: all_docs_query } }
109
+
110
+ before do
111
+ allow(subject).to receive_messages grouped_key_for_results: 'title_si'
112
+ blacklight_config.default_solr_params[:group] = true
113
+ blacklight_config.default_solr_params[:'group.field'] = %w[pub_date_si title_si]
114
+ (@solr_response, @document_list) = service.search_results
115
+ end
116
+
117
+ it "returns a grouped response" do
118
+ expect(@document_list).to be_empty
119
+ expect(@solr_response).to be_a_kind_of Blacklight::Solr::Response::GroupResponse
120
+ expect(@solr_response.group_field).to eq "title_si"
121
+ end
122
+ end
123
+
124
+ describe "for All Docs Query and One Facet" do
125
+ let(:user_params) { { q: all_docs_query, f: single_facet } }
126
+
127
+ it 'has results' do
128
+ (solr_response, document_list) = service.search_results
129
+ expect(solr_response.docs).to have(document_list.size).results
130
+ expect(solr_response.docs).to have_at_least(1).result
131
+ end
132
+ # TODO: check that number of these results < number of results for all docs query
133
+ # BUT can't: num docs isn't total, it's the num docs in the single SOLR response (e.g. 10)
134
+ end
135
+
136
+ describe "for Query Without Results and No Facet" do
137
+ let(:user_params) { { q: no_docs_query } }
138
+
139
+ it 'has no results and not raise error' do
140
+ (solr_response, document_list) = service.search_results
141
+ expect(document_list).to have(0).results
142
+ expect(solr_response.docs).to have(0).results
143
+ end
144
+ end
145
+
146
+ describe "for Query Without Results and One Facet" do
147
+ let(:user_params) { { q: no_docs_query, f: single_facet } }
148
+
149
+ it 'has no results and not raise error' do
150
+ (solr_response, document_list) = service.search_results
151
+ expect(document_list).to have(0).results
152
+ expect(solr_response.docs).to have(0).results
153
+ end
154
+ end
155
+
156
+ describe "for All Docs Query and Bad Facet" do
157
+ let(:bad_facet) { { format: '666' } }
158
+ let(:user_params) { { q: all_docs_query, f: bad_facet } }
159
+
160
+ it 'has no results and not raise error' do
161
+ (solr_response, document_list) = service.search_results
162
+ expect(document_list).to have(0).results
163
+ expect(solr_response.docs).to have(0).results
164
+ end
165
+ end
166
+ end # Search Results
167
+
168
+ # SPECS FOR SEARCH RESULTS FOR FACETS
169
+ describe 'Facets in Search Results for All Docs Query', integration: true do
170
+ let(:blacklight_config) { copy_of_catalog_config }
171
+ let(:user_params) { { q: all_docs_query } }
172
+
173
+ before do
174
+ (solr_response,) = service.search_results
175
+ @facets = solr_response.aggregations
176
+ end
177
+
178
+ it 'has more than one facet' do
179
+ expect(@facets).to have_at_least(1).facet
180
+ end
181
+ it 'has all facets specified in initializer' do
182
+ expect(@facets.keys).to include *blacklight_config.facet_fields.keys
183
+ expect(@facets.none? { |_k, v| v.nil? }).to eq true
184
+ end
185
+
186
+ it 'has at least one value for each facet' do
187
+ @facets.each do |_key, facet|
188
+ expect(facet.items).to have_at_least(1).hit
189
+ end
190
+ end
191
+ it 'has multiple values for at least one facet' do
192
+ has_mult_values = false
193
+ @facets.each do |_key, facet|
194
+ if facet.items.size > 1
195
+ has_mult_values = true
196
+ break
197
+ end
198
+ end
199
+ expect(has_mult_values).to eq true
200
+ end
201
+ it 'has all value counts > 0' do
202
+ @facets.each do |_key, facet|
203
+ facet.items.each do |facet_vals|
204
+ expect(facet_vals.hits).to be > 0
205
+ end
206
+ end
207
+ end
208
+ end # facet specs
209
+
210
+ # SPECS FOR SEARCH RESULTS FOR PAGING
211
+ describe 'Paging', integration: true do
212
+ let(:blacklight_config) { copy_of_catalog_config }
213
+ let(:user_params) { { q: all_docs_query } }
214
+
215
+ it 'starts with first results by default' do
216
+ (solr_response,) = service.search_results
217
+ expect(solr_response.params[:start].to_i).to eq 0
218
+ end
219
+ it 'has number of results (per page) set in initializer, by default' do
220
+ (solr_response, document_list) = service.search_results
221
+ expect(solr_response.docs).to have(blacklight_config[:default_solr_params][:rows]).items
222
+ expect(document_list).to have(blacklight_config[:default_solr_params][:rows]).items
223
+ end
224
+
225
+ context "with per page requested" do
226
+ let(:user_params) { { q: all_docs_query, per_page: num_results } }
227
+ let(:num_results) { 3 } # non-default value
228
+
229
+ it 'gets number of results per page requested' do
230
+ (solr_response1, document_list1) = service.search_results
231
+ expect(document_list1).to have(num_results).docs
232
+ expect(solr_response1.docs).to have(num_results).docs
233
+ end
234
+ end
235
+
236
+ context "with rows requested" do
237
+ let(:user_params) { { q: all_docs_query, rows: num_results } }
238
+ let(:num_results) { 4 } # non-default value
239
+
240
+ it 'gets number of rows requested' do
241
+ (solr_response1, document_list1) = service.search_results
242
+ expect(document_list1).to have(num_results).docs
243
+ expect(solr_response1.docs).to have(num_results).docs
244
+ end
245
+ end
246
+
247
+ context "with page requested" do
248
+ let(:user_params) { { q: all_docs_query, page: page } }
249
+ let(:page) { 3 }
250
+
251
+ it 'skips appropriate number of results when requested - default per page' do
252
+ (solr_response2,) = service.search_results
253
+ expect(solr_response2.params[:start].to_i).to eq blacklight_config[:default_solr_params][:rows] * (page - 1)
254
+ end
255
+ end
256
+
257
+ context "with page and num_results requested" do
258
+ let(:user_params) { { q: all_docs_query, page: page, per_page: num_results } }
259
+ let(:page) { 3 }
260
+ let(:num_results) { 3 } # non-default value
261
+
262
+ it 'skips appropriate number of results when requested - non-default per page' do
263
+ num_results = 3
264
+ (solr_response2a,) = service.search_results
265
+ expect(solr_response2a.params[:start].to_i).to eq num_results * (page - 1)
266
+ end
267
+ end
268
+
269
+ context "with page and num_results requested" do
270
+ let(:page) { 5000 }
271
+ let(:rows) { 5000 }
272
+ let(:user_params) { { q: all_docs_query, page: page, rows: rows } }
273
+
274
+ it 'has no results when prompted for page after last result' do
275
+ (solr_response3, document_list3) = service.search_results
276
+ expect(document_list3).to have(0).docs
277
+ expect(solr_response3.docs).to have(0).docs
278
+ end
279
+ end
280
+
281
+ context "with negative page" do
282
+ let(:page) { '-1' }
283
+ let(:user_params) { { q: all_docs_query, page: page } }
284
+
285
+ it 'shows first results when prompted for page before first result' do
286
+ # FIXME: should it show first results, or should it throw an error for view to deal w?
287
+ # Solr throws an error for a negative start value
288
+ (solr_response4,) = service.search_results
289
+ expect(solr_response4.params[:start].to_i).to eq 0
290
+ end
291
+ end
292
+
293
+ context "when asking for more rows than are in the reponse" do
294
+ let(:page) { 1 }
295
+ let(:rows) { 5000 }
296
+ let(:user_params) { { q: all_docs_query, page: page, rows: rows } }
297
+
298
+ it 'has results available when asked for more than are in response' do
299
+ (solr_response5, document_list5) = service.search_results
300
+ expect(solr_response5.docs).to have(document_list5.length).docs
301
+ expect(solr_response5.docs).to have_at_least(1).doc
302
+ end
303
+ end
304
+ end # page specs
305
+
306
+ # SPECS FOR SINGLE DOCUMENT REQUESTS
307
+ describe 'Get Document By Id', integration: true do
308
+ let(:doc_id) { '2007020969' }
309
+ let(:bad_id) { 'redrum' }
310
+
311
+ before do
312
+ @response2, @document = service.fetch(doc_id)
313
+ end
314
+
315
+ it "raises Blacklight::RecordNotFound for an unknown id" do
316
+ expect do
317
+ service.fetch(bad_id)
318
+ end.to raise_error(Blacklight::Exceptions::RecordNotFound)
319
+ end
320
+
321
+ it "has a non-nil result for a known id" do
322
+ expect(@document).not_to be_nil
323
+ end
324
+ it "has a single document in the response for a known id" do
325
+ expect(@response2.docs.size).to eq 1
326
+ end
327
+ it 'has the expected value in the id field' do
328
+ expect(@document.id).to eq doc_id
329
+ end
330
+ it 'has non-nil values for required fields set in initializer' do
331
+ expect(@document.fetch(blacklight_config.view_config(:show).display_type_field)).not_to be_nil
332
+ end
333
+ end
334
+
335
+ describe 'Get multiple documents By Id', integration: true do
336
+ let(:doc_id) { '2007020969' }
337
+ let(:bad_id) { 'redrum' }
338
+ let(:response) { service.fetch([doc_id]).first }
339
+
340
+ before do
341
+ blacklight_config.fetch_many_document_params[:fl] = 'id,format'
342
+ end
343
+
344
+ it 'has the expected value in the id field' do
345
+ expect(response.documents.first.id).to eq doc_id
346
+ end
347
+
348
+ it 'returns all the requested fields' do
349
+ expect(response.documents.first['format']).to eq ['Book']
350
+ end
351
+ end
352
+
353
+ # SPECS FOR SPELLING SUGGESTIONS VIA SEARCH
354
+ describe "Searches should return spelling suggestions", integration: true do
355
+ context "for just-poor-enough-query term" do
356
+ let(:user_params) { { q: 'boo' } }
357
+
358
+ it 'has (multiple) spelling suggestions' do
359
+ (solr_response,) = service.search_results
360
+ expect(solr_response.spelling.words).to include('bon')
361
+ expect(solr_response.spelling.words).to include('bod') # for multiple suggestions
362
+ end
363
+ end
364
+
365
+ context "for another just-poor-enough-query term" do
366
+ let(:user_params) { { q: 'politica' } }
367
+
368
+ it 'has multiple spelling suggestions' do
369
+ (solr_response,) = service.search_results
370
+ expect(solr_response.spelling.words).to include('policy') # less freq
371
+ expect(solr_response.spelling.words).to include('politics') # more freq
372
+ expect(solr_response.spelling.words).to include('political') # more freq
373
+ # # when we can have multiple suggestions
374
+ # expect(solr_response.spelling.words).to_not include('policy') # less freq
375
+ # solr_response.spelling.words).to include('politics') # more freq
376
+ # solr_response.spelling.words).to include('political') # more freq
377
+ end
378
+ end
379
+
380
+ context "for title search" do
381
+ let(:user_params) { { q: 'yehudiyam', qt: 'search', "spellcheck.dictionary": "title" } }
382
+
383
+ it 'has spelling suggestions' do
384
+ (solr_response,) = service.search_results
385
+ expect(solr_response.spelling.words).to include('yehudiyim')
386
+ end
387
+ end
388
+
389
+ context "for author search" do
390
+ let(:user_params) { { q: 'shirma', qt: 'search', "spellcheck.dictionary": "author" } }
391
+
392
+ it 'has spelling suggestions' do
393
+ (solr_response,) = service.search_results
394
+ expect(solr_response.spelling.words).to include('sharma')
395
+ end
396
+ end
397
+
398
+ context "for subject search" do
399
+ let(:user_params) { { q: 'wome', qt: 'search', "spellcheck.dictionary": "subject" } }
400
+
401
+ it 'has spelling suggestions' do
402
+ (solr_response,) = service.search_results
403
+ expect(solr_response.spelling.words).to include('women')
404
+ end
405
+ end
406
+ end
407
+
408
+ # TODO: more complex queries! phrases, offset into search results, non-latin, boosting(?)
409
+ # search within query building (?)
410
+ # search + facets (search done first; facet selected first, both selected)
411
+
412
+ # TODO: maybe eventually check other types of solr requests
413
+ # more like this
414
+ # nearby on shelf
415
+ it "raises a Blacklight exception if RSolr can't connect to the Solr instance" do
416
+ allow(blacklight_solr).to receive(:send_and_receive).and_raise(Errno::ECONNREFUSED)
417
+ expect { service.repository.search }.to raise_exception(/Unable to connect to Solr instance/)
418
+ end
419
+
420
+ describe "#previous_and_next_documents_for_search" do
421
+ let(:user_params) { { q: '', per_page: 100 } }
422
+
423
+ before do
424
+ @full_response, @all_docs = service.search_results
425
+ end
426
+
427
+ it "returns the previous and next documents for a search" do
428
+ _response, docs = service.previous_and_next_documents_for_search(4, q: '')
429
+
430
+ expect(docs.first.id).to eq @all_docs[3].id
431
+ expect(docs.last.id).to eq @all_docs[5].id
432
+ end
433
+
434
+ it "returns only the next document if the counter is 0" do
435
+ _response, docs = service.previous_and_next_documents_for_search(0, q: '')
436
+
437
+ expect(docs.first).to be_nil
438
+ expect(docs.last.id).to eq @all_docs[1].id
439
+ end
440
+
441
+ it "returns only the previous document if the counter is the total number of documents" do
442
+ _response, docs = service.previous_and_next_documents_for_search(@full_response.total - 1, q: '')
443
+ expect(docs.first.id).to eq @all_docs.slice(-2).id
444
+ expect(docs.last).to be_nil
445
+ end
446
+
447
+ it "returns an array of nil values if there is only one result" do
448
+ _response, docs = service.previous_and_next_documents_for_search(0, q: 'id:2007020969')
449
+ expect(docs.last).to be_nil
450
+ expect(docs.first).to be_nil
451
+ end
452
+
453
+ it 'returns only the unique key by default' do
454
+ _response, docs = service.previous_and_next_documents_for_search(0, q: '')
455
+ expect(docs.last.to_h).to eq 'id' => @all_docs[1].id
456
+ end
457
+
458
+ it 'allows the query parameters to be customized using configuration' do
459
+ blacklight_config.document_pagination_params[:fl] = 'id,format'
460
+
461
+ _response, docs = service.previous_and_next_documents_for_search(0, q: '')
462
+
463
+ expect(docs.last.to_h).to eq @all_docs[1].to_h.slice('id', 'format')
464
+ end
465
+ end
466
+
467
+ describe '#opensearch_response' do
468
+ let(:user_params) { { q: 'Book' } }
469
+ let(:mock_response) do
470
+ instance_double(Blacklight::Solr::Response, documents: [
471
+ { field: 'A' }, { field: 'B' }, { field: 'C' }
472
+ ])
473
+ end
474
+
475
+ before do
476
+ blacklight_config.view.opensearch.title_field = :field
477
+ allow(repository).to receive(:search).and_return(mock_response)
478
+ end
479
+
480
+ it 'contains the original user query as the first element in the response' do
481
+ expect(service.opensearch_response.first).to eq 'Book'
482
+ end
483
+
484
+ it 'contains the search suggestions as the second element in the response' do
485
+ expect(service.opensearch_response.last).to match_array %w[A B C]
486
+ end
487
+ end
488
+ end
data/spec/spec_helper.rb CHANGED
@@ -5,14 +5,9 @@
5
5
 
6
6
  ENV["RAILS_ENV"] ||= 'test'
7
7
 
8
- if ENV["COVERAGE"] or ENV["CI"]
9
- require 'simplecov'
10
- require 'coveralls'
11
-
12
- SimpleCov.formatter = Coveralls::SimpleCov::Formatter
13
- SimpleCov.start do
14
- add_filter "/spec/"
15
- end
8
+ require 'simplecov'
9
+ SimpleCov.start do
10
+ add_filter "/spec/"
16
11
  end
17
12
 
18
13
  require 'rsolr'
@@ -25,24 +20,33 @@ require 'rspec/rails'
25
20
  require 'rspec/its'
26
21
  require 'rspec/collection_matchers'
27
22
  require 'capybara/rspec'
28
- require 'capybara/poltergeist'
23
+ require 'selenium-webdriver'
29
24
  require 'equivalent-xml'
30
25
 
31
- Capybara.javascript_driver = :poltergeist
26
+ Capybara.javascript_driver = :headless_chrome
32
27
 
33
- Capybara.register_driver :poltergeist do |app|
34
- options = {}
35
- options[:timeout] = 120 if RUBY_PLATFORM == "java"
36
- Capybara::Poltergeist::Driver.new(app, options)
28
+ Capybara.register_driver :headless_chrome do |app|
29
+ capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
30
+ chromeOptions: { args: %w[headless disable-gpu no-sandbox] }
31
+ )
32
+
33
+ Capybara::Selenium::Driver.new(app,
34
+ browser: :chrome,
35
+ desired_capabilities: capabilities)
37
36
  end
38
37
 
39
38
  # Requires supporting ruby files with custom matchers and macros, etc,
40
39
  # in spec/support/ and its subdirectories.
41
40
  # Blacklight, again, make sure we're looking in the right place for em.
42
41
  # Relative to HERE, NOT to Rails.root, which is off somewhere else.
43
- Dir[Pathname.new(File.expand_path("../support/**/*.rb", __FILE__))].each {|f| require f}
42
+ Dir[Pathname.new(File.expand_path('support/**/*.rb', __dir__))].each { |f| require f }
44
43
 
45
44
  RSpec.configure do |config|
45
+ config.disable_monkey_patching!
46
+
47
+ # When we're testing the API, only run the api tests
48
+ config.filter_run api: true if ENV['BLACKLIGHT_API_TEST']
49
+
46
50
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
47
51
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
48
52
 
@@ -55,6 +59,7 @@ RSpec.configure do |config|
55
59
  config.include Devise::Test::ControllerHelpers, type: :controller
56
60
  else
57
61
  config.include Devise::TestHelpers, type: :controller
62
+ config.include Devise::TestHelpers, type: :i18n
58
63
  end
59
64
 
60
65
  config.infer_spec_type_from_file_location!
@@ -65,10 +70,6 @@ RSpec.configure do |config|
65
70
  config.include(ControllerLevelHelpers, type: :view)
66
71
  config.before(:each, type: :view) { initialize_controller_helpers(view) }
67
72
 
68
- unless Rails.version > '5'
69
- config.include BackportTest, type: :controller
70
- end
71
-
72
73
  config.expect_with :rspec do |expectations|
73
74
  expectations.include_chain_clauses_in_custom_matcher_descriptions = true
74
75
  end
@@ -13,11 +13,11 @@ module Features
13
13
 
14
14
  def sign_in(login = 'user1')
15
15
  email = "#{login}@#{login}.com"
16
- user = User.create(:email => email, :password => "password", :password_confirmation => "password")
16
+ User.create(email: email, password: "password", password_confirmation: "password")
17
17
  visit new_user_session_path
18
- fill_in("user_email", :with => email)
19
- fill_in("user_password", :with => "password")
20
-
18
+ fill_in("user_email", with: email)
19
+ fill_in("user_password", with: "password")
20
+
21
21
  if has_button? "Sign in"
22
22
  click_button("Sign in")
23
23
  elsif has_button? "Log in"
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  # spec/support/features.rb
3
3
 
4
- require File.expand_path("../features/session_helpers.rb", __FILE__)
4
+ require File.expand_path('features/session_helpers.rb', __dir__)
5
5
 
6
6
  RSpec.configure do |config|
7
7
  config.include Features::SessionHelpers, type: :feature
@@ -1,4 +1,2 @@
1
- if ENV['RAILS_VERSION'].nil? || ENV['RAILS_VERSION'] =~ /^5\./ || ENV['RAILS_VERSION'] == 'edge'
2
- gem 'rails-controller-testing'
3
- gem 'deprecation'
4
- end
1
+ gem 'rails-controller-testing'
2
+ gem 'thor', '~> 0.20'
@@ -2,32 +2,31 @@
2
2
  require 'rails/generators'
3
3
 
4
4
  class TestAppGenerator < Rails::Generators::Base
5
- source_root File.expand_path("../../../../test_app_templates", __FILE__)
5
+ source_root File.expand_path('../../../test_app_templates', __dir__)
6
6
 
7
- def fix_travis_rails_4
8
- if ENV['TRAVIS']
9
- insert_into_file 'app/assets/stylesheets/application.css', :before =>'/*' do
10
- "@charset \"UTF-8\";\n"
11
- end
12
- end
13
- end
14
-
15
- def remove_index
7
+ def remove_index
16
8
  remove_file "public/index.html"
17
9
  end
18
10
 
19
11
  def run_blacklight_generator
20
- say_status("warning", "GENERATING BL", :yellow)
12
+ say_status("warning", "GENERATING BL", :yellow)
21
13
 
22
14
  Bundler.with_clean_env do
23
15
  run "bundle install"
24
16
  end
17
+ options = '--devise'
18
+ if ENV['BLACKLIGHT_API_TEST']
19
+ options += ' --skip-assets'
20
+ inject_into_class 'app/controllers/application_controller.rb', 'ApplicationController' do
21
+ " include ActionController::MimeResponds\n" # see https://github.com/projectblacklight/blacklight/issues/1894
22
+ end
23
+ end
25
24
 
26
- generate 'blacklight:install', '--devise --marc --jettywrapper'
25
+ generate 'blacklight:install', options
27
26
  end
28
27
 
29
28
  def run_test_support_generator
30
- say_status("warning", "GENERATING test_support", :yellow)
29
+ say_status("warning", "GENERATING test_support", :yellow)
31
30
 
32
31
  generate 'blacklight:test_support'
33
32
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- describe "catalog/constraints" do
3
+ RSpec.describe "catalog/constraints" do
4
4
  let :blacklight_config do
5
5
  Blacklight::Configuration.new do |config|
6
6
  config.view.xyz
@@ -18,8 +18,7 @@ describe "catalog/constraints" do
18
18
  allow(view).to receive_messages(query_has_constraints?: true)
19
19
  allow(view).to receive(:blacklight_config).and_return(blacklight_config)
20
20
  render partial: "catalog/constraints"
21
- expect(rendered).to have_selector("#startOverLink")
22
- expect(rendered).to have_link("Start Over", :href => 'http://xyz')
21
+ expect(rendered).to have_link("Start Over", href: 'http://xyz')
23
22
  end
24
23
 
25
24
  it "renders a start over link with the current view type" do
@@ -28,8 +27,6 @@ describe "catalog/constraints" do
28
27
  params[:view] = 'xyz'
29
28
  allow(view).to receive(:blacklight_config).and_return(blacklight_config)
30
29
  render partial: "catalog/constraints"
31
- expect(rendered).to have_selector("#startOverLink")
32
- expect(rendered).to have_link("Start Over", :href => 'http://xyz?view=xyz')
30
+ expect(rendered).to have_link("Start Over", href: 'http://xyz?view=xyz')
33
31
  end
34
-
35
32
  end