blacklight 7.41.0 → 8.0.0.beta1

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 (425) hide show
  1. checksums.yaml +4 -4
  2. data/.env +2 -3
  3. data/.github/workflows/ruby.yml +81 -0
  4. data/.rubocop.yml +243 -14
  5. data/.rubocop_todo.yml +137 -429
  6. data/Gemfile +11 -6
  7. data/README.md +11 -3
  8. data/VERSION +1 -1
  9. data/app/assets/javascripts/blacklight/blacklight.esm.js +384 -0
  10. data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -0
  11. data/app/assets/javascripts/blacklight/blacklight.js +374 -493
  12. data/app/assets/javascripts/blacklight/blacklight.js.map +1 -0
  13. data/app/assets/stylesheets/blacklight/_autocomplete.scss +25 -0
  14. data/app/assets/stylesheets/blacklight/_blacklight_base.scss +1 -1
  15. data/app/assets/stylesheets/blacklight/_bookmark.scss +16 -0
  16. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +8 -0
  17. data/app/assets/stylesheets/blacklight/_constraints.scss +4 -4
  18. data/app/assets/stylesheets/blacklight/_facets.scss +72 -44
  19. data/app/assets/stylesheets/blacklight/_header.scss +0 -15
  20. data/app/assets/stylesheets/blacklight/_icons.scss +0 -14
  21. data/app/assets/stylesheets/blacklight/_mixins.scss +20 -0
  22. data/app/assets/stylesheets/blacklight/_modal.scss +8 -2
  23. data/app/assets/stylesheets/blacklight/_search_form.scss +30 -3
  24. data/app/assets/stylesheets/blacklight/_search_history.scss +10 -1
  25. data/app/assets/stylesheets/blacklight/_search_results.scss +6 -2
  26. data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +4 -1
  27. data/app/builders/blacklight/action_builder.rb +18 -9
  28. data/app/components/blacklight/advanced_search_form_component.html.erb +3 -3
  29. data/app/components/blacklight/advanced_search_form_component.rb +8 -10
  30. data/app/components/blacklight/constraints_component.rb +27 -37
  31. data/app/components/blacklight/document/action_component.rb +12 -10
  32. data/app/components/blacklight/document/actions_component.rb +2 -2
  33. data/app/components/blacklight/document/bookmark_component.html.erb +9 -0
  34. data/app/components/blacklight/document/bookmark_component.rb +4 -2
  35. data/app/components/blacklight/document/citation_component.rb +5 -3
  36. data/app/components/blacklight/document/group_component.rb +7 -3
  37. data/app/components/blacklight/document/sidebar_component.html.erb +2 -0
  38. data/app/components/blacklight/document/sidebar_component.rb +16 -0
  39. data/app/components/blacklight/document/thumbnail_component.html.erb +2 -7
  40. data/app/components/blacklight/document/thumbnail_component.rb +1 -9
  41. data/app/components/blacklight/document_component.html.erb +1 -1
  42. data/app/components/blacklight/document_component.rb +16 -78
  43. data/app/components/blacklight/document_metadata_component.html.erb +2 -4
  44. data/app/components/blacklight/document_metadata_component.rb +5 -10
  45. data/app/components/blacklight/facet_component.rb +3 -3
  46. data/app/components/blacklight/facet_field_checkboxes_component.html.erb +4 -4
  47. data/app/components/blacklight/facet_field_checkboxes_component.rb +1 -1
  48. data/app/components/blacklight/facet_field_component.html.erb +4 -5
  49. data/app/components/blacklight/facet_field_component.rb +9 -2
  50. data/app/components/blacklight/facet_field_list_component.html.erb +3 -3
  51. data/app/components/blacklight/facet_field_list_component.rb +37 -5
  52. data/app/components/blacklight/facet_field_no_layout_component.rb +0 -2
  53. data/app/components/blacklight/facet_item_component.rb +1 -43
  54. data/app/components/blacklight/facet_item_pivot_component.rb +21 -23
  55. data/app/components/blacklight/header_component.rb +1 -1
  56. data/app/components/blacklight/hidden_search_state_component.rb +1 -2
  57. data/app/components/blacklight/icons/icon_component.rb +4 -9
  58. data/app/components/blacklight/icons/legacy_icon_component.rb +30 -0
  59. data/app/components/blacklight/icons/list_component.rb +16 -0
  60. data/app/components/blacklight/icons/search_component.rb +16 -0
  61. data/app/components/blacklight/metadata_field_component.html.erb +2 -2
  62. data/app/components/blacklight/metadata_field_component.rb +24 -8
  63. data/app/components/blacklight/metadata_field_layout_component.rb +4 -25
  64. data/app/components/blacklight/response/facet_group_component.html.erb +3 -5
  65. data/app/components/blacklight/response/facet_group_component.rb +29 -8
  66. data/app/components/blacklight/response/pagination_component.html.erb +1 -1
  67. data/app/components/blacklight/response/pagination_component.rb +2 -11
  68. data/app/components/blacklight/response/sort_component.html.erb +6 -1
  69. data/app/components/blacklight/response/sort_component.rb +1 -16
  70. data/app/components/blacklight/response/spellcheck_component.rb +18 -7
  71. data/app/components/blacklight/response/view_type_button_component.rb +3 -7
  72. data/app/components/blacklight/response/view_type_component.rb +4 -6
  73. data/app/components/blacklight/search/sidebar_component.html.erb +8 -0
  74. data/app/components/blacklight/search/sidebar_component.rb +17 -0
  75. data/app/components/blacklight/search_bar_component.html.erb +20 -15
  76. data/app/components/blacklight/search_bar_component.rb +2 -16
  77. data/app/components/blacklight/search_button_component.rb +3 -3
  78. data/app/components/blacklight/search_context_component.rb +43 -10
  79. data/app/components/blacklight/search_header_component.html.erb +2 -0
  80. data/app/components/blacklight/search_header_component.rb +6 -0
  81. data/app/components/blacklight/start_over_button_component.rb +5 -3
  82. data/app/components/blacklight/system/dropdown_component.rb +8 -5
  83. data/app/components/blacklight/system/flash_message_component.html.erb +4 -2
  84. data/app/components/blacklight/system/flash_message_component.rb +12 -3
  85. data/app/components/blacklight/system/modal_component.html.erb +1 -1
  86. data/app/components/blacklight/system/modal_component.rb +1 -3
  87. data/app/components/blacklight/top_navbar_component.html.erb +1 -1
  88. data/app/components/blacklight/top_navbar_component.rb +0 -4
  89. data/app/controllers/bookmarks_controller.rb +1 -0
  90. data/app/controllers/catalog_controller.rb +1 -0
  91. data/app/controllers/concerns/blacklight/bookmarks.rb +10 -9
  92. data/app/controllers/concerns/blacklight/catalog.rb +21 -83
  93. data/app/controllers/concerns/blacklight/controller.rb +3 -41
  94. data/app/controllers/concerns/blacklight/search_context.rb +25 -7
  95. data/app/controllers/concerns/blacklight/search_history.rb +2 -0
  96. data/app/controllers/concerns/blacklight/searchable.rb +12 -1
  97. data/app/controllers/concerns/blacklight/token_based_user.rb +13 -1
  98. data/app/controllers/search_history_controller.rb +1 -0
  99. data/app/helpers/blacklight/blacklight_helper_behavior.rb +12 -310
  100. data/app/helpers/blacklight/catalog_helper_behavior.rb +22 -139
  101. data/app/helpers/blacklight/component_helper_behavior.rb +2 -53
  102. data/app/helpers/blacklight/configuration_helper_behavior.rb +2 -119
  103. data/app/helpers/blacklight/facets_helper_behavior.rb +4 -321
  104. data/app/helpers/blacklight/icon_helper_behavior.rb +5 -7
  105. data/app/helpers/blacklight/layout_helper_behavior.rb +4 -3
  106. data/app/helpers/blacklight/render_partials_helper_behavior.rb +11 -31
  107. data/app/helpers/blacklight/url_helper_behavior.rb +12 -97
  108. data/app/helpers/blacklight_helper.rb +1 -0
  109. data/app/helpers/catalog_helper.rb +1 -0
  110. data/app/javascript/blacklight/bookmark_toggle.js +13 -19
  111. data/app/javascript/blacklight/button_focus.js +12 -10
  112. data/app/javascript/blacklight/checkbox_submit.js +68 -123
  113. data/app/javascript/blacklight/core.js +5 -7
  114. data/app/javascript/blacklight/index.js +13 -0
  115. data/app/javascript/blacklight/modal.js +99 -164
  116. data/app/javascript/blacklight/modalForm.js +60 -0
  117. data/app/javascript/blacklight/search_context.js +46 -54
  118. data/app/models/blacklight/facet_paginator.rb +3 -2
  119. data/app/models/blacklight/icon.rb +4 -2
  120. data/app/models/bookmark.rb +0 -2
  121. data/app/models/concerns/blacklight/configurable.rb +5 -4
  122. data/app/models/concerns/blacklight/document/active_model_shim.rb +1 -10
  123. data/app/models/concerns/blacklight/document/cache_key.rb +1 -0
  124. data/app/models/concerns/blacklight/document/dublin_core.rb +2 -1
  125. data/app/models/concerns/blacklight/document/email.rb +1 -0
  126. data/app/models/concerns/blacklight/document/export.rb +2 -1
  127. data/app/models/concerns/blacklight/document/extensions.rb +1 -0
  128. data/app/models/concerns/blacklight/document/schema_org.rb +1 -0
  129. data/app/models/concerns/blacklight/document/semantic_fields.rb +2 -1
  130. data/app/models/concerns/blacklight/document/sms.rb +1 -0
  131. data/app/models/concerns/blacklight/suggest/response.rb +1 -0
  132. data/app/models/concerns/blacklight/user.rb +17 -8
  133. data/app/models/record_mailer.rb +13 -12
  134. data/app/models/search.rb +1 -7
  135. data/app/models/solr_document.rb +1 -0
  136. data/app/presenters/blacklight/clause_presenter.rb +1 -1
  137. data/app/presenters/blacklight/document_presenter.rb +23 -50
  138. data/app/presenters/blacklight/facet_field_presenter.rb +39 -14
  139. data/app/presenters/blacklight/facet_grouped_item_presenter.rb +1 -5
  140. data/app/presenters/blacklight/facet_item_pivot_presenter.rb +60 -0
  141. data/app/presenters/blacklight/facet_item_presenter.rb +3 -9
  142. data/app/presenters/blacklight/field_presenter.rb +1 -0
  143. data/app/presenters/blacklight/index_presenter.rb +2 -40
  144. data/app/presenters/blacklight/json_presenter.rb +10 -6
  145. data/app/presenters/blacklight/rendering/link_to_facet.rb +2 -5
  146. data/app/presenters/blacklight/show_presenter.rb +1 -9
  147. data/app/presenters/blacklight/thumbnail_presenter.rb +1 -1
  148. data/app/services/blacklight/bookmarks_search_builder.rb +22 -0
  149. data/app/services/blacklight/field_retriever.rb +12 -21
  150. data/app/services/blacklight/search_service.rb +10 -17
  151. data/app/values/blacklight/types.rb +0 -18
  152. data/app/views/bookmarks/_clear_bookmarks_widget.html.erb +8 -1
  153. data/app/views/bookmarks/_tools.html.erb +7 -12
  154. data/app/views/catalog/_advanced_search_form.html.erb +0 -1
  155. data/app/views/catalog/_bookmark_control.html.erb +1 -1
  156. data/app/views/catalog/_citation.html.erb +1 -1
  157. data/app/views/catalog/_constraints.html.erb +1 -14
  158. data/app/views/catalog/_document.atom.builder +12 -14
  159. data/app/views/catalog/_document.html.erb +5 -3
  160. data/app/views/catalog/_document.rss.builder +2 -4
  161. data/app/views/catalog/_facet_layout.html.erb +2 -2
  162. data/app/views/catalog/_facets.html.erb +5 -4
  163. data/app/views/catalog/_home_text.html.erb +2 -14
  164. data/app/views/catalog/_per_page_widget.html.erb +10 -1
  165. data/app/views/catalog/_search_form.html.erb +2 -2
  166. data/app/views/catalog/_search_header.html.erb +1 -2
  167. data/app/views/catalog/_search_results.html.erb +2 -2
  168. data/app/views/catalog/_search_sidebar.html.erb +5 -1
  169. data/app/views/catalog/_show_main_content.html.erb +11 -16
  170. data/app/views/catalog/_show_sidebar.html.erb +2 -2
  171. data/app/views/catalog/_show_tools.html.erb +8 -14
  172. data/app/views/catalog/_view_type_group.html.erb +1 -1
  173. data/app/views/catalog/email.html.erb +2 -2
  174. data/app/views/catalog/email_success.html.erb +5 -6
  175. data/app/views/catalog/facet.html.erb +7 -5
  176. data/app/views/catalog/index.atom.builder +12 -14
  177. data/app/views/catalog/index.html.erb +4 -1
  178. data/app/views/catalog/index.json.jbuilder +19 -19
  179. data/app/views/catalog/index.rss.builder +1 -1
  180. data/app/views/catalog/opensearch.xml.builder +1 -1
  181. data/app/views/catalog/sms.html.erb +2 -2
  182. data/app/views/catalog/sms_success.html.erb +5 -6
  183. data/app/views/catalog/suggest.html.erb +3 -0
  184. data/app/views/kaminari/blacklight/_page.html.erb +2 -1
  185. data/app/views/layouts/blacklight/base.html.erb +13 -2
  186. data/app/views/search_history/index.html.erb +6 -2
  187. data/app/views/shared/_flash_messages.html.erb +1 -1
  188. data/app/views/shared/_modal.html.erb +3 -3
  189. data/blacklight.gemspec +7 -11
  190. data/config/importmap.rb +3 -0
  191. data/config/locales/blacklight.ar.yml +0 -1
  192. data/config/locales/blacklight.ca.yml +0 -1
  193. data/config/locales/blacklight.de.yml +0 -1
  194. data/config/locales/blacklight.en.yml +0 -2
  195. data/config/locales/blacklight.es.yml +0 -1
  196. data/config/locales/blacklight.fr.yml +0 -1
  197. data/config/locales/blacklight.hu.yml +0 -1
  198. data/config/locales/blacklight.it.yml +0 -1
  199. data/config/locales/blacklight.nl.yml +0 -1
  200. data/config/locales/blacklight.pt-BR.yml +0 -1
  201. data/config/locales/blacklight.sq.yml +0 -1
  202. data/config/locales/blacklight.zh.yml +0 -1
  203. data/config/routes.rb +3 -2
  204. data/db/migrate/20140202020201_create_searches.rb +1 -0
  205. data/db/migrate/20140202020202_create_bookmarks.rb +1 -0
  206. data/db/migrate/20140320000000_add_polymorphic_type_to_bookmarks.rb +1 -0
  207. data/docker-compose.yml +3 -3
  208. data/lib/blacklight/abstract_repository.rb +1 -6
  209. data/lib/blacklight/component.rb +47 -10
  210. data/lib/blacklight/configuration/context.rb +4 -4
  211. data/lib/blacklight/configuration/display_field.rb +7 -9
  212. data/lib/blacklight/configuration/facet_field.rb +17 -11
  213. data/lib/blacklight/configuration/field.rb +1 -0
  214. data/lib/blacklight/configuration/fields.rb +12 -15
  215. data/lib/blacklight/configuration/index_field.rb +1 -0
  216. data/lib/blacklight/configuration/null_display_field.rb +17 -0
  217. data/lib/blacklight/configuration/search_field.rb +1 -0
  218. data/lib/blacklight/configuration/show_field.rb +1 -0
  219. data/lib/blacklight/configuration/sort_field.rb +1 -0
  220. data/lib/blacklight/configuration/tool_config.rb +1 -0
  221. data/lib/blacklight/configuration/view_config.rb +14 -10
  222. data/lib/blacklight/configuration.rb +310 -365
  223. data/lib/blacklight/engine.rb +8 -24
  224. data/lib/blacklight/exceptions.rb +2 -2
  225. data/lib/blacklight/nested_open_struct_with_hash_access.rb +7 -13
  226. data/lib/blacklight/open_struct_with_hash_access.rb +23 -6
  227. data/lib/blacklight/parameters.rb +7 -21
  228. data/lib/blacklight/routes/exportable.rb +1 -0
  229. data/lib/blacklight/routes/searchable.rb +2 -1
  230. data/lib/blacklight/routes.rb +1 -0
  231. data/lib/blacklight/search_builder.rb +10 -10
  232. data/lib/blacklight/search_state/filter_field.rb +8 -25
  233. data/lib/blacklight/search_state/pivot_filter_field.rb +144 -0
  234. data/lib/blacklight/search_state.rb +23 -79
  235. data/lib/blacklight/solr/document.rb +1 -0
  236. data/lib/blacklight/solr/facet_paginator.rb +1 -0
  237. data/lib/blacklight/solr/repository.rb +4 -24
  238. data/lib/blacklight/solr/request.rb +1 -0
  239. data/lib/blacklight/solr/response/facets.rb +21 -5
  240. data/lib/blacklight/solr/response/group.rb +1 -0
  241. data/lib/blacklight/solr/response/group_response.rb +1 -0
  242. data/lib/blacklight/solr/response/more_like_this.rb +1 -0
  243. data/lib/blacklight/solr/response/pagination_methods.rb +4 -3
  244. data/lib/blacklight/solr/response/params.rb +5 -4
  245. data/lib/blacklight/solr/response/response.rb +1 -0
  246. data/lib/blacklight/solr/response/spelling.rb +1 -0
  247. data/lib/blacklight/solr/response.rb +16 -3
  248. data/lib/blacklight/solr/search_builder_behavior.rb +16 -35
  249. data/lib/blacklight/solr.rb +7 -0
  250. data/lib/blacklight/version.rb +1 -0
  251. data/lib/blacklight.rb +26 -14
  252. data/lib/generators/blacklight/assets/importmap_generator.rb +55 -0
  253. data/lib/generators/blacklight/assets/propshaft_generator.rb +25 -0
  254. data/lib/generators/blacklight/assets/sprockets_generator.rb +66 -0
  255. data/lib/generators/blacklight/assets_generator.rb +13 -86
  256. data/lib/generators/blacklight/controller_generator.rb +4 -3
  257. data/lib/generators/blacklight/document_generator.rb +1 -0
  258. data/lib/generators/blacklight/install_generator.rb +4 -3
  259. data/lib/generators/blacklight/models_generator.rb +1 -0
  260. data/lib/generators/blacklight/search_builder_generator.rb +1 -0
  261. data/lib/generators/blacklight/solr_generator.rb +1 -1
  262. data/lib/generators/blacklight/templates/catalog_controller.rb +34 -8
  263. data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +1 -70
  264. data/lib/generators/blacklight/test_support_generator.rb +5 -3
  265. data/lib/generators/blacklight/user_generator.rb +7 -9
  266. data/lib/railties/blacklight.rake +6 -7
  267. data/package.json +10 -13
  268. data/rollup.config.js +27 -0
  269. data/spec/components/blacklight/constraints_component_spec.rb +17 -13
  270. data/spec/components/blacklight/document/action_component_spec.rb +6 -1
  271. data/spec/components/blacklight/document_component_spec.rb +22 -131
  272. data/spec/components/blacklight/facet_component_spec.rb +3 -18
  273. data/spec/components/blacklight/facet_field_checkboxes_component_spec.rb +1 -2
  274. data/spec/components/blacklight/facet_field_list_component_spec.rb +7 -6
  275. data/spec/components/blacklight/facet_item_pivot_component_spec.rb +10 -9
  276. data/spec/components/blacklight/response/view_type_component_spec.rb +66 -0
  277. data/spec/components/blacklight/search_bar_component_spec.rb +1 -1
  278. data/spec/components/blacklight/search_context_component_spec.rb +17 -8
  279. data/spec/controllers/blacklight/catalog/component_configuration_spec.rb +1 -6
  280. data/spec/controllers/blacklight/{base_spec.rb → catalog_spec.rb} +2 -2
  281. data/spec/controllers/bookmarks_controller_spec.rb +2 -3
  282. data/spec/controllers/catalog_controller_spec.rb +13 -135
  283. data/spec/features/advanced_search_spec.rb +0 -56
  284. data/spec/features/autocomplete_spec.rb +1 -1
  285. data/spec/features/axe_spec.rb +1 -6
  286. data/spec/features/bookmarks_spec.rb +1 -1
  287. data/spec/features/facets_spec.rb +6 -4
  288. data/spec/features/search_context_spec.rb +5 -11
  289. data/spec/features/search_results_spec.rb +0 -33
  290. data/spec/features/sitelinks_search_box.rb +13 -0
  291. data/spec/helpers/blacklight/configuration_helper_behavior_spec.rb +2 -138
  292. data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +0 -387
  293. data/spec/helpers/blacklight/icon_helper_behavior_spec.rb +8 -0
  294. data/spec/helpers/blacklight/layout_helper_behavior_spec.rb +3 -20
  295. data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +5 -7
  296. data/spec/helpers/blacklight/url_helper_behavior_spec.rb +9 -131
  297. data/spec/helpers/blacklight_helper_spec.rb +8 -252
  298. data/spec/helpers/catalog_helper_spec.rb +7 -118
  299. data/spec/i18n_spec.rb +1 -0
  300. data/spec/integration/generators/blacklight/solr_generator_spec.rb +1 -1
  301. data/spec/lib/blacklight/component_spec.rb +27 -32
  302. data/spec/lib/blacklight/configuration/facet_field_spec.rb +27 -16
  303. data/spec/lib/blacklight/configuration/field_spec.rb +1 -1
  304. data/spec/lib/blacklight/configuration/view_config_spec.rb +1 -1
  305. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +2 -2
  306. data/spec/lib/blacklight/parameters_spec.rb +1 -4
  307. data/spec/lib/blacklight/search_state/filter_field_spec.rb +4 -4
  308. data/spec/lib/blacklight/search_state/pivot_filter_field_spec.rb +117 -0
  309. data/spec/lib/blacklight/search_state_spec.rb +80 -198
  310. data/spec/lib/tasks/blacklight_task_spec.rb +1 -0
  311. data/spec/models/blacklight/configuration_spec.rb +17 -51
  312. data/spec/models/blacklight/document/active_model_shim_spec.rb +2 -2
  313. data/spec/models/blacklight/icon_spec.rb +31 -15
  314. data/spec/models/blacklight/search_builder_spec.rb +9 -9
  315. data/spec/models/blacklight/solr/document_spec.rb +3 -3
  316. data/spec/models/blacklight/solr/repository_spec.rb +0 -45
  317. data/spec/models/blacklight/solr/response/facets_spec.rb +27 -27
  318. data/spec/models/blacklight/solr/response/group_response_spec.rb +1 -0
  319. data/spec/models/blacklight/solr/response/group_spec.rb +1 -0
  320. data/spec/models/blacklight/solr/response_spec.rb +9 -2
  321. data/spec/models/blacklight/solr/search_builder_spec.rb +24 -44
  322. data/spec/models/blacklight/user_spec.rb +22 -0
  323. data/spec/models/solr_document_spec.rb +3 -9
  324. data/spec/presenters/blacklight/clause_presenter_spec.rb +1 -0
  325. data/spec/presenters/blacklight/document_presenter_spec.rb +2 -3
  326. data/spec/presenters/blacklight/facet_field_presenter_spec.rb +85 -12
  327. data/spec/presenters/blacklight/facet_grouped_item_presenter_spec.rb +1 -0
  328. data/spec/presenters/blacklight/facet_item_presenter_spec.rb +14 -13
  329. data/spec/presenters/blacklight/field_presenter_spec.rb +0 -14
  330. data/spec/presenters/blacklight/index_presenter_spec.rb +2 -5
  331. data/spec/presenters/blacklight/json_presenter_spec.rb +1 -0
  332. data/spec/presenters/blacklight/link_alternate_presenter_spec.rb +3 -2
  333. data/spec/presenters/blacklight/show_presenter_spec.rb +20 -30
  334. data/spec/presenters/thumbnail_presenter_spec.rb +1 -1
  335. data/spec/requests/load_suggestions_spec.rb +16 -0
  336. data/spec/routing/catalog_routing_spec.rb +2 -1
  337. data/spec/services/blacklight/search_service_spec.rb +39 -76
  338. data/spec/spec_helper.rb +8 -9
  339. data/spec/support/controller_level_helpers.rb +1 -2
  340. data/spec/support/features/search_helpers.rb +39 -0
  341. data/spec/support/features/session_helpers.rb +1 -0
  342. data/spec/support/features.rb +3 -0
  343. data/spec/support/view_component_capybara_test_helpers.rb +8 -0
  344. data/spec/test_app_templates/Gemfile.extra +1 -0
  345. data/spec/test_app_templates/lib/generators/test_app_generator.rb +9 -2
  346. data/spec/views/catalog/_document.html.erb_spec.rb +3 -34
  347. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +1 -1
  348. data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +0 -2
  349. data/spec/views/catalog/_search_header.erb_spec.rb +1 -0
  350. data/spec/views/catalog/_show_sidebar.erb_spec.rb +1 -0
  351. data/spec/views/catalog/_show_tools.html.erb_spec.rb +5 -66
  352. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +17 -9
  353. data/spec/views/catalog/email_success.html.erb_spec.rb +2 -2
  354. data/spec/views/catalog/facet.html.erb_spec.rb +6 -3
  355. data/spec/views/catalog/index.atom.builder_spec.rb +17 -11
  356. data/spec/views/catalog/index.html.erb_spec.rb +5 -6
  357. data/spec/views/catalog/index.json.jbuilder_spec.rb +2 -2
  358. data/spec/views/catalog/show.html.erb_spec.rb +3 -25
  359. data/spec/views/catalog/sms_success.html.erb_spec.rb +2 -2
  360. data/tasks/blacklight.rake +11 -9
  361. data/template.demo.rb +7 -7
  362. metadata +77 -189
  363. data/.babelrc +0 -11
  364. data/.github/matrix.json +0 -62
  365. data/.github/workflows/build.yml +0 -16
  366. data/.github/workflows/lint.yml +0 -23
  367. data/.github/workflows/main.yml +0 -23
  368. data/.github/workflows/test.yml +0 -53
  369. data/app/assets/images/blacklight/list.svg +0 -1
  370. data/app/assets/images/blacklight/search.svg +0 -1
  371. data/app/assets/stylesheets/blacklight/_twitter_typeahead.scss +0 -37
  372. data/app/components/blacklight/content_areas_shim.rb +0 -13
  373. data/app/components/blacklight/search/per_page_component.html.erb +0 -2
  374. data/app/components/blacklight/search/per_page_component.rb +0 -50
  375. data/app/components/blacklight/search_context/server_item_pagination_component.html.erb +0 -10
  376. data/app/components/blacklight/search_context/server_item_pagination_component.rb +0 -15
  377. data/app/components/blacklight/system/dropdown_button_component.rb +0 -18
  378. data/app/controllers/concerns/blacklight/base.rb +0 -12
  379. data/app/controllers/concerns/blacklight/default_component_configuration.rb +0 -64
  380. data/app/controllers/concerns/blacklight/facet.rb +0 -69
  381. data/app/controllers/concerns/blacklight/search_fields.rb +0 -46
  382. data/app/helpers/blacklight/hash_as_hidden_fields_helper_behavior.rb +0 -27
  383. data/app/helpers/blacklight/render_constraints_helper_behavior.rb +0 -188
  384. data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +0 -97
  385. data/app/helpers/blacklight/suggest_helper_behavior.rb +0 -13
  386. data/app/javascript/blacklight/autocomplete.js +0 -36
  387. data/app/javascript/blacklight/facet_load.js +0 -22
  388. data/app/presenters/blacklight/search_bar_presenter.rb +0 -47
  389. data/app/views/catalog/_constraints_element.html.erb +0 -14
  390. data/app/views/catalog/_document_action.html.erb +0 -5
  391. data/app/views/catalog/_facet_group.html.erb +0 -5
  392. data/app/views/catalog/_facet_limit.html.erb +0 -3
  393. data/app/views/catalog/_index.html.erb +0 -1
  394. data/app/views/catalog/_index_header.html.erb +0 -22
  395. data/app/views/catalog/_previous_next_doc.html.erb +0 -2
  396. data/app/views/catalog/_show.html.erb +0 -6
  397. data/app/views/catalog/_show_header.html.erb +0 -2
  398. data/app/views/catalog/_thumbnail.html.erb +0 -1
  399. data/lib/blacklight/deprecations/engine_configuration.rb +0 -66
  400. data/lib/blacklight/deprecations/search_state_normalization.rb +0 -52
  401. data/spec/components/blacklight/header_component_spec.rb +0 -20
  402. data/spec/components/blacklight/icons/icon_component_spec.rb +0 -42
  403. data/spec/components/blacklight/response/pagination_component_spec.rb +0 -53
  404. data/spec/components/blacklight/search_context/server_item_pagination_component_spec.rb +0 -35
  405. data/spec/controllers/blacklight/facet_spec.rb +0 -33
  406. data/spec/controllers/blacklight/search_fields_spec.rb +0 -62
  407. data/spec/features/citation_spec.rb +0 -10
  408. data/spec/features/sitelinks_search_box_spec.rb +0 -13
  409. data/spec/features/sms_spec.rb +0 -12
  410. data/spec/helpers/blacklight/hash_as_hidden_fields_behavior_spec.rb +0 -26
  411. data/spec/helpers/blacklight/render_constraints_helper_behavior_spec.rb +0 -92
  412. data/spec/helpers/blacklight/search_history_constraints_helper_behavior_spec.rb +0 -101
  413. data/spec/helpers/blacklight/suggest_helper_behavior_spec.rb +0 -48
  414. data/spec/lib/blacklight/engine_spec.rb +0 -41
  415. data/spec/presenters/blacklight/search_bar_presenter_spec.rb +0 -94
  416. data/spec/services/blacklight/field_retriever_spec.rb +0 -17
  417. data/spec/support/view_component_test_helpers.rb +0 -35
  418. data/spec/views/catalog/_constraints.html.erb_spec.rb +0 -33
  419. data/spec/views/catalog/_facet_group.html.erb_spec.rb +0 -84
  420. data/spec/views/catalog/_facets.html.erb_spec.rb +0 -15
  421. data/spec/views/catalog/_index.html.erb_spec.rb +0 -62
  422. data/spec/views/catalog/_index_header.html.erb_spec.rb +0 -35
  423. data/spec/views/catalog/_previous_next_doc.html.erb_spec.rb +0 -22
  424. data/spec/views/catalog/_show.html.erb_spec.rb +0 -62
  425. data/spec/views/catalog/_thumbnail.html.erb_spec.rb +0 -38
