blacklight 6.21.0 → 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (420) hide show
  1. checksums.yaml +4 -4
  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 +23 -27
  8. data/Gemfile +3 -4
  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 +19 -30
  39. data/app/controllers/concerns/blacklight/catalog.rb +263 -210
  40. data/app/controllers/concerns/blacklight/controller.rb +102 -124
  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 +11 -11
  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 +5 -7
  47. data/app/helpers/blacklight/blacklight_helper_behavior.rb +36 -118
  48. data/app/helpers/blacklight/catalog_helper_behavior.rb +94 -88
  49. data/app/helpers/blacklight/component_helper_behavior.rb +19 -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 -10
  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/{assets/javascripts → javascript}/blacklight/checkbox_submit.js +66 -71
  63. data/app/{assets/javascripts → javascript}/blacklight/collapsable.js +1 -1
  64. data/app/javascript/blacklight/core.js +41 -0
  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 +1 -1
  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.rb +23 -39
  75. data/app/models/concerns/blacklight/document/active_model_shim.rb +8 -11
  76. data/app/models/concerns/blacklight/document/cache_key.rb +1 -1
  77. data/app/models/concerns/blacklight/document/dublin_core.rb +2 -2
  78. data/app/models/concerns/blacklight/document/email.rb +1 -1
  79. data/app/models/concerns/blacklight/document/extensions.rb +5 -5
  80. data/app/models/concerns/blacklight/document/semantic_fields.rb +9 -9
  81. data/app/models/concerns/blacklight/document/sms.rb +1 -1
  82. data/app/models/concerns/blacklight/solr/document.rb +8 -8
  83. data/app/models/concerns/blacklight/user.rb +7 -6
  84. data/app/models/record_mailer.rb +5 -6
  85. data/app/models/search.rb +5 -7
  86. data/app/presenters/blacklight/document_presenter.rb +25 -140
  87. data/app/presenters/blacklight/field_presenter.rb +7 -5
  88. data/app/presenters/blacklight/index_presenter.rb +41 -70
  89. data/app/presenters/blacklight/json_presenter.rb +10 -14
  90. data/app/presenters/blacklight/link_alternate_presenter.rb +3 -1
  91. data/app/presenters/blacklight/rendering/abstract_step.rb +7 -5
  92. data/app/presenters/blacklight/rendering/helper_method.rb +10 -8
  93. data/app/presenters/blacklight/rendering/join.rb +5 -3
  94. data/app/presenters/blacklight/rendering/link_to_facet.rb +23 -19
  95. data/app/presenters/blacklight/rendering/microdata.rb +6 -3
  96. data/app/presenters/blacklight/rendering/pipeline.rb +7 -5
  97. data/app/presenters/blacklight/rendering/terminator.rb +2 -0
  98. data/app/presenters/blacklight/search_bar_presenter.rb +39 -0
  99. data/app/presenters/blacklight/show_presenter.rb +26 -72
  100. data/app/presenters/blacklight/thumbnail_presenter.rb +74 -0
  101. data/app/services/blacklight/document_factory.rb +13 -0
  102. data/app/services/blacklight/field_retriever.rb +26 -24
  103. data/app/services/blacklight/search_service.rb +152 -0
  104. data/app/values/blacklight/types.rb +31 -0
  105. data/app/views/blacklight/nav/_bookmark.html.erb +2 -2
  106. data/app/views/blacklight/nav/_search_history.html.erb +1 -1
  107. data/app/views/bookmarks/_tools.html.erb +2 -2
  108. data/app/views/bookmarks/index.html.erb +12 -13
  109. data/app/views/catalog/_bookmark_control.html.erb +26 -10
  110. data/app/views/catalog/_citation.html.erb +18 -23
  111. data/app/views/catalog/_constraints.html.erb +6 -7
  112. data/app/views/catalog/_constraints_element.html.erb +6 -6
  113. data/app/views/catalog/_did_you_mean.html.erb +1 -1
  114. data/app/views/catalog/{_document_default.atom.builder → _document.atom.builder} +19 -18
  115. data/app/views/catalog/_document.html.erb +5 -3
  116. data/app/views/catalog/{_document_default.rss.builder → _document.rss.builder} +2 -0
  117. data/app/views/catalog/_document_action.html.erb +2 -1
  118. data/app/views/catalog/_email_form.html.erb +8 -4
  119. data/app/views/catalog/_facet_index_navigation.html.erb +5 -4
  120. data/app/views/catalog/_facet_layout.html.erb +6 -10
  121. data/app/views/catalog/_facet_limit.html.erb +3 -2
  122. data/app/views/catalog/_facet_pagination.html.erb +8 -8
  123. data/app/views/catalog/_facet_pivot.html.erb +2 -2
  124. data/app/views/catalog/_facets.html.erb +9 -12
  125. data/app/views/catalog/_field.json.jbuilder +10 -0
  126. data/app/views/catalog/{_group_default.html.erb → _group.html.erb} +1 -1
  127. data/app/views/catalog/_home_text.html.erb +32 -36
  128. data/app/views/catalog/_index.html.erb +10 -0
  129. data/app/views/catalog/{_index_header_default.html.erb → _index_header.html.erb} +3 -3
  130. data/app/views/catalog/_per_page_widget.html.erb +6 -7
  131. data/app/views/catalog/_previous_next_doc.html.erb +6 -14
  132. data/app/views/catalog/_results_pagination.html.erb +2 -2
  133. data/app/views/catalog/_search_form.html.erb +12 -8
  134. data/app/views/catalog/_search_header.html.erb +0 -3
  135. data/app/views/catalog/_search_results.html.erb +6 -2
  136. data/app/views/catalog/_show.html.erb +8 -0
  137. data/app/views/catalog/{_show_header_default.html.erb → _show_header.html.erb} +0 -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.html.erb +1 -1
  149. data/app/views/catalog/citation.js.erb +9 -1
  150. data/app/views/catalog/email.html.erb +5 -3
  151. data/app/views/catalog/email_success.html.erb +12 -8
  152. data/app/views/catalog/facet.html.erb +10 -8
  153. data/app/views/catalog/facet.json.jbuilder +2 -0
  154. data/app/views/catalog/index.atom.builder +13 -16
  155. data/app/views/catalog/index.html.erb +9 -11
  156. data/app/views/catalog/index.json.jbuilder +84 -3
  157. data/app/views/catalog/index.rss.builder +7 -5
  158. data/app/views/catalog/opensearch.xml.builder +12 -10
  159. data/app/views/catalog/show.html.erb +11 -6
  160. data/app/views/catalog/show.json.jbuilder +21 -0
  161. data/app/views/catalog/sms.html.erb +3 -1
  162. data/app/views/catalog/sms_success.html.erb +12 -8
  163. data/app/views/kaminari/blacklight/_first_page.html.erb +2 -2
  164. data/app/views/kaminari/blacklight/_gap.html.erb +2 -2
  165. data/app/views/kaminari/blacklight/_last_page.html.erb +2 -2
  166. data/app/views/kaminari/blacklight/_next_page.html.erb +5 -5
  167. data/app/views/kaminari/blacklight/_page.html.erb +5 -3
  168. data/app/views/kaminari/blacklight/_prev_page.html.erb +4 -4
  169. data/app/views/kaminari/blacklight_compact/_paginator.html.erb +4 -4
  170. data/app/views/layouts/blacklight.html.erb +14 -41
  171. data/app/views/layouts/blacklight/base.html.erb +35 -0
  172. data/app/views/layouts/catalog_result.html.erb +11 -0
  173. data/app/views/search_history/index.html.erb +16 -21
  174. data/app/views/{_flash_msg.html.erb → shared/_flash_msg.html.erb} +0 -0
  175. data/app/views/shared/_header_navbar.html.erb +8 -13
  176. data/app/views/shared/_modal.html.erb +6 -0
  177. data/app/views/shared/_user_util_links.html.erb +22 -0
  178. data/blacklight.gemspec +8 -10
  179. data/config/i18n-tasks.yml +17 -0
  180. data/config/locales/blacklight.de.yml +71 -82
  181. data/config/locales/blacklight.en.yml +15 -27
  182. data/config/locales/blacklight.es.yml +14 -26
  183. data/config/locales/blacklight.fr.yml +16 -33
  184. data/config/locales/blacklight.hu.yml +212 -0
  185. data/config/locales/blacklight.it.yml +15 -26
  186. data/config/locales/blacklight.nl.yml +212 -0
  187. data/config/locales/blacklight.pt-BR.yml +24 -29
  188. data/config/locales/blacklight.sq.yml +4 -28
  189. data/config/locales/blacklight.zh.yml +3 -25
  190. data/config/routes.rb +2 -10
  191. data/db/migrate/20140202020202_create_bookmarks.rb +0 -1
  192. data/db/migrate/20140320000000_add_polymorphic_type_to_bookmarks.rb +1 -1
  193. data/lib/blacklight.rb +6 -4
  194. data/lib/blacklight/abstract_repository.rb +9 -9
  195. data/lib/blacklight/configuration.rb +99 -88
  196. data/lib/blacklight/configuration/context.rb +12 -1
  197. data/lib/blacklight/configuration/facet_field.rb +16 -9
  198. data/lib/blacklight/configuration/field.rb +32 -3
  199. data/lib/blacklight/configuration/fields.rb +15 -17
  200. data/lib/blacklight/configuration/null_field.rb +2 -0
  201. data/lib/blacklight/configuration/search_field.rb +2 -2
  202. data/lib/blacklight/configuration/sort_field.rb +2 -2
  203. data/lib/blacklight/configuration/view_config.rb +4 -0
  204. data/lib/blacklight/engine.rb +8 -9
  205. data/lib/blacklight/exceptions.rb +4 -7
  206. data/lib/blacklight/{utils.rb → nested_open_struct_with_hash_access.rb} +9 -81
  207. data/lib/blacklight/open_struct_with_hash_access.rb +49 -0
  208. data/lib/blacklight/parameters.rb +1 -1
  209. data/lib/blacklight/routes/exportable.rb +1 -3
  210. data/lib/blacklight/routes/searchable.rb +3 -3
  211. data/lib/blacklight/runtime_registry.rb +2 -0
  212. data/lib/blacklight/search_builder.rb +28 -35
  213. data/lib/blacklight/search_state.rb +10 -8
  214. data/lib/blacklight/solr/repository.rb +4 -3
  215. data/lib/blacklight/solr/request.rb +1 -1
  216. data/lib/blacklight/solr/response.rb +29 -30
  217. data/lib/blacklight/solr/response/facets.rb +29 -31
  218. data/lib/blacklight/solr/response/group.rb +3 -3
  219. data/lib/blacklight/solr/response/group_response.rb +1 -1
  220. data/lib/blacklight/solr/response/more_like_this.rb +2 -2
  221. data/lib/blacklight/solr/response/response.rb +2 -2
  222. data/lib/blacklight/solr/response/spelling.rb +4 -3
  223. data/lib/blacklight/solr/search_builder_behavior.rb +25 -29
  224. data/lib/blacklight/version.rb +1 -1
  225. data/lib/generators/blacklight/assets_generator.rb +13 -12
  226. data/lib/generators/blacklight/controller_generator.rb +4 -5
  227. data/lib/generators/blacklight/document_generator.rb +1 -1
  228. data/lib/generators/blacklight/install_generator.rb +17 -27
  229. data/lib/generators/blacklight/search_builder_generator.rb +1 -1
  230. data/lib/generators/blacklight/{solr5_generator.rb → solr_generator.rb} +12 -6
  231. data/lib/generators/blacklight/templates/.solr_wrapper.yml +5 -0
  232. data/lib/generators/blacklight/templates/alternate_controller.rb +4 -4
  233. data/lib/generators/blacklight/templates/blacklight.scss +0 -2
  234. data/lib/generators/blacklight/templates/catalog_controller.rb +57 -50
  235. data/lib/generators/blacklight/templates/config/blacklight.yml +1 -13
  236. data/{solr → lib/generators/blacklight/templates/solr}/conf/_rest_managed.json +0 -0
  237. data/{solr → lib/generators/blacklight/templates/solr}/conf/admin-extra.html +0 -0
  238. data/{solr → lib/generators/blacklight/templates/solr}/conf/elevate.xml +0 -0
  239. data/{solr → lib/generators/blacklight/templates/solr}/conf/mapping-ISOLatin1Accent.txt +0 -0
  240. data/{solr → lib/generators/blacklight/templates/solr}/conf/protwords.txt +0 -0
  241. data/lib/generators/blacklight/templates/solr/conf/schema.xml +388 -0
  242. data/{solr → lib/generators/blacklight/templates/solr}/conf/scripts.conf +0 -0
  243. data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +195 -0
  244. data/{solr → lib/generators/blacklight/templates/solr}/conf/spellings.txt +0 -0
  245. data/{solr → lib/generators/blacklight/templates/solr}/conf/stopwords.txt +0 -0
  246. data/{solr → lib/generators/blacklight/templates/solr}/conf/stopwords_en.txt +0 -0
  247. data/{solr → lib/generators/blacklight/templates/solr}/conf/synonyms.txt +0 -0
  248. data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example.xsl +0 -0
  249. data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example_atom.xsl +0 -0
  250. data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example_rss.xsl +0 -0
  251. data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/luke.xsl +0 -0
  252. data/lib/generators/blacklight/test_support_generator.rb +10 -10
  253. data/lib/generators/blacklight/user_generator.rb +5 -6
  254. data/lib/railties/blacklight.rake +7 -6
  255. data/package-lock.json +2195 -0
  256. data/package.json +29 -0
  257. data/spec/controllers/alternate_controller_spec.rb +5 -4
  258. data/spec/controllers/application_controller_spec.rb +1 -5
  259. data/spec/controllers/blacklight/base_spec.rb +6 -3
  260. data/spec/controllers/blacklight/catalog/component_configuration_spec.rb +11 -7
  261. data/spec/controllers/blacklight/facet_spec.rb +1 -2
  262. data/spec/controllers/blacklight/search_fields_spec.rb +25 -34
  263. data/spec/controllers/bookmarks_controller_spec.rb +13 -13
  264. data/spec/controllers/catalog_controller_spec.rb +332 -164
  265. data/spec/controllers/search_history_controller_spec.rb +6 -6
  266. data/spec/features/alternate_controller_spec.rb +4 -4
  267. data/spec/features/autocomplete_spec.rb +4 -2
  268. data/spec/features/bookmarks_spec.rb +10 -10
  269. data/spec/features/did_you_mean_spec.rb +7 -12
  270. data/spec/features/facets_spec.rb +16 -16
  271. data/spec/features/record_view_spec.rb +12 -18
  272. data/spec/features/search_context_spec.rb +6 -7
  273. data/spec/features/search_crawler_spec.rb +3 -5
  274. data/spec/features/search_filters_spec.rb +80 -80
  275. data/spec/features/search_formats_spec.rb +1 -1
  276. data/spec/features/search_history_spec.rb +6 -29
  277. data/spec/features/search_pagination_spec.rb +4 -2
  278. data/spec/features/search_results_spec.rb +14 -12
  279. data/spec/features/search_sort_spec.rb +2 -2
  280. data/spec/features/search_spec.rb +7 -12
  281. data/spec/features/sitelinks_search_box.rb +4 -4
  282. data/{solr → spec/fixtures}/sample_solr_documents.yml +688 -688
  283. data/spec/helpers/{configuration_helper_spec.rb → blacklight/configuration_helper_behavior_spec.rb} +97 -92
  284. data/spec/helpers/{facets_helper_spec.rb → blacklight/facets_helper_behavior_spec.rb} +72 -67
  285. data/spec/helpers/{hash_as_hidden_fields_spec.rb → blacklight/hash_as_hidden_fields_behavior_spec.rb} +2 -2
  286. data/spec/helpers/blacklight/icon_helper_behavior_spec.rb +10 -0
  287. data/spec/helpers/{layout_helper_spec.rb → blacklight/layout_helper_behavior_spec.rb} +5 -15
  288. data/spec/helpers/{render_constraints_helper_spec.rb → blacklight/render_constraints_helper_behavior_spec.rb} +10 -6
  289. data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +92 -0
  290. data/spec/helpers/{search_history_constraints_helper_spec.rb → blacklight/search_history_constraints_helper_behavior_spec.rb} +29 -30
  291. data/spec/helpers/{suggest_helper_spec.rb → blacklight/suggest_helper_behavior_spec.rb} +9 -2
  292. data/spec/helpers/{url_helper_spec.rb → blacklight/url_helper_behavior_spec.rb} +56 -54
  293. data/spec/helpers/blacklight_helper_spec.rb +62 -151
  294. data/spec/helpers/catalog_helper_spec.rb +80 -96
  295. data/spec/i18n_spec.rb +18 -0
  296. data/spec/integration/generators/blacklight/{solr5_generator_spec.rb → solr_generator_spec.rb} +21 -13
  297. data/spec/lib/blacklight/configuration/facet_field_spec.rb +13 -0
  298. data/spec/lib/blacklight/configuration/field_spec.rb +15 -0
  299. data/spec/lib/blacklight/nested_open_struct_with_hash_access_spec.rb +17 -0
  300. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +148 -0
  301. data/spec/lib/blacklight/parameters_spec.rb +4 -2
  302. data/spec/lib/blacklight/search_state_spec.rb +53 -36
  303. data/spec/lib/blacklight_spec.rb +14 -15
  304. data/spec/lib/tasks/blacklight_task_spec.rb +4 -6
  305. data/spec/models/blacklight/configurable_spec.rb +24 -27
  306. data/spec/models/blacklight/configuration/context_spec.rb +9 -10
  307. data/spec/models/blacklight/configuration_spec.rb +188 -165
  308. data/spec/models/blacklight/document/active_model_shim_spec.rb +15 -6
  309. data/spec/models/blacklight/document/cache_key_spec.rb +9 -2
  310. data/spec/models/blacklight/document/dublin_core_spec.rb +17 -20
  311. data/spec/models/blacklight/document/email_spec.rb +10 -10
  312. data/spec/models/blacklight/document/sms_spec.rb +10 -10
  313. data/spec/models/blacklight/document_spec.rb +10 -22
  314. data/spec/models/blacklight/facet_paginator_spec.rb +40 -30
  315. data/spec/models/blacklight/icon_spec.rb +44 -0
  316. data/spec/models/blacklight/search_builder_spec.rb +41 -26
  317. data/spec/models/blacklight/solr/document_spec.rb +224 -216
  318. data/spec/models/blacklight/solr/facet_paginator_spec.rb +6 -4
  319. data/spec/models/blacklight/solr/repository_spec.rb +50 -42
  320. data/spec/models/blacklight/solr/request_spec.rb +17 -18
  321. data/spec/models/blacklight/solr/response/facets_spec.rb +58 -58
  322. data/spec/models/blacklight/solr/response/group_response_spec.rb +16 -22
  323. data/spec/models/blacklight/solr/response/group_spec.rb +18 -25
  324. data/spec/models/blacklight/solr/response_spec.rb +56 -55
  325. data/spec/models/blacklight/solr/search_builder_spec.rb +150 -164
  326. data/spec/models/blacklight/suggest/response_spec.rb +1 -0
  327. data/spec/models/blacklight/suggest_search_spec.rb +4 -4
  328. data/spec/models/blacklight/user_spec.rb +9 -11
  329. data/spec/models/bookmark_spec.rb +7 -6
  330. data/spec/models/record_mailer_spec.rb +23 -21
  331. data/spec/models/search_spec.rb +19 -18
  332. data/spec/models/solr_document_spec.rb +33 -5
  333. data/spec/presenters/blacklight/document_presenter_spec.rb +86 -0
  334. data/spec/presenters/{index_presenter_spec.rb → blacklight/index_presenter_spec.rb} +25 -62
  335. data/spec/presenters/blacklight/json_presenter_spec.rb +59 -0
  336. data/spec/presenters/blacklight/link_alternate_presenter_spec.rb +3 -0
  337. data/spec/presenters/blacklight/search_bar_presenter_spec.rb +79 -0
  338. data/spec/presenters/{show_presenter_spec.rb → blacklight/show_presenter_spec.rb} +47 -62
  339. data/spec/presenters/pipeline_spec.rb +18 -11
  340. data/spec/presenters/thumbnail_presenter_spec.rb +174 -0
  341. data/spec/routing/catalog_routing_spec.rb +13 -31
  342. data/spec/services/blacklight/search_service_spec.rb +488 -0
  343. data/spec/spec_helper.rb +22 -15
  344. data/spec/support/features.rb +1 -1
  345. data/spec/support/features/session_helpers.rb +4 -4
  346. data/spec/test_app_templates/Gemfile.extra +2 -5
  347. data/spec/test_app_templates/lib/generators/test_app_generator.rb +12 -13
  348. data/spec/views/catalog/_constraints.html.erb_spec.rb +3 -6
  349. data/spec/views/catalog/_constraints_element.html.erb_spec.rb +17 -13
  350. data/spec/views/catalog/_document.html.erb_spec.rb +11 -11
  351. data/spec/views/catalog/_document_list.html.erb_spec.rb +2 -1
  352. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +5 -5
  353. data/spec/views/catalog/_facet_layout.html.erb_spec.rb +6 -6
  354. data/spec/views/catalog/_facets.html.erb_spec.rb +10 -12
  355. data/spec/views/catalog/{_index_default.erb_spec.rb → _index.html.erb_spec.rb} +14 -15
  356. data/spec/views/catalog/{_index_header_default.html.erb_spec.rb → _index_header.html.erb_spec.rb} +6 -9
  357. data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +7 -30
  358. data/spec/views/catalog/_search_header.erb_spec.rb +1 -3
  359. data/spec/views/catalog/{_show_default.erb_spec.rb → _show.html.erb_spec.rb} +13 -14
  360. data/spec/views/catalog/_show_sidebar.erb_spec.rb +6 -9
  361. data/spec/views/catalog/_show_tools.html.erb_spec.rb +5 -5
  362. data/spec/views/catalog/_sort_and_per_page.html.erb_spec.rb +1 -2
  363. data/spec/views/catalog/_sort_widget.html.erb_spec.rb +3 -1
  364. data/spec/views/catalog/{_thumbnail_default.erb_spec.rb → _thumbnail.html.erb_spec.rb} +7 -9
  365. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +12 -10
  366. data/spec/views/catalog/email_success.html.erb_spec.rb +8 -0
  367. data/spec/views/catalog/facet.html.erb_spec.rb +4 -3
  368. data/spec/views/catalog/facet.json.jbuilder_spec.rb +3 -2
  369. data/spec/views/catalog/index.atom.builder_spec.rb +11 -6
  370. data/spec/views/catalog/index.html.erb_spec.rb +6 -8
  371. data/spec/views/catalog/index.json.jbuilder_spec.rb +119 -26
  372. data/spec/views/catalog/opensearch.xml.builder_spec.rb +1 -1
  373. data/spec/views/catalog/show.html.erb_spec.rb +8 -8
  374. data/spec/views/catalog/show.json.jbuilder_spec.rb +40 -0
  375. data/spec/views/catalog/sms_success.html.erb_spec.rb +8 -0
  376. data/spec/views/{_user_util_links.html.erb_spec.rb → shared/_user_util_links.html.erb_spec.rb} +4 -7
  377. data/tasks/blacklight.rake +8 -4
  378. data/template.demo.rb +3 -11
  379. metadata +175 -195
  380. data/app/assets/javascripts/blacklight/autofocus.js +0 -16
  381. data/app/assets/javascripts/blacklight/bookmark_toggle.js +0 -23
  382. data/app/assets/javascripts/blacklight/core.js +0 -30
  383. data/app/controllers/concerns/blacklight/request_builders.rb +0 -77
  384. data/app/controllers/concerns/blacklight/saved_searches.rb +0 -70
  385. data/app/controllers/concerns/blacklight/search_helper.rb +0 -161
  386. data/app/controllers/concerns/blacklight/suggest.rb +0 -25
  387. data/app/controllers/saved_searches_controller.rb +0 -4
  388. data/app/controllers/suggest_controller.rb +0 -4
  389. data/app/helpers/blacklight/deprecated_url_helper_behavior.rb +0 -57
  390. data/app/helpers/blacklight/render_partials_helper.rb +0 -205
  391. data/app/helpers/blacklight_configuration_helper.rb +0 -4
  392. data/app/helpers/blacklight_url_helper.rb +0 -4
  393. data/app/helpers/component_helper.rb +0 -4
  394. data/app/helpers/facets_helper.rb +0 -4
  395. data/app/helpers/hash_as_hidden_fields_helper.rb +0 -4
  396. data/app/helpers/layout_helper.rb +0 -4
  397. data/app/helpers/render_constraints_helper.rb +0 -4
  398. data/app/helpers/search_history_constraints_helper.rb +0 -4
  399. data/app/helpers/suggest_helper.rb +0 -4
  400. data/app/models/concerns/blacklight/solr/document/more_like_this.rb +0 -6
  401. data/app/views/_user_util_links.html.erb +0 -26
  402. data/app/views/blacklight/nav/_saved_searches.html.erb +0 -1
  403. data/app/views/catalog/_index_default.html.erb +0 -12
  404. data/app/views/catalog/_show_default.html.erb +0 -10
  405. data/app/views/catalog/_thumbnail_default.html.erb +0 -5
  406. data/app/views/saved_searches/index.html.erb +0 -32
  407. data/app/views/shared/_ajax_modal.html.erb +0 -6
  408. data/lib/generators/blacklight/solr4_generator.rb +0 -31
  409. data/lib/generators/blacklight/templates/config/jetty.yml +0 -13
  410. data/solr/conf/schema.xml +0 -627
  411. data/solr/conf/solrconfig.xml +0 -411
  412. data/spec/controllers/blacklight/search_helper_spec.rb +0 -489
  413. data/spec/controllers/saved_searches_controller_spec.rb +0 -32
  414. data/spec/controllers/suggest_controller_spec.rb +0 -17
  415. data/spec/features/saved_searches_spec.rb +0 -47
  416. data/spec/helpers/deprecated_url_helper_behavior_spec.rb +0 -101
  417. data/spec/lib/blacklight/utils_spec.rb +0 -167
  418. data/spec/models/blacklight/solr/document/more_like_this_spec.rb +0 -18
  419. data/spec/presenters/document_presenter_spec.rb +0 -438
  420. data/spec/support/backport_test.rb +0 -14
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Blacklight::Icon do
4
+ subject { described_class.new(:search, classes: 'awesome') }
5
+
6
+ describe '#svg' do
7
+ it 'returns a string' do
8
+ expect(subject.svg).to be_an String
9
+ end
10
+ it 'returns raw svg' do
11
+ expect(Capybara.string(subject.svg))
12
+ .to have_css 'svg title', text: 'Search'
13
+ end
14
+ end
15
+
16
+ describe '#options' do
17
+ it 'applies options classes and default class' do
18
+ expect(subject.options[:class]).to eq 'blacklight-icons awesome'
19
+ end
20
+ end
21
+
22
+ describe '#path' do
23
+ it 'prepends blacklight and sufixes .svg' do
24
+ expect(subject.path).to eq 'blacklight/search.svg'
25
+ end
26
+ end
27
+
28
+ describe 'file_source' do
29
+ context 'file is not available' do
30
+ subject { described_class.new(:yolo) }
31
+
32
+ it {
33
+ expect { subject.file_source }
34
+ .to raise_error(Blacklight::Exceptions::IconNotFound)
35
+ }
36
+ end
37
+
38
+ context 'file is available' do
39
+ it 'returns the filesource' do
40
+ expect(subject.file_source).to include '<svg'
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,28 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- describe Blacklight::SearchBuilder do
3
+ RSpec.describe Blacklight::SearchBuilder, api: true do
4
+ subject(:builder) { described_class.new processor_chain, scope }
5
+
4
6
  let(:processor_chain) { [] }
