blacklight 6.14.0 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/.npmignore +23 -0
  4. data/.rubocop.yml +40 -16
  5. data/.rubocop_todo.yml +479 -375
  6. data/.solr_wrapper.yml +9 -2
  7. data/.travis.yml +27 -20
  8. data/Gemfile +3 -1
  9. data/README.md +22 -5
  10. data/Rakefile +3 -2
  11. data/VERSION +1 -1
  12. data/Vagrantfile +2 -0
  13. data/app/assets/images/blacklight/list.svg +1 -0
  14. data/app/assets/images/blacklight/search.svg +1 -0
  15. data/app/assets/javascripts/blacklight/blacklight.js +497 -57
  16. data/app/assets/stylesheets/blacklight/_balanced_list.scss +7 -12
  17. data/app/assets/stylesheets/blacklight/_blacklight_base.scss +18 -15
  18. data/app/assets/stylesheets/blacklight/_bookmark.scss +1 -13
  19. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +27 -0
  20. data/app/assets/stylesheets/blacklight/_constraints.scss +17 -25
  21. data/app/assets/stylesheets/blacklight/_controls.scss +8 -16
  22. data/app/assets/stylesheets/blacklight/_facets.scss +64 -93
  23. data/app/assets/stylesheets/blacklight/_header.scss +35 -48
  24. data/app/assets/stylesheets/blacklight/_icons.scss +35 -0
  25. data/app/assets/stylesheets/blacklight/_layout.scss +0 -10
  26. data/app/assets/stylesheets/blacklight/_mixins.scss +15 -0
  27. data/app/assets/stylesheets/blacklight/_modal.scss +9 -17
  28. data/app/assets/stylesheets/blacklight/_pagination.scss +2 -17
  29. data/app/assets/stylesheets/blacklight/_search_form.scss +7 -0
  30. data/app/assets/stylesheets/blacklight/_search_history.scss +5 -13
  31. data/app/assets/stylesheets/blacklight/_search_results.scss +9 -8
  32. data/app/assets/stylesheets/blacklight/_twitter_typeahead.scss +1 -2
  33. data/app/assets/stylesheets/blacklight/blacklight.scss +1 -1
  34. data/app/builders/blacklight/action_builder.rb +57 -0
  35. data/app/controllers/bookmarks_controller.rb +2 -2
  36. data/app/controllers/catalog_controller.rb +2 -2
  37. data/app/controllers/concerns/blacklight/base.rb +0 -33
  38. data/app/controllers/concerns/blacklight/bookmarks.rb +36 -33
  39. data/app/controllers/concerns/blacklight/catalog.rb +266 -210
  40. data/app/controllers/concerns/blacklight/controller.rb +111 -126
  41. data/app/controllers/concerns/blacklight/default_component_configuration.rb +12 -43
  42. data/app/controllers/concerns/blacklight/facet.rb +3 -0
  43. data/app/controllers/concerns/blacklight/search_context.rb +16 -14
  44. data/app/controllers/concerns/blacklight/search_fields.rb +4 -14
  45. data/app/controllers/concerns/blacklight/search_history.rb +1 -6
  46. data/app/controllers/concerns/blacklight/token_based_user.rb +24 -9
  47. data/app/helpers/blacklight/blacklight_helper_behavior.rb +39 -119
  48. data/app/helpers/blacklight/catalog_helper_behavior.rb +94 -88
  49. data/app/helpers/blacklight/component_helper_behavior.rb +21 -19
  50. data/app/helpers/blacklight/configuration_helper_behavior.rb +30 -57
  51. data/app/helpers/blacklight/facets_helper_behavior.rb +55 -51
  52. data/app/helpers/blacklight/hash_as_hidden_fields_helper_behavior.rb +9 -11
  53. data/app/helpers/blacklight/icon_helper_behavior.rb +18 -0
  54. data/app/helpers/blacklight/layout_helper_behavior.rb +3 -3
  55. data/app/helpers/blacklight/render_constraints_helper_behavior.rb +8 -6
  56. data/app/helpers/blacklight/render_partials_helper_behavior.rb +195 -0
  57. data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +19 -11
  58. data/app/helpers/blacklight/suggest_helper_behavior.rb +1 -0
  59. data/app/helpers/blacklight/url_helper_behavior.rb +50 -41
  60. data/app/{assets/javascripts → javascript}/blacklight/autocomplete.js +3 -2
  61. data/app/javascript/blacklight/bookmark_toggle.js +25 -0
  62. data/app/javascript/blacklight/checkbox_submit.js +134 -0
  63. data/app/{assets/javascripts → javascript}/blacklight/collapsable.js +1 -1
  64. data/app/{assets/javascripts → javascript}/blacklight/core.js +10 -8
  65. data/app/{assets/javascripts → javascript}/blacklight/facet_load.js +6 -6
  66. data/app/{assets/javascripts/blacklight/ajax_modal.js → javascript/blacklight/modal.js} +62 -64
  67. data/app/{assets/javascripts → javascript}/blacklight/search_context.js +10 -3
  68. data/app/models/blacklight/facet_paginator.rb +3 -3
  69. data/app/models/blacklight/icon.rb +56 -0
  70. data/app/models/blacklight/solr/facet_paginator.rb +3 -3
  71. data/app/models/blacklight/suggest_search.rb +4 -15
  72. data/app/models/bookmark.rb +5 -10
  73. data/app/models/concerns/blacklight/configurable.rb +13 -13
  74. data/app/models/concerns/blacklight/document/active_model_shim.rb +13 -11
  75. data/app/models/concerns/blacklight/document/cache_key.rb +1 -1
  76. data/app/models/concerns/blacklight/document/dublin_core.rb +2 -2
  77. data/app/models/concerns/blacklight/document/email.rb +1 -1
  78. data/app/models/concerns/blacklight/document/extensions.rb +5 -5
  79. data/app/models/concerns/blacklight/document/semantic_fields.rb +9 -9
  80. data/app/models/concerns/blacklight/document/sms.rb +1 -1
  81. data/app/models/concerns/blacklight/document.rb +26 -40
  82. data/app/models/concerns/blacklight/solr/document.rb +8 -8
  83. data/app/models/concerns/blacklight/suggest/response.rb +5 -3
  84. data/app/models/concerns/blacklight/user.rb +7 -6
  85. data/app/models/record_mailer.rb +5 -6
  86. data/app/models/search.rb +5 -7
  87. data/app/presenters/blacklight/document_presenter.rb +25 -140
  88. data/app/presenters/blacklight/field_presenter.rb +7 -5
  89. data/app/presenters/blacklight/index_presenter.rb +41 -58
  90. data/app/presenters/blacklight/json_presenter.rb +10 -14
  91. data/app/presenters/blacklight/link_alternate_presenter.rb +3 -1
  92. data/app/presenters/blacklight/rendering/abstract_step.rb +7 -5
  93. data/app/presenters/blacklight/rendering/helper_method.rb +10 -8
  94. data/app/presenters/blacklight/rendering/join.rb +5 -3
  95. data/app/presenters/blacklight/rendering/link_to_facet.rb +23 -19
  96. data/app/presenters/blacklight/rendering/microdata.rb +6 -3
  97. data/app/presenters/blacklight/rendering/pipeline.rb +7 -5
  98. data/app/presenters/blacklight/rendering/terminator.rb +2 -0
  99. data/app/presenters/blacklight/search_bar_presenter.rb +39 -0
  100. data/app/presenters/blacklight/show_presenter.rb +26 -63
  101. data/app/presenters/blacklight/thumbnail_presenter.rb +74 -0
  102. data/app/services/blacklight/document_factory.rb +13 -0
  103. data/app/services/blacklight/field_retriever.rb +26 -24
  104. data/app/services/blacklight/search_service.rb +152 -0
  105. data/app/values/blacklight/types.rb +31 -0
  106. data/app/views/blacklight/nav/_bookmark.html.erb +2 -2
  107. data/app/views/blacklight/nav/_search_history.html.erb +1 -1
  108. data/app/views/bookmarks/_tools.html.erb +2 -2
  109. data/app/views/bookmarks/index.html.erb +12 -13
  110. data/app/views/catalog/_bookmark_control.html.erb +26 -10
  111. data/app/views/catalog/_citation.html.erb +4 -4
  112. data/app/views/catalog/_constraints.html.erb +6 -7
  113. data/app/views/catalog/_constraints_element.html.erb +6 -6
  114. data/app/views/catalog/_did_you_mean.html.erb +1 -1
  115. data/app/views/catalog/{_document_default.atom.builder → _document.atom.builder} +19 -18
  116. data/app/views/catalog/_document.html.erb +5 -3
  117. data/app/views/catalog/{_document_default.rss.builder → _document.rss.builder} +2 -0
  118. data/app/views/catalog/_document_action.html.erb +2 -1
  119. data/app/views/catalog/_email_form.html.erb +8 -4
  120. data/app/views/catalog/_facet_index_navigation.html.erb +5 -4
  121. data/app/views/catalog/_facet_layout.html.erb +6 -10
  122. data/app/views/catalog/_facet_limit.html.erb +3 -2
  123. data/app/views/catalog/_facet_pagination.html.erb +8 -8
  124. data/app/views/catalog/_facet_pivot.html.erb +2 -2
  125. data/app/views/catalog/_facets.html.erb +9 -12
  126. data/app/views/catalog/_field.json.jbuilder +10 -0
  127. data/app/views/catalog/{_group_default.html.erb → _group.html.erb} +1 -1
  128. data/app/views/catalog/_home_text.html.erb +32 -36
  129. data/app/views/catalog/_index.html.erb +10 -0
  130. data/app/views/catalog/{_index_header_default.html.erb → _index_header.html.erb} +3 -3
  131. data/app/views/catalog/_per_page_widget.html.erb +6 -7
  132. data/app/views/catalog/_previous_next_doc.html.erb +6 -14
  133. data/app/views/catalog/_results_pagination.html.erb +2 -2
  134. data/app/views/catalog/_search_form.html.erb +12 -8
  135. data/app/views/catalog/_search_header.html.erb +0 -3
  136. data/app/views/catalog/_search_results.html.erb +6 -2
  137. data/app/views/catalog/_show.html.erb +8 -0
  138. data/app/views/catalog/_show_main_content.html.erb +4 -4
  139. data/app/views/catalog/_show_more_like_this.html.erb +1 -1
  140. data/app/views/catalog/_show_sidebar.html.erb +3 -3
  141. data/app/views/catalog/_show_tools.html.erb +10 -12
  142. data/app/views/catalog/_sms_form.html.erb +8 -4
  143. data/app/views/catalog/_sort_and_per_page.html.erb +3 -3
  144. data/app/views/catalog/_sort_widget.html.erb +7 -7
  145. data/app/views/catalog/_thumbnail.html.erb +5 -0
  146. data/app/views/catalog/_view_type_group.html.erb +2 -2
  147. data/app/views/catalog/_zero_results.html.erb +1 -1
  148. data/app/views/catalog/citation.js.erb +4 -2
  149. data/app/views/catalog/email.html.erb +5 -3
  150. data/app/views/catalog/email_success.html.erb +12 -8
  151. data/app/views/catalog/facet.html.erb +10 -8
  152. data/app/views/catalog/facet.json.jbuilder +2 -0
  153. data/app/views/catalog/index.atom.builder +13 -16
  154. data/app/views/catalog/index.html.erb +9 -11
  155. data/app/views/catalog/index.json.jbuilder +84 -3
  156. data/app/views/catalog/index.rss.builder +7 -5
  157. data/app/views/catalog/opensearch.xml.builder +12 -10
  158. data/app/views/catalog/show.html.erb +11 -6
  159. data/app/views/catalog/show.json.jbuilder +21 -0
  160. data/app/views/catalog/sms.html.erb +3 -1
  161. data/app/views/catalog/sms_success.html.erb +12 -8
  162. data/app/views/kaminari/blacklight/_first_page.html.erb +2 -2
  163. data/app/views/kaminari/blacklight/_gap.html.erb +2 -2
  164. data/app/views/kaminari/blacklight/_last_page.html.erb +2 -2
  165. data/app/views/kaminari/blacklight/_next_page.html.erb +5 -5
  166. data/app/views/kaminari/blacklight/_page.html.erb +5 -3
  167. data/app/views/kaminari/blacklight/_prev_page.html.erb +4 -4
  168. data/app/views/kaminari/blacklight_compact/_paginator.html.erb +4 -4
  169. data/app/views/layouts/blacklight/base.html.erb +35 -0
  170. data/app/views/layouts/blacklight.html.erb +14 -41
  171. data/app/views/layouts/catalog_result.html.erb +11 -0
  172. data/app/views/search_history/index.html.erb +16 -21
  173. data/app/views/shared/_header_navbar.html.erb +8 -13
  174. data/app/views/shared/_modal.html.erb +6 -0
  175. data/app/views/shared/_user_util_links.html.erb +22 -0
  176. data/blacklight.gemspec +10 -11
  177. data/config/i18n-tasks.yml +17 -0
  178. data/config/locales/blacklight.de.yml +71 -82
  179. data/config/locales/blacklight.en.yml +15 -27
  180. data/config/locales/blacklight.es.yml +14 -26
  181. data/config/locales/blacklight.fr.yml +16 -33
  182. data/config/locales/blacklight.hu.yml +212 -0
  183. data/config/locales/blacklight.it.yml +15 -26
  184. data/config/locales/blacklight.nl.yml +212 -0
  185. data/config/locales/blacklight.pt-BR.yml +24 -29
  186. data/config/locales/blacklight.sq.yml +4 -28
  187. data/config/locales/blacklight.zh.yml +3 -25
  188. data/config/routes.rb +2 -10
  189. data/db/migrate/20140202020202_create_bookmarks.rb +0 -1
  190. data/db/migrate/20140320000000_add_polymorphic_type_to_bookmarks.rb +1 -1
  191. data/lib/blacklight/abstract_repository.rb +22 -10
  192. data/lib/blacklight/configuration/context.rb +12 -1
  193. data/lib/blacklight/configuration/facet_field.rb +16 -9
  194. data/lib/blacklight/configuration/field.rb +32 -3
  195. data/lib/blacklight/configuration/fields.rb +61 -58
  196. data/lib/blacklight/configuration/null_field.rb +2 -0
  197. data/lib/blacklight/configuration/search_field.rb +2 -2
  198. data/lib/blacklight/configuration/sort_field.rb +2 -2
  199. data/lib/blacklight/configuration/view_config.rb +4 -0
  200. data/lib/blacklight/configuration.rb +101 -88
  201. data/lib/blacklight/engine.rb +11 -7
  202. data/lib/blacklight/exceptions.rb +4 -7
  203. data/lib/blacklight/{utils.rb → nested_open_struct_with_hash_access.rb} +9 -81
  204. data/lib/blacklight/open_struct_with_hash_access.rb +49 -0
  205. data/lib/blacklight/parameters.rb +1 -1
  206. data/lib/blacklight/routes/exportable.rb +1 -3
  207. data/lib/blacklight/routes/searchable.rb +3 -3
  208. data/lib/blacklight/runtime_registry.rb +2 -0
  209. data/lib/blacklight/search_builder.rb +28 -35
  210. data/lib/blacklight/search_state.rb +10 -8
  211. data/lib/blacklight/solr/repository.rb +40 -6
  212. data/lib/blacklight/solr/request.rb +1 -1
  213. data/lib/blacklight/solr/response/facets.rb +29 -31
  214. data/lib/blacklight/solr/response/group.rb +3 -3
  215. data/lib/blacklight/solr/response/group_response.rb +1 -1
  216. data/lib/blacklight/solr/response/more_like_this.rb +2 -2
  217. data/lib/blacklight/solr/response/response.rb +2 -2
  218. data/lib/blacklight/solr/response/spelling.rb +4 -3
  219. data/lib/blacklight/solr/response.rb +29 -30
  220. data/lib/blacklight/solr/search_builder_behavior.rb +25 -29
  221. data/lib/blacklight/version.rb +1 -1
  222. data/lib/blacklight.rb +10 -8
  223. data/lib/generators/blacklight/assets_generator.rb +18 -12
  224. data/lib/generators/blacklight/controller_generator.rb +4 -5
  225. data/lib/generators/blacklight/document_generator.rb +1 -1
  226. data/lib/generators/blacklight/install_generator.rb +18 -28
  227. data/lib/generators/blacklight/search_builder_generator.rb +1 -1
  228. data/lib/generators/blacklight/{solr5_generator.rb → solr_generator.rb} +12 -6
  229. data/lib/generators/blacklight/templates/.solr_wrapper.yml +5 -0
  230. data/lib/generators/blacklight/templates/alternate_controller.rb +4 -4
  231. data/lib/generators/blacklight/templates/blacklight.scss +0 -2
  232. data/lib/generators/blacklight/templates/catalog_controller.rb +59 -49
  233. data/lib/generators/blacklight/templates/config/blacklight.yml +1 -13
  234. data/lib/generators/blacklight/templates/solr/conf/schema.xml +388 -0
  235. data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +195 -0
  236. data/lib/generators/blacklight/test_support_generator.rb +10 -10
  237. data/lib/generators/blacklight/user_generator.rb +5 -6
  238. data/lib/railties/blacklight.rake +17 -21
  239. data/package-lock.json +2195 -0
  240. data/package.json +29 -0
  241. data/spec/controllers/alternate_controller_spec.rb +5 -4
  242. data/spec/controllers/application_controller_spec.rb +1 -5
  243. data/spec/controllers/blacklight/base_spec.rb +6 -3
  244. data/spec/controllers/blacklight/catalog/component_configuration_spec.rb +11 -7
  245. data/spec/controllers/blacklight/facet_spec.rb +1 -2
  246. data/spec/controllers/blacklight/search_fields_spec.rb +25 -34
  247. data/spec/controllers/bookmarks_controller_spec.rb +46 -11
  248. data/spec/controllers/catalog_controller_spec.rb +334 -161
  249. data/spec/controllers/search_history_controller_spec.rb +6 -6
  250. data/spec/features/alternate_controller_spec.rb +4 -4
  251. data/spec/features/autocomplete_spec.rb +4 -2
  252. data/spec/features/bookmarks_spec.rb +10 -10
  253. data/spec/features/did_you_mean_spec.rb +7 -12
  254. data/spec/features/facets_spec.rb +29 -17
  255. data/spec/features/record_view_spec.rb +12 -18
  256. data/spec/features/search_context_spec.rb +6 -7
  257. data/spec/features/search_crawler_spec.rb +3 -5
  258. data/spec/features/search_filters_spec.rb +80 -80
  259. data/spec/features/search_formats_spec.rb +1 -1
  260. data/spec/features/search_history_spec.rb +6 -29
  261. data/spec/features/search_pagination_spec.rb +4 -2
  262. data/spec/features/search_results_spec.rb +14 -12
  263. data/spec/features/search_sort_spec.rb +2 -2
  264. data/spec/features/search_spec.rb +8 -9
  265. data/spec/features/sitelinks_search_box.rb +4 -4
  266. data/{solr → spec/fixtures}/sample_solr_documents.yml +688 -688
  267. data/spec/helpers/{configuration_helper_spec.rb → blacklight/configuration_helper_behavior_spec.rb} +97 -92
  268. data/spec/helpers/{facets_helper_spec.rb → blacklight/facets_helper_behavior_spec.rb} +72 -67
  269. data/spec/helpers/{hash_as_hidden_fields_spec.rb → blacklight/hash_as_hidden_fields_behavior_spec.rb} +2 -2
  270. data/spec/helpers/blacklight/icon_helper_behavior_spec.rb +10 -0
  271. data/spec/helpers/{layout_helper_spec.rb → blacklight/layout_helper_behavior_spec.rb} +5 -5
  272. data/spec/helpers/{render_constraints_helper_spec.rb → blacklight/render_constraints_helper_behavior_spec.rb} +10 -6
  273. data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +92 -0
  274. data/spec/helpers/{search_history_constraints_helper_spec.rb → blacklight/search_history_constraints_helper_behavior_spec.rb} +29 -30
  275. data/spec/helpers/{suggest_helper_spec.rb → blacklight/suggest_helper_behavior_spec.rb} +9 -2
  276. data/spec/helpers/{url_helper_spec.rb → blacklight/url_helper_behavior_spec.rb} +56 -54
  277. data/spec/helpers/blacklight_helper_spec.rb +65 -150
  278. data/spec/helpers/catalog_helper_spec.rb +80 -96
  279. data/spec/i18n_spec.rb +18 -0
  280. data/spec/integration/generators/blacklight/{solr5_generator_spec.rb → solr_generator_spec.rb} +21 -13
  281. data/spec/lib/blacklight/configuration/facet_field_spec.rb +13 -0
  282. data/spec/lib/blacklight/configuration/field_spec.rb +15 -0
  283. data/spec/lib/blacklight/nested_open_struct_with_hash_access_spec.rb +17 -0
  284. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +148 -0
  285. data/spec/lib/blacklight/parameters_spec.rb +4 -2
  286. data/spec/lib/blacklight/search_state_spec.rb +53 -36
  287. data/spec/lib/blacklight_spec.rb +14 -15
  288. data/spec/lib/tasks/blacklight_task_spec.rb +4 -6
  289. data/spec/models/blacklight/configurable_spec.rb +24 -27
  290. data/spec/models/blacklight/configuration/context_spec.rb +9 -10
  291. data/spec/models/blacklight/configuration_spec.rb +248 -223
  292. data/spec/models/blacklight/document/active_model_shim_spec.rb +15 -6
  293. data/spec/models/blacklight/document/cache_key_spec.rb +9 -2
  294. data/spec/models/blacklight/document/dublin_core_spec.rb +17 -20
  295. data/spec/models/blacklight/document/email_spec.rb +10 -10
  296. data/spec/models/blacklight/document/sms_spec.rb +10 -10
  297. data/spec/models/blacklight/document_spec.rb +10 -22
  298. data/spec/models/blacklight/facet_paginator_spec.rb +40 -30
  299. data/spec/models/blacklight/icon_spec.rb +44 -0
  300. data/spec/models/blacklight/search_builder_spec.rb +41 -26
  301. data/spec/models/blacklight/solr/document_spec.rb +224 -216
  302. data/spec/models/blacklight/solr/facet_paginator_spec.rb +6 -4
  303. data/spec/models/blacklight/solr/repository_spec.rb +61 -46
  304. data/spec/models/blacklight/solr/request_spec.rb +17 -18
  305. data/spec/models/blacklight/solr/response/facets_spec.rb +58 -58
  306. data/spec/models/blacklight/solr/response/group_response_spec.rb +16 -22
  307. data/spec/models/blacklight/solr/response/group_spec.rb +18 -25
  308. data/spec/models/blacklight/solr/response_spec.rb +56 -55
  309. data/spec/models/blacklight/solr/search_builder_spec.rb +150 -164
  310. data/spec/models/blacklight/suggest/response_spec.rb +6 -4
  311. data/spec/models/blacklight/suggest_search_spec.rb +9 -16
  312. data/spec/models/blacklight/user_spec.rb +9 -11
  313. data/spec/models/bookmark_spec.rb +7 -6
  314. data/spec/models/record_mailer_spec.rb +23 -21
  315. data/spec/models/search_spec.rb +19 -18
  316. data/spec/models/solr_document_spec.rb +33 -5
  317. data/spec/presenters/blacklight/document_presenter_spec.rb +86 -0
  318. data/spec/presenters/blacklight/index_presenter_spec.rb +186 -0
  319. data/spec/presenters/blacklight/json_presenter_spec.rb +59 -0
  320. data/spec/presenters/blacklight/link_alternate_presenter_spec.rb +3 -0
  321. data/spec/presenters/blacklight/search_bar_presenter_spec.rb +79 -0
  322. data/spec/presenters/blacklight/show_presenter_spec.rb +333 -0
  323. data/spec/presenters/pipeline_spec.rb +18 -11
  324. data/spec/presenters/thumbnail_presenter_spec.rb +174 -0
  325. data/spec/routing/catalog_routing_spec.rb +13 -15
  326. data/spec/services/blacklight/search_service_spec.rb +488 -0
  327. data/spec/spec_helper.rb +20 -19
  328. data/spec/support/features/session_helpers.rb +4 -4
  329. data/spec/support/features.rb +1 -1
  330. data/spec/test_app_templates/Gemfile.extra +2 -4
  331. data/spec/test_app_templates/lib/generators/test_app_generator.rb +12 -13
  332. data/spec/views/catalog/_constraints.html.erb_spec.rb +3 -6
  333. data/spec/views/catalog/_constraints_element.html.erb_spec.rb +17 -13
  334. data/spec/views/catalog/_document.html.erb_spec.rb +11 -11
  335. data/spec/views/catalog/_document_list.html.erb_spec.rb +2 -1
  336. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +5 -5
  337. data/spec/views/catalog/_facet_layout.html.erb_spec.rb +6 -6
  338. data/spec/views/catalog/_facets.html.erb_spec.rb +10 -12
  339. data/spec/views/catalog/{_index_default.erb_spec.rb → _index.html.erb_spec.rb} +14 -15
  340. data/spec/views/catalog/{_index_header_default.html.erb_spec.rb → _index_header.html.erb_spec.rb} +6 -9
  341. data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +7 -30
  342. data/spec/views/catalog/_search_header.erb_spec.rb +1 -3
  343. data/spec/views/catalog/{_show_default.erb_spec.rb → _show.html.erb_spec.rb} +13 -14
  344. data/spec/views/catalog/_show_sidebar.erb_spec.rb +6 -9
  345. data/spec/views/catalog/_show_tools.html.erb_spec.rb +5 -5
  346. data/spec/views/catalog/_sort_and_per_page.html.erb_spec.rb +1 -2
  347. data/spec/views/catalog/_sort_widget.html.erb_spec.rb +3 -1
  348. data/spec/views/catalog/{_thumbnail_default.erb_spec.rb → _thumbnail.html.erb_spec.rb} +7 -9
  349. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +12 -10
  350. data/spec/views/catalog/email_success.html.erb_spec.rb +8 -0
  351. data/spec/views/catalog/facet.html.erb_spec.rb +4 -3
  352. data/spec/views/catalog/facet.json.jbuilder_spec.rb +3 -2
  353. data/spec/views/catalog/index.atom.builder_spec.rb +11 -6
  354. data/spec/views/catalog/index.html.erb_spec.rb +6 -8
  355. data/spec/views/catalog/index.json.jbuilder_spec.rb +119 -26
  356. data/spec/views/catalog/opensearch.xml.builder_spec.rb +1 -1
  357. data/spec/views/catalog/show.html.erb_spec.rb +8 -8
  358. data/spec/views/catalog/show.json.jbuilder_spec.rb +40 -0
  359. data/spec/views/catalog/sms_success.html.erb_spec.rb +8 -0
  360. data/spec/views/{_user_util_links.html.erb_spec.rb → shared/_user_util_links.html.erb_spec.rb} +4 -7
  361. data/tasks/blacklight.rake +10 -8
  362. data/template.demo.rb +3 -11
  363. metadata +188 -189
  364. data/app/assets/javascripts/blacklight/autofocus.js +0 -16
  365. data/app/assets/javascripts/blacklight/bookmark_toggle.js +0 -23
  366. data/app/assets/javascripts/blacklight/checkbox_submit.js +0 -135
  367. data/app/controllers/concerns/blacklight/request_builders.rb +0 -77
  368. data/app/controllers/concerns/blacklight/saved_searches.rb +0 -70
  369. data/app/controllers/concerns/blacklight/search_helper.rb +0 -155
  370. data/app/controllers/concerns/blacklight/suggest.rb +0 -25
  371. data/app/controllers/saved_searches_controller.rb +0 -4
  372. data/app/controllers/suggest_controller.rb +0 -4
  373. data/app/helpers/blacklight/deprecated_url_helper_behavior.rb +0 -57
  374. data/app/helpers/blacklight/render_partials_helper.rb +0 -205
  375. data/app/helpers/blacklight_configuration_helper.rb +0 -4
  376. data/app/helpers/blacklight_url_helper.rb +0 -4
  377. data/app/helpers/component_helper.rb +0 -4
  378. data/app/helpers/facets_helper.rb +0 -4
  379. data/app/helpers/hash_as_hidden_fields_helper.rb +0 -4
  380. data/app/helpers/layout_helper.rb +0 -4
  381. data/app/helpers/render_constraints_helper.rb +0 -4
  382. data/app/helpers/search_history_constraints_helper.rb +0 -4
  383. data/app/helpers/suggest_helper.rb +0 -4
  384. data/app/models/concerns/blacklight/solr/document/more_like_this.rb +0 -6
  385. data/app/views/_user_util_links.html.erb +0 -26
  386. data/app/views/blacklight/nav/_saved_searches.html.erb +0 -1
  387. data/app/views/catalog/_index_default.html.erb +0 -12
  388. data/app/views/catalog/_show_default.html.erb +0 -10
  389. data/app/views/catalog/_thumbnail_default.html.erb +0 -5
  390. data/app/views/saved_searches/index.html.erb +0 -32
  391. data/app/views/shared/_ajax_modal.html.erb +0 -6
  392. data/lib/generators/blacklight/solr4_generator.rb +0 -31
  393. data/lib/generators/blacklight/templates/config/jetty.yml +0 -13
  394. data/solr/conf/schema.xml +0 -629
  395. data/solr/conf/solrconfig.xml +0 -411
  396. data/spec/controllers/blacklight/search_helper_spec.rb +0 -470
  397. data/spec/controllers/saved_searches_controller_spec.rb +0 -32
  398. data/spec/controllers/suggest_controller_spec.rb +0 -17
  399. data/spec/features/saved_searches_spec.rb +0 -47
  400. data/spec/helpers/deprecated_url_helper_behavior_spec.rb +0 -101
  401. data/spec/lib/blacklight/utils_spec.rb +0 -167
  402. data/spec/models/blacklight/solr/document/more_like_this_spec.rb +0 -18
  403. data/spec/presenters/document_presenter_spec.rb +0 -438
  404. data/spec/presenters/index_presenter_spec.rb +0 -173
  405. data/spec/presenters/show_presenter_spec.rb +0 -313
  406. data/spec/support/backport_test.rb +0 -14
  407. /data/app/views/catalog/{_show_header_default.html.erb → _show_header.html.erb} +0 -0
  408. /data/app/views/{_flash_msg.html.erb → shared/_flash_msg.html.erb} +0 -0
  409. /data/{solr → lib/generators/blacklight/templates/solr}/conf/_rest_managed.json +0 -0
  410. /data/{solr → lib/generators/blacklight/templates/solr}/conf/admin-extra.html +0 -0
  411. /data/{solr → lib/generators/blacklight/templates/solr}/conf/elevate.xml +0 -0
  412. /data/{solr → lib/generators/blacklight/templates/solr}/conf/mapping-ISOLatin1Accent.txt +0 -0
  413. /data/{solr → lib/generators/blacklight/templates/solr}/conf/protwords.txt +0 -0
  414. /data/{solr → lib/generators/blacklight/templates/solr}/conf/scripts.conf +0 -0
  415. /data/{solr → lib/generators/blacklight/templates/solr}/conf/spellings.txt +0 -0
  416. /data/{solr → lib/generators/blacklight/templates/solr}/conf/stopwords.txt +0 -0
  417. /data/{solr → lib/generators/blacklight/templates/solr}/conf/stopwords_en.txt +0 -0
  418. /data/{solr → lib/generators/blacklight/templates/solr}/conf/synonyms.txt +0 -0
  419. /data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example.xsl +0 -0
  420. /data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example_atom.xsl +0 -0
  421. /data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example_rss.xsl +0 -0
  422. /data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/luke.xsl +0 -0
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- describe Blacklight::Suggest::Response do
4
- let(:empty_response) { described_class.new({}, { q: 'hello' }, 'suggest') }
3
+ RSpec.describe Blacklight::Suggest::Response, api: true do
4
+ let(:empty_response) { described_class.new({}, { q: 'hello' }, 'suggest', 'mySuggester') }
5
5
  let(:full_response) do
