blacklight 7.33.0 → 8.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 (427) hide show
  1. checksums.yaml +4 -4
  2. data/.env +3 -2
  3. data/.github/workflows/ruby.yml +38 -107
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +243 -2
  6. data/.rubocop_todo.yml +216 -270
  7. data/Gemfile +7 -6
  8. data/README.md +12 -4
  9. data/Rakefile +18 -0
  10. data/VERSION +1 -1
  11. data/app/assets/config/blacklight/manifest.js +3 -0
  12. data/app/assets/javascripts/blacklight/blacklight.esm.js +376 -0
  13. data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -0
  14. data/app/assets/javascripts/blacklight/blacklight.js +332 -485
  15. data/app/assets/javascripts/blacklight/blacklight.js.map +1 -0
  16. data/app/assets/stylesheets/blacklight/_autocomplete.scss +25 -0
  17. data/app/assets/stylesheets/blacklight/_blacklight_base.scss +1 -1
  18. data/app/assets/stylesheets/blacklight/_bookmark.scss +16 -0
  19. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +8 -0
  20. data/app/assets/stylesheets/blacklight/_facets.scss +104 -49
  21. data/app/assets/stylesheets/blacklight/_header.scss +0 -15
  22. data/app/assets/stylesheets/blacklight/_icons.scss +0 -14
  23. data/app/assets/stylesheets/blacklight/_mixins.scss +20 -0
  24. data/app/assets/stylesheets/blacklight/_modal.scss +8 -2
  25. data/app/assets/stylesheets/blacklight/_search_form.scss +30 -3
  26. data/app/assets/stylesheets/blacklight/_search_history.scss +10 -1
  27. data/app/assets/stylesheets/blacklight/_search_results.scss +6 -2
  28. data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +4 -1
  29. data/app/builders/blacklight/action_builder.rb +18 -9
  30. data/app/components/blacklight/advanced_search_form_component.html.erb +1 -1
  31. data/app/components/blacklight/advanced_search_form_component.rb +7 -9
  32. data/app/components/blacklight/constraints_component.rb +27 -37
  33. data/app/components/blacklight/document/action_component.html.erb +2 -9
  34. data/app/components/blacklight/document/action_component.rb +26 -8
  35. data/app/components/blacklight/document/actions_component.rb +2 -2
  36. data/app/components/blacklight/document/bookmark_component.html.erb +9 -0
  37. data/app/components/blacklight/document/bookmark_component.rb +4 -2
  38. data/app/components/blacklight/document/citation_component.rb +5 -3
  39. data/app/components/blacklight/document/group_component.rb +7 -3
  40. data/app/components/blacklight/document/show_tools_component.html.erb +12 -0
  41. data/app/components/blacklight/document/show_tools_component.rb +23 -0
  42. data/app/components/blacklight/document/sidebar_component.html.erb +2 -0
  43. data/app/components/blacklight/document/sidebar_component.rb +16 -0
  44. data/app/components/blacklight/document/thumbnail_component.html.erb +2 -7
  45. data/app/components/blacklight/document/thumbnail_component.rb +1 -9
  46. data/app/components/blacklight/document_component.html.erb +4 -0
  47. data/app/components/blacklight/document_component.rb +54 -42
  48. data/app/components/blacklight/document_metadata_component.html.erb +4 -2
  49. data/app/components/blacklight/document_metadata_component.rb +11 -6
  50. data/app/components/blacklight/document_title_component.rb +4 -1
  51. data/app/components/blacklight/facet_component.rb +1 -1
  52. data/app/components/blacklight/facet_field_checkboxes_component.html.erb +3 -3
  53. data/app/components/blacklight/facet_field_checkboxes_component.rb +1 -1
  54. data/app/components/blacklight/facet_field_component.html.erb +5 -5
  55. data/app/components/blacklight/facet_field_component.rb +9 -2
  56. data/app/components/blacklight/facet_field_list_component.html.erb +3 -3
  57. data/app/components/blacklight/facet_field_list_component.rb +37 -5
  58. data/app/components/blacklight/facet_field_no_layout_component.rb +0 -2
  59. data/app/components/blacklight/facet_item_component.rb +1 -43
  60. data/app/components/blacklight/facet_item_pivot_component.rb +21 -23
  61. data/app/components/blacklight/header_component.html.erb +2 -0
  62. data/app/components/blacklight/header_component.rb +26 -0
  63. data/app/components/blacklight/hidden_search_state_component.rb +1 -2
  64. data/app/components/blacklight/icons/legacy_icon_component.rb +30 -0
  65. data/app/components/blacklight/icons/list_component.rb +16 -0
  66. data/app/components/blacklight/icons/search_component.rb +16 -0
  67. data/app/components/blacklight/metadata_field_component.html.erb +2 -2
  68. data/app/components/blacklight/metadata_field_component.rb +24 -8
  69. data/app/components/blacklight/metadata_field_layout_component.rb +7 -22
  70. data/app/components/blacklight/metadata_field_plain_text_layout_component.rb +17 -0
  71. data/app/components/blacklight/response/facet_group_component.html.erb +5 -6
  72. data/app/components/blacklight/response/facet_group_component.rb +29 -8
  73. data/app/components/blacklight/response/sort_component.rb +2 -2
  74. data/app/components/blacklight/response/spellcheck_component.rb +18 -7
  75. data/app/components/blacklight/response/view_type_button_component.rb +3 -7
  76. data/app/components/blacklight/response/view_type_component.rb +4 -6
  77. data/app/components/blacklight/search/sidebar_component.html.erb +8 -0
  78. data/app/components/blacklight/search/sidebar_component.rb +17 -0
  79. data/app/components/blacklight/search_bar_component.html.erb +20 -15
  80. data/app/components/blacklight/search_bar_component.rb +2 -16
  81. data/app/components/blacklight/search_button_component.rb +3 -3
  82. data/app/components/blacklight/search_context/server_applied_params_component.html.erb +4 -0
  83. data/app/components/blacklight/search_context/server_applied_params_component.rb +13 -0
  84. data/app/components/blacklight/search_context/server_item_pagination_component.rb +71 -0
  85. data/app/components/blacklight/search_header_component.html.erb +2 -0
  86. data/app/components/blacklight/search_header_component.rb +6 -0
  87. data/app/components/blacklight/search_navbar_component.html.erb +5 -0
  88. data/app/components/blacklight/search_navbar_component.rb +34 -0
  89. data/app/components/blacklight/start_over_button_component.rb +5 -3
  90. data/app/components/blacklight/system/dropdown_component.rb +3 -3
  91. data/app/components/blacklight/system/flash_message_component.html.erb +3 -1
  92. data/app/components/blacklight/system/flash_message_component.rb +12 -3
  93. data/app/components/blacklight/system/modal_component.html.erb +1 -1
  94. data/app/components/blacklight/system/modal_component.rb +1 -3
  95. data/app/components/blacklight/top_navbar_component.html.erb +12 -0
  96. data/app/components/blacklight/top_navbar_component.rb +17 -0
  97. data/app/controllers/bookmarks_controller.rb +1 -0
  98. data/app/controllers/catalog_controller.rb +1 -0
  99. data/app/controllers/concerns/blacklight/bookmarks.rb +11 -6
  100. data/app/controllers/concerns/blacklight/catalog.rb +21 -72
  101. data/app/controllers/concerns/blacklight/controller.rb +6 -43
  102. data/app/controllers/concerns/blacklight/search_context.rb +71 -13
  103. data/app/controllers/concerns/blacklight/search_history.rb +2 -0
  104. data/app/controllers/concerns/blacklight/searchable.rb +12 -1
  105. data/app/controllers/concerns/blacklight/token_based_user.rb +1 -0
  106. data/app/controllers/search_history_controller.rb +1 -0
  107. data/app/helpers/blacklight/blacklight_helper_behavior.rb +1 -400
  108. data/app/helpers/blacklight/catalog_helper_behavior.rb +40 -182
  109. data/app/helpers/blacklight/component_helper_behavior.rb +1 -63
  110. data/app/helpers/blacklight/configuration_helper_behavior.rb +2 -117
  111. data/app/helpers/blacklight/document_helper_behavior.rb +76 -0
  112. data/app/helpers/blacklight/facets_helper_behavior.rb +4 -321
  113. data/app/helpers/blacklight/icon_helper_behavior.rb +5 -4
  114. data/app/helpers/blacklight/layout_helper_behavior.rb +60 -0
  115. data/app/helpers/blacklight/render_partials_helper_behavior.rb +12 -30
  116. data/app/helpers/blacklight/url_helper_behavior.rb +21 -97
  117. data/app/helpers/blacklight_helper.rb +1 -0
  118. data/app/helpers/catalog_helper.rb +1 -0
  119. data/app/javascript/blacklight/bookmark_toggle.js +9 -22
  120. data/app/javascript/blacklight/button_focus.js +9 -7
  121. data/app/javascript/blacklight/checkbox_submit.js +68 -122
  122. data/app/javascript/blacklight/core.js +6 -5
  123. data/app/javascript/blacklight/index.js +14 -0
  124. data/app/javascript/blacklight/modal.js +100 -165
  125. data/app/javascript/blacklight/modalForm.js +60 -0
  126. data/app/javascript/blacklight/search_context.js +13 -29
  127. data/app/models/blacklight/facet_paginator.rb +3 -2
  128. data/app/models/blacklight/icon.rb +4 -2
  129. data/app/models/bookmark.rb +0 -2
  130. data/app/models/concerns/blacklight/configurable.rb +5 -4
  131. data/app/models/concerns/blacklight/document/active_model_shim.rb +1 -0
  132. data/app/models/concerns/blacklight/document/attributes.rb +50 -0
  133. data/app/models/concerns/blacklight/document/cache_key.rb +1 -0
  134. data/app/models/concerns/blacklight/document/dublin_core.rb +2 -1
  135. data/app/models/concerns/blacklight/document/export.rb +2 -1
  136. data/app/models/concerns/blacklight/document/extensions.rb +1 -0
  137. data/app/models/concerns/blacklight/document/schema_org.rb +1 -0
  138. data/app/models/concerns/blacklight/document/semantic_fields.rb +1 -0
  139. data/app/models/concerns/blacklight/document.rb +23 -20
  140. data/app/models/concerns/blacklight/suggest/response.rb +1 -0
  141. data/app/models/concerns/blacklight/user.rb +17 -8
  142. data/app/models/record_mailer.rb +23 -18
  143. data/app/models/search.rb +0 -1
  144. data/app/models/solr_document.rb +1 -0
  145. data/app/presenters/blacklight/clause_presenter.rb +1 -1
  146. data/app/presenters/blacklight/document_presenter.rb +24 -30
  147. data/app/presenters/blacklight/facet_field_presenter.rb +39 -14
  148. data/app/presenters/blacklight/facet_grouped_item_presenter.rb +1 -5
  149. data/app/presenters/blacklight/facet_item_pivot_presenter.rb +60 -0
  150. data/app/presenters/blacklight/facet_item_presenter.rb +3 -9
  151. data/app/presenters/blacklight/field_presenter.rb +1 -0
  152. data/app/presenters/blacklight/index_presenter.rb +2 -40
  153. data/app/presenters/blacklight/json_presenter.rb +7 -5
  154. data/app/presenters/blacklight/rendering/abstract_step.rb +4 -0
  155. data/app/presenters/blacklight/rendering/join.rb +7 -1
  156. data/app/presenters/blacklight/rendering/link_to_facet.rb +3 -6
  157. data/app/presenters/blacklight/rendering/microdata.rb +1 -1
  158. data/app/presenters/blacklight/show_presenter.rb +1 -9
  159. data/app/presenters/blacklight/thumbnail_presenter.rb +1 -1
  160. data/app/services/blacklight/bookmarks_search_builder.rb +22 -0
  161. data/app/services/blacklight/field_retriever.rb +1 -8
  162. data/app/services/blacklight/search_service.rb +9 -7
  163. data/app/values/blacklight/types.rb +95 -11
  164. data/app/views/bookmarks/_clear_bookmarks_widget.html.erb +8 -1
  165. data/app/views/bookmarks/_tools.html.erb +7 -12
  166. data/app/views/catalog/_advanced_search_form.html.erb +0 -1
  167. data/app/views/catalog/_bookmark_control.html.erb +1 -1
  168. data/app/views/catalog/_constraints.html.erb +1 -14
  169. data/app/views/catalog/_document.atom.builder +12 -14
  170. data/app/views/catalog/_document.html.erb +3 -6
  171. data/app/views/catalog/_document.rss.builder +2 -4
  172. data/app/views/catalog/_document_list.html.erb +2 -1
  173. data/app/views/catalog/_facet_layout.html.erb +2 -2
  174. data/app/views/catalog/_facets.html.erb +5 -4
  175. data/app/views/catalog/_home_text.html.erb +2 -14
  176. data/app/views/catalog/_search_form.html.erb +3 -3
  177. data/app/views/catalog/_search_header.html.erb +1 -2
  178. data/app/views/catalog/_search_results.html.erb +2 -2
  179. data/app/views/catalog/_search_sidebar.html.erb +5 -1
  180. data/app/views/catalog/_show_main_content.html.erb +8 -19
  181. data/app/views/catalog/_show_sidebar.html.erb +2 -2
  182. data/app/views/catalog/_show_tools.html.erb +1 -19
  183. data/app/views/catalog/_view_type_group.html.erb +1 -1
  184. data/app/views/catalog/email_success.html.erb +5 -6
  185. data/app/views/catalog/facet.html.erb +7 -5
  186. data/app/views/catalog/index.atom.builder +12 -14
  187. data/app/views/catalog/index.html.erb +7 -1
  188. data/app/views/catalog/index.json.jbuilder +19 -19
  189. data/app/views/catalog/index.rss.builder +1 -1
  190. data/app/views/catalog/opensearch.xml.builder +1 -1
  191. data/app/views/catalog/show.html.erb +1 -6
  192. data/app/views/catalog/sms_success.html.erb +5 -6
  193. data/app/views/catalog/suggest.html.erb +3 -0
  194. data/app/views/layouts/blacklight/base.html.erb +19 -9
  195. data/app/views/record_mailer/email_record.text.erb +4 -3
  196. data/app/views/record_mailer/sms_record.text.erb +4 -4
  197. data/app/views/search_history/index.html.erb +6 -2
  198. data/app/views/shared/_header_navbar.html.erb +1 -22
  199. data/app/views/shared/_modal.html.erb +3 -3
  200. data/blacklight.gemspec +8 -10
  201. data/config/importmap.rb +3 -0
  202. data/config/locales/blacklight.ar.yml +209 -233
  203. data/config/locales/blacklight.ca.yml +0 -7
  204. data/config/locales/blacklight.de.yml +197 -216
  205. data/config/locales/blacklight.en.yml +2 -7
  206. data/config/locales/blacklight.es.yml +196 -216
  207. data/config/locales/blacklight.fr.yml +196 -220
  208. data/config/locales/blacklight.hu.yml +193 -213
  209. data/config/locales/blacklight.it.yml +197 -216
  210. data/config/locales/blacklight.nl.yml +193 -213
  211. data/config/locales/blacklight.pt-BR.yml +195 -216
  212. data/config/locales/blacklight.sq.yml +193 -213
  213. data/config/locales/blacklight.zh.yml +194 -214
  214. data/config/routes.rb +3 -2
  215. data/db/migrate/20140202020201_create_searches.rb +1 -0
  216. data/db/migrate/20140202020202_create_bookmarks.rb +1 -0
  217. data/db/migrate/20140320000000_add_polymorphic_type_to_bookmarks.rb +1 -0
  218. data/docker-compose.yml +1 -0
  219. data/lib/blacklight/abstract_repository.rb +1 -0
  220. data/lib/blacklight/configuration/context.rb +4 -4
  221. data/lib/blacklight/configuration/display_field.rb +7 -9
  222. data/lib/blacklight/configuration/facet_field.rb +17 -11
  223. data/lib/blacklight/configuration/field.rb +1 -0
  224. data/lib/blacklight/configuration/fields.rb +12 -15
  225. data/lib/blacklight/configuration/index_field.rb +1 -0
  226. data/lib/blacklight/configuration/null_display_field.rb +17 -0
  227. data/lib/blacklight/configuration/search_field.rb +1 -0
  228. data/lib/blacklight/configuration/session_tracking_config.rb +45 -0
  229. data/lib/blacklight/configuration/show_field.rb +1 -0
  230. data/lib/blacklight/configuration/sort_field.rb +1 -0
  231. data/lib/blacklight/configuration/tool_config.rb +1 -0
  232. data/lib/blacklight/configuration/view_config.rb +16 -10
  233. data/lib/blacklight/configuration.rb +322 -341
  234. data/lib/blacklight/engine.rb +13 -15
  235. data/lib/blacklight/exceptions.rb +2 -2
  236. data/lib/blacklight/nested_open_struct_with_hash_access.rb +6 -12
  237. data/lib/blacklight/open_struct_with_hash_access.rb +19 -17
  238. data/lib/blacklight/parameters.rb +7 -21
  239. data/lib/blacklight/routes/exportable.rb +1 -0
  240. data/lib/blacklight/routes/searchable.rb +3 -1
  241. data/lib/blacklight/routes.rb +1 -0
  242. data/lib/blacklight/search_builder.rb +10 -10
  243. data/lib/blacklight/search_state/filter_field.rb +8 -25
  244. data/lib/blacklight/search_state/pivot_filter_field.rb +144 -0
  245. data/lib/blacklight/search_state.rb +23 -79
  246. data/lib/blacklight/solr/document.rb +1 -0
  247. data/lib/blacklight/solr/facet_paginator.rb +1 -0
  248. data/lib/blacklight/solr/repository.rb +1 -0
  249. data/lib/blacklight/solr/request.rb +3 -0
  250. data/lib/blacklight/solr/response/facets.rb +21 -5
  251. data/lib/blacklight/solr/response/group.rb +1 -0
  252. data/lib/blacklight/solr/response/group_response.rb +1 -0
  253. data/lib/blacklight/solr/response/more_like_this.rb +1 -0
  254. data/lib/blacklight/solr/response/pagination_methods.rb +4 -3
  255. data/lib/blacklight/solr/response/params.rb +5 -4
  256. data/lib/blacklight/solr/response/response.rb +1 -0
  257. data/lib/blacklight/solr/response/spelling.rb +1 -0
  258. data/lib/blacklight/solr/response.rb +4 -3
  259. data/lib/blacklight/solr/search_builder_behavior.rb +16 -32
  260. data/lib/blacklight/solr.rb +1 -0
  261. data/lib/blacklight/version.rb +1 -0
  262. data/lib/blacklight.rb +8 -11
  263. data/lib/generators/blacklight/assets/importmap_generator.rb +56 -0
  264. data/lib/generators/blacklight/assets/propshaft_generator.rb +34 -0
  265. data/lib/generators/blacklight/assets/sprockets_generator.rb +68 -0
  266. data/lib/generators/blacklight/assets_generator.rb +14 -88
  267. data/lib/generators/blacklight/controller_generator.rb +3 -2
  268. data/lib/generators/blacklight/document_generator.rb +1 -0
  269. data/lib/generators/blacklight/install_generator.rb +7 -4
  270. data/lib/generators/blacklight/models_generator.rb +1 -0
  271. data/lib/generators/blacklight/search_builder_generator.rb +1 -0
  272. data/lib/generators/blacklight/solr_generator.rb +1 -1
  273. data/lib/generators/blacklight/templates/catalog_controller.rb +37 -7
  274. data/lib/generators/blacklight/templates/solr_document.rb +1 -7
  275. data/lib/generators/blacklight/test_support_generator.rb +4 -2
  276. data/lib/generators/blacklight/user_generator.rb +7 -9
  277. data/lib/railties/blacklight.rake +2 -3
  278. data/package.json +10 -10
  279. data/rollup.config.js +37 -0
  280. data/spec/components/blacklight/constraints_component_spec.rb +17 -13
  281. data/spec/components/blacklight/document_component_spec.rb +74 -33
  282. data/spec/components/blacklight/facet_component_spec.rb +2 -7
  283. data/spec/components/blacklight/facet_field_checkboxes_component_spec.rb +1 -2
  284. data/spec/components/blacklight/facet_field_list_component_spec.rb +7 -6
  285. data/spec/components/blacklight/facet_item_pivot_component_spec.rb +9 -7
  286. data/spec/components/blacklight/header_component_spec.rb +20 -0
  287. data/spec/components/blacklight/response/view_type_component_spec.rb +83 -0
  288. data/spec/components/blacklight/search_bar_component_spec.rb +1 -1
  289. data/spec/components/blacklight/search_context/server_applied_params_component_spec.rb +29 -0
  290. data/spec/components/blacklight/search_context/server_item_pagination_component_spec.rb +51 -0
  291. data/spec/controllers/blacklight/catalog/component_configuration_spec.rb +1 -6
  292. data/spec/controllers/blacklight/{base_spec.rb → catalog_spec.rb} +2 -2
  293. data/spec/controllers/bookmarks_controller_spec.rb +2 -3
  294. data/spec/controllers/catalog_controller_spec.rb +24 -126
  295. data/spec/features/autocomplete_spec.rb +1 -1
  296. data/spec/features/axe_spec.rb +1 -1
  297. data/spec/features/bookmarks_spec.rb +1 -1
  298. data/spec/features/component_template_override_spec.rb +8 -0
  299. data/spec/features/facets_spec.rb +1 -1
  300. data/spec/features/modal_spec.rb +12 -0
  301. data/spec/features/search_context_spec.rb +4 -10
  302. data/spec/features/search_results_spec.rb +0 -33
  303. data/spec/features/sitelinks_search_box_spec.rb +13 -0
  304. data/spec/helpers/blacklight/configuration_helper_behavior_spec.rb +2 -138
  305. data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +0 -387
  306. data/spec/helpers/blacklight/icon_helper_behavior_spec.rb +8 -0
  307. data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +5 -7
  308. data/spec/helpers/blacklight/url_helper_behavior_spec.rb +10 -132
  309. data/spec/helpers/blacklight_helper_spec.rb +3 -298
  310. data/spec/helpers/catalog_helper_spec.rb +60 -115
  311. data/spec/i18n_spec.rb +1 -0
  312. data/spec/integration/generators/blacklight/solr_generator_spec.rb +1 -1
  313. data/spec/lib/blacklight/configuration/facet_field_spec.rb +27 -16
  314. data/spec/lib/blacklight/configuration/field_spec.rb +1 -1
  315. data/spec/lib/blacklight/configuration/session_tracking_config_spec.rb +38 -0
  316. data/spec/lib/blacklight/configuration/view_config_spec.rb +1 -1
  317. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +4 -4
  318. data/spec/lib/blacklight/parameters_spec.rb +1 -4
  319. data/spec/lib/blacklight/search_state/filter_field_spec.rb +4 -4
  320. data/spec/lib/blacklight/search_state/pivot_filter_field_spec.rb +117 -0
  321. data/spec/lib/blacklight/search_state_spec.rb +80 -198
  322. data/spec/lib/tasks/blacklight_task_spec.rb +1 -0
  323. data/spec/models/blacklight/configuration_spec.rb +41 -53
  324. data/spec/models/blacklight/document/active_model_shim_spec.rb +2 -2
  325. data/spec/models/blacklight/icon_spec.rb +29 -15
  326. data/spec/models/blacklight/search_builder_spec.rb +12 -12
  327. data/spec/models/blacklight/solr/document_spec.rb +3 -3
  328. data/spec/models/blacklight/solr/request_spec.rb +2 -2
  329. data/spec/models/blacklight/solr/response/facets_spec.rb +27 -27
  330. data/spec/models/blacklight/solr/response/group_response_spec.rb +1 -0
  331. data/spec/models/blacklight/solr/response/group_spec.rb +1 -0
  332. data/spec/models/blacklight/solr/response_spec.rb +9 -2
  333. data/spec/models/blacklight/solr/search_builder_spec.rb +32 -23
  334. data/spec/models/blacklight/user_spec.rb +22 -0
  335. data/spec/models/record_mailer_spec.rb +36 -23
  336. data/spec/models/solr_document_spec.rb +21 -3
  337. data/spec/presenters/blacklight/clause_presenter_spec.rb +1 -0
  338. data/spec/presenters/blacklight/document_presenter_spec.rb +3 -2
  339. data/spec/presenters/blacklight/facet_field_presenter_spec.rb +85 -12
  340. data/spec/presenters/blacklight/facet_grouped_item_presenter_spec.rb +1 -0
  341. data/spec/presenters/blacklight/facet_item_presenter_spec.rb +14 -13
  342. data/spec/presenters/blacklight/field_presenter_spec.rb +2 -16
  343. data/spec/presenters/blacklight/index_presenter_spec.rb +3 -4
  344. data/spec/presenters/blacklight/json_presenter_spec.rb +1 -0
  345. data/spec/presenters/blacklight/link_alternate_presenter_spec.rb +3 -2
  346. data/spec/presenters/blacklight/show_presenter_spec.rb +11 -25
  347. data/spec/presenters/pipeline_spec.rb +13 -2
  348. data/spec/presenters/thumbnail_presenter_spec.rb +1 -1
  349. data/spec/requests/load_suggestions_spec.rb +16 -0
  350. data/spec/routing/catalog_routing_spec.rb +6 -1
  351. data/spec/services/blacklight/search_service_spec.rb +31 -68
  352. data/spec/spec_helper.rb +4 -3
  353. data/spec/support/controller_level_helpers.rb +1 -2
  354. data/spec/support/features/search_helpers.rb +39 -0
  355. data/spec/support/features/session_helpers.rb +1 -0
  356. data/spec/support/features.rb +3 -0
  357. data/spec/support/view_component_test_helpers.rb +21 -0
  358. data/spec/test_app_templates/Gemfile.extra +4 -0
  359. data/spec/test_app_templates/lib/generators/test_app_generator.rb +17 -2
  360. data/spec/views/catalog/_document.html.erb_spec.rb +23 -33
  361. data/spec/views/catalog/_document_list.html.erb_spec.rb +7 -2
  362. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +1 -1
  363. data/spec/views/catalog/_search_header.erb_spec.rb +1 -0
  364. data/spec/views/catalog/_show_sidebar.erb_spec.rb +1 -0
  365. data/spec/views/catalog/_show_tools.html.erb_spec.rb +7 -54
  366. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +17 -9
  367. data/spec/views/catalog/email_success.html.erb_spec.rb +2 -2
  368. data/spec/views/catalog/facet.html.erb_spec.rb +6 -3
  369. data/spec/views/catalog/index.atom.builder_spec.rb +18 -11
  370. data/spec/views/catalog/index.html.erb_spec.rb +5 -6
  371. data/spec/views/catalog/index.json.jbuilder_spec.rb +3 -3
  372. data/spec/views/catalog/show.html.erb_spec.rb +3 -25
  373. data/spec/views/catalog/sms_success.html.erb_spec.rb +2 -2
  374. data/tasks/blacklight.rake +7 -5
  375. metadata +95 -123
  376. data/.babelrc +0 -11
  377. data/app/assets/images/blacklight/list.svg +0 -1
  378. data/app/assets/images/blacklight/search.svg +0 -1
  379. data/app/assets/stylesheets/blacklight/_twitter_typeahead.scss +0 -37
  380. data/app/components/blacklight/content_areas_shim.rb +0 -13
  381. data/app/components/blacklight/search_context_component.rb +0 -34
  382. data/app/controllers/concerns/blacklight/base.rb +0 -7
  383. data/app/controllers/concerns/blacklight/default_component_configuration.rb +0 -64
  384. data/app/controllers/concerns/blacklight/facet.rb +0 -69
  385. data/app/controllers/concerns/blacklight/search_fields.rb +0 -46
  386. data/app/helpers/blacklight/hash_as_hidden_fields_helper_behavior.rb +0 -27
  387. data/app/helpers/blacklight/render_constraints_helper_behavior.rb +0 -188
  388. data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +0 -97
  389. data/app/helpers/blacklight/suggest_helper_behavior.rb +0 -13
  390. data/app/javascript/blacklight/autocomplete.js +0 -36
  391. data/app/javascript/blacklight/facet_load.js +0 -22
  392. data/app/models/concerns/blacklight/document/email.rb +0 -26
  393. data/app/models/concerns/blacklight/document/sms.rb +0 -24
  394. data/app/presenters/blacklight/search_bar_presenter.rb +0 -47
  395. data/app/views/catalog/_constraints_element.html.erb +0 -14
  396. data/app/views/catalog/_document_action.html.erb +0 -5
  397. data/app/views/catalog/_facet_group.html.erb +0 -5
  398. data/app/views/catalog/_facet_limit.html.erb +0 -3
  399. data/app/views/catalog/_index.html.erb +0 -1
  400. data/app/views/catalog/_index_header.html.erb +0 -22
  401. data/app/views/catalog/_previous_next_doc.html.erb +0 -2
  402. data/app/views/catalog/_show.html.erb +0 -6
  403. data/app/views/catalog/_show_header.html.erb +0 -2
  404. data/app/views/catalog/_thumbnail.html.erb +0 -1
  405. data/lib/blacklight/deprecations/engine_configuration.rb +0 -66
  406. data/lib/blacklight/deprecations/search_state_normalization.rb +0 -52
  407. data/spec/controllers/blacklight/facet_spec.rb +0 -33
  408. data/spec/controllers/blacklight/search_fields_spec.rb +0 -62
  409. data/spec/features/sitelinks_search_box.rb +0 -13
  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 -108
  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/models/blacklight/document/email_spec.rb +0 -57
  416. data/spec/models/blacklight/document/sms_spec.rb +0 -58
  417. data/spec/presenters/blacklight/search_bar_presenter_spec.rb +0 -94
  418. data/spec/support/view_component_capybara_test_helpers.rb +0 -8
  419. data/spec/views/catalog/_constraints.html.erb_spec.rb +0 -33
  420. data/spec/views/catalog/_facet_group.html.erb_spec.rb +0 -84
  421. data/spec/views/catalog/_facets.html.erb_spec.rb +0 -15
  422. data/spec/views/catalog/_index.html.erb_spec.rb +0 -62
  423. data/spec/views/catalog/_index_header.html.erb_spec.rb +0 -35
  424. data/spec/views/catalog/_previous_next_doc.html.erb_spec.rb +0 -22
  425. data/spec/views/catalog/_show.html.erb_spec.rb +0 -62
  426. data/spec/views/catalog/_thumbnail.html.erb_spec.rb +0 -38
  427. /data/app/components/blacklight/{search_context_component.html.erb → search_context/server_item_pagination_component.html.erb} +0 -0