5
7
  let(:blacklight_config) { Blacklight::Configuration.new }
6
8
  let(:scope) { double blacklight_config: blacklight_config }
7
- subject { described_class.new processor_chain, scope }
8
9
 
9
10
  context "with default processor chain" do
10
- context "with two arguments" do
11
- subject do
12
- Deprecation.silence Blacklight::SearchBuilder do
13
- described_class.new true, scope
14
- end
15
- end
16
- it "uses the class-level default_processor_chain" do
17
- expect(subject.processor_chain).to eq []
18
- end
19
- end
11
+ subject { described_class.new scope }
20
12
 
21
- context "with one arguments" do
22
- subject { described_class.new scope }
23
- it "uses the class-level default_processor_chain" do
24
- expect(subject.processor_chain).to eq []
25
- end
13
+ it "uses the class-level default_processor_chain" do
14
+ expect(subject.processor_chain).to eq []
26
15
  end
27
16
  end
28
17
 
@@ -44,6 +33,7 @@ describe Blacklight::SearchBuilder do
44
33
 
45
34
  describe "#processor_chain" do
46
35
  let(:processor_chain) { [:a, :b, :c] }
36
+
47
37
  it "is mutable" do
48
38
  subject.processor_chain.insert(-1, :d)
49
39
  expect(subject.processor_chain).to match_array [:a, :b, :c, :d]
