curation_concerns 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +7 -9
  3. data/.rspec +1 -1
  4. data/.rubocop.yml +185 -0
  5. data/.travis.yml +0 -10
  6. data/CONTRIBUTING.md +117 -0
  7. data/Gemfile +5 -2
  8. data/README.md +18 -11
  9. data/Rakefile +23 -11
  10. data/VERSION +1 -1
  11. data/app/assets/images/audio.png +0 -0
  12. data/app/assets/images/loading.gif +0 -0
  13. data/app/assets/images/progressbar.gif +0 -0
  14. data/app/assets/javascripts/curation_concerns/application.js +2 -8
  15. data/app/assets/javascripts/curation_concerns/curation_concerns.js +1 -15
  16. data/app/assets/javascripts/curation_concerns/facet_mine.js +4 -10
  17. data/app/assets/javascripts/curation_concerns/fileupload.js +6 -0
  18. data/app/assets/javascripts/curation_concerns/uploader.js +183 -0
  19. data/app/assets/stylesheets/curation_concerns/_curation_concerns.scss +3 -0
  20. data/app/assets/stylesheets/curation_concerns/_positioning.scss +6 -0
  21. data/app/assets/stylesheets/curation_concerns/fileupload/jquery.fileupload-ui.scss +86 -0
  22. data/app/assets/stylesheets/curation_concerns/fileupload/thumbnail-scaling.css +3 -0
  23. data/app/assets/stylesheets/curation_concerns/fileupload.scss +48 -0
  24. data/app/assets/stylesheets/curation_concerns/modules/attributes.scss +10 -0
  25. data/app/assets/stylesheets/curation_concerns/modules/embargoes.scss +1 -1
  26. data/app/assets/stylesheets/curation_concerns/modules/forms.scss +0 -10
  27. data/app/assets/stylesheets/curation_concerns/modules/search_results.scss +7 -8
  28. data/app/controllers/concerns/curation_concerns/api.rb +77 -0
  29. data/app/controllers/concerns/curation_concerns/application_controller_behavior.rb +30 -12
  30. data/app/controllers/concerns/curation_concerns/catalog_controller.rb +9 -276
  31. data/app/controllers/concerns/curation_concerns/collections_controller_behavior.rb +51 -40
  32. data/app/controllers/concerns/curation_concerns/curation_concern_controller.rb +60 -30
  33. data/app/controllers/concerns/curation_concerns/download_behavior.rb +51 -37
  34. data/app/controllers/concerns/curation_concerns/embargoes_controller_behavior.rb +29 -29
  35. data/app/controllers/concerns/curation_concerns/file_sets_controller_behavior.rb +198 -0
  36. data/app/controllers/concerns/curation_concerns/leases_controller_behavior.rb +27 -20
  37. data/app/controllers/concerns/curation_concerns/manages_embargoes.rb +2 -7
  38. data/app/controllers/concerns/curation_concerns/parent_container.rb +20 -4
  39. data/app/controllers/concerns/curation_concerns/single_use_links_controller_behavior.rb +48 -0
  40. data/app/controllers/concerns/curation_concerns/single_use_links_viewer_controller_behavior.rb +75 -0
  41. data/app/controllers/concerns/curation_concerns/themed_layout_controller.rb +0 -1
  42. data/app/controllers/concerns/curation_concerns/upload_sets_controller_behavior.rb +38 -0
  43. data/app/controllers/concerns/curation_concerns/welcome_controller_behavior.rb +8 -0
  44. data/app/controllers/concerns/curation_concerns/without_namespace.rb +2 -1
  45. data/app/controllers/curation_concerns/classify_concerns_controller.rb +9 -9
  46. data/app/controllers/curation_concerns/file_sets_controller.rb +5 -0
  47. data/app/controllers/curation_concerns/permissions_controller.rb +2 -3
  48. data/app/controllers/curation_concerns/single_use_links_controller.rb +5 -0
  49. data/app/controllers/curation_concerns/single_use_links_viewer_controller.rb +21 -0
  50. data/app/controllers/downloads_controller.rb +0 -1
  51. data/app/controllers/embargoes_controller.rb +0 -2
  52. data/app/controllers/leases_controller.rb +0 -2
  53. data/app/controllers/registrations_controller.rb +1 -2
  54. data/app/controllers/upload_sets_controller.rb +3 -0
  55. data/app/controllers/welcome_controller.rb +3 -0
  56. data/app/forms/curation_concerns/forms/collection_edit_form.rb +18 -2
  57. data/app/forms/curation_concerns/forms/file_set_edit_form.rb +15 -0
  58. data/app/forms/curation_concerns/forms/work_form.rb +57 -0
  59. data/app/helpers/curation_concerns/ability_helper.rb +24 -24
  60. data/app/helpers/curation_concerns/catalog_helper.rb +9 -8
  61. data/app/helpers/curation_concerns/collections_helper.rb +9 -12
  62. data/app/helpers/curation_concerns/embargo_helper.rb +0 -2
  63. data/app/helpers/curation_concerns/file_set_helper.rb +31 -0
  64. data/app/helpers/curation_concerns/lease_helper.rb +0 -3
  65. data/app/helpers/curation_concerns/main_app_helpers.rb +1 -3
  66. data/app/helpers/curation_concerns/render_constraints_helper.rb +5 -5
  67. data/app/helpers/curation_concerns/search_paths_helper.rb +5 -7
  68. data/app/helpers/curation_concerns/title_helper.rb +3 -7
  69. data/app/helpers/curation_concerns/url_helper.rb +4 -6
  70. data/app/inputs/multifile_input.rb +8 -0
  71. data/app/jobs/visibility_copy_job.rb +22 -0
  72. data/app/presenters/curation_concerns/collection_presenter.rb +14 -32
  73. data/app/presenters/curation_concerns/embargo_presenter.rb +26 -0
  74. data/app/presenters/curation_concerns/file_set_presenter.rb +34 -0
  75. data/app/presenters/curation_concerns/lease_presenter.rb +30 -0
  76. data/app/presenters/curation_concerns/model_proxy.rb +27 -0
  77. data/app/presenters/curation_concerns/permission_badge.rb +61 -0
  78. data/app/presenters/curation_concerns/presenter_factory.rb +45 -0
  79. data/app/presenters/curation_concerns/presents_attributes.rb +25 -0
  80. data/app/presenters/curation_concerns/version_list_presenter.rb +18 -0
  81. data/app/presenters/curation_concerns/version_presenter.rb +27 -0
  82. data/app/presenters/curation_concerns/work_show_presenter.rb +33 -0
  83. data/app/renderers/curation_concerns/attribute_renderer.rb +75 -0
  84. data/app/search_builders/curation_concerns/deactivated_embargo_search_builder.rb +10 -0
  85. data/app/search_builders/curation_concerns/deactivated_lease_search_builder.rb +10 -0
  86. data/app/search_builders/curation_concerns/embargo_search_builder.rb +23 -0
  87. data/app/search_builders/curation_concerns/expired_embargo_search_builder.rb +11 -0
  88. data/app/search_builders/curation_concerns/expired_lease_search_builder.rb +11 -0
  89. data/app/search_builders/curation_concerns/lease_search_builder.rb +23 -0
  90. data/app/search_builders/curation_concerns/search_builder.rb +10 -16
  91. data/app/services/curation_concerns/curation_concern.rb +0 -5
  92. data/app/services/curation_concerns/embargo_service.rb +26 -4
  93. data/app/services/curation_concerns/lease_service.rb +14 -5
  94. data/app/services/curation_concerns/parent_service.rb +19 -0
  95. data/app/services/curation_concerns/restriction_service.rb +24 -0
  96. data/app/services/rights_service.rb +14 -0
  97. data/app/views/catalog/_action_menu_partials/_collection.html.erb +1 -1
  98. data/app/views/catalog/_action_menu_partials/_default.html.erb +5 -3
  99. data/app/views/catalog/_document_list.html.erb +1 -1
  100. data/app/views/catalog/index.html.erb +1 -35
  101. data/app/views/collections/_edit_descriptions.html.erb +3 -4
  102. data/app/views/collections/_form.html.erb +1 -1
  103. data/app/views/collections/_form_permission.html.erb +1 -1
  104. data/app/views/collections/_search_form.html.erb +10 -0
  105. data/app/views/collections/_show_actions.html.erb +3 -3
  106. data/app/views/collections/_sort_and_per_page.html.erb +2 -2
  107. data/app/views/collections/show.html.erb +6 -6
  108. data/app/views/curation_concerns/base/_attribute_rows.html.erb +7 -0
  109. data/app/views/curation_concerns/base/_attributes.html.erb +6 -13
  110. data/app/views/curation_concerns/base/_form.html.erb +4 -5
  111. data/app/views/curation_concerns/base/_form_descriptive_fields.erb +2 -4
  112. data/app/views/curation_concerns/base/_form_files_and_links.html.erb +3 -5
  113. data/app/views/curation_concerns/base/_form_permission.html.erb +13 -26
  114. data/app/views/curation_concerns/base/_form_permission_note.html.erb +15 -0
  115. data/app/views/curation_concerns/base/_form_permission_under_embargo.html.erb +2 -2
  116. data/app/views/curation_concerns/base/_form_permission_under_lease.html.erb +2 -2
  117. data/app/views/curation_concerns/base/_form_representative_image.html.erb +16 -4
  118. data/app/views/curation_concerns/base/_form_rights.html.erb +17 -0
  119. data/app/views/curation_concerns/base/_form_supplementary_fields.html.erb +4 -9
  120. data/app/views/curation_concerns/base/_related_files.html.erb +4 -4
  121. data/app/views/curation_concerns/base/_representative_media.html.erb +2 -4
  122. data/app/views/curation_concerns/base/_versioning.html.erb +23 -0
  123. data/app/views/curation_concerns/base/show.html.erb +13 -10
  124. data/app/views/curation_concerns/base/show.json.jbuilder +1 -0
  125. data/app/views/curation_concerns/base/versions.html.erb +6 -0
  126. data/app/views/curation_concerns/file_sets/_actions.html.erb +16 -0
  127. data/app/views/curation_concerns/file_sets/_file_set.html.erb +12 -0
  128. data/app/views/curation_concerns/{generic_files → file_sets}/_form.html.erb +7 -7
  129. data/app/views/curation_concerns/file_sets/_multiple_upload.html.erb +3 -0
  130. data/app/views/curation_concerns/{generic_files → file_sets}/edit.html.erb +0 -0
  131. data/app/views/curation_concerns/file_sets/jq_upload.json.jbuilder +8 -0
  132. data/app/views/curation_concerns/file_sets/media_display/_audio.html.erb +6 -0
  133. data/app/views/curation_concerns/file_sets/media_display/_default.html.erb +4 -0
  134. data/app/views/curation_concerns/file_sets/media_display/_image.html.erb +8 -0
  135. data/app/views/curation_concerns/file_sets/media_display/_office_document.html.erb +7 -0
  136. data/app/views/curation_concerns/file_sets/media_display/_pdf.html.erb +7 -0
  137. data/app/views/curation_concerns/file_sets/media_display/_video.html.erb +6 -0
  138. data/app/views/curation_concerns/file_sets/show.html.erb +15 -0
  139. data/app/views/curation_concerns/file_sets/show.json.jbuilder +1 -0
  140. data/app/views/curation_concerns/file_sets/upload/_alerts.html.erb +19 -0
  141. data/app/views/curation_concerns/file_sets/upload/_form.html.erb +6 -0
  142. data/app/views/curation_concerns/file_sets/upload/_form_fields.html.erb +45 -0
  143. data/app/views/curation_concerns/file_sets/upload/_script_templates.html.erb +61 -0
  144. data/app/views/curation_concerns/single_use_links/new_download.html.erb +5 -0
  145. data/app/views/curation_concerns/single_use_links/new_show.html.erb +5 -0
  146. data/app/views/curation_concerns/single_use_links_viewer/show.html.erb +10 -0
  147. data/app/views/error/single_use_error.html.erb +19 -0
  148. data/app/views/layouts/error.html.erb +33 -0
  149. data/app/views/leases/_list_expired_active_leases.html.erb +6 -1
  150. data/app/views/records/_rights_modal.html.erb +1 -0
  151. data/app/views/records/edit_fields/_default.html.erb +5 -0
  152. data/app/views/records/show_fields/_default.html.erb +6 -0
  153. data/app/views/shared/_add_content.html.erb +2 -14
  154. data/app/views/shared/_add_works.html.erb +14 -0
  155. data/app/views/shared/_my_actions.html.erb +9 -1
  156. data/app/views/shared/_site_actions.html.erb +1 -1
  157. data/app/views/shared/_site_search.html.erb +7 -7
  158. data/app/views/upload_sets/_edit.js.erb +15 -0
  159. data/app/views/upload_sets/_metadata.html.erb +50 -0
  160. data/app/views/upload_sets/_more_metadata.html.erb +7 -0
  161. data/app/views/upload_sets/edit.html.erb +26 -0
  162. data/app/views/{catalog/_home_text.html.erb → welcome/index.html.erb} +1 -0
  163. data/config/initializers/simple_form.rb +14 -0
  164. data/config/jetty.yml +5 -0
  165. data/config/locales/curation_concerns.en.yml +25 -4
  166. data/config/routes.rb +5 -0
  167. data/curation_concerns.gemspec +4 -6
  168. data/lib/curation_concerns/callbacks/registry.rb +48 -0
  169. data/lib/curation_concerns/callbacks.rb +26 -0
  170. data/lib/curation_concerns/controller_resource.rb +4 -4
  171. data/lib/curation_concerns/engine.rb +4 -2
  172. data/lib/curation_concerns/rails/routes.rb +23 -19
  173. data/lib/curation_concerns/single_use_error.rb +3 -0
  174. data/lib/curation_concerns/spec_support.rb +0 -2
  175. data/lib/curation_concerns/version.rb +1 -1
  176. data/lib/curation_concerns.rb +1 -2
  177. data/lib/generators/curation_concerns/install_generator.rb +34 -30
  178. data/lib/generators/curation_concerns/templates/catalog_controller.rb +236 -0
  179. data/lib/generators/curation_concerns/templates/config/authorities/rights.yml +19 -0
  180. data/lib/generators/curation_concerns/templates/{curation_concerns.css.scss → curation_concerns.scss} +0 -0
  181. data/lib/generators/curation_concerns/work/templates/actor_spec.rb.erb +1 -1
  182. data/lib/generators/curation_concerns/work/templates/controller_spec.rb.erb +1 -1
  183. data/lib/generators/curation_concerns/work/templates/form.rb.erb +8 -0
  184. data/lib/generators/curation_concerns/work/templates/form_spec.rb.erb +10 -0
  185. data/lib/generators/curation_concerns/work/templates/model.rb.erb +2 -2
  186. data/lib/generators/curation_concerns/work/templates/model_spec.rb.erb +1 -1
  187. data/lib/generators/curation_concerns/work/work_generator.rb +31 -26
  188. data/spec/abilities/collection_abilities_spec.rb +13 -13
  189. data/spec/abilities/embargo_and_lease_ability_spec.rb +23 -0
  190. data/spec/abilities/file_set_abilities_spec.rb +67 -0
  191. data/spec/abilities/generic_work_abilities_spec.rb +12 -12
  192. data/spec/actors/curation_concerns/embargo_actor_spec.rb +38 -0
  193. data/spec/actors/curation_concerns/file_set_actor_spec.rb +180 -0
  194. data/spec/actors/curation_concerns/lease_actor_spec.rb +39 -0
  195. data/spec/actors/curation_concerns/manages_embargoes_actor_spec.rb +44 -38
  196. data/spec/actors/curation_concerns/work_actor_spec.rb +121 -63
  197. data/spec/controllers/catalog_controller_spec.rb +30 -32
  198. data/spec/controllers/curation_concerns/classify_concerns_controller_spec.rb +2 -3
  199. data/spec/controllers/curation_concerns/collections_controller_spec.rb +93 -76
  200. data/spec/controllers/curation_concerns/file_sets_controller_json_spec.rb +106 -0
  201. data/spec/controllers/curation_concerns/file_sets_controller_spec.rb +237 -0
  202. data/spec/controllers/curation_concerns/generic_works_controller_json_spec.rb +85 -0
  203. data/spec/controllers/curation_concerns/generic_works_controller_spec.rb +84 -72
  204. data/spec/controllers/curation_concerns/permissions_controller_spec.rb +8 -11
  205. data/spec/controllers/curation_concerns/single_use_links_controller_spec.rb +79 -0
  206. data/spec/controllers/curation_concerns/single_use_links_viewer_controller_spec.rb +74 -0
  207. data/spec/controllers/downloads_controller_spec.rb +49 -24
  208. data/spec/controllers/embargoes_controller_spec.rb +42 -51
  209. data/spec/controllers/leases_controller_spec.rb +53 -42
  210. data/spec/controllers/upload_sets_controller_spec.rb +76 -0
  211. data/spec/controllers/welcome_controller_spec.rb +12 -0
  212. data/spec/factories/collections.rb +5 -1
  213. data/spec/factories/{generic_files.rb → file_sets.rb} +6 -6
  214. data/spec/factories/generic_works.rb +5 -6
  215. data/spec/factories/users.rb +2 -4
  216. data/spec/features/add_file_spec.rb +11 -12
  217. data/spec/features/catalog_search_spec.rb +43 -0
  218. data/spec/features/collection_spec.rb +61 -46
  219. data/spec/features/create_work_spec.rb +26 -19
  220. data/spec/features/embargo_spec.rb +13 -12
  221. data/spec/features/lease_spec.rb +15 -16
  222. data/spec/features/update_file_spec.rb +11 -13
  223. data/spec/features/work_generator_spec.rb +34 -26
  224. data/spec/{helpers/curation_concerns/.keep → fixtures/empty_file.txt} +0 -0
  225. data/spec/fixtures/test.pdf +0 -0
  226. data/spec/forms/collection_edit_form_spec.rb +53 -9
  227. data/spec/forms/file_set_edit_form_spec.rb +53 -0
  228. data/spec/forms/work_form_spec.rb +54 -0
  229. data/spec/helpers/catalog_helper_spec.rb +9 -10
  230. data/spec/helpers/configuration_helper_spec.rb +1 -2
  231. data/spec/helpers/curation_concerns/collections_helper_spec.rb +8 -9
  232. data/spec/helpers/curation_concerns/file_set_helper_spec.rb +61 -0
  233. data/spec/helpers/render_constraints_helper_spec.rb +4 -4
  234. data/spec/helpers/url_helper_spec.rb +8 -7
  235. data/spec/indexers/collection_indexer_spec.rb +14 -0
  236. data/spec/indexers/file_set_indexing_service_spec.rb +69 -0
  237. data/spec/indexers/generic_work_indexing_service_spec.rb +22 -0
  238. data/spec/inputs/multifile_input_spec.rb +32 -0
  239. data/spec/jobs/active_fedora_id_based_job_spec.rb +10 -8
  240. data/spec/jobs/audit_job_spec.rb +28 -20
  241. data/spec/jobs/characterize_job_spec.rb +10 -15
  242. data/spec/jobs/create_derivatives_job_spec.rb +11 -9
  243. data/spec/jobs/import_url_job_spec.rb +14 -21
  244. data/spec/jobs/ingest_file_job_spec.rb +45 -0
  245. data/spec/jobs/ingest_local_file_job_spec.rb +13 -15
  246. data/spec/jobs/upload_set_update_job_spec.rb +30 -0
  247. data/spec/jobs/visibility_copy_job_spec.rb +61 -0
  248. data/spec/lib/curation_concerns/callbacks/registry_spec.rb +54 -0
  249. data/spec/lib/curation_concerns/callbacks_spec.rb +27 -0
  250. data/spec/lib/curation_concerns/messages_spec.rb +29 -30
  251. data/spec/lib/curation_concerns/readable_permissions_spec.rb +18 -20
  252. data/spec/lib/curation_concerns/writable_permissions_spec.rb +2 -4
  253. data/spec/matchers/metadata_field_matchers.rb +1 -1
  254. data/spec/matchers/response_matchers.rb +2 -2
  255. data/spec/matchers.rb +3 -2
  256. data/spec/models/checksum_audit_log_spec.rb +37 -32
  257. data/spec/models/curation_concerns/collection_behavior_spec.rb +50 -37
  258. data/spec/models/curation_concerns/file_set/derivatives_spec.rb +84 -0
  259. data/spec/models/curation_concerns/work_behavior_spec.rb +53 -0
  260. data/spec/models/file_set_spec.rb +601 -0
  261. data/spec/models/generic_work_spec.rb +15 -14
  262. data/spec/models/single_use_link_spec.rb +69 -0
  263. data/spec/models/solr_document_spec.rb +67 -0
  264. data/spec/models/upload_set_spec.rb +39 -0
  265. data/spec/models/user_spec.rb +7 -8
  266. data/spec/presenters/curation_concerns/collection_presenter_spec.rb +8 -24
  267. data/spec/presenters/curation_concerns/file_set_presenter_spec.rb +59 -0
  268. data/spec/presenters/curation_concerns/permission_badge_spec.rb +29 -0
  269. data/spec/presenters/curation_concerns/presenter_factory_spec.rb +29 -0
  270. data/spec/presenters/curation_concerns/version_list_presenter_spec.rb +32 -0
  271. data/spec/presenters/curation_concerns/version_presenter_spec.rb +51 -0
  272. data/spec/presenters/curation_concerns/work_show_presenter_spec.rb +35 -0
  273. data/spec/presenters/embargo_presenter_spec.rb +48 -0
  274. data/spec/presenters/lease_presenter_spec.rb +48 -0
  275. data/spec/renderers/curation_concerns/attribute_renderer_spec.rb +14 -0
  276. data/spec/routing/curation_concerns/routes_spec.rb +38 -12
  277. data/spec/routing/route_spec.rb +38 -39
  278. data/spec/search_builders/curation_concerns/embargo_search_builder_spec.rb +17 -0
  279. data/spec/search_builders/curation_concerns/lease_search_builder_spec.rb +17 -0
  280. data/spec/search_builders/curation_concerns/search_builder_spec.rb +60 -0
  281. data/spec/services/derivative_path_spec.rb +16 -0
  282. data/spec/services/embargo_service_spec.rb +15 -14
  283. data/spec/services/file_set_audit_service_spec.rb +71 -0
  284. data/spec/services/lease_service_spec.rb +13 -13
  285. data/spec/services/lock_manager_spec.rb +12 -0
  286. data/spec/services/parent_service_spec.rb +13 -0
  287. data/spec/services/persist_derivatives_spec.rb +24 -0
  288. data/spec/services/persist_directly_contained_output_file_service_spec.rb +14 -0
  289. data/spec/services/repository_audit_service_spec.rb +8 -7
  290. data/spec/services/rights_service_spec.rb +17 -0
  291. data/spec/services/thumbnail_path_service_spec.rb +43 -0
  292. data/spec/services/versioning_service_spec.rb +8 -9
  293. data/spec/spec_helper.rb +21 -13
  294. data/spec/support/curation_concerns/factory_helpers.rb +1 -0
  295. data/spec/support/features/fixture_file_upload.rb +3 -1
  296. data/spec/support/features/session_helpers.rb +3 -4
  297. data/spec/support/features.rb +1 -4
  298. data/spec/support/input_support.rb +11 -0
  299. data/spec/support/matchers/api_responses.rb +22 -0
  300. data/spec/support/shared/shared_examples_has_dc_metadata.rb +0 -2
  301. data/spec/support/shared/shared_examples_is_embargoable.rb +1 -3
  302. data/spec/support/shared/shared_examples_with_access_rights.rb +13 -16
  303. data/spec/tasks/rake_spec.rb +9 -11
  304. data/spec/test_app_templates/Gemfile.extra +4 -1
  305. data/spec/test_app_templates/lib/generators/test_app_generator.rb +3 -35
  306. data/spec/views/catalog/index.html.erb_spec.rb +7 -10
  307. data/spec/views/curation_concerns/base/_attributes.html.erb_spec.rb +9 -6
  308. data/spec/views/curation_concerns/base/_form_permission.html.erb_spec.rb +13 -0
  309. data/spec/views/curation_concerns/base/show.html.erb_spec.rb +35 -15
  310. data/spec/views/curation_concerns/base/show.json.jbuilder_spec.rb +21 -0
  311. data/spec/views/curation_concerns/file_sets/_file_set.html.erb_spec.rb +37 -0
  312. data/spec/views/curation_concerns/file_sets/show.json.jbuilder_spec.rb +21 -0
  313. data/spec/views/curation_concerns/permissions/confirm.html.erb_spec.rb +6 -6
  314. data/spec/views/error/single_use_error.html.erb_spec.rb +8 -0
  315. data/spec/views/layouts/error.html.erb_spec.rb +8 -0
  316. data/spec/views/shared/_add_content.html.erb_spec.rb +33 -20
  317. data/spec/views/shared/_my_actions.html.erb_spec.rb +18 -6
  318. data/spec/views/single_use_links/new_download.html.erb_spec.rb +29 -0
  319. data/spec/views/single_use_links_viewer/show.html.erb_spec.rb +32 -0
  320. data/tasks/jetty.rake +1 -1
  321. data/vendor/assets/javascrips/fileupload/jquery.fileupload-process.js +175 -0
  322. data/vendor/assets/javascrips/fileupload/jquery.fileupload-ui.js +710 -0
  323. data/vendor/assets/javascrips/fileupload/jquery.fileupload-validate.js +122 -0
  324. data/vendor/assets/javascrips/fileupload/jquery.fileupload.js +1477 -0
  325. data/vendor/assets/javascrips/fileupload/locale.js +27 -0
  326. data/vendor/assets/javascrips/fileupload/tmpl.js +87 -0
  327. metadata +242 -213
  328. data/app/assets/javascripts/curation_concerns/help_modal.js +0 -36
  329. data/app/assets/javascripts/curation_concerns/link_groups.js.coffee +0 -123
  330. data/app/assets/javascripts/curation_concerns/link_users.js.coffee +0 -126
  331. data/app/assets/javascripts/curation_concerns/proxy_rights.js.coffee +0 -95
  332. data/app/assets/javascripts/curation_concerns/proxy_submission.js +0 -23
  333. data/app/assets/javascripts/curation_concerns/select_works.js.coffee +0 -20
  334. data/app/controllers/catalog_controller.rb +0 -3
  335. data/app/controllers/concerns/curation_concerns/generic_files_controller_behavior.rb +0 -149
  336. data/app/controllers/curation_concerns/generic_files_controller.rb +0 -13
  337. data/app/datastreams/curation_concerns/generic_work_rdf_properties.rb +0 -57
  338. data/app/datastreams/generic_work_metadata.rb +0 -3
  339. data/app/forms/curation_concerns/forms/generic_file_edit_form.rb +0 -15
  340. data/app/forms/curation_concerns/forms/generic_work_edit_form.rb +0 -9
  341. data/app/helpers/curation_concerns/attribute_helper.rb +0 -67
  342. data/app/helpers/curation_concerns/generic_file_helper.rb +0 -19
  343. data/app/helpers/curation_concerns/thumbnail_helper.rb +0 -11
  344. data/app/presenters/curation_concerns/generic_file_presenter.rb +0 -14
  345. data/app/presenters/curation_concerns/generic_work_presenter.rb +0 -13
  346. data/app/views/catalog/_index_default.html.erb +0 -17
  347. data/app/views/collections/_form_representative_image.html.erb +0 -13
  348. data/app/views/collections/_identifier_and_action.html.erb +0 -15
  349. data/app/views/curation_concerns/base/_form_content_license.html.erb +0 -16
  350. data/app/views/curation_concerns/base/_form_editors.html.erb +0 -15
  351. data/app/views/curation_concerns/generic_files/_actions.html.erb +0 -16
  352. data/app/views/curation_concerns/generic_files/_generic_file.html.erb +0 -12
  353. data/app/views/curation_concerns/generic_files/_media_display.html.erb +0 -19
  354. data/app/views/curation_concerns/generic_files/jq_upload.json.jbuilder +0 -8
  355. data/app/views/curation_concerns/generic_files/show.html.erb +0 -15
  356. data/app/workers/visibility_copy_worker.rb +0 -30
  357. data/curation_concerns-models/.gitignore +0 -17
  358. data/curation_concerns-models/Gemfile +0 -4
  359. data/curation_concerns-models/LICENSE.md +0 -177
  360. data/curation_concerns-models/README.md +0 -42
  361. data/curation_concerns-models/Rakefile +0 -1
  362. data/curation_concerns-models/app/actors/concerns/curation_concerns/manages_embargoes_actor.rb +0 -99
  363. data/curation_concerns-models/app/actors/curation_concerns/base_actor.rb +0 -90
  364. data/curation_concerns-models/app/actors/curation_concerns/generic_file_actor.rb +0 -150
  365. data/curation_concerns-models/app/actors/curation_concerns/work_actor_behavior.rb +0 -88
  366. data/curation_concerns-models/app/jobs/active_fedora_id_based_job.rb +0 -22
  367. data/curation_concerns-models/app/jobs/active_fedora_pid_based_job.rb +0 -6
  368. data/curation_concerns-models/app/jobs/audit_job.rb +0 -58
  369. data/curation_concerns-models/app/jobs/characterize_job.rb +0 -11
  370. data/curation_concerns-models/app/jobs/copy_permissions_job.rb +0 -24
  371. data/curation_concerns-models/app/jobs/create_derivatives_job.rb +0 -15
  372. data/curation_concerns-models/app/jobs/import_url_job.rb +0 -56
  373. data/curation_concerns-models/app/jobs/ingest_local_file_job.rb +0 -48
  374. data/curation_concerns-models/app/jobs/resolrize_job.rb +0 -9
  375. data/curation_concerns-models/app/models/checksum_audit_log.rb +0 -21
  376. data/curation_concerns-models/app/models/concerns/curation_concerns/ability.rb +0 -34
  377. data/curation_concerns-models/app/models/concerns/curation_concerns/basic_metadata.rb +0 -87
  378. data/curation_concerns-models/app/models/concerns/curation_concerns/collection_behavior.rb +0 -47
  379. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/belongs_to_works.rb +0 -53
  380. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/characterization.rb +0 -89
  381. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/content.rb +0 -8
  382. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/export.rb +0 -343
  383. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/full_text_indexing.rb +0 -12
  384. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/indexing.rb +0 -14
  385. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/versions.rb +0 -16
  386. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file.rb +0 -5
  387. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file_behavior.rb +0 -44
  388. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_work_behavior.rb +0 -38
  389. data/curation_concerns-models/app/models/concerns/curation_concerns/has_representative.rb +0 -14
  390. data/curation_concerns-models/app/models/concerns/curation_concerns/human_readable_type.rb +0 -23
  391. data/curation_concerns-models/app/models/concerns/curation_concerns/permissions/readable.rb +0 -19
  392. data/curation_concerns-models/app/models/concerns/curation_concerns/permissions/writable.rb +0 -75
  393. data/curation_concerns-models/app/models/concerns/curation_concerns/permissions.rb +0 -7
  394. data/curation_concerns-models/app/models/concerns/curation_concerns/serializers.rb +0 -15
  395. data/curation_concerns-models/app/models/concerns/curation_concerns/solr_document_behavior.rb +0 -135
  396. data/curation_concerns-models/app/models/concerns/curation_concerns/user.rb +0 -65
  397. data/curation_concerns-models/app/models/concerns/curation_concerns/with_basic_metadata.rb +0 -98
  398. data/curation_concerns-models/app/models/concerns/curation_concerns/with_generic_files.rb +0 -29
  399. data/curation_concerns-models/app/models/curation_concerns/classify_concern.rb +0 -47
  400. data/curation_concerns-models/app/models/curation_concerns/quick_classification_query.rb +0 -31
  401. data/curation_concerns-models/app/models/datastreams/fits_datastream.rb +0 -148
  402. data/curation_concerns-models/app/models/version_committer.rb +0 -2
  403. data/curation_concerns-models/app/services/curation_concerns/characterization_service.rb +0 -71
  404. data/curation_concerns-models/app/services/curation_concerns/full_text_extraction_service.rb +0 -38
  405. data/curation_concerns-models/app/services/curation_concerns/generic_file_audit_service.rb +0 -85
  406. data/curation_concerns-models/app/services/curation_concerns/generic_file_indexing_service.rb +0 -14
  407. data/curation_concerns-models/app/services/curation_concerns/generic_work_indexing_service.rb +0 -16
  408. data/curation_concerns-models/app/services/curation_concerns/noid.rb +0 -23
  409. data/curation_concerns-models/app/services/curation_concerns/repository_audit_service.rb +0 -9
  410. data/curation_concerns-models/app/services/curation_concerns/versioning_service.rb +0 -27
  411. data/curation_concerns-models/config/locales/curation_concerns.en.yml +0 -6
  412. data/curation_concerns-models/curation_concerns-models.gemspec +0 -34
  413. data/curation_concerns-models/lib/curation_concerns/messages.rb +0 -66
  414. data/curation_concerns-models/lib/curation_concerns/models/engine.rb +0 -61
  415. data/curation_concerns-models/lib/curation_concerns/models/resque.rb +0 -36
  416. data/curation_concerns-models/lib/curation_concerns/models/utils.rb +0 -22
  417. data/curation_concerns-models/lib/curation_concerns/models/version.rb +0 -5
  418. data/curation_concerns-models/lib/curation_concerns/models.rb +0 -32
  419. data/curation_concerns-models/lib/generators/curation_concerns/models/abstract_migration_generator.rb +0 -30
  420. data/curation_concerns-models/lib/generators/curation_concerns/models/clamav_generator.rb +0 -19
  421. data/curation_concerns-models/lib/generators/curation_concerns/models/fulltext_generator.rb +0 -28
  422. data/curation_concerns-models/lib/generators/curation_concerns/models/install_generator.rb +0 -70
  423. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/app/models/collection.rb +0 -4
  424. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/app/models/generic_file.rb +0 -4
  425. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/clamav.rb +0 -1
  426. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/curation_concerns.rb +0 -123
  427. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/mime_types.rb +0 -6
  428. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/redis.yml +0 -9
  429. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/redis_config.rb +0 -32
  430. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/resque-pool.yml +0 -1
  431. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/resque_admin.rb +0 -10
  432. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/resque_config.rb +0 -5
  433. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/migrations/create_checksum_audit_logs.rb +0 -19
  434. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/migrations/create_version_committers.rb +0 -15
  435. data/curation_concerns-models/lib/tasks/curation_concerns-models_tasks.rake +0 -75
  436. data/curation_concerns-models/lib/tasks/migrate.rake +0 -13
  437. data/curation_concerns-models/lib/tasks/resque.rake +0 -13
  438. data/curation_concerns-models/lib/tasks/solr_reindex.rake +0 -8
  439. data/lib/curation_concerns/configuration.rb +0 -74
  440. data/lib/generators/curation_concerns/templates/curation_concerns_config.rb +0 -2
  441. data/solr_conf/conf/solrconfig.xml +0 -223
  442. data/spec/abilities/generic_file_abilities_spec.rb +0 -62
  443. data/spec/actors/curation_concerns/generic_file_actor_spec.rb +0 -116
  444. data/spec/controllers/curation_concerns/generic_files_controller_spec.rb +0 -251
  445. data/spec/forms/generic_file_edit_form_spec.rb +0 -33
  446. data/spec/helpers/thumbnail_helper_spec.rb +0 -21
  447. data/spec/jobs/copy_permissions_job_spec.rb +0 -49
  448. data/spec/jobs/curation_concerns_resque_queue_spec.rb +0 -49
  449. data/spec/models/curation_concerns/generic_file/derivatives_spec.rb +0 -88
  450. data/spec/models/curation_concerns/generic_work_behavior_spec.rb +0 -35
  451. data/spec/models/fits_datastream_spec.rb +0 -127
  452. data/spec/models/generic_file_spec.rb +0 -619
  453. data/spec/presenters/curation_concerns/generic_file_presenter_spec.rb +0 -16
  454. data/spec/services/characterization_service_spec.rb +0 -30
  455. data/spec/services/full_text_extraction_service_spec.rb +0 -5
  456. data/spec/services/generic_file_audit_service_spec.rb +0 -71
  457. data/spec/services/generic_file_indexing_service_spec.rb +0 -57
  458. data/spec/services/generic_work_indexing_service_spec.rb +0 -18
  459. data/spec/workers/visibility_copy_worker_spec.rb +0 -70
  460. data/vendor/assets/javascripts/handlebars.js +0 -2278
  461. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.autocomplete.js +0 -602
  462. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.core.js +0 -356
  463. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.effect-highlight.js +0 -50
  464. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.effect.js +0 -1276
  465. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.menu.js +0 -610
  466. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.position.js +0 -498
  467. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.widget.js +0 -528
  468. data/vendor/assets/javascripts/jquery.tokeninput.js +0 -1061
  469. data/vendor/assets/stylesheets/jquery-ui-lightness.css +0 -474
  470. data/vendor/assets/stylesheets/token-input-facebook.css +0 -122
  471. data/vendor/assets/stylesheets/token-input-mac.css +0 -204
  472. data/vendor/assets/stylesheets/token-input.css +0 -127