@@ -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
@@ -23,6 +24,10 @@ RSpec.describe "Routing" do
23
24
  it "maps { :controller => 'catalog', :action => 'show', :id => 666 } to /catalog/666" do
24
25
  expect(get: "/catalog/666").to route_to(controller: 'catalog', action: 'show', id: "666")
25
26
  end
27
+
28
+ it "maps GET {:controller => 'catalog', :action => 'prev_next_documents'} to /catalog/page_links" do
29
+ expect(get: "/catalog/page_links").to route_to(controller: 'catalog', action: 'page_links')
30
+ end
26
31
  end
27
32
 
28
33
  describe "solr_document_path for SolrDocument", test: true do
@@ -55,10 +55,6 @@ RSpec.describe Blacklight::SearchService, api: true do
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: true 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,12 +74,10 @@ RSpec.describe Blacklight::SearchService, api: true 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_kind_of 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
 
@@ -112,13 +89,12 @@ RSpec.describe Blacklight::SearchService, api: true 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_kind_of 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: true 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: true 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,19 +122,17 @@ RSpec.describe Blacklight::SearchService, api: true 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
@@ -182,7 +154,7 @@ RSpec.describe Blacklight::SearchService, api: true do
182
154
 
183
155
  it 'has all facets specified in initializer' do
