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
@@ -0,0 +1,601 @@
1
+ require 'spec_helper'
2
+
3
+ # This tests the FileSet model that is inserted into the host app by curation_concerns:models:install
4
+ # It includes the CurationConcerns::FileSetBehavior module and nothing else
5
+ # So this test covers both the FileSetBehavior module and the generated FileSet model
6
+ describe FileSet do
7
+ let(:user) { FactoryGirl.find_or_create(:jill) }
8
+
9
+ describe 'rdf type' do
10
+ subject { described_class.new.type }
11
+ it { is_expected.to include(Hydra::PCDM::Vocab::PCDMTerms.Object, Hydra::Works::Vocab::WorksTerms.FileSet) }
12
+ end
13
+
14
+ it 'is a Hydra::Works::FileSet' do
15
+ expect(subject).to be_file_set
16
+ end
17
+
18
+ it 'has depositor' do
19
+ subject.depositor = 'tess@example.com'
20
+ end
21
+
22
+ it 'updates attributes' do
23
+ subject.attributes = { title: ['My new Title'] }
24
+ expect(subject.title).to eq(['My new Title'])
25
+ end
26
+
27
+ context 'when it is initialized' do
28
+ it 'has empty arrays for all the properties' do
29
+ subject.attributes.each do |_k, v|
30
+ expect(Array(v)).to eq([])
31
+ end
32
+ end
33
+ end
34
+
35
+ describe 'visibility' do
36
+ it "does not be changed when it's new" do
37
+ expect(subject).not_to be_visibility_changed
38
+ end
39
+ it 'is changed when it has been changed' do
40
+ subject.visibility = 'open'
41
+ expect(subject).to be_visibility_changed
42
+ end
43
+
44
+ it "does not be changed when it's set to its previous value" do
45
+ subject.visibility = 'restricted'
46
+ expect(subject).not_to be_visibility_changed
47
+ end
48
+ end
49
+
50
+ describe '#apply_depositor_metadata' do
51
+ before { subject.apply_depositor_metadata('jcoyne') }
52
+
53
+ it 'grants edit access and record the depositor' do
54
+ expect(subject.edit_users).to eq ['jcoyne']
55
+ expect(subject.depositor).to eq 'jcoyne'
56
+ end
57
+ end
58
+
59
+ describe 'attributes' do
60
+ it 'has a set of permissions' do
61
+ subject.read_groups = %w(group1 group2)
62
+ subject.edit_users = ['user1']
63
+ subject.read_users = %w(user2 user3)
64
+ expect(subject.permissions.map(&:to_hash)).to match_array [
65
+ { type: 'group', access: 'read', name: 'group1' },
66
+ { type: 'group', access: 'read', name: 'group2' },
67
+ { type: 'person', access: 'read', name: 'user2' },
68
+ { type: 'person', access: 'read', name: 'user3' },
69
+ { type: 'person', access: 'edit', name: 'user1' }]
70
+ end
71
+
72
+ it "has attached content" do
73
+ expect(subject.association(:original_file)).to be_kind_of ActiveFedora::Associations::DirectlyContainsOneAssociation
74
+ end
75
+ end
76
+
77
+ describe 'metadata' do
78
+ it 'has descriptive metadata' do
79
+ expect(subject).to respond_to(:relative_path)
80
+ expect(subject).to respond_to(:depositor)
81
+ expect(subject).to respond_to(:related_url)
82
+ expect(subject).to respond_to(:based_near)
83
+ expect(subject).to respond_to(:part_of)
84
+ expect(subject).to respond_to(:contributor)
85
+ expect(subject).to respond_to(:creator)
86
+ expect(subject).to respond_to(:title)
87
+ expect(subject).to respond_to(:description)
88
+ expect(subject).to respond_to(:publisher)
89
+ expect(subject).to respond_to(:date_created)
90
+ expect(subject).to respond_to(:date_uploaded)
91
+ expect(subject).to respond_to(:date_modified)
92
+ expect(subject).to respond_to(:subject)
93
+ expect(subject).to respond_to(:language)
94
+ expect(subject).to respond_to(:rights)
95
+ expect(subject).to respond_to(:resource_type)
96
+ expect(subject).to respond_to(:identifier)
97
+ end
98
+ it 'has properties from characterization metadata' do
99
+ expect(subject).to respond_to(:format_label)
100
+ expect(subject).to respond_to(:mime_type)
101
+ expect(subject).to respond_to(:file_size)
102
+ expect(subject).to respond_to(:last_modified)
103
+ expect(subject).to respond_to(:filename)
104
+ expect(subject).to respond_to(:original_checksum)
105
+ expect(subject).to respond_to(:well_formed)
106
+ expect(subject).to respond_to(:page_count)
107
+ expect(subject).to respond_to(:file_title)
108
+ expect(subject).to respond_to(:file_author)
109
+ end
110
+
111
+ it 'redefines to_param to make redis keys more recognizable' do
112
+ expect(subject.to_param).to eq subject.id
113
+ end
114
+
115
+ describe 'that have been saved' do
116
+ before { subject.apply_depositor_metadata('jcoyne') }
117
+
118
+ it 'is able to set values via delegated methods' do
119
+ subject.related_url = ['http://example.org/']
120
+ subject.creator = ['John Doe']
121
+ subject.title = ['New work']
122
+ subject.save
123
+ f = subject.reload
124
+ expect(f.related_url).to eq ['http://example.org/']
125
+ expect(f.creator).to eq ['John Doe']
126
+ expect(f.title).to eq ['New work']
127
+ end
128
+
129
+ it 'is able to be added to w/o unexpected graph behavior' do
130
+ subject.creator = ['John Doe']
131
+ subject.title = ['New work']
132
+ subject.save!
133
+ f = subject.reload
134
+ expect(f.creator).to eq ['John Doe']
135
+ expect(f.title).to eq ['New work']
136
+ f.creator = ['Jane Doe']
137
+ f.title += ['Newer work']
138
+ f.save
139
+ f = subject.reload
140
+ expect(f.creator).to eq ['Jane Doe']
141
+ # TODO: Is order important?
142
+ expect(f.title).to include('New work')
143
+ expect(f.title).to include('Newer work')
144
+ end
145
+ end
146
+ end
147
+
148
+ describe '#indexer' do
149
+ subject { described_class.indexer }
150
+ it { is_expected.to eq CurationConcerns::FileSetIndexingService }
151
+ end
152
+
153
+ it 'supports multi-valued fields in solr' do
154
+ subject.tag = %w(tag1 tag2)
155
+ expect { subject.save }.not_to raise_error
156
+ subject.delete
157
+ end
158
+
159
+ it 'supports setting and getting the relative_path value' do
160
+ subject.relative_path = 'documents/research/NSF/2010'
161
+ expect(subject.relative_path).to eq 'documents/research/NSF/2010'
162
+ end
163
+ describe 'create_thumbnail' do
164
+ before do
165
+ @f = described_class.new
166
+ @f.apply_depositor_metadata('mjg36')
167
+ end
168
+ describe 'with a video', if: CurationConcerns.config.enable_ffmpeg do
169
+ before do
170
+ allow(@f).to receive(mime_type: 'video/quicktime') # Would get set by the characterization job
171
+ @f.save
172
+ Hydra::Works::AddFileToFileSet.call(subject, File.open("#{fixture_path}/countdown.avi", 'rb'), :original_file)
173
+ end
174
+ it 'makes a png thumbnail' do
175
+ @f.create_thumbnail
176
+ expect(@f.thumbnail.content.size).to eq 4768 # this is a bad test. I just want to show that it did something.
177
+ expect(@f.thumbnail.mime_type).to eq 'image/png'
178
+ end
179
+ end
180
+ end
181
+
182
+ describe '#related_files' do
183
+ let!(:f1) { described_class.new }
184
+
185
+ context 'when there are no related files' do
186
+ it 'returns an empty array' do
187
+ expect(f1.related_files).to eq []
188
+ end
189
+ end
190
+
191
+ context 'when there are related files' do
192
+ let(:parent_work) { FactoryGirl.create(:work_with_files) }
193
+ let(:f1) { parent_work.file_sets.first }
194
+ let(:f2) { parent_work.file_sets.last }
195
+ subject { f1.reload.related_files }
196
+ it 'returns all files contained in parent work(s) but excludes itself' do
197
+ expect(subject).to include(f2)
198
+ expect(subject).to_not include(f1)
199
+ end
200
+ end
201
+ end
202
+
203
+ describe 'noid integration' do
204
+ before do
205
+ allow_any_instance_of(ActiveFedora::Noid::Service).to receive(:mint).and_return(noid)
206
+ end
207
+
208
+ let(:noid) { 'wd3763094' }
209
+
210
+ subject do
211
+ described_class.create { |f| f.apply_depositor_metadata('mjg36') }
212
+ end
213
+
214
+ it 'runs the overridden #assign_id method' do
215
+ expect_any_instance_of(ActiveFedora::Noid::Service).to receive(:mint).once
216
+ described_class.create { |f| f.apply_depositor_metadata('mjg36') }
217
+ end
218
+
219
+ it 'returns the expected identifier' do
220
+ expect(subject.id).to eq noid
221
+ end
222
+
223
+ it "has a treeified URL" do
224
+ expect(subject.uri.to_s).to end_with '/wd/37/63/09/wd3763094'
225
+ end
226
+
227
+ context 'when a url is provided' do
228
+ let(:url) { 'http://localhost:8983/fedora/rest/test/wd/37/63/09/wd3763094' }
229
+
230
+ it 'transforms the url into an id' do
231
+ expect(described_class.uri_to_id(url)).to eq 'wd3763094'
232
+ end
233
+ end
234
+ end
235
+
236
+ context 'with access control metadata' do
237
+ subject do
238
+ described_class.new do |m|
239
+ m.apply_depositor_metadata('jcoyne')
240
+ m.permissions_attributes = [{ type: 'person', access: 'read', name: 'person1' },
241
+ { type: 'person', access: 'read', name: 'person2' },
242
+ { type: 'group', access: 'read', name: 'group-6' },
243
+ { type: 'group', access: 'read', name: 'group-7' },
244
+ { type: 'group', access: 'edit', name: 'group-8' }]
245
+ end
246
+ end
247
+
248
+ it 'has read groups accessor' do
249
+ expect(subject.read_groups).to eq ['group-6', 'group-7']
250
+ end
251
+
252
+ it 'has read groups writer' do
253
+ subject.read_groups = ['group-2', 'group-3']
254
+ expect(subject.read_groups).to eq ['group-2', 'group-3']
255
+ end
256
+
257
+ it 'has read groups string writer' do
258
+ subject.read_groups_string = 'umg/up.dlt.staff, group-3'
259
+ expect(subject.read_groups).to eq ['umg/up.dlt.staff', 'group-3']
260
+ expect(subject.edit_groups).to eq ['group-8']
261
+ expect(subject.read_users).to eq %w(person1 person2)
262
+ expect(subject.edit_users).to eq ['jcoyne']
263
+ end
264
+
265
+ it 'revokes only eligible groups' do
266
+ subject.set_read_groups(['group-2', 'group-3'], ['group-6'])
267
+ # 'group-7' is not eligible to be revoked
268
+ expect(subject.read_groups).to match_array ['group-2', 'group-3', 'group-7']
269
+ expect(subject.edit_groups).to eq ['group-8']
270
+ expect(subject.read_users).to match_array %w(person1 person2)
271
+ expect(subject.edit_users).to eq ['jcoyne']
272
+ end
273
+ end
274
+
275
+ describe 'permissions validation' do
276
+ before { subject.apply_depositor_metadata('mjg36') }
277
+
278
+ describe 'overriding' do
279
+ let(:asset) { SampleKlass.new }
280
+ before do
281
+ class SampleKlass < FileSet
282
+ def paranoid_edit_permissions
283
+ []
284
+ end
285
+ end
286
+ asset.apply_depositor_metadata('mjg36')
287
+ end
288
+ after do
289
+ Object.send(:remove_const, :SampleKlass)
290
+ end
291
+ context 'when the public has edit access' do
292
+ before { subject.edit_groups = ['public'] }
293
+
294
+ it 'is invalid' do
295
+ expect(subject).to_not be_valid
296
+ expect(subject.errors[:edit_groups]).to include('Public cannot have edit access')
297
+ end
298
+ end
299
+ end
300
+
301
+ context 'when the depositor does not have edit access' do
302
+ before do
303
+ subject.permissions = [Hydra::AccessControls::Permission.new(type: 'person', name: 'mjg36', access: 'read')]
304
+ end
305
+ it 'is invalid' do
306
+ expect(subject).to_not be_valid
307
+ expect(subject.errors[:edit_users]).to include('Depositor must have edit access')
308
+ end
309
+ end
310
+
311
+ context 'when the public has edit access' do
312
+ before { subject.edit_groups = ['public'] }
313
+
314
+ it 'is invalid' do
315
+ expect(subject).to_not be_valid
316
+ expect(subject.errors[:edit_groups]).to include('Public cannot have edit access')
317
+ end
318
+ end
319
+
320
+ context 'when registered has edit access' do
321
+ before { subject.edit_groups = ['registered'] }
322
+
323
+ it 'is invalid' do
324
+ expect(subject).to_not be_valid
325
+ expect(subject.errors[:edit_groups]).to include('Registered cannot have edit access')
326
+ end
327
+ end
328
+
329
+ context 'everything is copacetic' do
330
+ it 'is valid' do
331
+ expect(subject).to be_valid
332
+ end
333
+ end
334
+ end
335
+
336
+ describe 'file content validation' do
337
+ subject { create(:file_set) }
338
+ let(:file_path) { fixture_path + '/small_file.txt' }
339
+
340
+ context 'when file contains a virus' do
341
+ before do
342
+ allow(subject).to receive(:warn) # suppress virus warnings
343
+ allow(ClamAV.instance).to receive(:scanfile).and_return('EL CRAPO VIRUS')
344
+ # TODO: Test that this works with Hydra::Works::UploadFileToFileSet. see https://github.com/projecthydra-labs/hydra-works/pull/139
345
+ # Hydra::Works::UploadFileToFileSet.call(subject, file_path, original_name: 'small_file.txt')
346
+ of = subject.build_original_file
347
+ of.content = File.open(file_path)
348
+ end
349
+
350
+ it 'populates the errors hash during validation' do
351
+ expect(subject).to_not be_valid
352
+ expect(subject.errors.messages[:base].first).to match(/A virus was found in .*: EL CRAPO VIRUS/)
353
+ end
354
+
355
+ it 'does not save the file or create a new version' do
356
+ original_version_count = subject.versions.count
357
+ subject.save
358
+ expect(subject.versions.count).to eq original_version_count
359
+ expect(subject.reload.original_file).to be_nil
360
+ end
361
+ end
362
+ end
363
+
364
+ describe 'to_solr' do
365
+ let(:indexer) { double(generate_solr_document: {}) }
366
+ before do
367
+ allow(CurationConcerns::FileSetIndexingService).to receive(:new)
368
+ .with(subject).and_return(indexer)
369
+ end
370
+
371
+ it 'calls the indexer' do
372
+ expect(indexer).to receive(:generate_solr_document)
373
+ subject.to_solr
374
+ end
375
+
376
+ it 'has human readable type' do
377
+ expect(subject.to_solr.fetch('human_readable_type_tesim')).to eq 'File Set'
378
+ end
379
+ end
380
+
381
+ context 'with versions' do
382
+ it 'has versions' do
383
+ expect(subject.versions.count).to eq 0
384
+ end
385
+ end
386
+
387
+ describe 'public?' do
388
+ context 'when read group is set to public' do
389
+ before { subject.read_groups = ['public'] }
390
+
391
+ it { is_expected.to be_public }
392
+ end
393
+
394
+ context 'when read group is not set to public' do
395
+ before { subject.read_groups = ['foo'] }
396
+ it { is_expected.not_to be_public }
397
+ end
398
+ end
399
+
400
+ describe 'work associations' do
401
+ let(:work) { create(:work_with_one_file) }
402
+ subject { work.file_sets.first.reload }
403
+ it 'belongs to works' do
404
+ expect(subject.generic_works).to eq [work]
405
+ end
406
+ end
407
+
408
+ describe '#to_s' do
409
+ it 'uses the provided titles' do
410
+ subject.title = %w(Hello World)
411
+ expect(subject.to_s).to eq('Hello | World')
412
+ end
413
+
414
+ it 'falls back on label if no titles are given' do
415
+ subject.title = []
416
+ subject.label = 'Spam'
417
+ expect(subject.to_s).to eq('Spam')
418
+ end
419
+
420
+ it 'with no label or titles it is "No Title"' do
421
+ subject.title = []
422
+ subject.label = nil
423
+ expect(subject.to_s).to eq('No Title')
424
+ end
425
+ end
426
+
427
+ describe 'to_solr record' do
428
+ let(:depositor) { 'jcoyne' }
429
+ subject do
430
+ described_class.new.tap do |f|
431
+ f.apply_depositor_metadata(depositor)
432
+ f.save
433
+ end
434
+ end
435
+ let(:depositor_key) { Solrizer.solr_name('depositor') }
436
+ let(:title_key) { Solrizer.solr_name('title', :stored_searchable, type: :string) }
437
+ let(:title) { ['abc123'] }
438
+ let(:no_terms) { described_class.find(subject.id).to_solr }
439
+ let(:terms) do
440
+ file = described_class.find(subject.id)
441
+ file.title = title
442
+ file.save
443
+ file.to_solr
444
+ end
445
+
446
+ context 'without terms' do
447
+ specify 'title is nil' do
448
+ expect(no_terms[title_key]).to be_nil
449
+ end
450
+ end
451
+
452
+ context 'with terms' do
453
+ specify 'depositor is set' do
454
+ expect(terms[depositor_key].first).to eql(depositor)
455
+ end
456
+ specify 'title is set' do
457
+ expect(terms[title_key]).to eql(title)
458
+ end
459
+ end
460
+ end
461
+
462
+ describe 'assign_id' do
463
+ context 'with noids enabled (by default)' do
464
+ it 'uses the noid service' do
465
+ expect_any_instance_of(ActiveFedora::Noid::Service).to receive(:mint).once
466
+ subject.assign_id
467
+ end
468
+ end
469
+
470
+ context 'with noids disabled' do
471
+ before { CurationConcerns.config.enable_noids = false }
472
+ after { CurationConcerns.config.enable_noids = true }
473
+
474
+ it 'does not use the noid service' do
475
+ expect_any_instance_of(ActiveFedora::Noid::Service).not_to receive(:mint)
476
+ subject.assign_id
477
+ end
478
+ end
479
+ end
480
+
481
+ describe 'with a parent work' do
482
+ let(:parent) { create(:work_with_one_file) }
483
+ let(:parent_id) { parent.id }
484
+
485
+ describe '#related_files' do
486
+ let(:parent) { create(:work_with_files) }
487
+ let(:sibling) { parent.file_sets.last }
488
+ subject { parent.file_sets.first.reload }
489
+ it 'returns related files, but not itself' do
490
+ expect(subject.related_files).to eq([sibling])
491
+ expect(sibling.reload.related_files).to eq([subject])
492
+ end
493
+ end
494
+
495
+ describe '#remove_representative_relationship' do
496
+ subject { parent.file_sets.first.reload }
497
+
498
+ context 'it is not the representative' do
499
+ let(:some_other_id) { create(:file_set).id }
500
+ before do
501
+ parent.representative_id = some_other_id
502
+ parent.save!
503
+ end
504
+
505
+ it "doesn't update parent work when file is deleted" do
506
+ subject.destroy
507
+ expect(parent.representative_id).to eq some_other_id
508
+ end
509
+ end
510
+
511
+ context 'it is the representative' do
512
+ before do
513
+ parent.representative_id = subject.id
514
+ parent.save!
515
+ end
516
+
517
+ it 'updates the parent work when the file is deleted' do
518
+ subject.destroy
519
+ expect(parent.reload.representative_id).to be_nil
520
+ end
521
+ end
522
+ end
523
+ end
524
+
525
+ describe 'mime type recognition' do
526
+ context '#image?' do
527
+ context 'when image/jp2' do
528
+ before { subject.mime_type = 'image/jp2' }
529
+ it { should be_image }
530
+ end
531
+ context 'when image/jpg' do
532
+ before { subject.mime_type = 'image/jpg' }
533
+ it { should be_image }
534
+ end
535
+ context 'when image/png' do
536
+ before { subject.mime_type = 'image/png' }
537
+ it { should be_image }
538
+ end
539
+ context 'when image/tiff' do
540
+ before { subject.mime_type = 'image/tiff' }
541
+ it { should be_image }
542
+ end
543
+ end
544
+
545
+ describe '#pdf?' do
546
+ before { subject.mime_type = 'application/pdf' }
547
+ it { should be_pdf }
548
+ end
549
+
550
+ describe '#audio?' do
551
+ context 'when x-wave' do
552
+ before { subject.mime_type = 'audio/x-wave' }
553
+ it { should be_audio }
554
+ end
555
+ context 'when x-wav' do
556
+ before { subject.mime_type = 'audio/x-wav' }
557
+ it { should be_audio }
558
+ end
559
+ context 'when mpeg' do
560
+ before { subject.mime_type = 'audio/mpeg' }
561
+ it { should be_audio }
562
+ end
563
+ context 'when mp3' do
564
+ before { subject.mime_type = 'audio/mp3' }
565
+ it { should be_audio }
566
+ end
567
+ context 'when ogg' do
568
+ before { subject.mime_type = 'audio/ogg' }
569
+ it { should be_audio }
570
+ end
571
+ end
572
+
573
+ describe '#video?' do
574
+ context 'should be true for avi' do
575
+ before { subject.mime_type = 'video/avi' }
576
+ it { should be_video }
577
+ end
578
+
579
+ context 'should be true for webm' do
580
+ before { subject.mime_type = 'video/webm' }
581
+ it { should be_video }
582
+ end
583
+ context 'should be true for mp4' do
584
+ before { subject.mime_type = 'video/mp4' }
585
+ it { should be_video }
586
+ end
587
+ context 'should be true for mpeg' do
588
+ before { subject.mime_type = 'video/mpeg' }
589
+ it { should be_video }
590
+ end
591
+ context 'should be true for quicktime' do
592
+ before { subject.mime_type = 'video/quicktime' }
593
+ it { should be_video }
594
+ end
595
+ context 'should be true for mxf' do
596
+ before { subject.mime_type = 'application/mxf' }
597
+ it { should be_video }
598
+ end
599
+ end
600
+ end
601
+ end
@@ -4,38 +4,39 @@ require 'spec_helper'
4
4
  # It includes the CurationConcerns::GenericWorkBehavior module and nothing else