@@ -7,20 +7,20 @@ describe CollectionsController do
7
7
  end
8
8
 
9
9
  let(:user) { FactoryGirl.create(:user) }
10
- let(:asset1) { FactoryGirl.build(:generic_work, title: ["First of the Assets"], user: user) }
11
- let(:asset2) { FactoryGirl.build(:generic_work, title: ["Second of the Assets"], user: user, depositor: user.user_key) }
12
- let(:asset3) { FactoryGirl.build(:generic_work, title: ["Third of the Assets"]) }
13
- let!(:asset4) { FactoryGirl.create(:generic_work, title: ["Fourth of the Assets"], user: user) }
14
- let(:bogus_depositor_asset) { FactoryGirl.create(:generic_work, title: ["Bogus Asset"], depositor: 'abc') }
15
- let(:collection_attrs) { FactoryGirl.attributes_for(:collection, title: "My First Collection ", description: "The Description\r\n\r\nand more") }
16
- let(:collection) { FactoryGirl.create(:collection, title: "Collection Title", user: user) }
10
+ let(:asset1) { FactoryGirl.build(:generic_work, title: ['First of the Assets'], user: user) }
11
+ let(:asset2) { FactoryGirl.build(:generic_work, title: ['Second of the Assets'], user: user, depositor: user.user_key) }
12
+ let(:asset3) { FactoryGirl.build(:generic_work, title: ['Third of the Assets']) }
13
+ let!(:asset4) { FactoryGirl.create(:generic_work, title: ['Fourth of the Assets'], user: user) }
14
+ let(:bogus_depositor_asset) { FactoryGirl.create(:generic_work, title: ['Bogus Asset'], depositor: 'abc') }
15
+ let(:collection_attrs) { FactoryGirl.attributes_for(:collection, title: 'My First Collection ', description: "The Description\r\n\r\nand more") }
16
+ let(:collection) { FactoryGirl.create(:collection, title: 'Collection Title', user: user) }
17
17
 