184
156
  expect(@facets.keys).to include *blacklight_config.facet_fields.keys
185
- expect(@facets.none? { |_k, v| v.nil? }).to eq true
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,13 +171,13 @@ RSpec.describe Blacklight::SearchService, api: true 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
206
178
  @facets.each do |_key, facet|
207
179
  facet.items.each do |facet_vals|
208
- expect(facet_vals.hits).to be > 0
180
+ expect(facet_vals.hits).to be_positive
209
181
  end
210
182
  end
211
183
  end
@@ -222,9 +194,8 @@ RSpec.describe Blacklight::SearchService, api: true 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: true 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: true 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: true 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,8 +269,7 @@ RSpec.describe Blacklight::SearchService, api: true 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
@@ -314,7 +281,7 @@ RSpec.describe Blacklight::SearchService, api: true do
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,10 +294,6 @@ RSpec.describe Blacklight::SearchService, api: true 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
@@ -339,18 +302,18 @@ RSpec.describe Blacklight::SearchService, api: true do
339
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
 
@@ -382,7 +345,7 @@ RSpec.describe Blacklight::SearchService, api: true 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: true 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: true 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: true 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: true 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: true 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).
@@ -47,10 +48,10 @@ RSpec.configure do |config|
47
48
  config.disable_monkey_patching!