@@ -52,6 +42,7 @@ describe Blacklight::SearchBuilder do
52
42
 
53
43
  describe "#append" do
54
44
  let(:processor_chain) { [:a, :b, :c] }
45
+
55
46
  it "provides a new search builder with the processor chain" do
56
47
  builder = subject.append(:d, :e)
57
48
  expect(subject.processor_chain).to eq processor_chain
@@ -62,6 +53,7 @@ describe Blacklight::SearchBuilder do
62
53
 
63
54
  describe "#except" do
64
55
  let(:processor_chain) { [:a, :b, :c, :d, :e] }
56
+
65
57
  it "provide a new search builder excepting arguments" do
66
58
  builder = subject.except(:b, :d, :does_not_exist)
67
59
  expect(builder).not_to equal(subject)
@@ -82,11 +74,13 @@ describe Blacklight::SearchBuilder do
82
74
 
83
75
  describe "#merge" do
84
76
  let(:processor_chain) { [:pass_through] }
77
+
85
78
  before do
86
79
  allow(subject).to receive(:pass_through) do |req_params|
87
80
  req_params.replace subject.blacklight_params
88
81
  end
89
82
  end
83
+
90
84
  it "overwrites the processed parameters" do
91
85
  actual = subject.with(q: 'abc').merge(q: 'xyz')
