blacklight-spotlight 3.0.0.rc1 → 3.0.0.rc6

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 (338) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/assets/images/blacklight/arrow-alt-circle-left.svg +1 -0
  4. data/app/assets/images/blacklight/arrow-alt-circle-right.svg +1 -0
  5. data/app/assets/images/blacklight/close.svg +1 -0
  6. data/app/assets/images/blacklight/zoom_in.svg +1 -0
  7. data/app/assets/images/blacklight/zoom_out.svg +1 -0
  8. data/app/assets/javascripts/spotlight/admin/{add_new_page_button.js → add_new_button.js} +7 -0
  9. data/app/assets/javascripts/spotlight/admin/block_mixins/autocompleteable.js +4 -4
  10. data/app/assets/javascripts/spotlight/admin/blocks/browse_group_categories_block.js +88 -0
  11. data/app/assets/javascripts/spotlight/admin/blocks/pages_block.js +1 -1
  12. data/app/assets/javascripts/spotlight/admin/blocks/solr_documents_base_block.js +1 -1
  13. data/app/assets/javascripts/spotlight/admin/blocks/uploaded_items_block.js +8 -1
  14. data/app/assets/javascripts/spotlight/admin/catalog_edit.js +13 -47
  15. data/app/assets/javascripts/spotlight/admin/croppable.js +1 -1
  16. data/app/assets/javascripts/spotlight/admin/exhibit_tag_autocomplete.js +37 -0
  17. data/app/assets/javascripts/spotlight/admin/index.js +0 -2
  18. data/app/assets/javascripts/spotlight/admin/{reindex_monitor.js → progress_monitor.js} +26 -4
  19. data/app/assets/javascripts/spotlight/admin/search_typeahead.js +2 -2
  20. data/app/assets/javascripts/spotlight/admin/sir-trevor/locales.js +9 -2
  21. data/app/assets/javascripts/spotlight/user/browse_group_categories.js +59 -0
  22. data/app/assets/javascripts/spotlight/user/index.js +1 -0
  23. data/app/assets/javascripts/spotlight/user/zpr_links.js.erb +29 -14
  24. data/app/assets/stylesheets/spotlight/_breadcrumbs.scss +8 -0
  25. data/app/assets/stylesheets/spotlight/_browse.scss +8 -0
  26. data/app/assets/stylesheets/spotlight/_catalog.scss +34 -8
  27. data/app/assets/stylesheets/spotlight/_exhibit_admin.scss +9 -0
  28. data/app/assets/stylesheets/spotlight/_featured_browse_categories_block.scss +212 -84
  29. data/app/assets/stylesheets/spotlight/_item_text_block.scss +1 -1
  30. data/app/assets/stylesheets/spotlight/_modals.scss +3 -0
  31. data/app/assets/stylesheets/spotlight/_nestable.scss +8 -0
  32. data/app/assets/stylesheets/spotlight/_pages.scss +9 -4
  33. data/app/assets/stylesheets/spotlight/_spotlight.scss +4 -0
  34. data/app/assets/stylesheets/spotlight/_translations.scss +6 -0
  35. data/app/assets/stylesheets/spotlight/_view_larger.scss +22 -0
  36. data/app/assets/stylesheets/spotlight/browse_group_categories_block.scss +92 -0
  37. data/app/assets/stylesheets/spotlight/typeahead.css +23 -23
  38. data/app/builders/spotlight/bootstrap_breadcrumbs_builder.rb +5 -4
  39. data/app/controllers/concerns/spotlight/base.rb +1 -1
  40. data/app/controllers/concerns/spotlight/catalog.rb +7 -1
  41. data/app/controllers/concerns/spotlight/search_helper.rb +2 -8
  42. data/app/controllers/spotlight/appearances_controller.rb +0 -13
  43. data/app/controllers/spotlight/browse_controller.rb +15 -17
  44. data/app/controllers/spotlight/bulk_actions_controller.rb +62 -0
  45. data/app/controllers/spotlight/bulk_updates_controller.rb +67 -0
  46. data/app/controllers/spotlight/catalog_controller.rb +17 -14
  47. data/app/controllers/spotlight/concerns/application_controller.rb +13 -2
  48. data/app/controllers/spotlight/dashboards_controller.rb +5 -4
  49. data/app/controllers/spotlight/exhibits_controller.rb +1 -1
  50. data/app/controllers/spotlight/featured_images_controller.rb +1 -1
  51. data/app/controllers/spotlight/groups_controller.rb +80 -0
  52. data/app/controllers/spotlight/job_trackers_controller.rb +17 -0
  53. data/app/controllers/spotlight/pages_controller.rb +8 -13
  54. data/app/controllers/spotlight/searches_controller.rb +4 -17
  55. data/app/controllers/spotlight/tags_controller.rb +39 -5
  56. data/app/helpers/spotlight/application_helper.rb +21 -2
  57. data/app/helpers/spotlight/crud_link_helpers.rb +1 -1
  58. data/app/helpers/spotlight/job_trackers_helper.rb +31 -0
  59. data/app/helpers/spotlight/main_app_helpers.rb +4 -5
  60. data/app/helpers/spotlight/meta_helper.rb +2 -2
  61. data/app/helpers/spotlight/pages_helper.rb +1 -8
  62. data/app/helpers/spotlight/roles_helper.rb +1 -1
  63. data/app/helpers/spotlight/searches_helper.rb +1 -1
  64. data/app/jobs/concerns/spotlight/gather_documents.rb +35 -0
  65. data/app/jobs/concerns/spotlight/job_tracking.rb +64 -0
  66. data/app/jobs/concerns/spotlight/limit_concurrency.rb +33 -0
  67. data/app/jobs/spotlight/add_tags_job.rb +31 -0
  68. data/app/jobs/spotlight/add_uploads_from_csv.rb +4 -3
  69. data/app/jobs/spotlight/application_job.rb +8 -0
  70. data/app/jobs/spotlight/change_visibility_job.rb +33 -0
  71. data/app/jobs/spotlight/cleanup_job_trackers_job.rb +13 -0
  72. data/app/jobs/spotlight/default_thumbnail_job.rb +1 -3
  73. data/app/jobs/spotlight/process_bulk_updates_csv_job.rb +82 -0
  74. data/app/jobs/spotlight/reindex_exhibit_job.rb +39 -0
  75. data/app/jobs/spotlight/reindex_job.rb +64 -44
  76. data/app/jobs/spotlight/remove_tags_job.rb +31 -0
  77. data/app/jobs/spotlight/rename_sidecar_field_job.rb +3 -2
  78. data/app/jobs/spotlight/rename_tags_job.rb +33 -0
  79. data/app/jobs/spotlight/update_job_trackers_job.rb +20 -0
  80. data/app/models/concerns/spotlight/browse_category_search_builder.rb +59 -0
  81. data/app/models/concerns/spotlight/exhibit_analytics.rb +2 -6
  82. data/app/models/concerns/spotlight/exhibit_defaults.rb +1 -1
  83. data/app/models/concerns/spotlight/exhibit_documents.rb +2 -2
  84. data/app/models/concerns/spotlight/resources/web.rb +1 -1
  85. data/app/models/concerns/spotlight/search_builder.rb +11 -0
  86. data/app/models/concerns/spotlight/solr_document.rb +1 -1
  87. data/app/models/concerns/spotlight/solr_document/atomic_updates.rb +2 -2
  88. data/app/models/concerns/spotlight/user.rb +7 -2
  89. data/app/models/sir_trevor_rails/blocks/browse_group_categories_block.rb +25 -0
  90. data/app/models/sir_trevor_rails/blocks/solr_documents_block.rb +9 -0
  91. data/app/models/sir_trevor_rails/blocks/uploaded_items_block.rb +4 -0
  92. data/app/models/spotlight/ability.rb +8 -2
  93. data/app/models/spotlight/about_page.rb +1 -1
  94. data/app/models/spotlight/attachment.rb +1 -1
  95. data/app/models/spotlight/background_job_progress.rb +96 -0
  96. data/app/models/spotlight/blacklight_configuration.rb +28 -7
  97. data/app/models/spotlight/bulk_update.rb +8 -0
  98. data/app/models/spotlight/event.rb +13 -0
  99. data/app/models/spotlight/exhibit.rb +15 -12
  100. data/app/models/spotlight/feature_page.rb +1 -3
  101. data/app/models/spotlight/featured_image.rb +8 -2
  102. data/app/models/spotlight/field_metadata.rb +4 -8
  103. data/app/models/spotlight/group.rb +22 -0
  104. data/app/models/spotlight/group_member.rb +11 -0
  105. data/app/models/spotlight/home_page.rb +1 -1
  106. data/app/models/spotlight/job_tracker.rb +114 -0
  107. data/app/models/spotlight/page.rb +3 -5
  108. data/app/models/spotlight/page_configurations.rb +15 -9
  109. data/app/models/spotlight/resource.rb +28 -62
  110. data/app/models/spotlight/resources/iiif_harvester.rb +12 -3
  111. data/app/models/spotlight/resources/iiif_manifest.rb +9 -7
  112. data/app/models/spotlight/resources/iiif_service.rb +9 -2
  113. data/app/models/spotlight/resources/json_upload.rb +12 -0
  114. data/app/models/spotlight/resources/upload.rb +25 -2
  115. data/app/models/spotlight/role.rb +1 -2
  116. data/app/models/spotlight/search.rb +5 -0
  117. data/app/models/spotlight/solr_document_sidecar.rb +2 -1
  118. data/app/presenters/spotlight/iiif_manifest_presenter.rb +2 -2
  119. data/app/services/spotlight/bulk_updates_csv_template_service.rb +93 -0
  120. data/app/services/spotlight/etl.rb +7 -0
  121. data/app/services/spotlight/etl/context.rb +52 -0
  122. data/app/services/spotlight/etl/executor.rb +192 -0
  123. data/app/services/spotlight/etl/loaders.rb +12 -0
  124. data/app/services/spotlight/etl/pipeline.rb +81 -0
  125. data/app/services/spotlight/etl/solr_loader.rb +96 -0
  126. data/app/services/spotlight/etl/sources.rb +25 -0
  127. data/app/services/spotlight/etl/step.rb +82 -0
  128. data/app/services/spotlight/etl/transforms.rb +64 -0
  129. data/app/services/spotlight/exhibit_import_export_service.rb +50 -22
  130. data/app/services/spotlight/iiif_resource_resolver.rb +1 -1
  131. data/app/services/spotlight/validity_checker.rb +5 -5
  132. data/app/uploaders/spotlight/bulk_updates_uploader.rb +7 -0
  133. data/app/uploaders/spotlight/featured_image_uploader.rb +1 -1
  134. data/app/views/catalog/_add_tags.html.erb +28 -0
  135. data/app/views/catalog/_bulk_actions.html.erb +12 -0
  136. data/app/views/catalog/_change_visibility.html.erb +35 -0
  137. data/app/views/catalog/_curator_actions.html.erb +3 -0
  138. data/app/views/catalog/_remove_tags.html.erb +37 -0
  139. data/app/views/catalog/_save_search.html.erb +1 -1
  140. data/app/views/spotlight/about_pages/_empty.html.erb +5 -5
  141. data/app/views/spotlight/browse/_search.html.erb +2 -1
  142. data/app/views/spotlight/browse/_search_box.html.erb +9 -9
  143. data/app/views/spotlight/browse/index.html.erb +13 -0
  144. data/app/views/spotlight/bulk_updates/_download.html.erb +23 -0
  145. data/app/views/spotlight/bulk_updates/_overview.html.erb +1 -0
  146. data/app/views/spotlight/bulk_updates/_progress_panel.html.erb +19 -0
  147. data/app/views/spotlight/bulk_updates/_upload.html.erb +12 -0
  148. data/app/views/spotlight/bulk_updates/edit.html.erb +37 -0
  149. data/app/views/spotlight/catalog/_admin_header.html.erb +1 -1
  150. data/app/views/spotlight/catalog/_admin_index_header_default.html.erb +1 -1
  151. data/app/views/spotlight/catalog/_admin_thumbnail_default.html.erb +3 -2
  152. data/app/views/spotlight/catalog/_document.html.erb +2 -4
  153. data/app/views/spotlight/catalog/_edit_default.html.erb +2 -2
  154. data/app/views/spotlight/catalog/_reindex_progress_panel.html.erb +1 -1
  155. data/app/views/spotlight/catalog/index.iiif_json.jbuilder +22 -0
  156. data/app/views/spotlight/contacts/_form.html.erb +1 -1
  157. data/app/views/spotlight/custom_fields/_form.html.erb +1 -1
  158. data/app/views/spotlight/custom_search_fields/_form.html.erb +1 -1
  159. data/app/views/spotlight/dashboards/_reindexing_activity.html.erb +6 -6
  160. data/app/views/spotlight/exhibits/_exhibit_card.html.erb +1 -1
  161. data/app/views/spotlight/feature_pages/_empty.html.erb +5 -5
  162. data/app/views/spotlight/featured_images/_form.html.erb +2 -2
  163. data/app/views/spotlight/featured_images/_upload_form.html.erb +1 -1
  164. data/app/views/spotlight/home_pages/_empty.html.erb +3 -3
  165. data/app/views/spotlight/job_trackers/show.html.erb +79 -0
  166. data/app/views/spotlight/metadata_configurations/_metadata_field.html.erb +2 -2
  167. data/app/views/spotlight/pages/_form.html.erb +2 -2
  168. data/app/views/spotlight/pages/_view_type_group.html.erb +3 -3
  169. data/app/views/spotlight/resources/_form.html.erb +1 -1
  170. data/app/views/spotlight/resources/csv_upload/_form.html.erb +1 -1
  171. data/app/views/spotlight/resources/iiif/_form.html.erb +1 -1
  172. data/app/views/spotlight/resources/json_upload/_form.html.erb +2 -2
  173. data/app/views/spotlight/resources/upload/_form.html.erb +1 -1
  174. data/app/views/spotlight/search_configurations/_document_index_view_types.html.erb +2 -2
  175. data/app/views/spotlight/searches/_form.html.erb +14 -2
  176. data/app/views/spotlight/searches/_group.html.erb +27 -0
  177. data/app/views/spotlight/searches/index.html.erb +58 -17
  178. data/app/views/spotlight/shared/_curation_sidebar.html.erb +3 -0
  179. data/app/views/spotlight/shared/_locale_picker.html.erb +1 -1
  180. data/app/views/spotlight/sir_trevor/blocks/_browse_group_categories_block.html.erb +45 -0
  181. data/app/views/spotlight/sir_trevor/blocks/_solr_documents_block.html.erb +8 -8
  182. data/app/views/spotlight/sir_trevor/blocks/_solr_documents_carousel_block.html.erb +7 -7
  183. data/app/views/spotlight/sir_trevor/blocks/_solr_documents_features_block.html.erb +9 -7
  184. data/app/views/spotlight/sir_trevor/blocks/_solr_documents_grid_block.html.erb +5 -5
  185. data/app/views/spotlight/sir_trevor/blocks/_uploaded_items_block.html.erb +4 -0
  186. data/app/views/spotlight/tags/_tag.html.erb +24 -0
  187. data/app/views/spotlight/tags/index.html.erb +12 -16
  188. data/app/views/spotlight/translations/_groups.html.erb +34 -0
  189. data/app/views/spotlight/translations/_import.html.erb +5 -5
  190. data/app/views/spotlight/translations/edit.html.erb +6 -0
  191. data/app/views/spotlight/translations/show.yaml.yamlbuilder +6 -0
  192. data/config/i18n-tasks.yml +6 -0
  193. data/config/locales/spotlight.ar.yml +11 -1
  194. data/config/locales/spotlight.en.yml +283 -87
  195. data/config/routes.rb +39 -1
  196. data/db/migrate/20210113092223_create_spotlight_groups.rb +23 -0
  197. data/db/migrate/20210122082032_create_job_trackers.rb +22 -0
  198. data/db/migrate/20210126123041_create_events.rb +15 -0
  199. data/db/migrate/20210305070001_remove_class_from_sirtrevor_image_blocks.rb +20 -0
  200. data/db/migrate/20210305171150_create_bulk_updates.rb +9 -0
  201. data/db/migrate/20210308090000_migrate_caption_values_for_title_key.rb +29 -0
  202. data/lib/generators/spotlight/install_generator.rb +5 -5
  203. data/lib/generators/spotlight/scaffold_resource_generator.rb +5 -13
  204. data/lib/generators/spotlight/templates/config/initializers/riiif.rb +7 -5
  205. data/lib/generators/spotlight/templates/config/initializers/spotlight_initializer.rb +1 -1
  206. data/lib/generators/spotlight/templates/solr/config/schema.xml +1 -1
  207. data/lib/migration/iiif.rb +3 -3
  208. data/lib/spotlight/engine.rb +26 -4
  209. data/lib/spotlight/version.rb +1 -1
  210. data/spec/controllers/spotlight/about_pages_controller_spec.rb +3 -3
  211. data/spec/controllers/spotlight/browse_controller_spec.rb +23 -6
  212. data/spec/controllers/spotlight/bulk_actions_controller_spec.rb +124 -0
  213. data/spec/controllers/spotlight/bulk_updates_controller_spec.rb +77 -0
  214. data/spec/controllers/spotlight/catalog_controller_spec.rb +15 -13
  215. data/spec/controllers/spotlight/contacts_controller_spec.rb +2 -2
  216. data/spec/controllers/spotlight/feature_pages_controller_spec.rb +11 -0
  217. data/spec/controllers/spotlight/featured_images_controller_spec.rb +3 -3
  218. data/spec/controllers/spotlight/groups_controller_spec.rb +103 -0
  219. data/spec/controllers/spotlight/home_pages_controller_spec.rb +1 -1
  220. data/spec/controllers/spotlight/job_trackers_controller_spec.rb +37 -0
  221. data/spec/controllers/spotlight/searches_controller_spec.rb +10 -3
  222. data/spec/controllers/spotlight/tags_controller_spec.rb +5 -1
  223. data/spec/controllers/spotlight/view_configurations_controller_spec.rb +1 -1
  224. data/spec/examples.txt +1501 -1410
  225. data/spec/factories/bulk_updates.rb +15 -0
  226. data/spec/factories/exhibits.rb +4 -0
  227. data/spec/factories/group.rb +17 -0
  228. data/spec/factories/job_trackers.rb +11 -0
  229. data/spec/factories/searches.rb +11 -1
  230. data/spec/factories/users.rb +27 -8
  231. data/spec/features/add_items_spec.rb +10 -5
  232. data/spec/features/browse_category_admin_spec.rb +37 -5
  233. data/spec/features/browse_category_navigation_spec.rb +44 -0
  234. data/spec/features/browse_category_spec.rb +2 -2
  235. data/spec/features/bulk_actions_spec.rb +72 -0
  236. data/spec/features/catalog_spec.rb +3 -2
  237. data/spec/features/dashboard_spec.rb +2 -2
  238. data/spec/features/edit_search_fields_spec.rb +2 -2
  239. data/spec/features/exhibits/edit_metadata_fields_spec.rb +1 -1
  240. data/spec/features/exhibits/translation_editing_spec.rb +55 -6
  241. data/spec/features/home_page_spec.rb +5 -5
  242. data/spec/features/import_exhibit_spec.rb +5 -1
  243. data/spec/features/item_admin_spec.rb +4 -4
  244. data/spec/features/javascript/about_page_admin_spec.rb +1 -1
  245. data/spec/features/javascript/block_controls_spec.rb +1 -1
  246. data/spec/features/javascript/blocks/browse_group_categories_block_spec.rb +64 -0
  247. data/spec/features/javascript/blocks/solr_documents_block_spec.rb +4 -4
  248. data/spec/features/javascript/blocks/uploaded_items_block_spec.rb +27 -1
  249. data/spec/features/javascript/browse_group_admin_spec.rb +45 -0
  250. data/spec/features/javascript/edit_in_place_spec.rb +3 -3
  251. data/spec/features/javascript/feature_page_admin_spec.rb +1 -1
  252. data/spec/features/javascript/reindex_monitor_spec.rb +1 -1
  253. data/spec/features/javascript/search_config_admin_spec.rb +1 -1
  254. data/spec/features/report_a_problem_spec.rb +1 -1
  255. data/spec/features/site_users_management_spec.rb +5 -5
  256. data/spec/fixtures/bulk-update-template.csv +57 -0
  257. data/spec/fixtures/updated-bulk-update-template-w-tags.csv +4 -0
  258. data/spec/fixtures/updated-bulk-update-template.csv +4 -0
  259. data/spec/helpers/spotlight/application_helper_spec.rb +5 -6
  260. data/spec/helpers/spotlight/crud_link_helpers_spec.rb +3 -3
  261. data/spec/helpers/spotlight/pages_helper_spec.rb +8 -15
  262. data/spec/helpers/spotlight/roles_helper_spec.rb +1 -1
  263. data/spec/i18n_spec.rb +1 -0
  264. data/spec/jobs/spotlight/add_tags_job_spec.rb +34 -0
  265. data/spec/jobs/spotlight/add_uploads_from_csv_spec.rb +4 -1
  266. data/spec/jobs/spotlight/change_visibility_job_spec.rb +30 -0
  267. data/spec/jobs/spotlight/process_bulk_updates_csv_job_spec.rb +78 -0
  268. data/spec/jobs/spotlight/reindex_exhibit_job_spec.rb +43 -0
  269. data/spec/jobs/spotlight/reindex_job_spec.rb +34 -60
  270. data/spec/jobs/spotlight/remove_tags_job_spec.rb +39 -0
  271. data/spec/lib/migration/iiif_spec.rb +1 -1
  272. data/spec/models/sir_trevor_rails/blocks/browse_group_categories_block_spec.rb +41 -0
  273. data/spec/models/spotlight/ability_spec.rb +27 -0
  274. data/spec/models/spotlight/background_job_progress_spec.rb +137 -0
  275. data/spec/models/spotlight/blacklight_configuration_spec.rb +22 -17
  276. data/spec/models/spotlight/browse_category_search_builder_spec.rb +49 -0
  277. data/spec/models/spotlight/exhibit_spec.rb +13 -59
  278. data/spec/models/spotlight/featured_image_spec.rb +1 -1
  279. data/spec/models/spotlight/group_spec.rb +19 -0
  280. data/spec/models/spotlight/main_navigation_spec.rb +1 -1
  281. data/spec/models/spotlight/resource_spec.rb +89 -87
  282. data/spec/models/spotlight/resources/iiif_harvester_spec.rb +9 -10
  283. data/spec/models/spotlight/role_spec.rb +1 -1
  284. data/spec/models/spotlight/search_spec.rb +30 -3
  285. data/spec/models/spotlight/solr_document/atomic_updates_spec.rb +10 -0
  286. data/spec/models/spotlight/solr_document_sidecar_spec.rb +1 -0
  287. data/spec/presenters/spotlight/iiif_manifest_presenter_spec.rb +1 -1
  288. data/spec/services/spotlight/bulk_updates_csv_template_service_spec.rb +26 -0
  289. data/spec/services/spotlight/etl/context_spec.rb +66 -0
  290. data/spec/services/spotlight/etl/executor_spec.rb +149 -0
  291. data/spec/services/spotlight/etl/pipeline_spec.rb +22 -0
  292. data/spec/services/spotlight/etl/solr_loader_spec.rb +76 -0
  293. data/spec/services/spotlight/etl/step_spec.rb +70 -0
  294. data/spec/services/spotlight/exhibit_import_export_service_spec.rb +48 -1
  295. data/spec/spec_helper.rb +3 -6
  296. data/spec/support/features/test_features_helpers.rb +15 -0
  297. data/spec/test_app_templates/Gemfile.extra +2 -0
  298. data/spec/test_app_templates/catalog_controller.rb +6 -3
  299. data/spec/test_app_templates/lib/generators/test_app_generator.rb +2 -2
  300. data/spec/uploaders/spotlight/featured_image_uploader_spec.rb +2 -2
  301. data/spec/views/shared/_exhibit_navbar.html.erb_spec.rb +1 -1
  302. data/spec/views/spotlight/browse/index.html.erb_spec.rb +2 -0
  303. data/spec/views/spotlight/catalog/_edit_default.html.erb_spec.rb +1 -1
  304. data/spec/views/spotlight/dashboards/_analytics.html.erb_spec.rb +1 -1
  305. data/spec/views/spotlight/dashboards/_reindexing_activity.html.erb_spec.rb +30 -25
  306. data/spec/views/spotlight/job_trackers/show.html.erb_spec.rb +65 -0
  307. data/spec/views/spotlight/metadata_configurations/_metadata_field.html.erb_spec.rb +3 -4
  308. data/spec/views/spotlight/pages/show.html.erb_spec.rb +1 -0
  309. data/spec/views/spotlight/search_configurations/_facets.html.erb_spec.rb +1 -1
  310. data/spec/views/spotlight/sir_trevor/blocks/_browse_block.html.erb_spec.rb +1 -1
  311. data/spec/views/spotlight/sir_trevor/blocks/_iframe_block.html.erb_spec.rb +1 -1
  312. data/spec/views/spotlight/sir_trevor/blocks/_link_to_search_block.html.erb_spec.rb +1 -1
  313. data/spec/views/spotlight/sir_trevor/blocks/_rule_block.html.erb_spec.rb +1 -1
  314. data/spec/views/spotlight/sir_trevor/blocks/_solr_documents_block.html.erb_spec.rb +8 -4
  315. data/spec/views/spotlight/sir_trevor/blocks/_solr_documents_carousel_block.html.erb_spec.rb +7 -2
  316. data/spec/views/spotlight/sir_trevor/blocks/_solr_documents_embed_block.html.erb_spec.rb +8 -5
  317. data/spec/views/spotlight/sir_trevor/blocks/_solr_documents_features_block.html.erb_spec.rb +3 -2
  318. data/spec/views/spotlight/sir_trevor/blocks/_solr_documents_grid_block.html.erb_spec.rb +9 -4
  319. data/spec/views/spotlight/tags/index.html.erb_spec.rb +5 -2
  320. data/vendor/assets/javascripts/tiny-slider.js +3218 -0
  321. data/vendor/assets/stylesheets/tiny-slider.css +1 -0
  322. metadata +471 -281
  323. data/app/assets/images/blacklight/add_circle.svg +0 -1
  324. data/app/assets/images/blacklight/custom_fullscreen.svg +0 -1
  325. data/app/assets/images/blacklight/remove_circle.svg +0 -1
  326. data/app/assets/images/blacklight/resize_small.svg +0 -1
  327. data/app/models/concerns/spotlight/resources/open_graph.rb +0 -36
  328. data/app/models/spotlight/reindex_progress.rb +0 -78
  329. data/app/models/spotlight/reindexing_log_entry.rb +0 -42
  330. data/app/services/spotlight/resources/iiif_builder.rb +0 -19
  331. data/app/services/spotlight/solr_document_builder.rb +0 -77
  332. data/app/services/spotlight/upload_solr_document_builder.rb +0 -57
  333. data/spec/factories/reindexing_log_entries.rb +0 -54
  334. data/spec/models/spotlight/reindex_progress_spec.rb +0 -122
  335. data/spec/models/spotlight/reindexing_log_entry_spec.rb +0 -129
  336. data/spec/models/spotlight/resources/open_graph_spec.rb +0 -65
  337. data/spec/services/spotlight/solr_document_builder_spec.rb +0 -66
  338. data/vendor/assets/javascripts/handlebars-v1.3.0.js +0 -2746