@@ -14,15 +14,11 @@ RSpec.describe Blacklight::ShowPresenter, api: true do
14
14
  let(:search_state) { Blacklight::SearchState.new(params, config, controller) }
15
15
 
16
16
  let(:document) do
17
- SolrDocument.new(id: 1,
18
- 'link_to_facet_true' => 'x',
19
- 'link_to_facet_named' => 'x',
20
- 'qwer' => 'document qwer value')
17
+ SolrDocument.new(id: 'xyz', some_field: 'value')
21
18
  end
22
19
 
23
20
  before do
24
21
  allow(request_context).to receive(:search_state).and_return(search_state)
25
- allow(request_context).to receive(:action_name).and_return(:show)
26
22
  end
27
23
 
28
24
  describe "link_rel_alternates" do
@@ -53,6 +49,10 @@ RSpec.describe Blacklight::ShowPresenter, api: true do
53
49
 
54
50
  MockDocument.use_extension(MockExtension)
55
51
 
52
+ def mock_document_app_helper_url *args
53
+ solr_document_url(*args)
54
+ end
55
+
56
56
  allow(request_context).to receive(:polymorphic_url) do |_, opts|
57
57
  "url.#{opts[:format]}"
58
58
  end
@@ -67,10 +67,12 @@ RSpec.describe Blacklight::ShowPresenter, api: true do
67
67
  tmp_value = Capybara.ignore_hidden_elements