92
86
  expect(actual[:q]).to eq 'xyz'
@@ -95,6 +89,7 @@ describe Blacklight::SearchBuilder do
95
89
 
96
90
  describe "#reverse_merge" do
97
91
  let(:processor_chain) { [:pass_through] }
92
+
98
93
  before do
99
94
  allow(subject).to receive(:pass_through) do |req_params|
100
95
  req_params.replace subject.blacklight_params
@@ -176,18 +171,38 @@ describe Blacklight::SearchBuilder do
176
171
  end
177
172
 
178
173
  describe "#sort" do
179
- it "passes through the sort parameter" do
180
- expect(subject.with(sort: 'x').send(:sort)).to eq 'x'
181
- end
174
+ context "when no sort parameter is given" do
175
+ subject(:sort) { builder.send(:sort) }
182
176
 
183
- it "uses the default if no sort parameter is given" do
184
- blacklight_config.default_sort_field = double(sort: 'x desc')
185
- expect(subject.send(:sort)).to eq 'x desc'
177
+ before do
178
+ blacklight_config.default_sort_field = double(sort: 'x desc')
179
+ end
180
+
181
+ it "uses the default" do
182
+ expect(sort).to eq 'x desc'
183
+ end
186
184
  end
187
185
 
188
- it "uses the requested sort field" do
189
- blacklight_config.add_sort_field 'x', sort: 'x asc'
190
- expect(subject.with(sort: 'x').send(:sort)).to eq 'x asc'
186
+ context "when the user provides an sort parameter" do
187
+ subject(:sort) { builder_with_param.send(:sort) }
188
+
189
+ let(:builder_with_param) { builder.with(sort: 'x') }
190
+
191
+ context "that is invalid" do
192
+ it "removes them" do
193
+ expect(sort).to be_nil
194
+ end
195
+ end
196
+
197
+ context "that is valid" do
198
+ before do
199
+ blacklight_config.add_sort_field 'x', sort: 'x asc'
200
+ end
201
+
202
+ it "uses the requested sort field" do
203
+ expect(sort).to eq 'x asc'
204
+ end
205
+ end
191
206
  end