48
49
 
49
50
  # When we're testing the API, only run the api tests
50
- config.filter_run api: true if ENV['BLACKLIGHT_API_TEST']
51
+ config.filter_run api: true if ENV['BLACKLIGHT_API_TEST'].present?
51
52
 
52
53
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
53
- config.fixture_path = "#{::Rails.root}/spec/fixtures"
54
+ config.fixture_path = Rails.root.join("spec/fixtures")
54
55
 
55
56
  # If you're not using ActiveRecord, or you'd prefer not to run each of your
56
57
  # examples within a transaction, remove the following line or assign false
@@ -67,7 +68,7 @@ RSpec.configure do |config|
67
68
  config.infer_spec_type_from_file_location!
68
69
  config.include PresenterTestHelpers, type: :presenter
69
70
  config.include ViewComponent::TestHelpers, type: :component
70
- config.include ViewComponentCapybaraTestHelpers, type: :component
71
+ config.include ViewComponentTestHelpers, type: :component
71
72
 
72
73
  config.include(ControllerLevelHelpers, type: :helper)
73
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,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ViewComponentTestHelpers
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
+
9
+ # Work-around for https://github.com/ViewComponent/view_component/pull/1661
10
+ # which made the component test's controller method (more) private. This makes
11
+ # it available so we can set up controller-level state for our tests.
12
+ def controller
13
+ # ViewComponent 2.x
14
+ return super if defined?(super)
15
+
16
+ # ViewComponent 3.x
17
+ return vc_test_controller if defined?(vc_test_controller)
18
+
19
+ ApplicationController.new.extend(Rails.application.routes.url_helpers)
20
+ end
21
+ end
@@ -1,2 +1,6 @@
1
1
  gem 'rails-controller-testing'