68
68
  Capybara.ignore_hidden_elements = false
69
69
  document.export_formats.each_pair do |format, _spec|
70
- expect(subject).to have_selector("link[href$='.#{format}']", count: 1) do |tag|
71
- expect(tag["rel"]).to eq "alternate"
72
- expect(tag["title"]).to eq format.to_s
73
- expect(tag["href"]).to eq "url.#{format}"
70
+ expect(subject).to have_selector("link[href$='.#{format}']") do |matches|
71
+ expect(matches).to have(1).match
72
+ tag = matches[0]
73
+ expect(tag.attributes["rel"].value).to eq "alternate"
74
+ expect(tag.attributes["title"].value).to eq format.to_s
75
+ expect(tag.attributes["href"].value).to eq mock_document_app_helper_url(document, format: format)
74
76
  end
75
77
  end
76
78
  Capybara.ignore_hidden_elements = tmp_value
@@ -103,43 +105,36 @@ RSpec.describe Blacklight::ShowPresenter, api: true do
103
105
  end
104
106
 
105
107
  describe '#fields' do
106
- let(:field) { instance_double(Blacklight::Configuration::Field) }
107
-
108
108
  before do
109
- allow(config).to receive(:show_fields_for).and_return(title: field)
109
+ config.add_show_field 'title'
110
110
  end