192
207
  end
193
208
 
@@ -1,280 +1,288 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- describe "Blacklight::Solr::Document" do
4
- class MockDocument
5
- include Blacklight::Solr::Document
6
- end
3
+ RSpec.describe "Blacklight::Solr::Document", api: true do
4
+ class MockDocument
5
+ include Blacklight::Solr::Document
6
+ end
7
7
 
8
- module MockExtension
9
- def my_extension_method
10
- "my_extension_results"
11
- end
8
+ module MockExtension
9
+ def my_extension_method
10
+ "my_extension_results"
12
11
  end
12
+ end
13
13
 
14
- module MockSecondExtension
15
- def my_extension_method
16
- "override"
17
- end
14
+ module MockSecondExtension
15
+ def my_extension_method
16
+ "override"
18
17
  end
18
+ end
19
19
 
20
- context "Hashy methods" do
21
- it 'should create a doc with hashy methods' do
22
- doc = SolrDocument.new({'id'=>'SP2514N','inStock'=>true,'manu'=>'Samsung Electronics Co. Ltd.','name'=>'Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133','popularity'=>6,'price'=>92.0,'sku'=>'SP2514N','timestamp'=>'2009-03-20T14:42:49.795Z','cat'=>['electronics','hard drive'],'spell'=>['Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133'],'features'=>['7200RPM, 8MB cache, IDE Ultra ATA-133','NoiseGuard, SilentSeek technology, Fluid Dynamic Bearing (FDB) motor']})
20
+ context "Hashy methods" do
21
+ it 'creates a doc with hashy methods' do
22
+ doc = SolrDocument.new('id' => 'SP2514N', 'inStock' => true, 'manu' => 'Samsung Electronics Co. Ltd.', 'name' => 'Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133', 'popularity' => 6, 'price' => 92.0, 'sku' => 'SP2514N', 'timestamp' => '2009-03-20T14:42:49.795Z', 'cat' => ['electronics', 'hard drive'], 'spell' => ['Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133'], 'features' => ['7200RPM, 8MB cache, IDE Ultra ATA-133', 'NoiseGuard, SilentSeek technology, Fluid Dynamic Bearing (FDB) motor'])
23
23
 