@@ -4,6 +4,8 @@ describe Spotlight::BrowseController, type: :controller do
4
4
  routes { Spotlight::Engine.routes }
5
5
  let(:exhibit) { FactoryBot.create(:exhibit) }
6
6
  let!(:search) { FactoryBot.create(:published_search, exhibit: exhibit) }
7
+ let(:group) { FactoryBot.create(:group, published: true, title: 'Good group', exhibit: exhibit, searches: [search]) }
8
+ let(:group_unpublished) { FactoryBot.create(:group, title: 'Secret group', exhibit: exhibit, searches: [search]) }
7
9
  let!(:unpublished) { FactoryBot.create(:search, exhibit: exhibit) }
8
10
  let(:admin) { FactoryBot.create(:site_admin) }
9
11
 
@@ -53,6 +55,16 @@ describe Spotlight::BrowseController, type: :controller do
53
55
  expect(assigns[:exhibit]).to eq exhibit
54
56
  expect(response).to render_template 'spotlight/browse/index'
55
57
  end
58
+
59
+ it 'includes the browse groups' do
60
+ expect(controller).to receive(:add_breadcrumb).with('Home', exhibit)
61
+ expect(controller).to receive(:add_breadcrumb).with('Browse', exhibit_browse_index_path(exhibit))
62
+ expect(controller).to receive(:add_breadcrumb).with('Good group', exhibit_browse_groups_path(exhibit, group))
63
+ get :index, params: { exhibit_id: exhibit, group_id: group.id }
64
+ expect(response).to be_successful
65
+ expect(assigns[:groups]).to eq [group]
66
+ expect(response).to render_template 'spotlight/browse/index'
67
+ end
56
68
  end