18
18
  describe '#new' do
19
19
  before do
20
20
  sign_in user
21
21
  end
22
22
 
23
- it 'should assign @collection' do
23
+ it 'assigns @collection' do
24
24
  get :new
25
25
  expect(assigns(:collection)).to be_kind_of(Collection)
26
26
  end
@@ -31,139 +31,156 @@ describe CollectionsController do
31
31
  sign_in user
32
32
  end
33
33
 
34
- it "should create a Collection" do
35
- expect {
36
- post :create, collection: collection_attrs
37
- }.to change{ Collection.count }.by(1)
34
+ it 'creates a Collection' do
35
+ expect do
36
+ post :create, collection: collection_attrs.merge(visibility: 'open')
37
+ end.to change { Collection.count }.by(1)
38
+ expect(assigns[:collection].visibility).to eq 'open'
38
39
  end
39
40
 
40
- it "should remove blank strings from params before creating Collection" do
41
- expect {
42
- post :create, collection: collection_attrs.merge(creator: [""])
43
- }.to change{ Collection.count }.by(1)
44
- expect(assigns[:collection].title).to eq("My First Collection ")
41
+ it 'removes blank strings from params before creating Collection' do
42
+ expect do
43
+ post :create, collection: collection_attrs.merge(creator: [''])
44
+ end.to change { Collection.count }.by(1)
45
+ expect(assigns[:collection].title).to eq('My First Collection ')
45
46
  expect(assigns[:collection].creator).to eq([])