111
111
 
112
112
  it 'returns the list from the configs' do
113
- expect(subject.send(:fields)).to eq(title: field)
113
+ expect(subject.send(:fields).keys).to eq ['title']
114
114
  end
115
115
  end
116
116
 
117
117
  describe "#heading" do
118
118
  it "falls back to an id" do
119
- allow(document).to receive(:[]).with('id').and_return "xyz"
120
119
  expect(subject.heading).to eq document.id
121
120
  end
122
121
 
123
122
  it "returns the value of the field" do
124
- config.show.title_field = :x
125
- allow(document).to receive(:has?).with(:x).and_return(true)
126
- allow(document).to receive(:fetch).with(:x, nil).and_return("value")
123
+ config.show.title_field = 'some_field'
127
124
  expect(subject.heading).to eq "value"
128
125
  end
129
126
 
130
127
  it "returns the first present value" do
131
- config.show.title_field = [:x, :y]
132
- allow(document).to receive(:fetch).with(:x, nil).and_return(nil)
133
- allow(document).to receive(:fetch).with(:y, nil).and_return("value")
128
+ config.show.title_field = %w[a_field_that_doesnt_exist some_field]
134
129
  expect(subject.heading).to eq "value"
135
130
  end
136
131
 
137
132
  it "can use explicit field configuration" do