2
2
  gem 'thor', '~> 0.20' if /^5.[12]/.match?(ENV['RAILS_VERSION'])
3
+
4
+ unless ENV['VIEW_COMPONENT_VERSION'].to_s == ""
5
+ gem 'view_component', ENV.fetch('VIEW_COMPONENT_VERSION')
6
+ end
@@ -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,18 @@ 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
37
+
38
+ def add_component_template_override
39
+ src_template = File.join(Blacklight::Engine.root, 'app', 'components', 'blacklight', 'top_navbar_component.html.erb')
40
+ target_template = File.join('app', 'components', 'blacklight', 'top_navbar_component.html.erb')
41
+ create_file(target_template) do
42
+ File.read(src_template).gsub('role="navigation"', 'role="navigation" data-template-override="top_navbar_component"')
43
+ end
44
+ end
30
45
  end
@@ -8,51 +8,41 @@ RSpec.describe "catalog/_document" do
8
8
  allow(controller).to receive(:controller_name).and_return('test')
9
9
  allow(view).to receive(:render_grouped_response?).and_return(false)
10
10
  allow(view).to receive(:blacklight_config).and_return(blacklight_config)
11
+ allow(view).to receive(:search_session).and_return({})
12
+ allow(view).to receive(:current_search_session).and_return(nil)
13
+ allow(view.main_app).to receive(:track_test_path).and_return('/track')
11
14
  assign(:response, instance_double(Blacklight::Solr::Response, start: 20))