46
47
  end
47
48
 
48
- it "should create a Collection with files I can access" do
49
- [ asset1, asset2 ].map(&:save) # bogus_depositor_asset is already saved
50
- expect {
49
+ it 'creates a Collection with files I can access' do
50
+ [asset1, asset2].map(&:save) # bogus_depositor_asset is already saved
51
+ expect do
51
52
  post :create, collection: collection_attrs,
52
- batch_document_ids: [asset1.id, asset2.id, bogus_depositor_asset.id]
53
- }.to change{ Collection.count }.by(1)
53
+ batch_document_ids: [asset1.id, asset2.id, bogus_depositor_asset.id]
54
+ end.to change { Collection.count }.by(1)
54
55
  collection = assigns(:collection)
55
56
  expect(collection.members).to match_array [asset1, asset2]
56
57
  end
57
58
 
58
- it "should add docs to the collection if a batch id is provided and add the collection id to the documents in the collection" do
59
+ it 'adds docs to the collection if a batch id is provided and add the collection id to the documents in the collection' do
59
60
  asset1.save
60
61
  post :create, batch_document_ids: [asset1.id], collection: collection_attrs
61
62
  expect(assigns[:collection].members).to eq [asset1]
62
63
 
63
- asset_results = ActiveFedora::SolrService.instance.conn.get "select", params:{fq:["id:\"#{asset1.id}\""],fl:['id',Solrizer.solr_name(:collection)]}
64
- expect(asset_results["response"]["numFound"]).to eq 1
64
+ asset_results = ActiveFedora::SolrService.instance.conn.get 'select', params: { fq: ["id:\"#{asset1.id}\""], fl: ['id'] }
65
+ expect(asset_results['response']['numFound']).to eq 1
65
66
 