24
- expect(doc.has?(:cat, /^elec/)).to eq true
25
- expect(doc.has?(:cat, 'elec')).not_to eq true
26
- expect(doc.has?(:cat, 'electronics')).to eq true
24
+ expect(doc.has?(:cat, /^elec/)).to eq true
25
+ expect(doc.has?(:cat, 'elec')).not_to eq true
26
+ expect(doc.has?(:cat, 'electronics')).to eq true
27
27
 
28
- expect(doc.fetch(:cat)).to eq ['electronics', 'hard drive']
29
- expect(doc.fetch(:xyz, nil)).to be_nil
30
- expect(doc.fetch(:xyz, 'def')).to eq 'def'
31
- expect(doc.fetch(:xyz) { |el| 'def' }).to eq 'def'
32
- expect { doc.fetch(:xyz) }.to raise_exception(KeyError)
33
- end
28
+ expect(doc.fetch(:cat)).to eq ['electronics', 'hard drive']
29
+ expect(doc.fetch(:xyz, nil)).to be_nil
30
+ expect(doc.fetch(:xyz, 'def')).to eq 'def'
31
+ expect(doc.fetch(:xyz) { |_el| 'def' }).to eq 'def'
32
+ expect { doc.fetch(:xyz) }.to raise_exception(KeyError)
34
33
  end
34
+ end
35
35
 
36
-
37
- context "Unique Key" do
38
- before(:each) do
39
- MockDocument.unique_key = 'my_unique_key'
40
- end
36
+ context "Unique Key" do
37
+ before do
38
+ MockDocument.unique_key = 'my_unique_key'
39
+ end
41
40
 
42
- after(:each) do
43
- MockDocument.unique_key = 'id'
44
- end
45
- it "should use a configuration-defined document unique key" do
46
- @document = MockDocument.new :id => 'asdf', :my_unique_key => '1234'
47
- expect(@document.id).to eq '1234'
48
- end
41
+ after do
42
+ MockDocument.unique_key = 'id'
43
+ end
49
44
 
45
+ it "uses a configuration-defined document unique key" do
46
+ @document = MockDocument.new id: 'asdf', my_unique_key: '1234'
47
+ expect(@document.id).to eq '1234'
50
48
  end
49
+ end
51
50
 
52
- describe "Primary key" do
53
- before(:each) do
54
- MockDocument.unique_key = 'my_unique_key'
55
- end
56
- after(:each) do
57
- MockDocument.unique_key = 'id'
58
- end
59
- it "should be the same as the unique key" do
60
- expect(MockDocument.primary_key).to eq MockDocument.unique_key
61
- end
51
+ describe "Primary key" do
52
+ before do
53
+ MockDocument.unique_key = 'my_unique_key'
62
54
  end
63
55
 
64
- describe "#to_param" do
65
- it "should be a string" do
66
- @document = MockDocument.new :id => 1234
67
- expect(@document.to_param).to eq '1234'
68
- end
56
+ after do
57
+ MockDocument.unique_key = 'id'
69
58
  end
70
59
 
71
- context "Extendability" do
72
- before(:each) do
73
- #Clear extensions
74
- MockDocument.registered_extensions = []
75
- end
76
-
77
- it "should let you register an extension" do
78
- MockDocument.use_extension(MockExtension) { |doc| true }
60
+ it "is the same as the unique key" do
61
+ expect(MockDocument.primary_key).to eq MockDocument.unique_key
62
+ end
63
+ end
79
64
 
80
- expect(MockDocument.registered_extensions.find {|a| a[:module_obj] == MockExtension}).not_to be_nil
81
- end
82
- it "should let you register an extension with a nil condition proc" do
83
- MockDocument.use_extension(MockExtension) { |doc| true }
84
- expect(MockDocument.registered_extensions.find {|a| a[:module_obj] == MockExtension}).not_to be_nil
85
- end
86
- it "should apply an extension whose condition is met" do
87
- MockDocument.use_extension(MockExtension) {|doc| true}
88
- doc = MockDocument.new()
65
+ describe "#to_param" do
66
+ it "is a string" do
67
+ @document = MockDocument.new id: 1234
68
+ expect(@document.to_param).to eq '1234'
69
+ end
70
+ end
89
71
 
90
- expect(doc.methods.find {|name| name.to_s == "my_extension_method"}).not_to be_nil
91
- expect(doc.my_extension_method.to_s).to eq "my_extension_results"
92
- end
93
- it "should apply an extension based on a Solr field" do
94
- MockDocument.use_extension(MockExtension) {|doc| doc.key?(:required_key)}
72
+ context "Extendability" do
73
+ before do
74
+ # Clear extensions
75
+ MockDocument.registered_extensions = []
76
+ end
95
77
 
96
- with_extension = MockDocument.new(:required_key => "value")
97
- expect(with_extension.my_extension_method.to_s).to eq "my_extension_results"
78
+ it "lets you register an extension" do
79
+ MockDocument.use_extension(MockExtension) { |_doc| true }
98
80
 
99
- without_extension = MockDocument.new(:other_key => "value")
100
- expect(without_extension.methods.find {|name| name.to_s == "my_extension_method"}).to be_nil
101
-
102
- end
103
- it "should not apply an extension whose condition is not met" do
104
- MockDocument.use_extension(MockExtension) {|doc| false}
105
- doc = MockDocument.new()
106
-
107
- expect(doc.methods.find {|name| name.to_s == "my_extension_method"}).to be_nil
108
- end
109
- it "should treat a nil condition as always applyable" do
110
- MockDocument.use_extension(MockExtension)
111
-
112
- doc = MockDocument.new()
113
-
114
- expect(doc.methods.find {|name | name.to_s =="my_extension_method"}).not_to be_nil
115
- expect(doc.my_extension_method).to eq "my_extension_results"
116
- end
117
- it "should let last extension applied override earlier extensions" do
118
- MockDocument.use_extension(MockExtension)
119
- MockDocument.use_extension(MockSecondExtension)
81
+ expect(MockDocument.registered_extensions.find { |a| a[:module_obj] == MockExtension }).not_to be_nil
82
+ end
83
+ it "lets you register an extension with a nil condition proc" do
84
+ MockDocument.use_extension(MockExtension) { |_doc| true }
85
+ expect(MockDocument.registered_extensions.find { |a| a[:module_obj] == MockExtension }).not_to be_nil
86
+ end
87
+ it "applies an extension whose condition is met" do
88
+ MockDocument.use_extension(MockExtension) { |_doc| true }
89
+ doc = MockDocument.new
120
90
 