12
15
  end
13
16
 
14
- it "renders the header, thumbnail and index by default" do
15
- stub_template "catalog/_index_header.html.erb" => "document_header"
16
- stub_template "catalog/_thumbnail.html.erb" => "thumbnail_default"
17
- stub_template "catalog/_index_default.html.erb" => "index_default"
18
- render partial: "catalog/document", locals: { document: document, document_counter: 1 }
19
- expect(rendered).to have_selector 'article.document[@data-document-counter="22"]'
20
- expect(rendered).to match /document_header/
21
- expect(rendered).to match /thumbnail_default/
22
- expect(rendered).to match /index_default/
23
- end
24
-
25
17
  it "uses the index.partials parameter to determine the partials to render" do
26
18
  blacklight_config.index.partials = %w[a b c]
27
19
  stub_template "catalog/_a_default.html.erb" => "a_partial"
28
20
  stub_template "catalog/_b_default.html.erb" => "b_partial"
29
21
  stub_template "catalog/_c_default.html.erb" => "c_partial"
30
- render partial: "catalog/document", locals: { document: document, document_counter: 1 }
22
+ render partial: "catalog/document", locals: { document: document, document_counter: 1, view_config: blacklight_config.index }
31
23
  expect(rendered).to match /a_partial/
32
24
  expect(rendered).to match /b_partial/