5
5
  # So this test covers both the GenericWorkBehavior module and the generated GenericWork model
6
6
  describe GenericWork do
7
-
8
- it "has a title" do
7
+ it 'has a title' do
9
8
  subject.title = ['foo']
10
9
  expect(subject.title).to eq ['foo']
11
10
  end
12
11
 
13
- context "with attached files" do
12
+ context 'with attached files' do
14
13
  subject { FactoryGirl.create(:work_with_files) }
15
14
 
16
- it "has two files" do
17
- expect(subject.generic_files.size).to eq 2
18
- expect(subject.generic_files.first).to be_kind_of GenericFile
15
+ it 'has two file_sets' do
16
+ expect(subject.file_sets.size).to eq 2
17
+ expect(subject.file_sets.first).to be_kind_of FileSet
19
18
  end
20
19
  end
21
20
 
22
- describe "#indexer" do
21
+ describe '#indexer' do
23
22
  subject { described_class.indexer }
24
- it { is_expected.to eq CurationConcerns::GenericWorkIndexingService }
23
+ it { is_expected.to eq CurationConcerns::WorkIndexingService }
25
24
  end
26
25
 
27
- describe "to_solr" do
28
- subject { FactoryGirl.build(:work, date_uploaded: Date.today).to_solr }
29
- it "indexes some fields" do
26
+ describe 'to_solr' do
27
+ subject { build(:work, date_uploaded: Date.today).to_solr }
28
+
29
+ it 'indexes some fields' do
30
30
  expect(subject.keys).to include 'date_uploaded_dtsi'
31
31
  end
32
- it "inherits (and extends) to_solr behaviors from superclass" do
32
+
33
+ it 'inherits (and extends) to_solr behaviors from superclass' do
33
34
  expect(subject.keys).to include(:id)
34
- expect(subject.keys).to include("has_model_ssim")
35
+ expect(subject.keys).to include('has_model_ssim')
35
36
  end
36
37
  end
37
38
 
38
- describe "#to_partial_path" do
39
+ describe '#to_partial_path' do
39
40
  let(:work) { described_class.new }
40
41
  subject { work.to_partial_path }
41
42
  it { is_expected.to eq 'curation_concerns/generic_works/generic_work' }