66
- doc = asset_results["response"]["docs"].first
67
- expect(doc["id"]).to eq asset1.id
68
-
69
- afterupdate = GenericWork.find(asset1.id)
70
- expect(doc[Solrizer.solr_name(:collection)]).to eq afterupdate.to_solr[Solrizer.solr_name(:collection)]
67
+ doc = asset_results['response']['docs'].first
68
+ expect(doc['id']).to eq asset1.id
71
69
  end
72
-
73
70
  end
74
71
 
75
- describe "#update" do
72
+ describe '#update' do
76
73
  before { sign_in user }
77
74
 
78
- context "a collections members" do
75
+ context 'collection members' do
79
76
  before do
80
- [ asset1, asset2 ].map(&:save) # bogus_depositor_asset is already saved
81
- bogus_depositor_asset.apply_depositor_metadata(user.user_key)
82
- bogus_depositor_asset.save
77
+ [asset1, asset2].map(&:save) # bogus_depositor_asset is already saved
78
+ collection.members = [asset1, asset2]
79
+ collection.save!
83
80
  end
84
81
 
85
- it "should set collection on members" do
86
- put :update, id: collection,
87
- collection: { members:"add" },
88
- batch_document_ids: [ bogus_depositor_asset.id, asset1.id, asset2.id ]
82
+ # Collections are unordered by default, which disallows duplicates.
83
+ xit 'appends members to the collection in order, allowing duplicates' do
84
+ # TODO: Using size until count is fixed https://github.com/projecthydra-labs/activefedora-aggregation/issues/78
85
+ expect {
86
+ put :update, id: collection,
87
+ collection: { members: 'add' },
88
+ batch_document_ids: [asset2.id, asset1.id]
89
+ }.to change { collection.reload.members.size }.by(2)
89
90
  expect(response).to redirect_to routes.url_helpers.collection_path(collection)