33
25
  expect(rendered).to match /c_partial/
34
26
  end
35
27
 
36
- it 'provides the rendered partials to an explicitly configured component but does not render them by default' do
37
- blacklight_config.index.partials = %w[a]
38
- stub_template "catalog/_a_default.html.erb" => "partial"
39
- blacklight_config.index.document_component = Blacklight::DocumentComponent
40
- allow(view).to receive(:search_session).and_return({})
41
- allow(view).to receive(:current_search_session).and_return(nil)
42
- allow(view.main_app).to receive(:track_test_path).and_return('/track')
43
-
44
- render partial: "catalog/document", locals: { document: document, document_counter: 1 }
45
-
46
- expect(rendered).to have_selector 'article.document header', text: '22. xyz'
47
- expect(rendered).not_to match(/partial/)
48
- end
49
-
50
- it 'renders the partial using a provided view config' do
51
- view_config = Blacklight::Configuration::ViewConfig.new partials: %w[a]
52
- stub_template "catalog/_a_default.html.erb" => "partial"
53
-
54
- render partial: "catalog/document", locals: { document: document, document_counter: 1, view_config: view_config }
55
-
56
- expect(rendered).to match(/partial/)
28
+ context 'with a configured document component' do
29
+ let(:custom_component_class) do
30
+ Class.new(Blacklight::DocumentComponent) do
31
+ # Override component rendering with our own value
32
+ def call
33
+ 'blah'
34
+ end
35
+ end
36
+ end
37
+
38
+ before do
39
+ stub_const('MyDocumentComponent', custom_component_class)
40
+ blacklight_config.index.document_component = MyDocumentComponent
41
+ end
42
+
43
+ it 'renders the document component' do
44
+ render partial: "catalog/document", locals: { document: document, document_counter: 1, view_config: blacklight_config.index }
45
+ expect(rendered).to match /blah/
46
+ end
57
47
  end