138
- config.show.title_field = Blacklight::Configuration::Field.new(field: 'x', values: ->(*_) { 'hardcoded' })
133
+ config.show.title_field = Blacklight::Configuration::DisplayField.new(field: 'x', values: ->(*_) { 'hardcoded' })
139
134
  expect(subject.heading).to eq 'hardcoded'
140
135
  end
141
136
 
142
- context "when empty document" do
137
+ context "with an empty document" do
143
138
  let(:document) { SolrDocument.new({}) }
144
139
 
145
140
  it "returns an empty string as the heading" do
@@ -150,26 +145,21 @@ RSpec.describe Blacklight::ShowPresenter, api: true do
150
145
 
151
146
  describe "#html_title" do
152
147
  it "falls back to an id" do
153
- allow(document).to receive(:[]).with('id').and_return "xyz"
154
148
  expect(subject.html_title).to eq document.id
155
149
  end
156
150
 
157
151
  it "returns the value of the field" do
158
- config.show.html_title_field = :x
159
- allow(document).to receive(:has?).with(:x).and_return(true)
160
- allow(document).to receive(:fetch).with(:x, nil).and_return("value")
152
+ config.show.html_title_field = 'some_field'
161
153
  expect(subject.html_title).to eq "value"
162
154
  end
163
155
 
164
156
  it "returns the first present value" do
165
- config.show.html_title_field = [:x, :y]
166
- allow(document).to receive(:fetch).with(:x, nil).and_return(nil)
167
- allow(document).to receive(:fetch).with(:y, nil).and_return("value")
157
+ config.show.html_title_field = %w[a_field_that_doesnt_exist some_field]
168
158
  expect(subject.html_title).to eq "value"
169
159
  end
170
160
 
171
161
  it "can use explicit field configuration" do
172
- config.show.html_title_field = Blacklight::Configuration::Field.new(field: 'x', values: ->(*_) { 'hardcoded' })
162
+ config.show.html_title_field = Blacklight::Configuration::DisplayField.new(field: 'x', values: ->(*_) { 'hardcoded' })
173
163
  expect(subject.html_title).to eq 'hardcoded'
174
164
  end
175
165
  end
@@ -95,7 +95,7 @@ RSpec.describe Blacklight::ThumbnailPresenter do
95
95
  allow(view_context).to receive_messages(xyz: nil)
96
96
  end
97
97
 
98
- it { is_expected.to be nil }
98
+ it { is_expected.to be_nil }
99
99
  end
100
100
  end
101
101
 
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe 'GET /catalog/suggest' do
6
+ it 'returns suggestions' do
7
+ get '/catalog/suggest?q=new'
8
+ expect(response.body).to eq <<-RESULT
9
+ <li role="option"><span>new jersey</span></li>
10
+ <li role="option"><span>new jersey bridgeton biography</span></li>
11
+ <li role="option"><span>new jersey bridgeton history</span></li>
12
+ <li role="option"><span>new york</span></li>
13
+ <li role="option"><span>nuwākshūṭ</span></li>
14
+ RESULT
15
+ end
16
+ end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
3
4
 