57
69
  end
58
70
 
@@ -90,6 +102,17 @@ describe Spotlight::BrowseController, type: :controller do
90
102
  expect(response).to render_template 'spotlight/browse/show'
91
103
  end
92
104
 
105
+ it 'includes the browse group when a group_id is provided' do
106
+ expect(controller).to receive(:add_breadcrumb).with('Home', exhibit)
107
+ expect(controller).to receive(:add_breadcrumb).with('Browse', exhibit_browse_index_path(exhibit))
108
+ expect(controller).to receive(:add_breadcrumb).with('Good group', exhibit_browse_groups_path(exhibit, group))
109
+ expect(controller).to receive(:add_breadcrumb).with(search.title, exhibit_browse_group_path(exhibit, group, search))
110
+ get :show, params: { id: search, exhibit_id: exhibit, group_id: group.id }
111
+ expect(response).to be_successful
112
+ expect(assigns[:group]).to eq group
113
+ expect(response).to render_template 'spotlight/browse/show'
114
+ end
115
+
93
116
  it 'removes all the document actions' do
94
117
  get :show, params: { id: search, exhibit_id: exhibit }
95
118
  expect(controller.blacklight_config.index.document_actions).to be_blank
@@ -105,12 +128,6 @@ describe Spotlight::BrowseController, type: :controller do
105
128
  get :show, params: { id: search, exhibit_id: exhibit }