90
- expect(assigns[:collection].members).to match_array [ asset2, bogus_depositor_asset, asset1 ]
91
+ expect(assigns[:collection].members).to eq [asset1, asset2, asset2, asset1]
91
92
 
92
- asset_results = ActiveFedora::SolrService.instance.conn.get "select", params:{fq:["id:\"#{asset2.id}\""],fl:['id',Solrizer.solr_name(:collection)]}
93
- expect(asset_results["response"]["numFound"]).to eq 1
93
+ asset_results = ActiveFedora::SolrService.instance.conn.get 'select', params: { fq: ["id:\"#{asset2.id}\""], fl: ['id'] }
94
+ expect(asset_results['response']['numFound']).to eq 1
94
95
 
95
- doc = asset_results["response"]["docs"].first
96
- expect(doc["id"]).to eq asset2.id
96
+ doc = asset_results['response']['docs'].first
97
+ expect(doc['id']).to eq asset2.id
98
+ end
97
99
 
98
- afterupdate = GenericWork.find(asset2.id)
99
- expect(doc[Solrizer.solr_name(:collection)]).to eq afterupdate.to_solr[Solrizer.solr_name(:collection)]
100
+ it "adds members to the collection" do
101
+ expect {
102
+ put :update, id: collection,
103
+ collection: { members: 'add' },
104
+ batch_document_ids: [asset4.id]
105
+ }.to change { collection.reload.members.size }.by(1)
106
+ expect(response).to redirect_to routes.url_helpers.collection_path(collection)
107
+ expect(assigns[:collection].members).to eq [asset1, asset2, asset4]
100
108
 
101
- put :update, id: collection,
102
- collection: { members: "remove" },
103
- batch_document_ids: [ asset2 ]
104
- asset_results = ActiveFedora::SolrService.instance.conn.get "select", params:{fq:["id:\"#{asset2.id}\""],fl:['id',Solrizer.solr_name(:collection)]}
105
- expect(asset_results["response"]["numFound"]).to eq 1
109
+ asset_results = ActiveFedora::SolrService.instance.conn.get 'select', params: { fq: ["id:\"#{asset2.id}\""], fl: ['id'] }
110
+ expect(asset_results['response']['numFound']).to eq 1
106
111
 
107
- doc = asset_results["response"]["docs"].first
108
- expect(doc["id"]).to eq asset2.id
112
+ doc = asset_results['response']['docs'].first
113
+ expect(doc['id']).to eq asset2.id
114
+ end
109
115
 
110
- afterupdate = GenericWork.find(asset2.id)
111
- expect(doc[Solrizer.solr_name(:collection)]).to be_nil
116
+ it "removes members from the collection" do
117
+ # TODO: Using size until count is fixed https://github.com/projecthydra-labs/activefedora-aggregation/issues/78
118
+ expect {
119
+ put :update, id: collection,
120
+ collection: { members: 'remove' },
121
+ batch_document_ids: [asset2]
122
+ }.to change { collection.reload.members.size }.by(-1)
123
+ asset_results = ActiveFedora::SolrService.instance.conn.get 'select', params: { fq: ["id:\"#{asset2.id}\""], fl: ['id'] }
124
+ expect(asset_results['response']['numFound']).to eq 1
125
+
126
+ doc = asset_results['response']['docs'].first
127
+ expect(doc['id']).to eq asset2.id
112
128
  end
113
129
  end
114
130
 
115
- context "updating a collections metadata" do
116
- it "should save the metadata" do
117
- put :update, id: collection, collection: { creator: ['Emily'] }
131
+ context 'updating a collections metadata' do
132
+ it 'saves the metadata' do
133
+ put :update, id: collection, collection: { creator: ['Emily'], visibility: 'open' }
118
134
  collection.reload
119
135
  expect(collection.creator).to eq ['Emily']
136
+ expect(collection.visibility).to eq 'open'
120
137
  end
121
138
 
122
- it "should remove blank strings from params before updating Collection metadata" do
123
- put :update, id: collection, collection: collection_attrs.merge(creator: [""])
124
- expect(assigns[:collection].title).to eq("My First Collection ")
139
+ it 'removes blank strings from params before updating Collection metadata' do
140
+ put :update, id: collection, collection: collection_attrs.merge(creator: [''])
141
+ expect(assigns[:collection].title).to eq('My First Collection ')
125
142
  expect(assigns[:collection].creator).to eq([])
126
143
  end
127
-
128
144
  end
129
145
  end
130
146
 
131
- describe "#show" do
132
-
133
- context "when signed in" do
147
+ describe '#show' do
148
+ context 'when signed in' do
134
149
  before do
135
150
  sign_in user
136
- [ asset1, asset2, asset3 ].map { |a| a.apply_depositor_metadata(user); a.save }
137
- collection.members = [ asset1, asset2, asset3 ]
151
+ [asset1, asset2, asset3].map do |a|
152
+ a.apply_depositor_metadata(user)
153
+ a.save
154
+ end
155
+ collection.members = [asset1, asset2, asset3]
138
156
  collection.save