4
5
  RSpec.describe "Routing" do
5
6
  describe "Paths Generated by Custom Routes:" do
@@ -8,7 +8,7 @@
8
8
  # to talk with solr and get results)? when we do a document request, does
9
9
  # blacklight code get a single document returned?)
10
10
  #
11
- RSpec.describe Blacklight::SearchService, :api do
11
+ RSpec.describe Blacklight::SearchService, api: true do
12
12
  subject { service }
13
13
 
14
14
  let(:context) { { whatever: :value } }
@@ -49,16 +49,12 @@ RSpec.describe Blacklight::SearchService, :api do
49
49
  end
50
50
 
51
51
  # SPECS FOR SEARCH RESULTS FOR QUERY
52
- describe 'Search Results', :integration do
52
+ describe 'Search Results', integration: true do
53
53
  let(:blacklight_config) { copy_of_catalog_config }
54
54
 
55
55
  describe 'for a sample query returning results' do
56
56
  let(:user_params) { { q: all_docs_query } }
57
57
 
58
- before do
59
- (@solr_response, @document_list) = service.search_results
60
- end
61
-
62
58
  it "uses the configured request handler" do
63
59
  allow(blacklight_config).to receive(:default_solr_params).and_return(qt: 'custom_request_handler')
64
60
  allow(blacklight_solr).to receive(:send_and_receive) do |path, params|
@@ -69,23 +65,6 @@ RSpec.describe Blacklight::SearchService, :api do
69
65
  end.and_return('response' => { 'docs' => [] })
70
66
  service.search_results
71
67
  end
72
-
73
- it 'has a @response.docs list of the same size as @document_list' do
74
- expect(@solr_response.docs).to have(@document_list.length).docs
75
- end
76
-
77
- it 'has @response.docs list representing same documents as SolrDocuments in @document_list' do
78
- @solr_response.docs.each_index do |index|
79
- mash = @solr_response.docs[index]
80
- solr_document = @document_list[index]
81
-
82
- expect(Set.new(mash.keys)).to eq Set.new(solr_document.keys)
83
-
84
- mash.keys.each do |key|
85
- expect(mash[key]).to eq solr_document[key]
86
- end
87
- end
88
- end
89
68
  end
90
69
 
91
70
  describe "for a query returning a grouped response" do
@@ -95,16 +74,14 @@ RSpec.describe Blacklight::SearchService, :api do
95
74
  before do
96
75
  blacklight_config.default_solr_params[:group] = true
97
76
  blacklight_config.default_solr_params[:'group.field'] = 'pub_date_si'
98
- (@solr_response, @document_list) = service.search_results
99
77
  end
100
78
 
101
79
  it "returns a grouped response" do
102
- expect(@document_list).to be_empty
103
- expect(@solr_response).to be_a Blacklight::Solr::Response::GroupResponse
80
+ expect(service.search_results).to be_a_kind_of Blacklight::Solr::Response::GroupResponse
104
81
  end
105
82
  end
106
83
 
107
- describe "for a query returning multiple groups", :integration do
84
+ describe "for a query returning multiple groups", integration: true do
108
85
  let(:blacklight_config) { copy_of_catalog_config }
109
86
  let(:user_params) { { q: all_docs_query } }
110
87
 
@@ -112,13 +89,12 @@ RSpec.describe Blacklight::SearchService, :api do
112
89
  allow(subject).to receive_messages grouped_key_for_results: 'title_si'
113
90
  blacklight_config.default_solr_params[:group] = true
114
91
  blacklight_config.default_solr_params[:'group.field'] = %w[pub_date_si title_si]
115
- (@solr_response, @document_list) = service.search_results
116
92
  end
117
93
 
118
94
  it "returns a grouped response" do
119
- expect(@document_list).to be_empty
120
- expect(@solr_response).to be_a Blacklight::Solr::Response::GroupResponse
121
- expect(@solr_response.group_field).to eq "title_si"
95
+ solr_response = service.search_results
96
+ expect(solr_response).to be_a_kind_of Blacklight::Solr::Response::GroupResponse
97
+ expect(solr_response.group_field).to eq "title_si"
122
98
  end
123
99
  end
124
100
 
@@ -126,8 +102,7 @@ RSpec.describe Blacklight::SearchService, :api do
126
102
  let(:user_params) { { q: all_docs_query, f: single_facet } }
127
103
 
128
104
  it 'has results' do
129
- (solr_response, document_list) = service.search_results
130
- expect(solr_response.docs).to have(document_list.size).results
105
+ solr_response = service.search_results
131
106
  expect(solr_response.docs).to have_at_least(1).result
132
107
  end
133
108
  # TODO: check that number of these results < number of results for all docs query
@@ -138,8 +113,7 @@ RSpec.describe Blacklight::SearchService, :api do
138
113
  let(:user_params) { { q: no_docs_query } }
139
114
 
140
115
  it 'has no results and not raise error' do
141
- (solr_response, document_list) = service.search_results
142
- expect(document_list).to have(0).results
116
+ solr_response = service.search_results
143
117
  expect(solr_response.docs).to have(0).results
144
118
  end
145
119
  end
@@ -148,26 +122,24 @@ RSpec.describe Blacklight::SearchService, :api do
148
122
  let(:user_params) { { q: no_docs_query, f: single_facet } }
149
123
 
150
124
  it 'has no results and not raise error' do
151
- (solr_response, document_list) = service.search_results
152
- expect(document_list).to have(0).results
125
+ solr_response = service.search_results
153
126
  expect(solr_response.docs).to have(0).results
154
127
  end
155
128
  end
156
129
 
157
130
  describe "for All Docs Query and Bad Facet" do
158
- let(:bad_facet) { { format: '666' } }
131
+ let(:bad_facet) { { format: ['666'] } }
159
132
  let(:user_params) { { q: all_docs_query, f: bad_facet } }
160
133
 
161
134
  it 'has no results and not raise error' do
162
- (solr_response, document_list) = service.search_results
163
- expect(document_list).to have(0).results
135
+ solr_response = service.search_results
164
136
  expect(solr_response.docs).to have(0).results
165
137
  end
166
138
  end
167
139
  end # Search Results
168
140
 
169
141
  # SPECS FOR SEARCH RESULTS FOR FACETS
170
- describe 'Facets in Search Results for All Docs Query', :integration do
142
+ describe 'Facets in Search Results for All Docs Query', integration: true do
171
143
  let(:blacklight_config) { copy_of_catalog_config }
172
144
  let(:user_params) { { q: all_docs_query } }
173
145
 
@@ -181,8 +153,8 @@ RSpec.describe Blacklight::SearchService, :api do
181
153
  end
182
154
 
183
155
  it 'has all facets specified in initializer' do
184
- expect(@facets.keys).to include(*blacklight_config.facet_fields.keys)
185
- expect(@facets.none? { |_k, v| v.nil? }).to eq true
156
+ expect(@facets.keys).to include *blacklight_config.facet_fields.keys
157
+ expect(@facets.none? { |_k, v| v.nil? }).to be true
186
158
  end
187
159
 
188
160
  it 'has at least one value for each facet' do
@@ -199,7 +171,7 @@ RSpec.describe Blacklight::SearchService, :api do
199
171
  break
200
172
  end
201
173
  end
202
- expect(has_mult_values).to eq true
174
+ expect(has_mult_values).to be true
203
175
  end
204
176
 
205
177
  it 'has all value counts > 0' do
@@ -212,7 +184,7 @@ RSpec.describe Blacklight::SearchService, :api do
212
184
  end # facet specs
213
185
 
214
186
  # SPECS FOR SEARCH RESULTS FOR PAGING