121
- expect(MockDocument.new().my_extension_method.to_s).to eq "override"
122
- end
91
+ expect(doc.methods.find { |name| name.to_s == "my_extension_method" }).not_to be_nil
92
+ expect(doc.my_extension_method.to_s).to eq "my_extension_results"
93
+ end
94
+ it "applies an extension based on a Solr field" do
95
+ MockDocument.use_extension(MockExtension) { |doc| doc.key?(:required_key) }
123
96
 
124
- describe "extension_parameters class-level hash" do
125
- it "should provide an extension_parameters hash at the class level" do
126
- MockDocument.extension_parameters[:key] = "value"
127
- expect(MockDocument.extension_parameters[:key]).to eq "value"
128
- end
129
-
130
- it "extension_parameters should not be shared between classes" do
131
- class_one = Class.new do
132
- include Blacklight::Solr::Document
133
- end
134
- class_two = Class.new do
135
- include Blacklight::Solr::Document
136
- end
137
-
138
- class_one.extension_parameters[:key] = "class_one_value"
139
- class_two.extension_parameters[:key] = "class_two_value"
140
-
141
- expect(class_one.extension_parameters[:key]).to eq "class_one_value"
142
- end
143
- end
144
-
97
+ with_extension = MockDocument.new(required_key: "value")
98
+ expect(with_extension.my_extension_method.to_s).to eq "my_extension_results"
99
+
100
+ without_extension = MockDocument.new(other_key: "value")
101
+ expect(without_extension.methods.find { |name| name.to_s == "my_extension_method" }).to be_nil
145
102
  end
103
+ it "does not apply an extension whose condition is not met" do
104
+ MockDocument.use_extension(MockExtension) { |_doc| false }
105
+ doc = MockDocument.new
146
106
 
147
- context "Will export as" do
148
- class MockDocument
149
- include Blacklight::Solr::Document
107
+ expect(doc.methods.find { |name| name.to_s == "my_extension_method" }).to be_nil
108
+ end
109
+ it "treats a nil condition as always applyable" do
110
+ MockDocument.use_extension(MockExtension)
150
111
 
151
- def export_as_marc
152
- "fake_marc"
153
- end
154
- end
112
+ doc = MockDocument.new
155
113
 
156
- it "reports it's exportable formats properly" do
157
- doc = MockDocument.new
158
- doc.will_export_as(:marc, "application/marc" )
159
- expect(doc.export_formats).to have_key(:marc)
160
- expect(doc.export_formats[:marc][:content_type]).to eq "application/marc"
161
- end
114
+ expect(doc.methods.find { |name| name.to_s == "my_extension_method" }).not_to be_nil
115
+ expect(doc.my_extension_method).to eq "my_extension_results"
116
+ end
117
+ it "lets last extension applied override earlier extensions" do
118
+ MockDocument.use_extension(MockExtension)
119
+ MockDocument.use_extension(MockSecondExtension)
120
+
121
+ expect(MockDocument.new.my_extension_method.to_s).to eq "override"
122
+ end
162
123
 
163
- it "looks up content-type from Mime::Type if not given in arg" do
164
- doc = MockDocument.new
165
- doc.will_export_as(:html)
166
- expect(doc.export_formats).to have_key(:html)
124
+ describe "extension_parameters class-level hash" do
125
+ it "provides an extension_parameters hash at the class level" do
126
+ MockDocument.extension_parameters[:key] = "value"
127
+ expect(MockDocument.extension_parameters[:key]).to eq "value"
167
128
  end
168
129
 
169
- context "format not registered with Mime::Type" do
170
- before(:all) do
171
- @doc = MockDocument.new
172
- @doc.will_export_as(:mock2, "application/mock2" )
173
- # Mime::Type doesn't give us a good way to clean up our new
174
- # registration in an after, sorry.
130
+ it "extension_parameters should not be shared between classes" do
131
+ class_one = Class.new do
132
+ include Blacklight::Solr::Document
175
133
  end
176
- it "registers format" do
177
- expect(defined?("Mime::MOCK2")).to be_truthy
134
+ class_two = Class.new do
135
+ include Blacklight::Solr::Document
178
136
  end
179
- it "registers as alias only" do
180
- expect(Mime::Type.lookup("application/mock2")).not_to equal Mime::Type.lookup_by_extension("mock2")
181
- end
182
- end
183
137
 
184
- it "export_as(:format) by calling export_as_format" do
185
- doc = MockDocument.new
186
- doc.will_export_as(:marc, "application/marc")
187
- expect(doc.export_as(:marc)).to eq "fake_marc"
188
- end
189
-
190
- it "should know if a document is exportable" do
191
- doc = MockDocument.new
192
- doc.will_export_as(:marc, "application/marc")
193
- expect(doc.exports_as?(:marc)).to be true
138
+ class_one.extension_parameters[:key] = "class_one_value"
139
+ class_two.extension_parameters[:key] = "class_two_value"
140
+
141
+ expect(class_one.extension_parameters[:key]).to eq "class_one_value"
194
142
  end
195
143
  end
144
+ end
196
145
 
197
- context "to_semantic_fields" do
198
- class MockDocument
199
- include Blacklight::Solr::Document
200
- end
201
- before do
202
- MockDocument.field_semantics.merge!(
203
- title: ["title_field", "other_title"],
204
- author: "author_field",
205
- something: "something_field"
206
- )
207
-
208
- @doc1 = MockDocument.new(
209
- "title_field" => "doc1 title",
210
- "other_title" => "doc1 title other",
211
- "something_field" => ["val1", "val2"],
212
- "not_in_list_field" => "weird stuff"
213
- )
146
+ context "Will export as" do
147
+ class MockDocument
148
+ include Blacklight::Solr::Document
149
+
150
+ def export_as_marc
151
+ "fake_marc"
214
152
  end
153
+ end
154
+
155
+ it "reports it's exportable formats properly" do
156
+ doc = MockDocument.new
157
+ doc.will_export_as(:marc, "application/marc")
158
+ expect(doc.export_formats).to have_key(:marc)
159
+ expect(doc.export_formats[:marc][:content_type]).to eq "application/marc"
160
+ end
215
161
 
216
- it "should return complete dictionary based on config'd fields" do
217
- expect(@doc1.to_semantic_values)
218
- .to eq title: ["doc1 title", "doc1 title other"], something: ["val1", "val2"]
219
- end
220
- it "should return empty array for a key without a value" do
221
- expect(@doc1.to_semantic_values[:author]).to be_empty
222
- expect(@doc1.to_semantic_values[:nonexistent_token]).to be_empty
162
+ it "looks up content-type from Mime::Type if not given in arg" do
163
+ doc = MockDocument.new
164
+ doc.will_export_as(:html)
165
+ expect(doc.export_formats).to have_key(:html)
166
+ end
167
+
168
+ context "format not registered with Mime::Type" do
169
+ before(:all) do
170
+ @doc = MockDocument.new
171
+ @doc.will_export_as(:mock2, "application/mock2")
172
+ # Mime::Type doesn't give us a good way to clean up our new
173
+ # registration in an after, sorry.
223
174
  end