139
157
  end
140
158
 
141
- it "should return the collection and its members" do
159
+ it 'returns the collection and its members' do
142
160
  get :show, id: collection
143
161
  expect(response).to be_successful
144
162
  expect(assigns[:presenter]).to be_kind_of CurationConcerns::CollectionPresenter
145
- expect(assigns[:collection].title).to eq collection.title
163
+ expect(assigns[:presenter].title).to eq collection.title
146
164
  expect(assigns[:member_docs].map(&:id)).to match_array [asset1, asset2, asset3].map(&:id)
147
165
  end
148
166
  end
149
167
 
150
- context "not signed in" do
168
+ context 'not signed in' do
151
169
  before do
152
- collection.members = [ asset1, asset2, asset3 ]
170
+ collection.members = [asset1, asset2, asset3]
153
171
  collection.save
154
172
  end
155
- it "should force me to log in" do
173
+ it 'forces me to log in' do
156
174
  get :show, id: collection
157
175
  expect(response).to redirect_to(main_app.new_user_session_path)
158
176
  end
159
177
  end
160
178
  end
161
179
 
162
- describe "#edit" do
163
-
180
+ describe '#edit' do
164
181
  before { sign_in user }
165
182
 
166
- it "should not show flash" do
183
+ it 'does not show flash' do
167
184
  get :edit, id: collection
168
185
  expect(flash[:notice]).to be_nil
169
186
  end