215
- describe 'Paging', :integration do
187
+ describe 'Paging', integration: true do
216
188
  let(:blacklight_config) { copy_of_catalog_config }
217
189
  let(:user_params) { { q: all_docs_query } }
218
190
 
@@ -222,9 +194,8 @@ RSpec.describe Blacklight::SearchService, :api do
222
194
  end
223
195
 
224
196
  it 'has number of results (per page) set in initializer, by default' do
225
- (solr_response, document_list) = service.search_results
197
+ solr_response = service.search_results
226
198
  expect(solr_response.docs).to have(blacklight_config[:default_solr_params][:rows]).items
227
- expect(document_list).to have(blacklight_config[:default_solr_params][:rows]).items
228
199
  end
229
200
 
230
201
  context "with per page requested" do
@@ -232,8 +203,7 @@ RSpec.describe Blacklight::SearchService, :api do
232
203
  let(:num_results) { 3 } # non-default value
233
204
 
234
205
  it 'gets number of results per page requested' do
235
- (solr_response1, document_list1) = service.search_results
236
- expect(document_list1).to have(num_results).docs
206
+ solr_response1 = service.search_results
237
207
  expect(solr_response1.docs).to have(num_results).docs
238
208
  end
239
209
  end
@@ -243,8 +213,7 @@ RSpec.describe Blacklight::SearchService, :api do
243
213
  let(:num_results) { 4 } # non-default value
244
214
 
245
215
  it 'gets number of rows requested' do
246
- (solr_response1, document_list1) = service.search_results
247
- expect(document_list1).to have(num_results).docs
216
+ solr_response1 = service.search_results
248
217
  expect(solr_response1.docs).to have(num_results).docs
249
218
  end
250
219
  end
@@ -277,8 +246,7 @@ RSpec.describe Blacklight::SearchService, :api do
277
246
  let(:user_params) { { q: all_docs_query, page: page, rows: rows } }
278
247
 
279
248
  it 'has no results when prompted for page after last result' do
280
- (solr_response3, document_list3) = service.search_results
281
- expect(document_list3).to have(0).docs
249
+ solr_response3 = service.search_results
282
250
  expect(solr_response3.docs).to have(0).docs
283
251
  end
284
252
  end
@@ -301,20 +269,19 @@ RSpec.describe Blacklight::SearchService, :api do
301
269
  let(:user_params) { { q: all_docs_query, page: page, rows: rows } }
302
270
 
303
271
  it 'has results available when asked for more than are in response' do
304
- (solr_response5, document_list5) = service.search_results
305
- expect(solr_response5.docs).to have(document_list5.length).docs
272
+ solr_response5 = service.search_results
306
273
  expect(solr_response5.docs).to have_at_least(1).doc
307
274
  end
308
275
  end
309
276
  end # page specs
310
277
 
311
278
  # SPECS FOR SINGLE DOCUMENT REQUESTS
312
- describe 'Get Document By Id', :integration do
279
+ describe 'Get Document By Id', integration: true do
313
280
  let(:doc_id) { '2007020969' }
314
281
  let(:bad_id) { 'redrum' }
315
282
 
316
283
  before do
317
- @response2, @document = service.fetch(doc_id)
284
+ @document = service.fetch(doc_id)
318
285
  end
319
286
 
320
287
  it "raises Blacklight::RecordNotFound for an unknown id" do
@@ -327,35 +294,31 @@ RSpec.describe Blacklight::SearchService, :api do
327
294
  expect(@document).not_to be_nil
328
295
  end
329
296
 
330
- it "has a single document in the response for a known id" do
331
- expect(@response2.docs.size).to eq 1
332
- end
333
-
334
297
  it 'has the expected value in the id field' do
335
298
  expect(@document.id).to eq doc_id
336
299
  end
337
300
  end
338
301
 
339
- describe 'Get multiple documents By Id', :integration do
302
+ describe 'Get multiple documents By Id', integration: true do
340
303
  let(:doc_id) { '2007020969' }
341
304
  let(:bad_id) { 'redrum' }
342
- let(:response) { service.fetch([doc_id]).first }
305
+ let(:response) { service.fetch([doc_id]) }
343
306
 
344
307
  before do
345
308
  blacklight_config.fetch_many_document_params[:fl] = 'id,format'
346
309
  end
347
310
 
348
311
  it 'has the expected value in the id field' do
349
- expect(response.documents.first.id).to eq doc_id
312
+ expect(response.first.id).to eq doc_id
350
313
  end
351
314
 
352
315
  it 'returns all the requested fields' do
353
- expect(response.documents.first['format']).to eq ['Book']
316
+ expect(response.first['format']).to eq ['Book']
354
317
  end
355
318
  end
356
319
 
357
320
  # SPECS FOR SPELLING SUGGESTIONS VIA SEARCH
358
- describe "Searches should return spelling suggestions", :integration do
321
+ describe "Searches should return spelling suggestions", integration: true do
359
322
  context "for just-poor-enough-query term" do
360
323
  let(:user_params) { { q: 'boo' } }
361
324
 
@@ -382,7 +345,7 @@ RSpec.describe Blacklight::SearchService, :api do
382
345
  end
383
346
 
384
347
  context "for title search" do
385
- let(:user_params) { { q: 'yehudiyam', qt: 'search', "spellcheck.dictionary": "title" } }
348
+ let(:user_params) { { q: 'yehudiyam', 'spellcheck.dictionary': "title" } }
386
349
 
387
350
  it 'has spelling suggestions' do
388
351
  (solr_response,) = service.search_results
@@ -391,7 +354,7 @@ RSpec.describe Blacklight::SearchService, :api do
391
354
  end
392
355
 
393
356
  context "for author search" do
394
- let(:user_params) { { q: 'shirma', qt: 'search', "spellcheck.dictionary": "author" } }
357
+ let(:user_params) { { q: 'shirma', 'spellcheck.dictionary': "author" } }
395
358
 
396
359
  it 'has spelling suggestions' do
397
360
  (solr_response,) = service.search_results
@@ -400,7 +363,7 @@ RSpec.describe Blacklight::SearchService, :api do
400
363
  end
401
364
 
402
365
  context "for subject search" do
403
- let(:user_params) { { q: 'wome', qt: 'search', "spellcheck.dictionary": "subject" } }
366
+ let(:user_params) { { q: 'wome', 'spellcheck.dictionary': "subject" } }
404
367
 
405
368
  it 'has spelling suggestions' do
406
369
  (solr_response,) = service.search_results
@@ -433,26 +396,26 @@ RSpec.describe Blacklight::SearchService, :api do
433
396
  let(:user_params) { { q: '', per_page: 100 } }
434
397
 
435
398
  before do
436
- @full_response, @all_docs = service.search_results
399
+ @full_response = service.search_results
437
400
  end
438
401
 
439
402
  it "returns the previous and next documents for a search" do
440
403
  _response, docs = service.previous_and_next_documents_for_search(4, q: '')
441
404
 
442
- expect(docs.first.id).to eq @all_docs[3].id
443
- expect(docs.last.id).to eq @all_docs[5].id
405
+ expect(docs.first.id).to eq @full_response.documents[3].id
406
+ expect(docs.last.id).to eq @full_response.documents[5].id
444
407
  end
445
408
 
446
409
  it "returns only the next document if the counter is 0" do
447
410
  _response, docs = service.previous_and_next_documents_for_search(0, q: '')
448
411
 
449
412
  expect(docs.first).to be_nil
450
- expect(docs.last.id).to eq @all_docs[1].id
413
+ expect(docs.last.id).to eq @full_response.documents[1].id
451
414
  end
452
415
 
453
416
  it "returns only the previous document if the counter is the total number of documents" do