224
- it "should return an array even for a single-value field" do
225
- expect(@doc1.to_semantic_values[:title]).to be_kind_of(Array)
175
+
176
+ it "registers format" do
177
+ expect(defined?("Mime::MOCK2")).to be_truthy
226
178
  end
227
- it "should return complete array for a multi-value field" do
228
- expect(@doc1.to_semantic_values[:something]).to eq ["val1", "val2"]
179
+ it "registers as alias only" do
180
+ expect(Mime::Type.lookup("application/mock2")).not_to equal Mime::Type.lookup_by_extension("mock2")
229
181
  end
230
-
231
182
  end
232
183
 
233
- context "highlighting" do
184
+ it "export_as(:format) by calling export_as_format" do
185
+ doc = MockDocument.new
186
+ doc.will_export_as(:marc, "application/marc")
187
+ expect(doc.export_as(:marc)).to eq "fake_marc"
188
+ end
234
189
 
235
- before(:all) do
236
- @document = MockDocument.new({'id' => 'doc1', 'title_field' => 'doc1 title'}, {'highlighting' => { 'doc1' => { 'title_text' => ['doc <em>1</em>']}, 'doc2' => { 'title_text' => ['doc 2']}}})
190
+ it "knows if a document is exportable" do
191
+ doc = MockDocument.new
192
+ doc.will_export_as(:marc, "application/marc")
193
+ expect(doc.exports_as?(:marc)).to be true
194
+ end
195
+ end
237
196
 
238
- end
197
+ context "to_semantic_fields" do
198
+ class MockDocument
199
+ include Blacklight::Solr::Document
200
+ end
201
+ before do
202
+ MockDocument.field_semantics.merge!(
203
+ title: %w[title_field other_title],
204
+ author: "author_field",
205
+ something: "something_field"
206
+ )
207
+
208
+ @doc1 = MockDocument.new(
209
+ "title_field" => "doc1 title",
210
+ "other_title" => "doc1 title other",
211
+ "something_field" => %w[val1 val2],
212
+ "not_in_list_field" => "weird stuff"
213
+ )
214
+ end
239
215
 
240
- describe "#has_highlight_field?" do
241
- it "should be true if the highlight field is in the solr response" do
242
- expect(@document).to have_highlight_field 'title_text'
243
- expect(@document).to have_highlight_field :title_text
244
- end
216
+ it "returns complete dictionary based on config'd fields" do
217
+ expect(@doc1.to_semantic_values)
218
+ .to eq title: ["doc1 title", "doc1 title other"], something: %w[val1 val2]
219
+ end
220
+ it "returns empty array for a key without a value" do
221
+ expect(@doc1.to_semantic_values[:author]).to be_empty
222
+ expect(@doc1.to_semantic_values[:nonexistent_token]).to be_empty
223
+ end
224
+ it "returns an array even for a single-value field" do
225
+ expect(@doc1.to_semantic_values[:title]).to be_kind_of(Array)
226
+ end
227
+ it "returns complete array for a multi-value field" do
228
+ expect(@doc1.to_semantic_values[:something]).to eq %w[val1 val2]
229
+ end
230
+ end
245
231
 
246
- it "should be false if the highlight field isn't in the solr response" do
247
- expect(@document).to_not have_highlight_field 'nonexisting_field'
248
- end
232
+ context "highlighting" do
233
+ before(:all) do
234
+ @document = MockDocument.new({ 'id' => 'doc1', 'title_field' => 'doc1 title' }, 'highlighting' => { 'doc1' => { 'title_tsimext' => ['doc <em>1</em>'] }, 'doc2' => { 'title_tsimext' => ['doc 2'] } })
235
+ end
236
+
237
+ describe "#has_highlight_field?" do
238
+ it "is true if the highlight field is in the solr response" do
239
+ expect(@document).to have_highlight_field 'title_tsimext'
240
+ expect(@document).to have_highlight_field :title_tsimext
249
241
  end
250
242
 
251
- describe "#highlight_field" do
252
- it "should return a value" do
253
- expect(@document.highlight_field('title_text')).to include('doc <em>1</em>')
254
- end
243
+ it "is false if the highlight field isn't in the solr response" do
244
+ expect(@document).not_to have_highlight_field 'nonexisting_field'
245
+ end
246
+ end
255
247
 
248
+ describe "#highlight_field" do
249
+ it "returns a value" do
250
+ expect(@document.highlight_field('title_tsimext')).to include('doc <em>1</em>')
251
+ end
256
252
 
257
- it "should return a value that is html safe" do
258
- expect(@document.highlight_field('title_text').first).to be_html_safe
259
- end
253
+ it "returns a value that is html safe" do
254
+ expect(@document.highlight_field('title_tsimext').first).to be_html_safe
255
+ end
260
256
 
261
- it "should return nil when the field doesn't exist" do
262
- expect(@document.highlight_field('nonexisting_field')).to be_nil
263
- end
257
+ it "returns nil when the field doesn't exist" do
258
+ expect(@document.highlight_field('nonexisting_field')).to be_nil
264
259
  end
265
260
  end
261
+ end
266
262
 
267
263
  describe "#first" do
268
- it "should get the first value from a multi-valued field" do
269
- doc = SolrDocument.new :multi => ['a', 'b']
270
- expect(doc.first :multi).to eq("a")
264
+ it "gets the first value from a multi-valued field" do
265
+ doc = SolrDocument.new multi: %w[a b]
266
+ expect(doc.first(:multi)).to eq("a")
267
+ end
268
+
269
+ it "gets the value from a single-valued field" do
270
+ doc = SolrDocument.new single: 'a'
271
+ expect(doc.first(:single)).to eq("a")
271
272
  end
273
+ end
274
+
275
+ describe '#more_like_this' do
276
+ subject(:result) { document.more_like_this }
272
277
 
273
- it "should get the value from a single-valued field" do
274
- doc = SolrDocument.new :single => 'a'
275
- expect(doc.first :single).to eq("a")
278
+ let(:response) { instance_double(Blacklight::Solr::Response, more_like: [{ 'id' => 'abc' }]) }
279
+ let(:document) { MockDocument.new({ id: '123' }, response) }
276
280
 
281
+ it "plucks the MoreLikeThis results from the Solr Response" do
282
+ expect(result).to have(1).item
283
+ expect(result.first).to be_a_kind_of(MockDocument)
284
+ expect(result.first.id).to eq 'abc'
285
+ expect(result.first.solr_response).to eq response
277
286
  end
278
287
  end
279
-
280
288
  end