106
129
  expect(controller.blacklight_config.index.document_actions).to match_array %i[a b c]
107
130
  end
108
-
109
- it 'has a json response' do
110
- get :show, params: { id: search, exhibit_id: exhibit, format: :json }
111
- expect(assigns[:presenter]).to be_a Blacklight::JsonPresenter
112
- expect(response).to render_template 'catalog/index'
113
- end
114
131
  end
115
132
  end
116
133
  end
@@ -0,0 +1,124 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe Spotlight::BulkActionsController, type: :controller do
4
+ routes { Spotlight::Engine.routes }
5
+ let(:exhibit) { FactoryBot.create(:skinny_exhibit) }
6
+
7
+ # rubocop:disable RSpec/BeforeAfterAll
8
+ before(:all) do
9
+ ActiveJob::Base.queue_adapter = :test
10
+ end
11
+
12
+ after(:all) do
13
+ ActiveJob::Base.queue_adapter = :inline
14
+ end
15
+ # rubocop:enable RSpec/BeforeAfterAll
16
+
17
+ describe 'when the user is not authorized' do
18
+ before do
19
+ sign_in FactoryBot.create(:exhibit_visitor)
20
+ end
21
+
22
+ describe 'POST change_visibility' do
23
+ it 'denies access' do
24
+ post :change_visibility, params: { exhibit_id: exhibit }
25
+ expect(response).to redirect_to main_app.root_path
26
+ expect(flash[:alert]).to be_present
27
+ end
28
+ end
29
+
30
+ describe 'POST add_tags' do
31
+ it 'denies access' do
32
+ post :add_tags, params: { exhibit_id: exhibit }
33
+ expect(response).to redirect_to main_app.root_path
34
+ expect(flash[:alert]).to be_present
35
+ end
36
+ end
37
+
38
+ describe 'POST remove_tags' do
39
+ it 'denies access' do
40
+ post :remove_tags, params: { exhibit_id: exhibit }
41
+ expect(response).to redirect_to main_app.root_path
42
+ expect(flash[:alert]).to be_present
43
+ end
44
+ end
45
+ end
46
+
47
+ describe 'when the user is a curator' do
48
+ before do
49
+ sign_in FactoryBot.create(:exhibit_curator, exhibit: exhibit)
50
+ end
51
+
52
+ let(:search) { FactoryBot.create(:search, exhibit: exhibit) }
53
+ let(:search_session) { instance_double('Blacklight::Search', query_params: { q: 'map' }) }
54
+
55
+ describe 'POST change_visibility' do
56
+ it 'redirects and sets a notice' do
57
+ allow(controller).to receive(:current_search_session).and_return(search_session)
58
+ request.env['HTTP_REFERER'] = '/referring_url'
59
+ post :change_visibility, params: { 'visibility' => 'private', 'q' => 'map', exhibit_id: exhibit }
60
+ expect(response).to redirect_to '/referring_url'
61
+ expect(flash[:notice]).to eq 'Visibility of 55 items is being updated.'
62
+ end
63
+
64
+ # rubocop:disable Style/MultilineBlockChain
65
+ it 'enqueues the job' do
66
+ allow(controller).to receive(:current_search_session).and_return(search_session)
67
+ expect do
68
+ post :change_visibility, params: { 'visibility' => 'private', 'q' => 'map', exhibit_id: exhibit }
69
+ end.to have_enqueued_job(Spotlight::ChangeVisibilityJob).with do |solr_params, exhb, visibility|
70
+ expect(solr_params).to.not be_nil
71
+ expect(exhb).to eq exhibit
72
+ expect(visibility).to eq 'private'
73
+ end
74
+ end
75
+ # rubocop:enable Style/MultilineBlockChain
76
+ end
77
+
78
+ describe 'POST add_tags' do
79
+ it 'redirects and sets a notice' do
80
+ allow(controller).to receive(:current_search_session).and_return(search_session)
81
+ request.env['HTTP_REFERER'] = '/referring_url'
82
+ post :add_tags, params: { 'tags' => 'howdy,planet', 'q' => 'map', exhibit_id: exhibit }
83
+ expect(response).to redirect_to '/referring_url'
84
+ expect(flash[:notice]).to eq 'Tags are being added for 55 items.'
85
+ end
86
+
87
+ # rubocop:disable Style/MultilineBlockChain
88
+ it 'enqueues the job' do
89
+ allow(controller).to receive(:current_search_session).and_return(search_session)
90
+ expect do
91
+ post :add_tags, params: { 'tags' => 'howdy,planet', 'q' => 'map', exhibit_id: exhibit }
92
+ end.to have_enqueued_job(Spotlight::AddTagsJob).with do |solr_params, exhb, tags|
93
+ expect(solr_params).to.not be_nil
94
+ expect(exhb).to eq exhibit
95
+ expect(tags).to eq %w[howdy planet]
96
+ end
97
+ end
98
+ # rubocop:enable Style/MultilineBlockChain
99
+ end
100
+
101
+ describe 'POST remove_tags' do
102
+ it 'redirects and sets a notice' do
103
+ allow(controller).to receive(:current_search_session).and_return(search_session)
104
+ request.env['HTTP_REFERER'] = '/referring_url'
105
+ post :remove_tags, params: { 'tags' => 'hello,world', 'q' => 'map', exhibit_id: exhibit }
106
+ expect(response).to redirect_to '/referring_url'
107
+ expect(flash[:notice]).to eq 'Tags are being removed for 55 items.'
108
+ end
109
+
110
+ # rubocop:disable Style/MultilineBlockChain
111
+ it 'enqueues the job' do
112
+ allow(controller).to receive(:current_search_session).and_return(search_session)
113
+ expect do
114
+ post :remove_tags, params: { 'tags' => 'howdy,planet', 'q' => 'map', exhibit_id: exhibit }
115
+ end.to have_enqueued_job(Spotlight::RemoveTagsJob).with do |solr_params, exhb, tags|
116
+ expect(solr_params).to.not be_nil
117
+ expect(exhb).to eq exhibit
118
+ expect(tags).to eq %w[howdy planet]
119
+ end
120
+ end
121
+ # rubocop:enable Style/MultilineBlockChain
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe Spotlight::BulkUpdatesController, type: :controller do
4
+ routes { Spotlight::Engine.routes }
5
+ let(:exhibit) { FactoryBot.create(:exhibit) }
6
+
7
+ describe 'when the user is not authorized' do
8
+ before do
9
+ sign_in FactoryBot.create(:exhibit_visitor)
10
+ end
11
+
12
+ describe 'GET edit' do
13
+ it 'denies access' do
14
+ get :edit, params: { exhibit_id: exhibit }
15
+ expect(response).to redirect_to main_app.root_path
16
+ expect(flash[:alert]).to be_present
17
+ end
18
+ end
19
+
20
+ describe 'POST download_template' do
21
+ it 'denies access' do
22
+ post :download_template, params: { exhibit_id: exhibit }
23
+ expect(response).to redirect_to main_app.root_path
24
+ expect(flash[:alert]).to be_present
25
+ end
26
+ end
27
+ end
28
+
29
+ describe 'when the user is a curator' do
30
+ before do
31
+ sign_in FactoryBot.create(:exhibit_curator, exhibit: exhibit)
32
+ end
33
+
34
+ describe 'GET edit' do
35
+ it 'is allowed' do
36
+ get :edit, params: { exhibit_id: exhibit }
37
+ expect(response).to be_successful
38
+ end
39
+ end
40
+
41
+ describe 'POST download_template' do
42
+ it 'downloads a CSV template' do
43
+ post :download_template, params: {
44
+ exhibit_id: exhibit,
45
+ reference_fields: { item_id: 1, item_title: 1 },
46
+ updatable_fields: { tags: 0, visibility: 1 }
47
+ }
48
+
49
+ content = CSV.parse(response.body)
50
+ expect(content.length).to eq 56
51
+ expect(content[0]).to eq ['Item ID', 'Item Title', 'Visibility']
52
+ end
53
+ end
54
+
55
+ describe 'PATCH download_template' do
56
+ before { ActiveJob::Base.queue_adapter = :test }
57
+
58
+ after { ActiveJob::Base.queue_adapter = :inline }
59
+
60
+ it 'uploads the given CSV template and passes it to a job' do
61
+ expect do
62
+ patch :update, params: {
63
+ exhibit_id: exhibit,
64
+ file: fixture_file_upload('spec/fixtures/bulk-update-template.csv', 'text/csv')
65
+ }
66
+ end.to(have_enqueued_job(Spotlight::ProcessBulkUpdatesCsvJob).with do |job_exhibit, uploader|
67
+ expect(job_exhibit).to eq exhibit
68
+ expect(uploader).to be_a Spotlight::BulkUpdate
69
+ expect(uploader.file_identifier).to eq 'bulk-update-template.csv'
70
+ end)
71
+
72
+ expect(flash[:notice]).to eq 'The CSV file was uploaded successfully.'
73
+ expect(response).to redirect_to(spotlight.edit_exhibit_bulk_updates_path(exhibit))
74
+ end
75
+ end
76
+ end
77
+ end
@@ -29,7 +29,7 @@ describe Spotlight::CatalogController, type: :controller do
29
29
  let(:search) { FactoryBot.create(:search, exhibit: exhibit) }