454
417
  _response, docs = service.previous_and_next_documents_for_search(@full_response.total - 1, q: '')
455
- expect(docs.first.id).to eq @all_docs.slice(-2).id
418
+ expect(docs.first.id).to eq @full_response.documents.slice(-2).id
456
419
  expect(docs.last).to be_nil
457
420
  end
458
421
 
@@ -464,7 +427,7 @@ RSpec.describe Blacklight::SearchService, :api do
464
427
 
465
428
  it 'returns only the unique key by default' do
466
429
  _response, docs = service.previous_and_next_documents_for_search(0, q: '')
467
- expect(docs.last.to_h).to eq 'id' => @all_docs[1].id
430
+ expect(docs.last.to_h).to eq 'id' => @full_response.documents[1].id
468
431
  end
469
432
 
470
433
  it 'allows the query parameters to be customized using configuration' do
@@ -472,7 +435,7 @@ RSpec.describe Blacklight::SearchService, :api do
472
435
 
473
436
  _response, docs = service.previous_and_next_documents_for_search(0, q: '')
474
437
 
475
- expect(docs.last.to_h).to eq @all_docs[1].to_h.slice('id', 'format')
438
+ expect(docs.last.to_h).to eq @full_response.documents[1].to_h.slice('id', 'format')
476
439
  end
477
440
  end
478
441
 
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # This file is copied to spec/ when you run 'rails generate rspec:install'
3
4
  # Has been customized by Blacklight to work when application is in one place,
4
5
  # and actual spec/ stuff is in another (the blacklight gem checkout).
@@ -16,6 +17,7 @@ EngineCart.load_application!
16
17
  require 'rspec/rails'
17
18
  require 'rspec/collection_matchers'
18
19
  require 'capybara/rails'
20
+ require 'webdrivers'
19
21
  require 'selenium-webdriver'
20
22
  require 'equivalent-xml'
21
23
  require 'axe-rspec'
@@ -27,13 +29,13 @@ Capybara.javascript_driver = :headless_chrome
27
29
 
28
30
  Capybara.register_driver :headless_chrome do |app|
29
31
  Capybara::Selenium::Driver.load_selenium
30
- options = ::Selenium::WebDriver::Chrome::Options.new.tap do |opts|
32
+ capabilities = ::Selenium::WebDriver::Chrome::Options.new.tap do |opts|
31
33
  opts.args << '--headless'
32
34
  opts.args << '--disable-gpu'
33
35
  opts.args << '--no-sandbox'
34
36
  opts.args << '--window-size=1280,1696'
35
37
  end
36
- Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
38
+ Capybara::Selenium::Driver.new(app, browser: :chrome, capabilities: capabilities)
37
39
  end
38
40
 
39
41
  # Requires supporting ruby files with custom matchers and macros, etc,
@@ -46,13 +48,10 @@ RSpec.configure do |config|
46
48
  config.disable_monkey_patching!
47
49
 
48
50
  # When we're testing the API, only run the api tests
49
- config.filter_run api: true if ENV['BLACKLIGHT_API_TEST']
51
+ config.filter_run api: true if ENV['BLACKLIGHT_API_TEST'].present?
50
52
 
51
- if Rails.version.to_f >= 7.1
52
- config.fixture_paths = [Rails.root.join("spec/fixtures")]
53
- else
54
- config.fixture_path = Rails.root.join("spec/fixtures")
55
- end
53
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
54
+ config.fixture_path = Rails.root.join("spec/fixtures")
56
55
 
57
56
  # If you're not using ActiveRecord, or you'd prefer not to run each of your
58
57
  # examples within a transaction, remove the following line or assign false
@@ -69,7 +68,7 @@ RSpec.configure do |config|
69
68
  config.infer_spec_type_from_file_location!
70
69
  config.include PresenterTestHelpers, type: :presenter
71
70
  config.include ViewComponent::TestHelpers, type: :component
72
- config.include ViewComponentTestHelpers, type: :component
71
+ config.include ViewComponentCapybaraTestHelpers, type: :component
73
72
 
74
73
  config.include(ControllerLevelHelpers, type: :helper)
75
74
  config.before(:each, type: :helper) { initialize_controller_helpers(helper) }
@@ -1,8 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module ControllerLevelHelpers
3
4
  module ControllerViewHelpers
4
- include Blacklight::Facet
5
-
6
5
  def search_state
7
6
  @search_state ||= Blacklight::SearchState.new(params, blacklight_config, controller)
8
7
  end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ # spec/support/features/search_helpers.rb
4
+ module Features
5
+ module SearchHelpers
6
+ def search_for q
7
+ visit root_path
8
+ fill_in "q", with: q
9
+ click_button 'search'
10
+ end
11
+
12
+ def position_in_result_page(page, id)
13
+ i = -1
14
+ page.all(".index_title a").each_with_index do |link, idx|
15
+ i = (idx + 1) if link['href'] =~ Regexp.new("#{Regexp.escape(id)}$")
16
+ end
17
+ i.to_i
18
+ end
19
+
20
+ def number_of_results_for_query(query)
21
+ visit root_path
22
+ fill_in "q", with: query
23
+ click_button "search"
24
+ get_number_of_results_from_page(page)
25
+ end
26
+
27
+ def number_of_results_from_page(page)
28
+ tmp_value = Capybara.ignore_hidden_elements
29
+ Capybara.ignore_hidden_elements = false
30
+ val = begin
31
+ page.find("meta[name=totalResults]")['content'].to_i
32
+ rescue StandardError
33
+ 0
34
+ end
35
+ Capybara.ignore_hidden_elements = tmp_value
36
+ val
37
+ end
38
+ end
39
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # spec/support/features/session_helpers.rb
3
4
  module Features
4
5
  module SessionHelpers
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # spec/support/features.rb
3
4
 
5
+ require File.expand_path('features/search_helpers.rb', __dir__)
4
6
  require File.expand_path('features/session_helpers.rb', __dir__)
5
7
 
6
8
  RSpec.configure do |config|
9
+ config.include Features::SearchHelpers, type: :feature
7
10
  config.include Features::SessionHelpers, type: :feature
8
11
  end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ViewComponentCapybaraTestHelpers
4
+ # Work around for https://github.com/teamcapybara/capybara/issues/2466
5
+ def render_inline_to_capybara_node(component)
6
+ Capybara::Node::Simple.new(render_inline(component).to_s)
7
+ end
8
+ end
@@ -1 +1,2 @@
1
1
  gem 'rails-controller-testing'
2
+ gem 'thor', '~> 0.20' if /^5.[12]/.match?(ENV['RAILS_VERSION'])
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'rails/generators'
3
4
 
4
5
  class TestAppGenerator < Rails::Generators::Base
@@ -11,11 +12,11 @@ class TestAppGenerator < Rails::Generators::Base
11
12
  def run_blacklight_generator
12
13
  say_status("warning", "GENERATING BL", :yellow)
13
14
 
14
- Bundler.with_clean_env do
15
+ Bundler.with_unbundled_env do
15
16
  run "bundle install"
16
17
  end
17
18
  options = '--devise'
18
- if ENV['BLACKLIGHT_API_TEST']
19
+ if ENV['BLACKLIGHT_API_TEST'].present?
19
20
  options += ' --skip-assets'
20
21
  end
21
22
 
@@ -27,4 +28,10 @@ class TestAppGenerator < Rails::Generators::Base
27
28
 
28
29
  generate 'blacklight:test_support'
29
30
  end
31
+
32
+ def add_local_assets_for_propshaft
33
+ return unless defined?(Propshaft)
34
+
35
+ run "yarn add #{Blacklight::Engine.root}"
36
+ end
30
37
  end