6
6
  described_class.new(
7
7
  {
@@ -36,7 +36,8 @@ describe Blacklight::Suggest::Response do
36
36
  {
37
37
  q: 'new'
38
38
  },
39
- 'suggest'
39
+ 'suggest',
40
+ 'mySuggester'
40
41
  )
41
42
  end
42
43
 
@@ -45,6 +46,7 @@ describe Blacklight::Suggest::Response do
45
46
  expect(empty_response).to be_an Blacklight::Suggest::Response
46
47
  end
47
48
  end
49
+
48
50
  describe '#suggestions' do
49
51
  it 'returns an array of suggestions' do
50
52
  expect(full_response.suggestions).to be_an Array
@@ -52,4 +54,4 @@ describe Blacklight::Suggest::Response do
52
54
  expect(full_response.suggestions.first['term']).to eq 'new jersey'
53
55
  end
54
56
  end
55
- end
57
+ end
@@ -1,22 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- describe Blacklight::SuggestSearch do
4
- let(:params) { {q: 'test'} }
5
- let(:suggest_path) { 'suggest' }
6
- let(:connection) { instance_double(RSolr::Client, send_and_receive: 'sent')}
7
- let(:repository) { instance_double(Blacklight::Solr::Repository, connection: connection) }
8
- let(:suggest_search) { described_class.new(params, repository)}
3
+ RSpec.describe Blacklight::SuggestSearch, api: true do
4
+ let(:params) { { q: 'test' } }
5
+ let(:response) { instance_double(Blacklight::Suggest::Response) }
6
+ let(:repository) { instance_double(Blacklight::Solr::Repository, suggestions: response) }
7
+ let(:suggest_search) { described_class.new(params, repository) }
8
+
9
9
  describe '#suggestions' do
10
- it 'returns a Blacklight::Suggest::Response' do
11
- expect(suggest_search).to receive(:suggest_results).and_return([])
12
- expect(suggest_search).to receive(:suggest_handler_path).and_return(suggest_path)
13
- expect(suggest_search.suggestions).to be_an Blacklight::Suggest::Response
14
- end
15
- end
16
- describe '#suggest_results' do
17
- it 'calls send_and_recieve from a repository connection' do
18
- expect(suggest_search).to receive(:suggest_handler_path).and_return(suggest_path)
19
- expect(suggest_search.suggest_results).to eq 'sent'
10
+ it 'delegates to the repository' do
11
+ expect(repository).to receive(:suggestions).with(q: 'test').and_return(response)
12
+ expect(suggest_search.suggestions).to eq response
20
13
  end
21
14
  end
22
15
  end
@@ -1,20 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- describe "Blacklight::User" do
4
-
5
- subject { User.create! :email => 'xyz@example.com', :password => 'xyz12345' }
3
+ RSpec.describe "Blacklight::User", api: true do
4
+ subject { User.create! email: 'xyz@example.com', password: 'xyz12345' }
6
5
 
7
6
  def mock_bookmark document_id
8
7
  Bookmark.new document_id: document_id, document_type: SolrDocument.to_s
9
8
  end
10
-
9
+
11
10
  describe "#bookmarks_for_documents" do
12
11
  before do
13
12
  subject.bookmarks << mock_bookmark(1)
14
13
  subject.bookmarks << mock_bookmark(2)
15
14
  subject.bookmarks << mock_bookmark(3)
16
15
  end
17
-
16
+
18
17
  it "returns all the bookmarks that match the given documents" do
19
18
  bookmarks = subject.bookmarks_for_documents([SolrDocument.new(id: 1), SolrDocument.new(id: 2)])
20
19
  expect(bookmarks).to have(2).items
@@ -22,18 +21,18 @@ describe "Blacklight::User" do
22
21
  expect(bookmarks.last.document_id).to eq "2"
23
22
  end
24
23
  end
25
-
24
+
26
25
  describe "#document_is_bookmarked?" do
27
26
  before do
28
27
  subject.bookmarks << mock_bookmark(1)
29
28
  end
30
-
29
+
31
30
  it "is true if the document is bookmarked" do
32
31
  expect(subject).to be_document_is_bookmarked(SolrDocument.new(id: 1))
33
32
  end
34
33
 
35
34
  it "is false if the document is not bookmarked" do
36
- expect(subject).to_not be_document_is_bookmarked(SolrDocument.new(id: 2))
35
+ expect(subject).not_to be_document_is_bookmarked(SolrDocument.new(id: 2))
37
36
  end
38
37
  end
39
38
 
@@ -41,10 +40,9 @@ describe "Blacklight::User" do
41
40
  before do
42
41
  subject.bookmarks << mock_bookmark(1)
43
42
  end
44
-
43
+
45
44
  it "returns the bookmark for that document id" do
46
45
  expect(subject.existing_bookmark_for(SolrDocument.new(id: 1))).to eq subject.bookmarks.first
47
46
  end
48
47
  end
49
-
50
- end
48
+ end
@@ -1,32 +1,33 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- describe Bookmark do
4
- let(:user) { User.create! email: 'xyz@example.com', password: 'xyz12345'}
3
+ RSpec.describe Bookmark do
5
4
  subject do
6
- b = Bookmark.new(user: user)
5
+ b = described_class.new(user: user)
7
6
  b.document = SolrDocument.new(id: 'u001')
8
7
  b
9
8
  end
10
9
 
10
+ let(:user) { User.create! email: 'xyz@example.com', password: 'xyz12345' }
11
+
11
12
  it "is valid" do
12
13
  expect(subject).to be_valid
13
14
  end
14
15
 
15
16
  it "belongs to user" do
16
- expect(Bookmark.reflect_on_association(:user)).not_to be_nil
17
+ expect(described_class.reflect_on_association(:user)).not_to be_nil
17
18
  end
18
19
 
19
20
  it "is valid after saving" do
20
21
  subject.save
21
22
  expect(subject).to be_valid
22
23
  end
23
-
24
+
24
25
  describe "#document_type" do
25
26
  it "is the class of the solr document" do
26
27
  expect(subject.document_type).to eq SolrDocument
27
28
  end
28
29
  end
29
-
30
+
30
31
  describe "#document" do
31
32
  it "is a SolrDocument with just an id field" do
32
33
  expect(subject.document).to be_a_kind_of SolrDocument
@@ -1,18 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- describe RecordMailer do
4
- before(:each) do
5
- allow(RecordMailer).to receive(:default) { { :from => 'no-reply@projectblacklight.org' } }
6
- SolrDocument.use_extension( Blacklight::Document::Email )
7
- SolrDocument.use_extension( Blacklight::Document::Sms )
8
- document = SolrDocument.new({:id=>"123456", :format=>["book"], :title_display => "The horn", :language_facet => "English", :author_display => "Janetzky, Kurt"})
3
+ RSpec.describe RecordMailer do
4
+ before do
5
+ allow(described_class).to receive(:default).and_return(from: 'no-reply@projectblacklight.org')
6
+ SolrDocument.use_extension(Blacklight::Document::Email)
7
+ SolrDocument.use_extension(Blacklight::Document::Sms)
8
+ document = SolrDocument.new(id: "123456", format: ["book"], title_tsim: "The horn", language_ssim: "English", author_tsim: "Janetzky, Kurt")
9
9
  @documents = [document]
10
10
  end
11
+
11
12
  describe "email" do
12
- before(:each) do
13
- details = {:to => 'test@test.com', :message => "This is my message"}
14
- @email = RecordMailer.email_record(@documents,details,{:host =>'projectblacklight.org', :protocol => 'https'})
13
+ before do
14
+ details = { to: 'test@test.com', message: "This is my message" }
15
+ @email = described_class.email_record(@documents, details, host: 'projectblacklight.org', protocol: 'https')
15
16
  end
17
+
16
18
  it "receives the TO paramater and send the email to that address" do
17
19
  expect(@email.to).to include 'test@test.com'
18
20
  end
@@ -31,17 +33,18 @@ describe RecordMailer do
31
33
  expect(@email.body).to match /projectblacklight.org/
32
34
  end
33
35
  it "uses https URLs when protocol is set" do
34
- details = {:to => 'test@test.com', :message => "This is my message"}
35
- @https_email = RecordMailer.email_record(@documents,details,{:host =>'projectblacklight.org', :protocol => 'https'})
36
- expect(@https_email.body).to match %r|https://projectblacklight.org/|
36
+ details = { to: 'test@test.com', message: "This is my message" }
37
+ @https_email = described_class.email_record(@documents, details, host: 'projectblacklight.org', protocol: 'https')
38
+ expect(@https_email.body).to match %r{https://projectblacklight.org/}
37
39
  end
38
40
  end
39
-
41
+
40
42
  describe "SMS" do
41
- before(:each) do
42
- details = {:to => '5555555555@txt.att.net'}
43
- @sms = RecordMailer.sms_record(@documents,details,{:host =>'projectblacklight.org:3000'})
43
+ before do
44
+ details = { to: '5555555555@txt.att.net' }
45
+ @sms = described_class.sms_record(@documents, details, host: 'projectblacklight.org:3000')
44
46
  end
47
+
45
48
  it "creates the correct TO address for the SMS email" do
46
49
  expect(@sms.to).to include '5555555555@txt.att.net'
47
50
  end
@@ -54,13 +57,12 @@ describe RecordMailer do
54
57
  it "prints out the correct body" do
55
58
  expect(@sms.body).to match /The horn/
56
59
  expect(@sms.body).to match /by Janetzky, Kurt/
57
- expect(@sms.body).to match /projectblacklight.org:3000/
60
+ expect(@sms.body).to match /projectblacklight.org:3000/
58
61
  end
59
62
  it "uses https URL when protocol is set" do
60
- details = {:to => '5555555555@txt.att.net'}
61
- @https_sms = RecordMailer.sms_record(@documents,details,{:host =>'projectblacklight.org', :protocol => 'https'})
62
- expect(@https_sms.body).to match %r|https://projectblacklight.org/|
63
+ details = { to: '5555555555@txt.att.net' }
64
+ @https_sms = described_class.sms_record(@documents, details, host: 'projectblacklight.org', protocol: 'https')
65
+ expect(@https_sms.body).to match %r{https://projectblacklight.org/}
63
66
  end
64
67
  end
65
-
66
68
  end
@@ -1,57 +1,58 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- describe Search do
4
- let(:user) { User.create! email: 'xyz@example.com', password: 'xyz12345'}
3
+ RSpec.describe Search do
4
+ let(:user) { User.create! email: 'xyz@example.com', password: 'xyz12345' }
5
+
5
6
  describe "query_params" do
6
- before(:each) do
7
- @search = Search.new(user: user)
8
- @query_params = { :q => "query", :f => "facet" }
7
+ before do
8
+ @search = described_class.new(user: user)
9
+ @query_params = { q: "query", f: "facet" }
9
10
  end
10
11
 
11
12
  it "can save and retrieve the hash" do
12
13
  @search.query_params = @query_params
13
14
  @search.save!
14
- expect(Search.find(@search.id).query_params).to eq @query_params
15
+ expect(described_class.find(@search.id).query_params).to eq @query_params
15
16
  end
16
17
  end
17
18
 
18
19
  describe "saved?" do
19
20
  it "is true when user_id is not NULL and greater than 0" do
20
- @search = Search.new(user: user)
21
+ @search = described_class.new(user: user)
21
22
  @search.save!
22
23
 
23
24
  expect(@search).to be_saved
24
25
  end
25
26
  it "is false when user_id is NULL or less than 1" do
26
- @search = Search.create
27
+ @search = described_class.create
27
28
  expect(@search).not_to be_saved
28
29
  end
29
30
  end
30
31
 
31
32
  describe "delete_old_searches" do
32
33
  it "throws an ArgumentError if days_old is not a number" do
33
- expect { Search.delete_old_searches("blah") }.to raise_error(ArgumentError)
34
+ expect { described_class.delete_old_searches("blah") }.to raise_error(ArgumentError)
34
35
  end
35
36
 
36
37
  it "throws an ArgumentError if days_old is equal to 0" do
37
- expect { Search.delete_old_searches(0) }.to raise_error(ArgumentError)
38
+ expect { described_class.delete_old_searches(0) }.to raise_error(ArgumentError)
38
39
  end
39
40
 
40
41
  it "throws an ArgumentError if days_old is less than 0" do
41
- expect { Search.delete_old_searches(-1) }.to raise_error(ArgumentError)
42
+ expect { described_class.delete_old_searches(-1) }.to raise_error(ArgumentError)
42
43
  end
43
44
 
44
45
  it "destroy searches with no user_id that are older than X days" do
45
- Search.destroy_all
46
+ described_class.destroy_all
46
47
  days_old = 7
47
- Search.create!(created_at: Date.today)
48
- Search.create!(created_at: Date.today - (days_old + 1).days)
49
- Search.create!(user: user, created_at: Date.today)
50
- Search.create!(user: user, created_at: Date.today - (days_old + 1).days)
48
+ described_class.create!(created_at: Date.today)
49
+ described_class.create!(created_at: Date.today - (days_old + 1).days)
50
+ described_class.create!(user: user, created_at: Date.today)
51
+ described_class.create!(user: user, created_at: Date.today - (days_old + 1).days)
51
52
 
52
53
  expect do
53
- Search.delete_old_searches(days_old)
54
- end.to change(Search, :count).by(-1)
54
+ described_class.delete_old_searches(days_old)
55
+ end.to change(described_class, :count).by(-1)
55
56
  end
56
57
  end
57
58
  end
@@ -1,27 +1,55 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- RSpec.describe SolrDocument do
3
+ RSpec.describe SolrDocument, api: true do
4
4
  describe "access methods" do
5
5
  let(:solrdoc) do
6
- SolrDocument.new(id: '00282214', format: ['Book'], title_display: 'some-title')
6
+ SolrDocument.new(id: '00282214', format: ['Book'], title_tsim: 'some-title')
7
7
  end
8
8
 
9
9
  describe "#[]" do
10
10
  subject { solrdoc[field] }
11
11
 
12
- context "with title_display" do
13
- let(:field) { :title_display }
12
+ context "with title_tsim" do
13
+ let(:field) { :title_tsim }
14
+
14
15
  it { is_expected.to eq 'some-title' }
15
16
  end
17
+
16
18
  context "with format" do
17
19
  let(:field) { :format }
20
+
18
21
  it { is_expected.to eq ['Book'] }
19
22
  end
20
23
  end
21
-
24
+
22
25
  describe "#id" do
23
26
  subject { solrdoc.id }
27
+
24
28
  it { is_expected.to eq '00282214' }
25
29
  end
26
30
  end
31
+
32
+ describe '.attribute' do
33
+ subject(:title) { document.title }
34
+
35
+ let(:doc_class) do
36
+ Class.new(SolrDocument) do
37
+ attribute :title, Blacklight::Types::String, 'title_tesim'
38
+ attribute :author, Blacklight::Types::Array, 'author_tesim'
39
+ attribute :date, Blacklight::Types::Date, 'date_dtsi'
40
+ end
41
+ end
42
+ let(:document) do
43
+ doc_class.new(id: '123',
44
+ title_tesim: ['Good Omens'],
45
+ author_tesim: ['Neil Gaiman', 'Terry Pratchett'],
46
+ date_dtsi: '1990-01-01T00:00:00Z')
47
+ end
48
+
49
+ it "casts the attributes" do
50
+ expect(document.title).to eq 'Good Omens'
51
+ expect(document.author).to eq ['Neil Gaiman', 'Terry Pratchett']
52
+ expect(document.date).to eq Date.new(1990)
53
+ end
54
+ end
27
55
  end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Blacklight::DocumentPresenter do
4
+ let(:presenter) { described_class.new }
5
+ let(:doc) { instance_double(SolrDocument) }
6
+ let(:view_context) { double('View context', should_render_field?: true) }
7
+
8
+ before do
9
+ allow(presenter).to receive(:document).and_return(doc)
10
+ allow(presenter).to receive(:view_context).and_return(view_context)
11
+ end
12
+
13
+ describe '#fields_to_render' do
14
+ subject { presenter.fields_to_render }
15
+
16
+ let(:field_config) { double(field: 'asdf') }
17
+
18
+ context 'when all of the fields have values' do
19
+ before do
20
+ allow(presenter).to receive_messages(fields: { 'title' => field_config },
21
+ render_field?: true,
22
+ has_value?: true)
23
+ end
24
+
25
+ it { is_expected.to eq('title' => field_config) }
26
+ end
27
+ end
28
+
29
+ describe '#render_field?' do
30
+ subject { presenter.send(:render_field?, field_config) }
31
+
32
+ let(:field_config) { double('field config', if: true, unless: false) }
33
+
34
+ before do
35
+ allow(presenter).to receive_messages(document_has_value?: true)
36
+ end
37
+
38
+ it { is_expected.to be true }
39
+
40
+ context 'when the view context says not to render the field' do
41
+ let(:view_context) { double('View context', should_render_field?: false) }
42
+
43
+ before do
44
+ allow(field_config).to receive_messages(if: false)
45
+ end
46
+
47
+ it { is_expected.to be false }
48
+ end
49
+ end
50
+
51
+ describe '#has_value?' do
52
+ subject { presenter.send(:has_value?, field_config) }
53
+
54
+ context 'when the document has the field value' do
55
+ let(:field_config) { double(field: 'asdf') }
56
+
57
+ before do
58
+ allow(doc).to receive(:has?).with('asdf').and_return(true)
59
+ end
60
+
61
+ it { is_expected.to be true }
62
+ end
63
+
64
+ context 'when the document has a highlight field value' do
65
+ let(:field_config) { double(field: 'asdf', highlight: true) }
66
+
67
+ before do
68
+ allow(doc).to receive(:has_highlight_field?).with('asdf').and_return(true)
69
+ allow(doc).to receive(:has?).with('asdf').and_return(true)
70
+ end
71
+
72
+ it { is_expected.to be true }
73
+ end
74
+
75
+ context 'when the field is a model accessor' do
76
+ let(:field_config) { double(field: 'asdf', highlight: true, accessor: true) }
77
+
78
+ before do
79
+ allow(doc).to receive(:has_highlight_field?).with('asdf').and_return(true)
80
+ allow(doc).to receive(:has?).with('asdf').and_return(true)
81
+ end
82
+
83
+ it { is_expected.to be true }
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,186 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Blacklight::IndexPresenter, api: true do
4
+ include Capybara::RSpecMatchers
5
+ subject { presenter }
6
+
7
+ let(:request_context) { double(document_index_view_type: 'list') }
8
+ let(:config) { Blacklight::Configuration.new }
9
+
10
+ let(:presenter) { described_class.new(document, request_context, config) }
11
+ let(:parameter_class) { ActionController::Parameters }
12
+ let(:params) { parameter_class.new }
13
+ let(:controller) { double }
14
+ let(:search_state) { Blacklight::SearchState.new(params, config, controller) }
15
+
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')
21
+ end
22
+
23
+ before do
24
+ allow(request_context).to receive(:search_state).and_return(search_state)
25
+ end
26
+
27
+ describe '#field_value' do
28
+ subject { presenter.field_value field }
29
+
30
+ let(:field) { config.index_fields[field_name] }
31
+ let(:field_name) { 'asdf' }
32
+ let(:config) do
33
+ Blacklight::Configuration.new.configure do |config|
34
+ config.add_index_field 'qwer'
35
+ config.add_index_field 'asdf', helper_method: :render_asdf_index_field
36
+ config.add_index_field 'link_to_facet_true', link_to_facet: true
37
+ config.add_index_field 'link_to_facet_named', link_to_facet: :some_field
38
+ config.add_index_field 'highlight', highlight: true
39
+ config.add_index_field 'solr_doc_accessor', accessor: true
40
+ config.add_index_field 'explicit_accessor', accessor: :solr_doc_accessor
41
+ config.add_index_field 'alias', field: 'qwer'
42
+ config.add_index_field 'with_default', default: 'value'
43
+ end
44
+ end
45
+
46
+ context 'when an explicit value is provided' do
47
+ subject { presenter.field_value field, value: 'asdf' }
48
+
49
+ it { is_expected.to eq 'asdf' }
50
+ end
51
+
52
+ context 'when field has a helper method' do
53
+ before do
54
+ allow(request_context).to receive(:render_asdf_index_field).and_return('custom asdf value')
55
+ end
56
+
57
+ it { is_expected.to eq 'custom asdf value' }
58
+ end
59
+
60
+ context 'when field has link_to_facet with true' do
61
+ before do
62
+ allow(request_context).to receive(:search_action_path).with('f' => { 'link_to_facet_true' => ['x'] }).and_return('/foo')
63
+ allow(request_context).to receive(:link_to).with("x", '/foo').and_return('bar')
64
+ end
65
+
66
+ let(:field_name) { 'link_to_facet_true' }
67
+
68
+ it { is_expected.to eq 'bar' }
69
+ end
70
+
71
+ context 'when field has link_to_facet with a field name' do
72
+ before do
73
+ allow(request_context).to receive(:search_action_path).with('f' => { 'some_field' => ['x'] }).and_return('/foo')
74
+ allow(request_context).to receive(:link_to).with("x", '/foo').and_return('bar')
75
+ end
76
+
77
+ let(:field_name) { 'link_to_facet_named' }
78
+
79
+ it { is_expected.to eq 'bar' }
80
+ end
81
+
82
+ context 'when no highlight field is available' do
83
+ before do
84
+ allow(document).to receive(:has_highlight_field?).and_return(false)
85
+ end
86
+
87
+ let(:field_name) { 'highlight' }
88
+
89
+ it { is_expected.to be_blank }
90
+ end
91
+
92
+ context 'when highlight field is available' do
93
+ before do
94
+ allow(document).to receive(:has_highlight_field?).and_return(true)
95
+ allow(document).to receive(:highlight_field).with('highlight').and_return(['<em>highlight</em>'.html_safe])
96
+ end
97
+
98
+ let(:field_name) { 'highlight' }
99
+
100
+ it { is_expected.to eq '<em>highlight</em>' }
101
+ end
102
+
103
+ context 'when no options are provided' do
104
+ let(:field_name) { 'qwer' }
105
+
106
+ it "checks the document field value" do
107
+ expect(subject).to eq 'document qwer value'
108
+ end
109
+ end
110
+
111
+ context 'when accessor is true' do
112
+ before do
113
+ allow(document).to receive_messages(solr_doc_accessor: "123")
114
+ end
115
+
116
+ let(:field_name) { 'solr_doc_accessor' }
117
+
118
+ it { is_expected.to eq '123' }
119
+ end
120
+
121
+ context 'when accessor is set to a value' do
122
+ let(:field_name) { 'explicit_accessor' }
123
+
124
+ it 'calls the accessor with the field_name as the argument' do
125
+ expect(document).to receive(:solr_doc_accessor).with('explicit_accessor').and_return("123")
126
+
127
+ expect(subject).to eq '123'
128
+ end
129
+ end
130
+
131
+ context 'when the field is an alias' do
132
+ let(:field_name) { 'alias' }
133
+
134
+ it { is_expected.to eq 'document qwer value' }
135
+ end
136
+
137
+ context 'when the field has a default' do
138
+ let(:field_name) { 'with_default' }
139
+
140
+ it { is_expected.to eq 'value' }
141
+ end
142
+ end
143
+
144
+ describe '#field_values' do
145
+ context 'for a field with the helper_method option' do
146
+ let(:field_name) { 'field_with_helper' }
147
+ let(:field_config) { config.add_facet_field 'field_with_helper', helper_method: 'render_field_with_helper' }
148
+ let(:document) do
149
+ SolrDocument.new(id: 1, 'field_with_helper' => 'value')
150
+ end
151
+
152
+ it "checks call the helper method with arguments" do
153
+ allow(request_context).to receive(:render_field_with_helper) do |*args|
154
+ args.first
155
+ end
156
+
157
+ options = subject.send(:field_values, field_config, a: 1)
158
+
159
+ expect(options).to include :document, :field, :value, :config, :a
160
+ expect(options[:document]).to eq document
161
+ expect(options[:field]).to eq 'field_with_helper'
162
+ expect(options[:value]).to eq ['value']
163
+ expect(options[:config]).to eq field_config
164
+ expect(options[:a]).to eq 1
165
+ end
166
+ end
167
+ end
168
+
169
+ describe '#fields' do
170
+ let(:field) { instance_double(Blacklight::Configuration::Field) }
171
+
172
+ before do
173
+ allow(config).to receive(:index_fields_for).and_return(title: field)
174
+ end
175
+
176
+ it 'returns the list from the configs' do
177
+ expect(subject.send(:fields)).to eq(title: field)
178
+ end
179
+ end
180
+
181
+ describe "#thumbnail" do
182
+ subject { presenter.thumbnail }
183
+
184
+ it { is_expected.to be_instance_of Blacklight::ThumbnailPresenter }
185
+ end
186
+ end