58
48
  end
@@ -1,12 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  RSpec.describe "catalog/_document_list", type: :view do
4
+ let(:view_type) { 'some-view' }
5
+ let(:view_config) { double(Blacklight::Configuration::ViewConfig) }
6
+
4
7
  before do
5
- allow(view).to receive_messages(document_index_view_type: "some-view", documents: [], blacklight_config: nil)
8
+ allow(view_config).to receive_messages(key: view_type, document_component: Blacklight::DocumentComponent, partials: [])
9
+ allow(view).to receive_messages(document_index_view_type: view_type, documents: [], blacklight_config: nil)
10
+ assign(:response, instance_double(Blacklight::Solr::Response, start: 0))
6
11
  end
7
12
 
8
13
  it "includes a class for the current view" do
9
- render
14
+ render(partial: "catalog/document_list", locals: { view_config: view_config })
10
15
  expect(rendered).to have_selector(".documents-some-view")
11
16
  end
12
17
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  RSpec.describe 'catalog/_facet_index_navigation.html.erb', type: :view do
4
4
  let(:pagination) { Blacklight::Solr::FacetPaginator.new([]) }
5
- let(:facet) { Blacklight::Configuration::FacetField.new(index_range: '0'..'9') }
5
+ let(:facet) { Blacklight::Configuration::FacetField.new(index_range: '0'..'9', presenter: Blacklight::FacetFieldPresenter) }
6
6
  let(:display_facet) { double(items: [], offset: 0, prefix: '', sort: 'index') }
7
7
  let(:blacklight_config) { Blacklight::Configuration.new }
8
8
 
@@ -6,6 +6,7 @@ RSpec.describe "/catalog/_search_header.html.erb" do
6
6
  it "renders the default search header partials" do
7
7
  stub_template "_did_you_mean.html.erb" => "did_you_mean"
8
8
  stub_template "_sort_and_per_page.html.erb" => "sort_and_per_page"
9
+ allow(view).to receive(:blacklight_config).and_return(CatalogController.blacklight_config)
9
10
  render
10
11
  expect(rendered).to match /did_you_mean/
11
12
  expect(rendered).to match /sort_and_per_page/
@@ -6,6 +6,7 @@ RSpec.describe "catalog/_show_sidebar.html.erb" do
6
6
  let(:blacklight_config) do
7
7
  Blacklight::Configuration.new do |config|
8
8
  config.index.title_field = 'title_tsim'
9
+ config.index.sidebar_component = Blacklight::Document::SidebarComponent
9
10
  end
10
11
  end
11
12