@@ -0,0 +1,106 @@
1
+ require 'spec_helper'
2
+
3
+ describe CurationConcerns::FileSetsController do
4
+ let(:user) { create(:user) }
5
+ let(:parent) { create(:generic_work, edit_users: [user.user_key], visibility: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC) }
6
+ let(:file_set) do
7
+ create(:file_set, user: user).tap do |file_set|
8
+ parent.members << file_set
9
+ end
10
+ end
11
+ let(:file) { fixture_file_upload('/world.png', 'image/png') }
12
+ let(:empty_file) { fixture_file_upload('/empty_file.txt', 'text/plain') }
13
+
14
+ before { sign_in user }
15
+
16
+ context "JSON" do
17
+ let(:resource) { file_set }
18
+ let(:resource_request) { get :show, id: resource, format: :json }
19
+ subject { response }
20
+ describe "unauthorized" do
21
+ before do
22
+ sign_out user
23
+ resource_request
24
+ end
25
+ it { is_expected.to respond_unauthorized }
26
+ end
27
+ describe "forbidden" do
28
+ before do
29
+ sign_in create(:user)
30
+ resource_request
31
+ end
32
+ it { is_expected.to respond_forbidden }
33
+ end
34
+ describe 'not found' do
35
+ before { get :show, id: "non-existent-pid", format: :json }
36
+ it { is_expected.to respond_not_found(description: 'Object non-existent-pid not found in solr') }
37
+ end
38
+
39
+ describe 'created' do
40
+ it "returns 201, renders jq_upload json template and sets location header" do
41
+ expect(controller.send(:actor)).to receive(:create_metadata).with(nil, parent, hash_including(:files, title: ['a title']))
42
+ expect(controller.send(:actor)).to receive(:create_content).with(file).and_return(true)
43
+
44
+ allow_any_instance_of(FileSet).to receive(:persisted?).and_return(true)
45
+ allow_any_instance_of(FileSet).to receive(:to_param).and_return('999')
46
+
47
+ post :create, file_set: { title: ['a title'], files: [file] }, parent_id: parent.id, format: :json
48
+
49
+ expect(assigns[:file_set]).to be_instance_of ::FileSet # this object is used by the jbuilder template
50
+ expect(controller).to render_template('curation_concerns/file_sets/jq_upload')
51
+ expect(response.status).to eq 201
52
+ created_resource = controller.curation_concern
53
+ expect(response.location).to eq main_app.curation_concerns_file_set_path(created_resource)
54
+ end
55
+ end
56
+ describe 'failed create: no file' do
57
+ before { post :create, file_set: { title: ["foo"] }, parent_id: parent.id, format: :json }
58
+ it { is_expected.to respond_bad_request(message: 'Error! No file to save') }
59
+ end
60
+ describe 'failed create: bad file' do
61
+ before { post :create, file_set: { files: ['not a file'] }, parent_id: parent.id, format: :json }
62
+ it { is_expected.to respond_bad_request(message: 'Error! No file for upload', description: 'unknown file') }
63
+ end
64
+ describe 'failed create: empty file' do
65
+ before { post :create, file_set: { files: [empty_file] }, parent_id: parent.id, format: :json }
66
+ it { is_expected.to respond_unprocessable_entity(errors: { files: "#{empty_file.original_filename} has no content! (Zero length file)" }, description: I18n.t('curation_concerns.api.unprocessable_entity.empty_file')) }
67
+ end
68
+ describe 'failed create: solr error' do
69
+ before do
70
+ allow(controller).to receive(:process_file).and_raise(RSolr::Error::Http.new(controller.request, response))
71
+ post :create, file_set: { files: [file] }, parent_id: parent.id, format: :json
72
+ end
73
+ it { is_expected.to respond_internal_error(message: 'Error occurred while creating generic file.') }
74
+ end
75
+ describe 'found' do
76
+ before { resource_request }
77
+ it "returns json of the work" do
78
+ expect(assigns[:file_set]).to be_instance_of ::FileSet # this object is used by the jbuilder template
79
+ expect(controller).to render_template('curation_concerns/file_sets/show')
80
+ expect(response.code).to eq "200"
81
+ end
82
+ end
83
+ describe 'updated' do
84
+ before { put :update, id: resource, file_set: { title: ['updated title'] }, format: :json }
85
+ it "returns json of updated work and sets location header" do
86
+ expect(assigns[:file_set]).to be_instance_of ::FileSet # this object is used by the jbuilder template
87
+ expect(controller).to render_template('curation_concerns/file_sets/show')
88
+ expect(response.status).to eq 200
89
+ created_resource = assigns[:file_set]
90
+ expect(response.location).to eq main_app.curation_concerns_file_set_path(created_resource)
91
+ end
92
+ end
93
+ describe 'failed update' do
94
+ before {
95
+ expect(controller).to receive(:update_metadata) do
96
+ controller.curation_concern.errors.add(:some_field, "This is not valid. Fix it.")
97
+ false
98
+ end
99
+ post :update, id: resource, file_set: { title: nil, depositor: nil }, format: :json
100
+ }
101
+ it "returns 422 and the errors" do
102
+ expect(response).to respond_unprocessable_entity(errors: { "some_field": ["This is not valid. Fix it."] })
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,237 @@
1
+ require 'spec_helper'
2
+
3
+ describe CurationConcerns::FileSetsController do
4
+ let(:user) { create(:user) }
5
+ let(:file) { fixture_file_upload('files/image.png', 'image/png') }
6
+ let(:parent) { create(:generic_work, edit_users: [user.user_key], visibility: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC) }
7
+
8
+ context 'when signed in' do
9
+ before { sign_in user }
10
+
11
+ describe '#create' do
12
+ before do
13
+ FileSet.destroy_all
14
+ end
15
+
16
+ context 'on the happy path' do
17
+ let(:date_today) { DateTime.now }
18
+
19
+ before do
20
+ allow(DateTime).to receive(:now).and_return(date_today)
21
+ end
22
+
23
+ it 'calls the actor to create metadata and content' do
24
+ expect(controller.send(:actor)).to receive(:create_metadata).with(nil, parent, files: [file], title: ['test title'], visibility: 'restricted')
25
+ expect(controller.send(:actor)).to receive(:create_content).with(file).and_return(true)
26
+ xhr :post, :create, parent_id: parent,
27
+ file_set: { files: [file],
28
+ title: ['test title'],
29
+ visibility: 'restricted' }
30
+ expect(response).to be_success
31
+ expect(flash[:error]).to be_nil
32
+ end
33
+ end
34
+
35
+ context "on something that isn't a file" do
36
+ # Note: This is a duplicate of coverage in file_sets_controller_json_spec.rb
37
+ it 'renders error' do
38
+ xhr :post, :create, parent_id: parent, file_set: { files: ['hello'] },
39
+ permission: { group: { 'public' => 'read' } }, terms_of_service: '1'
40
+ expect(response.status).to eq 400
41
+ msg = JSON.parse(response.body)['message']
42
+ expect(msg).to match(/no file for upload/i)
43
+ end
44
+ end
45
+
46
+ subject { create(:file_set) }
47
+ let(:file_path) { fixture_path + '/small_file.txt' }
48
+
49
+ context 'when the file has a virus' do
50
+ before do
51
+ allow(subject).to receive(:warn) # suppress virus warnings
52
+ allow(ClamAV.instance).to receive(:scanfile).and_return('EL CRAPO VIRUS')
53
+ of = subject.build_original_file
54
+ of.content = File.open(file_path)
55
+ end
56
+ it 'populates the errors hash during validation' do
57
+ expect(subject).to_not be_valid
58
+ expect(subject.errors.messages[:base].first).to match(/A virus was found in .*: EL CRAPO VIRUS/)
59
+ end
60
+ end
61
+
62
+ context 'when solr is down' do
63
+ before do
64
+ allow(controller.send(:actor)).to receive(:create_metadata)
65
+ allow(controller.send(:actor)).to receive(:create_content).with(file).and_raise(RSolr::Error::Http.new({}, {}))
66
+ end
67
+
68
+ it 'errors out of create after on continuous rsolr error' do
69
+ xhr :post, :create, parent_id: parent, file_set: { files: [file] },
70
+ permission: { group: { 'public' => 'read' } }, terms_of_service: '1'
71
+ expect(response.body).to include('Error occurred while creating generic file.')
72
+ end
73
+ end
74
+ end
75
+
76
+ describe 'destroy' do
77
+ let(:file_set) do
78
+ file_set = FileSet.create! do |gf|
79
+ gf.apply_depositor_metadata(user)
80
+ end
81
+ parent.ordered_members << file_set
82
+ parent.save
83
+ file_set
84
+ end
85
+
86
+ it 'deletes the file' do
87
+ expect(FileSet.find(file_set.id)).to be_kind_of FileSet
88
+ delete :destroy, id: file_set
89
+ expect { FileSet.find(file_set.id) }.to raise_error Ldp::Gone
90
+ expect(response).to redirect_to main_app.curation_concerns_generic_work_path(parent)
91
+ end
92
+ end
93
+
94
+ describe 'update' do
95
+ let!(:file_set) do
96
+ file_set = FileSet.new.tap do |gf|
97
+ gf.apply_depositor_metadata(user)
98
+ gf.visibility = Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE
99
+ gf.save!
100
+ end
101
+ parent.ordered_members << file_set
102
+ parent.save
103
+ file_set
104
+ end
105
+
106
+ after do
107
+ file_set.destroy
108
+ end
109
+
110
+ context 'updating metadata' do
111
+ it 'is successful and update attributes' do
112
+ post :update, id: file_set, file_set:
113
+ { title: ['new_title'], tag: [''], permissions_attributes: [{ type: 'person', name: 'archivist1', access: 'edit' }] }
114
+ expect(response).to redirect_to main_app.curation_concerns_file_set_path(file_set)
115
+ expect(assigns[:file_set].title).to eq(['new_title'])
116
+ end
117
+
118
+ it 'goes back to edit on an error' do
119
+ allow_any_instance_of(FileSet).to receive(:valid?).and_return(false)
120
+ post :update, id: file_set, file_set:
121
+ { title: ['new_title'], tag: [''], permissions_attributes: [{ type: 'person', name: 'archivist1', access: 'edit' }] }
122
+ expect(response.status).to eq 422
123
+ expect(response).to render_template('edit')
124
+ expect(assigns[:file_set]).to eq file_set
125
+ end
126
+
127
+ context 'updating visibility' do
128
+ it 'applies public' do
129
+ new_visibility = Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC
130
+ post :update, id: file_set, file_set: { visibility: new_visibility, embargo_release_date: '' }
131
+ expect(file_set.reload.visibility).to eq new_visibility
132
+ end
133
+
134
+ it 'applies embargo' do
135
+ post :update, id: file_set, file_set: {
136
+ visibility: 'embargo',
137
+ visibility_during_embargo: 'restricted',
138
+ embargo_release_date: '2099-09-05',
139
+ visibility_after_embargo: 'open',
140
+ visibility_during_lease: 'open',
141
+ lease_expiration_date: '2099-09-05',
142
+ visibility_after_lease: 'restricted'
143
+ }
144
+ file_set.reload
145
+ expect(file_set).to be_under_embargo
146
+ expect(file_set).to_not be_active_lease
147
+ end
148
+ end
149
+ end
150
+
151
+ context 'updating file content' do
152
+ it 'is successful' do
153
+ expect(IngestFileJob).to receive(:perform_later)
154
+ expect(CharacterizeJob).to receive(:perform_later).with(file_set.id, kind_of(String))
155
+ post :update, id: file_set, file_set: { files: [file] }
156
+ expect(response).to redirect_to main_app.curation_concerns_file_set_path(file_set)
157
+ end
158
+ end
159
+
160
+ context 'restoring an old version' do
161
+ before do
162
+ # don't run characterization jobs
163
+ allow(CharacterizeJob).to receive(:perform_later)
164
+ # Create version 1
165
+ Hydra::Works::AddFileToFileSet.call(file_set, File.open(fixture_file_path('small_file.txt')), :original_file)
166
+ # Create version 2
167
+ Hydra::Works::AddFileToFileSet.call(file_set, File.open(fixture_file_path('curation_concerns_generic_stub.txt')), :original_file)
168
+ end
169
+
170
+ # TODO: This test should move into the FileSetActor spec and just ensure the actor is called.
171
+ it 'is successful' do
172
+ expect(file_set.latest_content_version.label).to eq('version2')
173
+ expect(file_set.original_file.content).to eq("This is a test fixture for curation_concerns: <%= @id %>.\n")
174
+ post :update, id: file_set, revision: 'version1'
175
+ expect(response).to redirect_to main_app.curation_concerns_file_set_path(file_set)
176
+ reloaded = file_set.reload.original_file
177
+ expect(reloaded.versions.last.label).to eq 'version3'
178
+ expect(reloaded.content).to eq "small\n"
179
+ expect(reloaded.mime_type).to eq 'text/plain'
180
+ end
181
+ end
182
+ end
183
+ end
184
+
185
+ context 'someone elses (public) files' do
186
+ let(:creator) { create(:user, email: 'archivist1@example.com') }
187
+ let(:public_file_set) { create(:file_set, user: creator, read_groups: ['public']) }
188
+ before { sign_in user }
189
+
190
+ describe '#edit' do
191
+ it 'gives me the unauthorized page' do
192
+ get :edit, id: public_file_set
193
+ expect(response.code).to eq '401'
194
+ expect(response).to render_template(:unauthorized)
195
+ end
196
+ end
197
+
198
+ describe '#show' do
199
+ it 'allows access to the file' do
200
+ get :show, id: public_file_set
201
+ expect(response).to be_success
202
+ end
203
+ end
204
+ end
205
+
206
+ context 'when not signed in' do
207
+ let(:private_file_set) { create(:file_set) }
208
+ let(:public_file_set) { create(:file_set, read_groups: ['public']) }
209
+
210
+ describe '#edit' do
211
+ it 'requires login' do
212
+ get :edit, id: public_file_set
213
+ expect(response).to fail_redirect_and_flash(main_app.new_user_session_path, 'You are not authorized to access this page.')
214
+ end
215
+ end
216
+
217
+ describe '#show' do
218
+ it 'denies access to private files' do
219
+ get :show, id: private_file_set
220
+ expect(response).to fail_redirect_and_flash(main_app.new_user_session_path, 'You are not authorized to access this page.')
221
+ end
222
+
223
+ it 'allows access to public files' do
224
+ expect(controller).to receive(:additional_response_formats).with(ActionController::MimeResponds::Collector)
225
+ get :show, id: public_file_set
226
+ expect(response).to be_success
227
+ end
228
+ end
229
+
230
+ describe '#new' do
231
+ it 'does not let the user submit' do
232
+ get :new, parent_id: parent
233
+ expect(response).to fail_redirect_and_flash(main_app.new_user_session_path, 'You are not authorized to access this page.')
234
+ end
235
+ end
236
+ end
237
+ end