30
30
 
31
31
  it 'shows the item' do
32
- expect(controller).to receive(:add_breadcrumb).with('Home', exhibit_path(exhibit, q: ''))
32
+ expect(controller).to receive(:add_breadcrumb).with('Home', exhibit_path(exhibit))
33
33
  expect(controller).to receive(:add_breadcrumb).with('L'AMERIQUE', exhibit_solr_document_path(exhibit, document))
34
34
  get :show, params: { exhibit_id: exhibit, id: 'dq287tq6352' }
35
35
  expect(response).to be_successful
@@ -38,7 +38,7 @@ describe Spotlight::CatalogController, type: :controller do
38
38
  it 'shows the item with breadcrumbs to the browse page' do
39
39
  allow(controller).to receive_messages(current_browse_category: search)
40
40
 
41
- expect(controller).to receive(:add_breadcrumb).with('Home', exhibit_path(exhibit, q: ''))
41
+ expect(controller).to receive(:add_breadcrumb).with('Home', exhibit_path(exhibit))
42
42
  expect(controller).to receive(:add_breadcrumb).with('Browse', exhibit_browse_index_path(exhibit))
43
43
  expect(controller).to receive(:add_breadcrumb).with(search.title, exhibit_browse_path(exhibit, search))
44
44
  expect(controller).to receive(:add_breadcrumb).with('L'AMERIQUE', exhibit_solr_document_path(exhibit, document))
@@ -50,7 +50,7 @@ describe Spotlight::CatalogController, type: :controller do
50
50
  feature_page = FactoryBot.create(:feature_page, exhibit: exhibit)
51
51
  allow(controller).to receive_messages(current_page_context: feature_page)
52
52
 
53
- expect(controller).to receive(:add_breadcrumb).with('Home', exhibit_path(exhibit, q: ''))
53
+ expect(controller).to receive(:add_breadcrumb).with('Home', exhibit_path(exhibit))
54
54
  expect(controller).to receive(:add_breadcrumb).with(feature_page.title, [exhibit, feature_page])
55
55
  expect(controller).to receive(:add_breadcrumb).with('L'AMERIQUE', exhibit_solr_document_path(exhibit, document))
56
56
  get :show, params: { exhibit_id: exhibit, id: 'dq287tq6352' }
@@ -61,7 +61,7 @@ describe Spotlight::CatalogController, type: :controller do
61
61
  home_page = FactoryBot.create(:home_page)
62
62
  allow(controller).to receive_messages(current_page_context: home_page)
63
63
 
64
- expect(controller).to receive(:add_breadcrumb).with('Home', exhibit_path(exhibit, q: ''))
64
+ expect(controller).to receive(:add_breadcrumb).with('Home', exhibit_path(exhibit))
65
65
  expect(controller).to receive(:add_breadcrumb).with('L'AMERIQUE', exhibit_solr_document_path(exhibit, document))
66
66
  get :show, params: { exhibit_id: exhibit, id: 'dq287tq6352' }
67
67
  expect(response).to be_successful
@@ -80,8 +80,8 @@ describe Spotlight::CatalogController, type: :controller do
80
80
 
81
81
  describe 'GET index' do
82
82
  it 'shows the index when there are parameters' do
83
- expect(controller).to receive(:add_breadcrumb).with('Home', exhibit_path(exhibit, q: ''))
84
- expect(controller).to receive(:add_breadcrumb).with('Search Results', search_exhibit_catalog_path(exhibit, q: 'map'))
83
+ expect(controller).to receive(:add_breadcrumb).with('Home', exhibit_path(exhibit))
84
+ expect(controller).to receive(:add_breadcrumb).with('Search results', search_exhibit_catalog_path(exhibit, q: 'map'), current: true)
85
85
  get :index, params: { exhibit_id: exhibit, q: 'map' }
86
86
  expect(response).to be_successful
87
87
  end
@@ -120,8 +120,9 @@ describe Spotlight::CatalogController, type: :controller do
120
120
 
121
121
  describe 'GET manifest' do
122
122
  context 'document is an uploaded resource' do
123
+ let(:uploaded_resource) { FactoryBot.create(:uploaded_resource) }
124
+
123
125
  it 'returns the json manifest produced by Spotlight::IiifManifestPresenter, based on the retrieved document and the controller' do
124
- uploaded_resource = FactoryBot.create(:uploaded_resource)
125
126
  compound_id = uploaded_resource.compound_id
126
127
  slug = uploaded_resource.exhibit.slug
127
128
 
@@ -146,6 +147,7 @@ describe Spotlight::CatalogController, type: :controller do
146
147
  expect(image['resource']['@id']).to eq compound_id
147
148
  expect(image['resource']['format']).to eq 'image/jpeg'
148
149
 
150
+ ensure
149
151
  # clean up solr document created by save_and_index above
150
152
  Blacklight.default_index.connection.delete_by_id uploaded_resource.compound_id
151
153
  Blacklight.default_index.connection.commit
@@ -214,7 +216,7 @@ describe Spotlight::CatalogController, type: :controller do
214
216
  before { sign_in FactoryBot.create(:exhibit_curator, exhibit: exhibit) }
215
217
 
216
218
  it 'shows all the items' do
217
- expect(controller).to receive(:add_breadcrumb).with('Home', exhibit_path(exhibit, q: ''))
219
+ expect(controller).to receive(:add_breadcrumb).with('Home', exhibit_path(exhibit))
218
220
  expect(controller).to receive(:add_breadcrumb).with('Curation', exhibit_dashboard_path(exhibit))
219
221
  expect(controller).to receive(:add_breadcrumb).with('Items', admin_exhibit_catalog_path(exhibit))
220
222
  get :admin, params: { exhibit_id: exhibit }
@@ -297,7 +299,7 @@ describe Spotlight::CatalogController, type: :controller do
297
299
  end
298
300
 
299
301
  describe 'when the user is a site admin' do
300
- before { sign_in FactoryBot.create(:site_admin, exhibit: exhibit) }
302
+ before { sign_in FactoryBot.create(:site_admin) }
301
303
 
302
304
  describe 'GET show' do
303
305
  it 'has a solr_json serialization' do
@@ -497,22 +499,22 @@ describe Spotlight::CatalogController, type: :controller do
497
499
 
498
500
  before { allow(controller).to receive_messages(current_exhibit: current_exhibit) }
499
501
 
500
- describe 'render_save_this_search?' do
502
+ describe 'render_curator_actions?' do
501
503
  it 'returns false if we are on the items admin screen' do
502
504
  allow(controller).to receive(:can?).with(:curate, current_exhibit).and_return(true)
503
505
  allow(controller).to receive(:params).and_return(controller: 'spotlight/catalog', action: 'admin')
504
- expect(controller).not_to be_render_save_this_search
506
+ expect(controller).not_to be_render_curator_actions
505
507
  end
506
508
 
507
509
  it 'returns true if we are not on the items admin screen' do
508
510
  allow(controller).to receive(:can?).with(:curate, current_exhibit).and_return(true)
509
511
  allow(controller).to receive(:params).and_return(controller: 'spotlight/catalog', action: 'index')
510
- expect(controller).to be_render_save_this_search
512
+ expect(controller).to be_render_curator_actions
511
513
  end
512
514
 
513
515
  it 'returns false if a user cannot curate the object' do
514
516
  allow(controller).to receive(:can?).with(:curate, current_exhibit).and_return(false)
515
- expect(controller).not_to be_render_save_this_search
517
+ expect(controller).not_to be_render_curator_actions
516
518
  end
517
519
  end
518
520
  end
@@ -24,7 +24,7 @@ describe Spotlight::ContactsController, type: :controller do
24
24
  it 'is successful' do
25
25
  expect(controller).to receive(:add_breadcrumb).with('Home', exhibit)
26
26
  expect(controller).to receive(:add_breadcrumb).with('Curation', exhibit_dashboard_path(exhibit))
27
- expect(controller).to receive(:add_breadcrumb).with('About Pages', exhibit_about_pages_path(exhibit))
27
+ expect(controller).to receive(:add_breadcrumb).with('About pages', exhibit_about_pages_path(exhibit))
28
28
  expect(controller).to receive(:add_breadcrumb).with(contact.name, edit_exhibit_contact_path(exhibit, contact))
29
29
  get :edit, params: { id: contact, exhibit_id: contact.exhibit }
30
30
  expect(response).to be_successful
@@ -76,7 +76,7 @@ describe Spotlight::ContactsController, type: :controller do
76
76
  it 'is successful' do
77
77
  expect(controller).to receive(:add_breadcrumb).with('Home', exhibit)
78
78
  expect(controller).to receive(:add_breadcrumb).with('Curation', exhibit_dashboard_path(exhibit))
79
- expect(controller).to receive(:add_breadcrumb).with('About Pages', exhibit_about_pages_path(exhibit))
79
+ expect(controller).to receive(:add_breadcrumb).with('About pages', exhibit_about_pages_path(exhibit))
80
80
  expect(controller).to receive(:add_breadcrumb).with('Add contact', new_exhibit_contact_path(exhibit))
81
81
  get :new, params: { exhibit_id: exhibit }
82
82
  expect(response).to be_successful
@@ -92,6 +92,17 @@ describe Spotlight::FeaturePagesController, type: :controller, versioning: true
92
92
  expect(response).to redirect_to(exhibit_feature_page_path(exhibit, page_es))
93
93
  end
94
94
  end
95
+
96
+ context 'when the sidebar is set to not display' do
97
+ let(:page) { FactoryBot.create(:feature_page, exhibit: exhibit, published: true) }
98
+
99
+ before { page.update(display_sidebar: false) }
100
+
101
+ it 'injects custom classes into the gallery view' do
102
+ get :show, params: { exhibit_id: exhibit.id, id: page.id }
103
+ expect(assigns(:exhibit).blacklight_config.view.gallery.classes).to eq 'row-cols-2 row-cols-md-4'
104
+ end
105
+ end
95
106
  end
96
107
 
97
108
  describe 'GET new' do
@@ -40,7 +40,7 @@ describe Spotlight::FeaturedImagesController, type: :controller do
40
40
  end.to change { Spotlight::FeaturedImage.count }.by(1)
41
41
 
42
42
  expect(response).to be_successful
43
- expect(response.body).to match %r{\{"tilesource":"http://test\.host/images/\d+/info\.json","id":\d+\}}
43
+ expect(response.body).to match %r{\{"tilesource":"http://test\.host/images/\d+-.+/info\.json","id":\d+\}}
44
44
  end
45
45
  end
46
46
 
@@ -55,7 +55,7 @@ describe Spotlight::FeaturedImagesController, type: :controller do
55
55
  end.to change { Spotlight::FeaturedImage.count }.by(1)
56
56
 
57
57
  expect(response).to be_successful
58
- expect(response.body).to match %r{\{"tilesource":"http://test\.host/images/\d+/info\.json","id":\d+\}}
58
+ expect(response.body).to match %r{\{"tilesource":"http://test\.host/images/\d+-.+/info\.json","id":\d+\}}
59
59
  end
60
60
  end
61
61
 
@@ -70,7 +70,7 @@ describe Spotlight::FeaturedImagesController, type: :controller do
70
70
  end.to change { Spotlight::FeaturedImage.count }.by(1)
71
71
 
72
72
  expect(response).to be_successful
73
- expect(response.body).to match %r{\{"tilesource":"http://test\.host/images/\d+/info\.json","id":\d+\}}
73
+ expect(response.body).to match %r{\{"tilesource":"http://test\.host/images/\d+-.+/info\.json","id":\d+\}}
74
74
  end
75
75
  end
76
76
  end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe Spotlight::GroupsController, type: :controller do
4
+ routes { Spotlight::Engine.routes }
5
+ let(:exhibit) { FactoryBot.create(:exhibit) }
6
+ let!(:group) { FactoryBot.create(:group, exhibit: exhibit) }
7
+
8
+ describe 'when the user is not authorized' do
9
+ before do
10
+ sign_in FactoryBot.create(:exhibit_visitor)
11
+ end
12
+
13
+ describe 'GET index' do
14
+ it 'returns authorized groups (none)' do
15
+ get :index, params: { exhibit_id: exhibit }, format: :json
16
+ expect(response).to be_successful
17
+ expect(JSON.parse(response.body).length).to eq 0
18
+ end
19
+ end
20
+
21
+ describe 'POST create' do
22
+ it 'denies access' do
23
+ post :create, params: { exhibit_id: exhibit, group: { title: 'Hello' } }
24
+ expect(response).to redirect_to main_app.root_path
25
+ expect(flash[:alert]).to be_present
26
+ end
27
+ end
28
+
29
+ describe 'PUT update' do
30
+ it 'denies access' do
31
+ patch :update, params: { exhibit_id: exhibit, id: group.id }
32
+ expect(response).to redirect_to main_app.root_path
33
+ expect(flash[:alert]).to be_present
34
+ end
35
+ end
36
+ end
37
+
38
+ describe 'when the user is a curator' do
39
+ before do
40
+ sign_in FactoryBot.create(:exhibit_curator, exhibit: exhibit)
41
+ end
42
+
43
+ describe 'GET index' do
44
+ it 'returns json response of groups' do
45
+ get :index, params: { exhibit_id: exhibit }, format: :json
46
+ expect(JSON.parse(response.body).length).to eq 1
47
+ end
48
+ end
49
+
50
+ describe 'POST create' do
51
+ it 'creates a saved search' do
52
+ post :create, params: { exhibit_id: exhibit, group: { title: 'Hello' } }
53
+ expect(response).to redirect_to spotlight.exhibit_searches_path(exhibit, anchor: 'browse-groups')
54
+ expect(flash[:notice]).to eq 'The browse group was created.'
55
+ end
56
+ end
57
+
58
+ describe 'PATCH update' do
59
+ it 'shows edit page' do
60
+ patch :update, params: {
61
+ id: group.id,
62
+ exhibit_id: group.exhibit,
63
+ group: {
64
+ title: 'Hello world'
65
+ }
66
+ }
67
+
68
+ expect(group.reload.title).to eq 'Hello world'
69
+ expect(response).to redirect_to exhibit_searches_path(exhibit, anchor: 'browse-groups')
70
+ end
71
+ end
72
+
73
+ describe 'PATCH update_all' do
74
+ let!(:group2) { FactoryBot.create(:group, exhibit: exhibit, published: true) }
75
+ let!(:group3) { FactoryBot.create(:group, exhibit: exhibit, published: true) }
76
+
77
+ it 'shows edit page' do
78
+ patch :update_all, params: {
79
+ exhibit_id: group.exhibit,
80
+ exhibit: {
81
+ groups_attributes: [
82
+ { id: group.id, published: true, weight: '1' },
83
+ { id: group2.id, published: false, weight: '0' }
84
+ ]
85
+ }
86
+ }
87
+
88
+ expect(group.reload.weight).to eq 1
89
+ expect(group2.reload.published).to be false
90
+ expect(response).to redirect_to exhibit_searches_path(exhibit, anchor: 'browse-groups')
91
+ end
92
+ end
93
+
94
+ describe 'DELETE delete' do
95
+ it 'removes the group' do
96
+ group
97
+ expect do
98
+ delete :destroy, params: { id: group.id, exhibit_id: group.exhibit }
99
+ end.to change { Spotlight::Group.count }.by(-1)
100
+ end
101
+ end
102
+ end
103
+ end