curation_concerns 0.1.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 (424) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +18 -0
  5. data/Gemfile +31 -0
  6. data/LICENSE.txt +15 -0
  7. data/README.md +46 -0
  8. data/RELEASING.md +2 -0
  9. data/Rakefile +26 -0
  10. data/VERSION +1 -0
  11. data/app/assets/images/default.png +0 -0
  12. data/app/assets/images/nope.png +0 -0
  13. data/app/assets/javascripts/.gitkeep +0 -0
  14. data/app/assets/javascripts/curation_concerns/.gitkeep +0 -0
  15. data/app/assets/javascripts/curation_concerns/application.js +18 -0
  16. data/app/assets/javascripts/curation_concerns/browse_everything_implement.js +7 -0
  17. data/app/assets/javascripts/curation_concerns/curation_concerns.js +28 -0
  18. data/app/assets/javascripts/curation_concerns/embargoes.js +17 -0
  19. data/app/assets/javascripts/curation_concerns/facet_mine.js +22 -0
  20. data/app/assets/javascripts/curation_concerns/help_modal.js +36 -0
  21. data/app/assets/javascripts/curation_concerns/link_groups.js.coffee +123 -0
  22. data/app/assets/javascripts/curation_concerns/link_users.js.coffee +126 -0
  23. data/app/assets/javascripts/curation_concerns/proxy_rights.js.coffee +95 -0
  24. data/app/assets/javascripts/curation_concerns/proxy_submission.js +23 -0
  25. data/app/assets/javascripts/curation_concerns/select_works.js.coffee +20 -0
  26. data/app/assets/javascripts/modernizr.js +3 -0
  27. data/app/assets/stylesheets/curation_concerns/_curation_concerns.scss +9 -0
  28. data/app/assets/stylesheets/curation_concerns/_global-variables.scss +5 -0
  29. data/app/assets/stylesheets/curation_concerns/_modules.scss +13 -0
  30. data/app/assets/stylesheets/curation_concerns/_positioning.scss +138 -0
  31. data/app/assets/stylesheets/curation_concerns/_theme.scss +46 -0
  32. data/app/assets/stylesheets/curation_concerns/_typography.scss +137 -0
  33. data/app/assets/stylesheets/curation_concerns/_variables_bootstrap.scss +7 -0
  34. data/app/assets/stylesheets/curation_concerns/downloads.scss +3 -0
  35. data/app/assets/stylesheets/curation_concerns/help_requests.scss +3 -0
  36. data/app/assets/stylesheets/curation_concerns/modules/accessibility.scss +50 -0
  37. data/app/assets/stylesheets/curation_concerns/modules/accordion.scss +33 -0
  38. data/app/assets/stylesheets/curation_concerns/modules/attributes.scss +31 -0
  39. data/app/assets/stylesheets/curation_concerns/modules/classify_work.scss +100 -0
  40. data/app/assets/stylesheets/curation_concerns/modules/embargoes.scss +15 -0
  41. data/app/assets/stylesheets/curation_concerns/modules/emphatic_action_area.scss +14 -0
  42. data/app/assets/stylesheets/curation_concerns/modules/forms.scss +116 -0
  43. data/app/assets/stylesheets/curation_concerns/modules/multi_value_fields.scss +52 -0
  44. data/app/assets/stylesheets/curation_concerns/modules/pagination.scss +4 -0
  45. data/app/assets/stylesheets/curation_concerns/modules/search_results.scss +55 -0
  46. data/app/assets/stylesheets/curation_concerns/modules/site_actions.scss +53 -0
  47. data/app/assets/stylesheets/curation_concerns/modules/site_search.scss +46 -0
  48. data/app/controllers/catalog_controller.rb +3 -0
  49. data/app/controllers/collections_controller.rb +3 -0
  50. data/app/controllers/concerns/curation_concerns/application_controller_behavior.rb +28 -0
  51. data/app/controllers/concerns/curation_concerns/catalog_controller.rb +321 -0
  52. data/app/controllers/concerns/curation_concerns/collections_controller_behavior.rb +76 -0
  53. data/app/controllers/concerns/curation_concerns/curation_concern_controller.rb +125 -0
  54. data/app/controllers/concerns/curation_concerns/download_behavior.rb +60 -0
  55. data/app/controllers/concerns/curation_concerns/embargoes_controller_behavior.rb +44 -0
  56. data/app/controllers/concerns/curation_concerns/generic_files_controller_behavior.rb +149 -0
  57. data/app/controllers/concerns/curation_concerns/leases_controller_behavior.rb +36 -0
  58. data/app/controllers/concerns/curation_concerns/manages_embargoes.rb +26 -0
  59. data/app/controllers/concerns/curation_concerns/parent_container.rb +33 -0
  60. data/app/controllers/concerns/curation_concerns/themed_layout_controller.rb +31 -0
  61. data/app/controllers/concerns/curation_concerns/without_namespace.rb +15 -0
  62. data/app/controllers/curation_concerns/application_controller.rb +7 -0
  63. data/app/controllers/curation_concerns/classify_concerns_controller.rb +35 -0
  64. data/app/controllers/curation_concerns/generic_files_controller.rb +13 -0
  65. data/app/controllers/curation_concerns/permissions_controller.rb +19 -0
  66. data/app/controllers/downloads_controller.rb +4 -0
  67. data/app/controllers/embargoes_controller.rb +5 -0
  68. data/app/controllers/leases_controller.rb +5 -0
  69. data/app/controllers/registrations_controller.rb +20 -0
  70. data/app/controllers/sessions_controller.rb +4 -0
  71. data/app/datastreams/curation_concerns/generic_work_rdf_properties.rb +57 -0
  72. data/app/datastreams/generic_work_metadata.rb +3 -0
  73. data/app/forms/curation_concerns/forms/collection_edit_form.rb +17 -0
  74. data/app/forms/curation_concerns/forms/generic_file_edit_form.rb +15 -0
  75. data/app/forms/curation_concerns/forms/generic_work_edit_form.rb +9 -0
  76. data/app/helpers/curation_concerns/ability_helper.rb +46 -0
  77. data/app/helpers/curation_concerns/attribute_helper.rb +67 -0
  78. data/app/helpers/curation_concerns/catalog_helper.rb +38 -0
  79. data/app/helpers/curation_concerns/collections_helper.rb +63 -0
  80. data/app/helpers/curation_concerns/embargo_helper.rb +17 -0
  81. data/app/helpers/curation_concerns/generic_file_helper.rb +19 -0
  82. data/app/helpers/curation_concerns/lease_helper.rb +18 -0
  83. data/app/helpers/curation_concerns/main_app_helpers.rb +13 -0
  84. data/app/helpers/curation_concerns/render_constraints_helper.rb +42 -0
  85. data/app/helpers/curation_concerns/search_paths_helper.rb +13 -0
  86. data/app/helpers/curation_concerns/thumbnail_helper.rb +11 -0
  87. data/app/helpers/curation_concerns/title_helper.rb +23 -0
  88. data/app/helpers/curation_concerns/url_helper.rb +29 -0
  89. data/app/presenters/curation_concerns/collection_presenter.rb +40 -0
  90. data/app/presenters/curation_concerns/generic_file_presenter.rb +14 -0
  91. data/app/presenters/curation_concerns/generic_work_presenter.rb +13 -0
  92. data/app/search_builders/curation_concerns/search_builder.rb +49 -0
  93. data/app/services/curation_concerns/curation_concern.rb +14 -0
  94. data/app/services/curation_concerns/embargo_service.rb +26 -0
  95. data/app/services/curation_concerns/lease_service.rb +23 -0
  96. data/app/views/catalog/_action_menu_partials/_collection.html.erb +27 -0
  97. data/app/views/catalog/_action_menu_partials/_default.html.erb +27 -0
  98. data/app/views/catalog/_document.html.erb +3 -0
  99. data/app/views/catalog/_document_list.html.erb +5 -0
  100. data/app/views/catalog/_home_text.html.erb +8 -0
  101. data/app/views/catalog/_index_default.html.erb +17 -0
  102. data/app/views/catalog/_index_header_list_default.html.erb +8 -0
  103. data/app/views/catalog/_navbar.html.erb +12 -0
  104. data/app/views/catalog/_show_partials/_default.html.erb +22 -0
  105. data/app/views/catalog/_show_partials/_default_details.html.erb +15 -0
  106. data/app/views/catalog/_show_partials/_facets.html.erb +52 -0
  107. data/app/views/catalog/index.html.erb +47 -0
  108. data/app/views/collections/_add_to_collection_modal.html.erb +15 -0
  109. data/app/views/collections/_batch_edits_actions.html.erb +3 -0
  110. data/app/views/collections/_button_for_creating_empty_collection.html.erb +3 -0
  111. data/app/views/collections/_collection.html.erb +1 -0
  112. data/app/views/collections/_dashboard_document_list.html.erb +6 -0
  113. data/app/views/collections/_document_list.html.erb +7 -0
  114. data/app/views/collections/_edit_actions.html.erb +5 -0
  115. data/app/views/collections/_edit_descriptions.html.erb +20 -0
  116. data/app/views/collections/_form.html.erb +26 -0
  117. data/app/views/collections/_form_additional_information.html.erb +6 -0
  118. data/app/views/collections/_form_for_select_collection.html.erb +34 -0
  119. data/app/views/collections/_form_permission.html.erb +36 -0
  120. data/app/views/collections/_form_representative_image.html.erb +13 -0
  121. data/app/views/collections/_form_required_information.html.erb +11 -0
  122. data/app/views/collections/_form_to_add_member.html.erb +21 -0
  123. data/app/views/collections/_identifier_and_action.html.erb +15 -0
  124. data/app/views/collections/_media_display.html.erb +1 -0
  125. data/app/views/collections/_paginate.html.erb +6 -0
  126. data/app/views/collections/_search_collection_dashboard_form.html.erb +10 -0
  127. data/app/views/collections/_show_actions.html.erb +8 -0
  128. data/app/views/collections/_show_descriptions.html.erb +10 -0
  129. data/app/views/collections/_show_fields.html.erb +0 -0
  130. data/app/views/collections/_single_item_action_fields.html.erb +6 -0
  131. data/app/views/collections/_sort_and_per_page.html.erb +29 -0
  132. data/app/views/collections/_view_type_group.html.erb +13 -0
  133. data/app/views/collections/edit.html.erb +17 -0
  134. data/app/views/collections/show.html.erb +24 -0
  135. data/app/views/curation_concerns/base/_attributes.html.erb +25 -0
  136. data/app/views/curation_concerns/base/_collections.html.erb +26 -0
  137. data/app/views/curation_concerns/base/_form.html.erb +25 -0
  138. data/app/views/curation_concerns/base/_form_additional_information.html.erb +7 -0
  139. data/app/views/curation_concerns/base/_form_content_license.html.erb +16 -0
  140. data/app/views/curation_concerns/base/_form_descriptive_fields.erb +11 -0
  141. data/app/views/curation_concerns/base/_form_editors.html.erb +15 -0
  142. data/app/views/curation_concerns/base/_form_files_and_links.html.erb +23 -0
  143. data/app/views/curation_concerns/base/_form_permission.html.erb +52 -0
  144. data/app/views/curation_concerns/base/_form_permission_embargo.html.erb +6 -0
  145. data/app/views/curation_concerns/base/_form_permission_lease.html.erb +6 -0
  146. data/app/views/curation_concerns/base/_form_permission_under_embargo.html.erb +16 -0
  147. data/app/views/curation_concerns/base/_form_permission_under_lease.html.erb +18 -0
  148. data/app/views/curation_concerns/base/_form_representative_image.html.erb +13 -0
  149. data/app/views/curation_concerns/base/_form_required_information.html.erb +11 -0
  150. data/app/views/curation_concerns/base/_form_supplementary_fields.html.erb +15 -0
  151. data/app/views/curation_concerns/base/_legally_binding_text.html.erb +33 -0
  152. data/app/views/curation_concerns/base/_related_files.html.erb +24 -0
  153. data/app/views/curation_concerns/base/_representative_media.html.erb +8 -0
  154. data/app/views/curation_concerns/base/edit.html.erb +13 -0
  155. data/app/views/curation_concerns/base/new.html.erb +12 -0
  156. data/app/views/curation_concerns/base/show.html.erb +21 -0
  157. data/app/views/curation_concerns/base/unauthorized.html.erb +3 -0
  158. data/app/views/curation_concerns/classify_concerns/new.html.erb +25 -0
  159. data/app/views/curation_concerns/collections/_form_additional_information.html.erb +6 -0
  160. data/app/views/curation_concerns/generic_files/_actions.html.erb +16 -0
  161. data/app/views/curation_concerns/generic_files/_form.html.erb +35 -0
  162. data/app/views/curation_concerns/generic_files/_generic_file.html.erb +12 -0
  163. data/app/views/curation_concerns/generic_files/_media_display.html.erb +19 -0
  164. data/app/views/curation_concerns/generic_files/edit.html.erb +5 -0
  165. data/app/views/curation_concerns/generic_files/jq_upload.json.jbuilder +8 -0
  166. data/app/views/curation_concerns/generic_files/show.html.erb +15 -0
  167. data/app/views/curation_concerns/permissions/confirm.html.erb +21 -0
  168. data/app/views/embargoes/_embargo_history.html.erb +7 -0
  169. data/app/views/embargoes/_list_active_embargoes.html.erb +16 -0
  170. data/app/views/embargoes/_list_deactivated_embargoes.html.erb +10 -0
  171. data/app/views/embargoes/_list_expired_active_embargoes.html.erb +44 -0
  172. data/app/views/embargoes/edit.html.erb +43 -0
  173. data/app/views/embargoes/index.html.erb +18 -0
  174. data/app/views/layouts/boilerplate.html.erb +22 -0
  175. data/app/views/layouts/curation_concerns/1_column.html.erb +11 -0
  176. data/app/views/layouts/curation_concerns/catalog.html.erb +37 -0
  177. data/app/views/layouts/curation_concerns.html.erb +22 -0
  178. data/app/views/leases/_lease_history.html.erb +7 -0
  179. data/app/views/leases/_list_active_leases.html.erb +16 -0
  180. data/app/views/leases/_list_deactivated_leases.html.erb +4 -0
  181. data/app/views/leases/_list_expired_active_leases.html.erb +38 -0
  182. data/app/views/leases/edit.html.erb +43 -0
  183. data/app/views/leases/index.html.erb +18 -0
  184. data/app/views/shared/_add_content.html.erb +32 -0
  185. data/app/views/shared/_brand_bar.html.erb +10 -0
  186. data/app/views/shared/_flash_message.html.erb +17 -0
  187. data/app/views/shared/_footer.html.erb +10 -0
  188. data/app/views/shared/_ga.html.erb +6 -0
  189. data/app/views/shared/_header.html.erb +12 -0
  190. data/app/views/shared/_my_actions.html.erb +21 -0
  191. data/app/views/shared/_site_actions.html.erb +7 -0
  192. data/app/views/shared/_site_search.html.erb +12 -0
  193. data/app/views/shared/_title_bar.html.erb +16 -0
  194. data/app/workers/visibility_copy_worker.rb +30 -0
  195. data/config/initializers/simple_form.rb +31 -0
  196. data/config/locales/curation_concerns.en.yml +96 -0
  197. data/config/routes.rb +4 -0
  198. data/curation_concerns-models/.gitignore +17 -0
  199. data/curation_concerns-models/Gemfile +4 -0
  200. data/curation_concerns-models/LICENSE.md +177 -0
  201. data/curation_concerns-models/README.md +42 -0
  202. data/curation_concerns-models/Rakefile +1 -0
  203. data/curation_concerns-models/app/actors/concerns/curation_concerns/manages_embargoes_actor.rb +99 -0
  204. data/curation_concerns-models/app/actors/curation_concerns/base_actor.rb +90 -0
  205. data/curation_concerns-models/app/actors/curation_concerns/generic_file_actor.rb +150 -0
  206. data/curation_concerns-models/app/actors/curation_concerns/work_actor_behavior.rb +88 -0
  207. data/curation_concerns-models/app/jobs/active_fedora_id_based_job.rb +22 -0
  208. data/curation_concerns-models/app/jobs/active_fedora_pid_based_job.rb +6 -0
  209. data/curation_concerns-models/app/jobs/audit_job.rb +58 -0
  210. data/curation_concerns-models/app/jobs/characterize_job.rb +11 -0
  211. data/curation_concerns-models/app/jobs/copy_permissions_job.rb +24 -0
  212. data/curation_concerns-models/app/jobs/create_derivatives_job.rb +15 -0
  213. data/curation_concerns-models/app/jobs/import_url_job.rb +56 -0
  214. data/curation_concerns-models/app/jobs/ingest_local_file_job.rb +48 -0
  215. data/curation_concerns-models/app/jobs/resolrize_job.rb +9 -0
  216. data/curation_concerns-models/app/models/checksum_audit_log.rb +21 -0
  217. data/curation_concerns-models/app/models/concerns/curation_concerns/ability.rb +34 -0
  218. data/curation_concerns-models/app/models/concerns/curation_concerns/basic_metadata.rb +87 -0
  219. data/curation_concerns-models/app/models/concerns/curation_concerns/collection_behavior.rb +47 -0
  220. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/belongs_to_works.rb +53 -0
  221. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/characterization.rb +89 -0
  222. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/content.rb +8 -0
  223. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/export.rb +343 -0
  224. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/full_text_indexing.rb +12 -0
  225. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/indexing.rb +14 -0
  226. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/versions.rb +16 -0
  227. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file.rb +5 -0
  228. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file_behavior.rb +44 -0
  229. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_work_behavior.rb +38 -0
  230. data/curation_concerns-models/app/models/concerns/curation_concerns/has_representative.rb +14 -0
  231. data/curation_concerns-models/app/models/concerns/curation_concerns/human_readable_type.rb +23 -0
  232. data/curation_concerns-models/app/models/concerns/curation_concerns/permissions/readable.rb +19 -0
  233. data/curation_concerns-models/app/models/concerns/curation_concerns/permissions/writable.rb +75 -0
  234. data/curation_concerns-models/app/models/concerns/curation_concerns/permissions.rb +7 -0
  235. data/curation_concerns-models/app/models/concerns/curation_concerns/serializers.rb +15 -0
  236. data/curation_concerns-models/app/models/concerns/curation_concerns/solr_document_behavior.rb +135 -0
  237. data/curation_concerns-models/app/models/concerns/curation_concerns/user.rb +65 -0
  238. data/curation_concerns-models/app/models/concerns/curation_concerns/with_basic_metadata.rb +98 -0
  239. data/curation_concerns-models/app/models/concerns/curation_concerns/with_generic_files.rb +29 -0
  240. data/curation_concerns-models/app/models/curation_concerns/classify_concern.rb +47 -0
  241. data/curation_concerns-models/app/models/curation_concerns/quick_classification_query.rb +31 -0
  242. data/curation_concerns-models/app/models/datastreams/fits_datastream.rb +148 -0
  243. data/curation_concerns-models/app/models/version_committer.rb +2 -0
  244. data/curation_concerns-models/app/services/curation_concerns/characterization_service.rb +71 -0
  245. data/curation_concerns-models/app/services/curation_concerns/full_text_extraction_service.rb +38 -0
  246. data/curation_concerns-models/app/services/curation_concerns/generic_file_audit_service.rb +85 -0
  247. data/curation_concerns-models/app/services/curation_concerns/generic_file_indexing_service.rb +14 -0
  248. data/curation_concerns-models/app/services/curation_concerns/generic_work_indexing_service.rb +16 -0
  249. data/curation_concerns-models/app/services/curation_concerns/noid.rb +23 -0
  250. data/curation_concerns-models/app/services/curation_concerns/repository_audit_service.rb +9 -0
  251. data/curation_concerns-models/app/services/curation_concerns/versioning_service.rb +27 -0
  252. data/curation_concerns-models/config/locales/curation_concerns.en.yml +6 -0
  253. data/curation_concerns-models/curation_concerns-models.gemspec +34 -0
  254. data/curation_concerns-models/lib/curation_concerns/messages.rb +66 -0
  255. data/curation_concerns-models/lib/curation_concerns/models/engine.rb +61 -0
  256. data/curation_concerns-models/lib/curation_concerns/models/resque.rb +36 -0
  257. data/curation_concerns-models/lib/curation_concerns/models/utils.rb +22 -0
  258. data/curation_concerns-models/lib/curation_concerns/models/version.rb +5 -0
  259. data/curation_concerns-models/lib/curation_concerns/models.rb +32 -0
  260. data/curation_concerns-models/lib/generators/curation_concerns/models/abstract_migration_generator.rb +30 -0
  261. data/curation_concerns-models/lib/generators/curation_concerns/models/clamav_generator.rb +19 -0
  262. data/curation_concerns-models/lib/generators/curation_concerns/models/fulltext_generator.rb +28 -0
  263. data/curation_concerns-models/lib/generators/curation_concerns/models/install_generator.rb +70 -0
  264. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/app/models/collection.rb +4 -0
  265. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/app/models/generic_file.rb +4 -0
  266. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/clamav.rb +1 -0
  267. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/curation_concerns.rb +123 -0
  268. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/mime_types.rb +6 -0
  269. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/redis.yml +9 -0
  270. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/redis_config.rb +32 -0
  271. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/resque-pool.yml +1 -0
  272. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/resque_admin.rb +10 -0
  273. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/resque_config.rb +5 -0
  274. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/migrations/create_checksum_audit_logs.rb +19 -0
  275. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/migrations/create_version_committers.rb +15 -0
  276. data/curation_concerns-models/lib/tasks/curation_concerns-models_tasks.rake +75 -0
  277. data/curation_concerns-models/lib/tasks/migrate.rake +13 -0
  278. data/curation_concerns-models/lib/tasks/resque.rake +13 -0
  279. data/curation_concerns-models/lib/tasks/solr_reindex.rake +8 -0
  280. data/curation_concerns.gemspec +46 -0
  281. data/lib/curation_concerns/configuration.rb +74 -0
  282. data/lib/curation_concerns/controller_resource.rb +10 -0
  283. data/lib/curation_concerns/engine.rb +20 -0
  284. data/lib/curation_concerns/rails/routes.rb +76 -0
  285. data/lib/curation_concerns/spec_support.rb +10 -0
  286. data/lib/curation_concerns/version.rb +3 -0
  287. data/lib/curation_concerns.rb +8 -0
  288. data/lib/generators/curation_concerns/install_generator.rb +103 -0
  289. data/lib/generators/curation_concerns/templates/curation_concerns.css.scss +3 -0
  290. data/lib/generators/curation_concerns/templates/curation_concerns.js +1 -0
  291. data/lib/generators/curation_concerns/templates/curation_concerns_config.rb +2 -0
  292. data/lib/generators/curation_concerns/templates/curation_concerns_helper.rb +4 -0
  293. data/lib/generators/curation_concerns/work/USAGE +19 -0
  294. data/lib/generators/curation_concerns/work/templates/README +13 -0
  295. data/lib/generators/curation_concerns/work/templates/actor.rb.erb +7 -0
  296. data/lib/generators/curation_concerns/work/templates/actor_spec.rb.erb +9 -0
  297. data/lib/generators/curation_concerns/work/templates/controller.rb.erb +7 -0
  298. data/lib/generators/curation_concerns/work/templates/controller_spec.rb.erb +9 -0
  299. data/lib/generators/curation_concerns/work/templates/model.rb.erb +7 -0
  300. data/lib/generators/curation_concerns/work/templates/model_spec.rb.erb +9 -0
  301. data/lib/generators/curation_concerns/work/work_generator.rb +78 -0
  302. data/solr_conf/conf/solrconfig.xml +223 -0
  303. data/spec/abilities/collection_abilities_spec.rb +48 -0
  304. data/spec/abilities/generic_file_abilities_spec.rb +62 -0
  305. data/spec/abilities/generic_work_abilities_spec.rb +58 -0
  306. data/spec/actors/curation_concerns/generic_file_actor_spec.rb +116 -0
  307. data/spec/actors/curation_concerns/manages_embargoes_actor_spec.rb +95 -0
  308. data/spec/actors/curation_concerns/work_actor_spec.rb +203 -0
  309. data/spec/controllers/catalog_controller_spec.rb +115 -0
  310. data/spec/controllers/curation_concerns/classify_concerns_controller_spec.rb +43 -0
  311. data/spec/controllers/curation_concerns/collections_controller_spec.rb +171 -0
  312. data/spec/controllers/curation_concerns/generic_files_controller_spec.rb +251 -0
  313. data/spec/controllers/curation_concerns/generic_works_controller_spec.rb +167 -0
  314. data/spec/controllers/curation_concerns/permissions_controller_spec.rb +29 -0
  315. data/spec/controllers/downloads_controller_spec.rb +51 -0
  316. data/spec/controllers/embargoes_controller_spec.rb +114 -0
  317. data/spec/controllers/leases_controller_spec.rb +94 -0
  318. data/spec/factories/collections.rb +15 -0
  319. data/spec/factories/create_curation_concern.rb +3 -0
  320. data/spec/factories/generic_files.rb +31 -0
  321. data/spec/factories/generic_works.rb +54 -0
  322. data/spec/factories/users.rb +28 -0
  323. data/spec/features/add_file_spec.rb +30 -0
  324. data/spec/features/collection_spec.rb +222 -0
  325. data/spec/features/create_work_spec.rb +43 -0
  326. data/spec/features/embargo_spec.rb +51 -0
  327. data/spec/features/lease_spec.rb +49 -0
  328. data/spec/features/update_file_spec.rb +32 -0
  329. data/spec/features/work_generator_spec.rb +58 -0
  330. data/spec/fixtures/Example.ogg +0 -0
  331. data/spec/fixtures/charter.docx +0 -0
  332. data/spec/fixtures/countdown.avi +0 -0
  333. data/spec/fixtures/curation_concerns_generic_stub.txt +1 -0
  334. data/spec/fixtures/files/image.png +0 -0
  335. data/spec/fixtures/image.jp2 +0 -0
  336. data/spec/fixtures/image.jpg +0 -0
  337. data/spec/fixtures/piano_note.wav +0 -0
  338. data/spec/fixtures/sample_mpeg4.mp4 +0 -0
  339. data/spec/fixtures/small_file.txt +1 -0
  340. data/spec/fixtures/spoken-text.m4a +0 -0
  341. data/spec/fixtures/test4.pdf +0 -0
  342. data/spec/fixtures/test5.mp3 +0 -0
  343. data/spec/fixtures/world.png +0 -0
  344. data/spec/forms/collection_edit_form_spec.rb +20 -0
  345. data/spec/forms/generic_file_edit_form_spec.rb +33 -0
  346. data/spec/helpers/catalog_helper_spec.rb +58 -0
  347. data/spec/helpers/configuration_helper_spec.rb +13 -0
  348. data/spec/helpers/curation_concerns/.keep +0 -0
  349. data/spec/helpers/curation_concerns/collections_helper_spec.rb +49 -0
  350. data/spec/helpers/render_constraints_helper_spec.rb +19 -0
  351. data/spec/helpers/thumbnail_helper_spec.rb +21 -0
  352. data/spec/helpers/url_helper_spec.rb +22 -0
  353. data/spec/jobs/active_fedora_id_based_job_spec.rb +14 -0
  354. data/spec/jobs/audit_job_spec.rb +53 -0
  355. data/spec/jobs/characterize_job_spec.rb +23 -0
  356. data/spec/jobs/copy_permissions_job_spec.rb +49 -0
  357. data/spec/jobs/create_derivatives_job_spec.rb +23 -0
  358. data/spec/jobs/curation_concerns_resque_queue_spec.rb +49 -0
  359. data/spec/jobs/import_url_job_spec.rb +45 -0
  360. data/spec/jobs/ingest_local_file_job_spec.rb +25 -0
  361. data/spec/lib/curation_concerns/messages_spec.rb +70 -0
  362. data/spec/lib/curation_concerns/readable_permissions_spec.rb +56 -0
  363. data/spec/lib/curation_concerns/writable_permissions_spec.rb +16 -0
  364. data/spec/matchers/metadata_field_matchers.rb +28 -0
  365. data/spec/matchers/response_matchers.rb +7 -0
  366. data/spec/matchers.rb +24 -0
  367. data/spec/models/checksum_audit_log_spec.rb +66 -0
  368. data/spec/models/curation_concerns/collection_behavior_spec.rb +107 -0
  369. data/spec/models/curation_concerns/generic_file/derivatives_spec.rb +88 -0
  370. data/spec/models/curation_concerns/generic_work_behavior_spec.rb +35 -0
  371. data/spec/models/fits_datastream_spec.rb +127 -0
  372. data/spec/models/generic_file_spec.rb +619 -0
  373. data/spec/models/generic_work_spec.rb +43 -0
  374. data/spec/models/user_spec.rb +23 -0
  375. data/spec/presenters/curation_concerns/collection_presenter_spec.rb +34 -0
  376. data/spec/presenters/curation_concerns/generic_file_presenter_spec.rb +16 -0
  377. data/spec/routing/curation_concerns/routes_spec.rb +36 -0
  378. data/spec/routing/route_spec.rb +86 -0
  379. data/spec/services/characterization_service_spec.rb +30 -0
  380. data/spec/services/embargo_service_spec.rb +38 -0
  381. data/spec/services/full_text_extraction_service_spec.rb +5 -0
  382. data/spec/services/generic_file_audit_service_spec.rb +71 -0
  383. data/spec/services/generic_file_indexing_service_spec.rb +57 -0
  384. data/spec/services/generic_work_indexing_service_spec.rb +18 -0
  385. data/spec/services/lease_service_spec.rb +53 -0
  386. data/spec/services/repository_audit_service_spec.rb +18 -0
  387. data/spec/services/versioning_service_spec.rb +32 -0
  388. data/spec/spec_helper.rb +94 -0
  389. data/spec/support/controllers/engine_helpers.rb +7 -0
  390. data/spec/support/curation_concerns/factory_helpers.rb +14 -0
  391. data/spec/support/features/fixture_file_upload.rb +14 -0
  392. data/spec/support/features/session_helpers.rb +41 -0
  393. data/spec/support/features.rb +19 -0
  394. data/spec/support/shared/shared_examples_has_dc_metadata.rb +17 -0
  395. data/spec/support/shared/shared_examples_is_embargoable.rb +8 -0
  396. data/spec/support/shared/shared_examples_with_access_rights.rb +63 -0
  397. data/spec/tasks/rake_spec.rb +24 -0
  398. data/spec/test_app_templates/Gemfile.extra +1 -0
  399. data/spec/test_app_templates/lib/generators/test_app_generator.rb +55 -0
  400. data/spec/views/catalog/index.html.erb_spec.rb +59 -0
  401. data/spec/views/curation_concerns/base/_attributes.html.erb_spec.rb +25 -0
  402. data/spec/views/curation_concerns/base/show.html.erb_spec.rb +29 -0
  403. data/spec/views/curation_concerns/permissions/confirm.html.erb_spec.rb +33 -0
  404. data/spec/views/shared/_add_content.html.erb_spec.rb +42 -0
  405. data/spec/views/shared/_my_actions.html.erb_spec.rb +23 -0
  406. data/spec/workers/visibility_copy_worker_spec.rb +70 -0
  407. data/tasks/jetty.rake +15 -0
  408. data/tasks/release.rake +93 -0
  409. data/vendor/assets/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  410. data/vendor/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  411. data/vendor/assets/javascripts/handlebars.js +2278 -0
  412. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.autocomplete.js +602 -0
  413. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.core.js +356 -0
  414. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.effect-highlight.js +50 -0
  415. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.effect.js +1276 -0
  416. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.menu.js +610 -0
  417. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.position.js +498 -0
  418. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.widget.js +528 -0
  419. data/vendor/assets/javascripts/jquery.tokeninput.js +1061 -0
  420. data/vendor/assets/stylesheets/jquery-ui-lightness.css +474 -0
  421. data/vendor/assets/stylesheets/token-input-facebook.css +122 -0
  422. data/vendor/assets/stylesheets/token-input-mac.css +204 -0
  423. data/vendor/assets/stylesheets/token-input.css +127 -0
  424. metadata +888 -0
@@ -0,0 +1,619 @@
1
+ require 'spec_helper'
2
+
3
+ # This tests the GenericFile model that is inserted into the host app by curation_concerns:models:install
4
+ # It includes the CurationConcerns::GenericFileBehavior module and nothing else
5
+ # So this test covers both the GenericFileBehavior module and the generated GenericFile model
6
+ describe GenericFile do
7
+
8
+ let(:user) { FactoryGirl.find_or_create(:jill) }
9
+
10
+ describe "rdf type" do
11
+ subject { described_class.new.type }
12
+ it { is_expected.to include(RDFVocabularies::PCDMTerms.Object,WorksVocabularies::WorksTerms.GenericFile) }
13
+ end
14
+
15
+ it "is a Hydra::Works GenericFile" do
16
+ expect(subject).to be_works_generic_file
17
+ end
18
+
19
+ it "should have depositor" do
20
+ subject.depositor = 'tess@example.com'
21
+ end
22
+
23
+ it "should update attributes" do
24
+ subject.attributes = {title:["My new Title"]}
25
+ expect(subject.title).to eq(["My new Title"])
26
+ end
27
+
28
+ context "when it is initialized" do
29
+ it "has empty arrays for all the properties" do
30
+ subject.attributes.each do |k,v|
31
+ expect(Array(v)).to eq([])
32
+ end
33
+ end
34
+ end
35
+
36
+ describe "visibility" do
37
+ it "should not be changed when it's new" do
38
+ expect(subject).not_to be_visibility_changed
39
+ end
40
+ it "should be changed when it has been changed" do
41
+ subject.visibility= 'open'
42
+ expect(subject).to be_visibility_changed
43
+ end
44
+
45
+ it "should not be changed when it's set to its previous value" do
46
+ subject.visibility= 'restricted'
47
+ expect(subject).not_to be_visibility_changed
48
+ end
49
+
50
+ end
51
+
52
+ describe "#apply_depositor_metadata" do
53
+ before { subject.apply_depositor_metadata('jcoyne') }
54
+
55
+ it "should grant edit access and record the depositor" do
56
+ expect(subject.edit_users).to eq ['jcoyne']
57
+ expect(subject.depositor).to eq 'jcoyne'
58
+ end
59
+ end
60
+
61
+ describe "attributes" do
62
+ it "should have a set of permissions" do
63
+ subject.read_groups=['group1', 'group2']
64
+ subject.edit_users=['user1']
65
+ subject.read_users=['user2', 'user3']
66
+ expect(subject.permissions.map(&:to_hash)).to match_array [
67
+ {type: "group", access: "read", name: "group1"},
68
+ {type: "group", access: "read", name: "group2"},
69
+ {type: "person", access: "read", name: "user2"},
70
+ {type: "person", access: "read", name: "user3"},
71
+ {type: "person", access: "edit", name: "user1"}]
72
+ end
73
+
74
+ it "should have a characterization datastream" do
75
+ expect(subject.characterization).to be_kind_of FitsDatastream
76
+ end
77
+
78
+ it "should have attached content" do
79
+ subject.add_file(File.open(fixture_path + '/world.png'), path: 'content', original_name: 'world.png')
80
+ expect(subject.content).to be_kind_of ActiveFedora::File
81
+ end
82
+ end
83
+
84
+ describe "metadata" do
85
+ it "should have descriptive metadata" do
86
+ expect(subject).to respond_to(:relative_path)
87
+ expect(subject).to respond_to(:depositor)
88
+ expect(subject).to respond_to(:related_url)
89
+ expect(subject).to respond_to(:based_near)
90
+ expect(subject).to respond_to(:part_of)
91
+ expect(subject).to respond_to(:contributor)
92
+ expect(subject).to respond_to(:creator)
93
+ expect(subject).to respond_to(:title)
94
+ expect(subject).to respond_to(:description)
95
+ expect(subject).to respond_to(:publisher)
96
+ expect(subject).to respond_to(:date_created)
97
+ expect(subject).to respond_to(:date_uploaded)
98
+ expect(subject).to respond_to(:date_modified)
99
+ expect(subject).to respond_to(:subject)
100
+ expect(subject).to respond_to(:language)
101
+ expect(subject).to respond_to(:rights)
102
+ expect(subject).to respond_to(:resource_type)
103
+ expect(subject).to respond_to(:identifier)
104
+ end
105
+ it "should delegate methods to characterization metadata" do
106
+ expect(subject).to respond_to(:format_label)
107
+ expect(subject).to respond_to(:mime_type)
108
+ expect(subject).to respond_to(:file_size)
109
+ expect(subject).to respond_to(:last_modified)
110
+ expect(subject).to respond_to(:filename)
111
+ expect(subject).to respond_to(:original_checksum)
112
+ expect(subject).to respond_to(:well_formed)
113
+ expect(subject).to respond_to(:file_title)
114
+ expect(subject).to respond_to(:file_author)
115
+ expect(subject).to respond_to(:page_count)
116
+ end
117
+ it "should redefine to_param to make redis keys more recognizable" do
118
+ expect(subject.to_param).to eq subject.id
119
+ end
120
+
121
+ describe "that have been saved" do
122
+ before { subject.apply_depositor_metadata('jcoyne') }
123
+
124
+ it "should be able to set values via delegated methods" do
125
+ subject.related_url = ["http://example.org/"]
126
+ subject.creator = ["John Doe"]
127
+ subject.title = ["New work"]
128
+ subject.save
129
+ f = subject.reload
130
+ expect(f.related_url).to eq ["http://example.org/"]
131
+ expect(f.creator).to eq ["John Doe"]
132
+ expect(f.title).to eq ["New work"]
133
+ end
134
+
135
+ it "should be able to be added to w/o unexpected graph behavior" do
136
+ subject.creator = ["John Doe"]
137
+ subject.title = ["New work"]
138
+ subject.save!
139
+ f = subject.reload
140
+ expect(f.creator).to eq ["John Doe"]
141
+ expect(f.title).to eq ["New work"]
142
+ f.creator = ["Jane Doe"]
143
+ f.title += ["Newer work"]
144
+ f.save
145
+ f = subject.reload
146
+ expect(f.creator).to eq ["Jane Doe"]
147
+ # TODO: Is order important?
148
+ expect(f.title).to include("New work")
149
+ expect(f.title).to include("Newer work")
150
+ end
151
+ end
152
+ end
153
+
154
+ describe "#indexer" do
155
+ subject { described_class.indexer }
156
+ it { is_expected.to eq CurationConcerns::GenericFileIndexingService }
157
+ end
158
+
159
+ it "should support multi-valued fields in solr" do
160
+ subject.tag = ["tag1", "tag2"]
161
+ expect { subject.save }.not_to raise_error
162
+ subject.delete
163
+ end
164
+
165
+ it "should support setting and getting the relative_path value" do
166
+ subject.relative_path = "documents/research/NSF/2010"
167
+ expect(subject.relative_path).to eq "documents/research/NSF/2010"
168
+ end
169
+ describe "create_thumbnail" do
170
+ before do
171
+ @f = GenericFile.new
172
+ @f.apply_depositor_metadata('mjg36')
173
+ end
174
+ describe "with a video", if: CurationConcerns.config.enable_ffmpeg do
175
+ before do
176
+ allow(@f).to receive(mime_type: 'video/quicktime') #Would get set by the characterization job
177
+ @f.add_file(File.open("#{fixture_path}/countdown.avi", 'rb'), path: 'content', original_name: 'countdown.avi')
178
+ @f.save
179
+ end
180
+ it "should make a png thumbnail" do
181
+ @f.create_thumbnail
182
+ expect(@f.thumbnail.content.size).to eq 4768 # this is a bad test. I just want to show that it did something.
183
+ expect(@f.thumbnail.mime_type).to eq 'image/png'
184
+ end
185
+ end
186
+ end
187
+
188
+ describe "#related_files" do
189
+ let!(:f1) { GenericFile.new }
190
+
191
+ context "when there are no related files" do
192
+ it "should return an empty array" do
193
+ expect(f1.related_files).to eq []
194
+ end
195
+ end
196
+
197
+ context "when there are related files" do
198
+ let(:parent_work) { FactoryGirl.create(:work_with_files)}
199
+ let(:f1) { parent_work.generic_files.first }
200
+ let(:f2) { parent_work.generic_files.last }
201
+ subject { f1.reload.related_files }
202
+ it "returns all generic_files contained in parent work(s) but excludes itself" do
203
+ expect(subject).to include(f2)
204
+ expect(subject).to_not include(f1)
205
+ end
206
+ end
207
+ end
208
+
209
+ describe "noid integration" do
210
+ before do
211
+ allow_any_instance_of(ActiveFedora::Noid::Service).to receive(:mint).and_return(noid)
212
+ end
213
+
214
+ let(:noid) { 'wd3763094' }
215
+
216
+ subject do
217
+ GenericFile.create { |f| f.apply_depositor_metadata('mjg36') }
218
+ end
219
+
220
+ it "runs the overridden #assign_id method" do
221
+ expect_any_instance_of(ActiveFedora::Noid::Service).to receive(:mint).once
222
+ GenericFile.create { |f| f.apply_depositor_metadata('mjg36') }
223
+ end
224
+
225
+ it "returns the expected identifier" do
226
+ expect(subject.id).to eq noid
227
+ end
228
+
229
+ it "has a treeified URL" do
230
+ expect(subject.uri).to eq 'http://localhost:8983/fedora/rest/test/wd/37/63/09/wd3763094'
231
+ end
232
+
233
+ context "when a url is provided" do
234
+ let(:url) { 'http://localhost:8983/fedora/rest/test/wd/37/63/09/wd3763094' }
235
+
236
+ it "transforms the url into an id" do
237
+ expect(GenericFile.uri_to_id(url)).to eq 'wd3763094'
238
+ end
239
+ end
240
+ end
241
+
242
+ context "with access control metadata" do
243
+ subject do
244
+ GenericFile.new do |m|
245
+ m.apply_depositor_metadata('jcoyne')
246
+ m.permissions_attributes = [{type: 'person', access: 'read', name: "person1"},
247
+ {type: 'person', access: 'read', name: "person2"},
248
+ {type: 'group', access: 'read', name: "group-6"},
249
+ {type: 'group', access: 'read', name: "group-7"},
250
+ {type: 'group', access: 'edit', name: "group-8"}]
251
+ end
252
+ end
253
+
254
+ it "should have read groups accessor" do
255
+ expect(subject.read_groups).to eq ['group-6', 'group-7']
256
+ end
257
+
258
+ it "should have read groups string accessor" do
259
+ expect(subject.read_groups_string).to eq 'group-6, group-7'
260
+ end
261
+
262
+ it "should have read groups writer" do
263
+ subject.read_groups = ['group-2', 'group-3']
264
+ expect(subject.read_groups).to eq ['group-2', 'group-3']
265
+ end
266
+
267
+ it "should have read groups string writer" do
268
+ subject.read_groups_string = 'umg/up.dlt.staff, group-3'
269
+ expect(subject.read_groups).to eq ['umg/up.dlt.staff', 'group-3']
270
+ expect(subject.edit_groups).to eq ['group-8']
271
+ expect(subject.read_users).to eq ['person1', 'person2']
272
+ expect(subject.edit_users).to eq ['jcoyne']
273
+ end
274
+
275
+ it "should only revoke eligible groups" do
276
+ subject.set_read_groups(['group-2', 'group-3'], ['group-6'])
277
+ # 'group-7' is not eligible to be revoked
278
+ expect(subject.read_groups).to match_array ['group-2', 'group-3', 'group-7']
279
+ expect(subject.edit_groups).to eq ['group-8']
280
+ expect(subject.read_users).to match_array ['person1', 'person2']
281
+ expect(subject.edit_users).to eq ['jcoyne']
282
+ end
283
+ end
284
+
285
+ describe "permissions validation" do
286
+ before { subject.apply_depositor_metadata('mjg36') }
287
+
288
+ describe "overriding" do
289
+ let(:asset) { SampleKlass.new }
290
+ before do
291
+ class SampleKlass < GenericFile
292
+ def paranoid_edit_permissions
293
+ []
294
+ end
295
+ end
296
+ asset.apply_depositor_metadata('mjg36')
297
+ end
298
+ after do
299
+ Object.send(:remove_const, :SampleKlass)
300
+ end
301
+ context "when the public has edit access" do
302
+ before { subject.edit_groups = ['public'] }
303
+
304
+ it "should be invalid" do
305
+ expect(subject).to_not be_valid
306
+ expect(subject.errors[:edit_groups]).to include('Public cannot have edit access')
307
+ end
308
+ end
309
+ end
310
+
311
+ context "when the depositor does not have edit access" do
312
+ before do
313
+ subject.permissions = [ Hydra::AccessControls::Permission.new(type: 'person', name: 'mjg36', access: 'read')]
314
+ end
315
+ it "should be invalid" do
316
+ expect(subject).to_not be_valid
317
+ expect(subject.errors[:edit_users]).to include('Depositor must have edit access')
318
+ end
319
+ end
320
+
321
+ context "when the public has edit access" do
322
+ before { subject.edit_groups = ['public'] }
323
+
324
+ it "should be invalid" do
325
+ expect(subject).to_not be_valid
326
+ expect(subject.errors[:edit_groups]).to include('Public cannot have edit access')
327
+ end
328
+ end
329
+
330
+ context "when registered has edit access" do
331
+ before { subject.edit_groups = ['registered'] }
332
+
333
+ it "should be invalid" do
334
+ expect(subject).to_not be_valid
335
+ expect(subject.errors[:edit_groups]).to include('Registered cannot have edit access')
336
+ end
337
+ end
338
+
339
+ context "everything is copacetic" do
340
+ it "should be valid" do
341
+ expect(subject).to be_valid
342
+ end
343
+ end
344
+ end
345
+
346
+ describe "file content validation" do
347
+ subject { FactoryGirl.create(:generic_file) }
348
+ let(:file_path) { fixture_path + '/small_file.txt' }
349
+
350
+ context "when file contains a virus" do
351
+ before do
352
+ allow(subject).to receive(:warn) # suppress virus warnings
353
+ expect(ClamAV.instance).to receive(:scanfile).and_return("EL CRAPO VIRUS")
354
+ # TODO: Test that this works with Hydra::Works::UploadFileToGenericFile. see https://github.com/projecthydra-labs/hydra-works/pull/139
355
+ # Hydra::Works::UploadFileToGenericFile.call(subject, file_path, original_name: 'small_file.txt')
356
+ of = subject.build_original_file
357
+ of.content = File.open(file_path)
358
+ end
359
+
360
+ it "populates the errors hash during validation" do
361
+ expect(subject).to_not be_valid
362
+ expect(subject.errors.messages[:base].first).to match /A virus was found in .*: EL CRAPO VIRUS/
363
+ end
364
+
365
+ it "does not save the file or create a new version" do
366
+ original_version_count = subject.versions.count
367
+ subject.save
368
+ expect(subject.versions.count).to eq original_version_count
369
+ expect(subject.reload.original_file).to be_nil
370
+ end
371
+ end
372
+ end
373
+
374
+ describe "to_solr" do
375
+ before do
376
+ subject.title = ['One Flew Over the Cuckoo\'s Nest']
377
+ subject.characterization.height = '500'
378
+ subject.characterization.width = '600'
379
+ end
380
+ let(:solr_doc) { subject.to_solr }
381
+
382
+ it "has a solr_doc" do
383
+ expect(solr_doc['title_tesim']).to eq ['One Flew Over the Cuckoo\'s Nest']
384
+ expect(solr_doc['title_sim']).to eq ['One Flew Over the Cuckoo\'s Nest']
385
+ expect(solr_doc['height_isi']).to eq 500
386
+ expect(solr_doc['width_isi']).to eq 600
387
+ end
388
+ end
389
+
390
+ context "with versions" do
391
+ it "should have versions" do
392
+ expect(subject.versions.count).to eq 0
393
+ end
394
+ end
395
+
396
+ describe "public?" do
397
+ context "when read group is set to public" do
398
+ before { subject.read_groups = ['public'] }
399
+
400
+ it { is_expected.to be_public }
401
+ end
402
+
403
+ context "when read group is not set to public" do
404
+ before { subject.read_groups = ['foo'] }
405
+ it { is_expected.not_to be_public }
406
+ end
407
+ end
408
+
409
+ describe "work associations" do
410
+ let(:work) { FactoryGirl.create(:work_with_one_file) }
411
+ subject { work.generic_files.first.reload }
412
+ it "should belong to works" do
413
+ expect(subject.generic_works).to eq [work]
414
+ end
415
+ end
416
+
417
+ describe '#to_s' do
418
+ it 'uses the provided titles' do
419
+ subject.title = ["Hello", "World"]
420
+ expect(subject.to_s).to eq("Hello | World")
421
+ end
422
+
423
+ it 'falls back on label if no titles are given' do
424
+ subject.title = []
425
+ subject.label = 'Spam'
426
+ expect(subject.to_s).to eq("Spam")
427
+ end
428
+
429
+ it 'with no label or titles it is "No Title"' do
430
+ subject.title = []
431
+ subject.label = nil
432
+ expect(subject.to_s).to eq("No Title")
433
+ end
434
+ end
435
+
436
+ describe "to_solr record" do
437
+ let(:depositor) { 'jcoyne' }
438
+ subject do
439
+ GenericFile.new.tap do |f|
440
+ f.apply_depositor_metadata(depositor)
441
+ f.save
442
+ end
443
+ end
444
+ let(:depositor_key) { Solrizer.solr_name("depositor") }
445
+ let(:title_key) { Solrizer.solr_name("title", :stored_searchable, type: :string) }
446
+ let(:title) { ["abc123"] }
447
+ let(:no_terms) { GenericFile.find(subject.id).to_solr }
448
+ let(:terms) {
449
+ file = GenericFile.find(subject.id)
450
+ file.title = title
451
+ file.save
452
+ file.to_solr
453
+ }
454
+
455
+ context "without terms" do
456
+ specify "title is nil" do
457
+ expect(no_terms[title_key]).to be_nil
458
+ end
459
+ end
460
+
461
+ context "with terms" do
462
+ specify "depositor is set" do
463
+ expect(terms[depositor_key].first).to eql(depositor)
464
+ end
465
+ specify "title is set" do
466
+ expect(terms[title_key]).to eql(title)
467
+ end
468
+ end
469
+
470
+ end
471
+
472
+ describe "assign_id" do
473
+ context "with noids enabled (by default)" do
474
+ it "uses the noid service" do
475
+ expect_any_instance_of(ActiveFedora::Noid::Service).to receive(:mint).once
476
+ subject.assign_id
477
+ end
478
+ end
479
+
480
+ context "with noids disabled" do
481
+ before { CurationConcerns.config.enable_noids = false }
482
+ after { CurationConcerns.config.enable_noids = true }
483
+
484
+ it "does not use the noid service" do
485
+ expect_any_instance_of(ActiveFedora::Noid::Service).not_to receive(:mint)
486
+ subject.assign_id
487
+ end
488
+ end
489
+ end
490
+
491
+ describe 'with a parent work' do
492
+
493
+ let(:parent) { FactoryGirl.create(:work_with_one_file) }
494
+ let(:parent_id) { parent.id }
495
+
496
+ describe '#related_files' do
497
+ let(:parent) { FactoryGirl.create(:work_with_files) }
498
+ let(:sibling) { parent.generic_files.last }
499
+ subject { parent.generic_files.first.reload }
500
+ it "returns related files, but not itself" do
501
+ expect(subject.related_files).to eq([sibling])
502
+ expect(sibling.reload.related_files).to eq([subject])
503
+ end
504
+ end
505
+
506
+ describe '#remove_representative_relationship' do
507
+ let(:some_other_id) { 'something456' }
508
+ subject { parent.generic_files.first.reload }
509
+ context "the parent object doesn't exist" do
510
+ before do
511
+ parent.representative = subject.id
512
+ parent.save!
513
+ @parent_id = parent.id
514
+ parent.destroy
515
+ end
516
+ end
517
+
518
+ context 'it is not the representative' do
519
+ before do
520
+ parent.representative = some_other_id
521
+ parent.save!
522
+ end
523
+ it "doesn't update parent work when file is deleted" do
524
+ subject.destroy
525
+ expect(parent.representative).to eq some_other_id
526
+ end
527
+ end
528
+
529
+ context 'it is the representative' do
530
+ before do
531
+ parent.representative = subject.id
532
+ parent.save!
533
+ end
534
+ it 'updates the parent work when the file is deleted' do
535
+ subject.destroy
536
+ expect(parent.reload.representative).to be_nil
537
+ end
538
+ end
539
+ end
540
+ end
541
+
542
+ describe "mime type recognition" do
543
+ context "#image?" do
544
+ context "when image/jp2" do
545
+ before { subject.mime_type = 'image/jp2' }
546
+ it { should be_image }
547
+ end
548
+ context "when image/jpg" do
549
+ before { subject.mime_type = 'image/jpg' }
550
+ it { should be_image }
551
+ end
552
+ context "when image/png" do
553
+ before { subject.mime_type = 'image/png' }
554
+ it { should be_image }
555
+ end
556
+ context "when image/tiff" do
557
+ before { subject.mime_type = 'image/tiff' }
558
+ it { should be_image }
559
+ end
560
+ end
561
+
562
+ describe "#pdf?" do
563
+ before { subject.mime_type = 'application/pdf' }
564
+ it { should be_pdf }
565
+ end
566
+
567
+ describe "#audio?" do
568
+ context "when x-wave" do
569
+ before { subject.mime_type = 'audio/x-wave' }
570
+ it { should be_audio }
571
+ end
572
+ context "when x-wav" do
573
+ before { subject.mime_type = 'audio/x-wav' }
574
+ it { should be_audio }
575
+ end
576
+ context "when mpeg" do
577
+ before { subject.mime_type = 'audio/mpeg' }
578
+ it { should be_audio }
579
+ end
580
+ context "when mp3" do
581
+ before { subject.mime_type = 'audio/mp3' }
582
+ it { should be_audio }
583
+ end
584
+ context "when ogg" do
585
+ before { subject.mime_type = 'audio/ogg' }
586
+ it { should be_audio }
587
+ end
588
+ end
589
+
590
+ describe "#video?" do
591
+ context "should be true for avi" do
592
+ before { subject.mime_type = 'video/avi' }
593
+ it { should be_video }
594
+ end
595
+
596
+ context "should be true for webm" do
597
+ before { subject.mime_type = 'video/webm' }
598
+ it { should be_video }
599
+ end
600
+ context "should be true for mp4" do
601
+ before { subject.mime_type = 'video/mp4' }
602
+ it { should be_video }
603
+ end
604
+ context "should be true for mpeg" do
605
+ before { subject.mime_type = 'video/mpeg' }
606
+ it { should be_video }
607
+ end
608
+ context "should be true for quicktime" do
609
+ before { subject.mime_type = 'video/quicktime' }
610
+ it { should be_video }
611
+ end
612
+ context "should be true for mxf" do
613
+ before { subject.mime_type = 'application/mxf' }
614
+ it { should be_video }
615
+ end
616
+ end
617
+ end
618
+
619
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ # This tests the GenericWork model that is inserted into the host app by curation_concerns:models:install
4
+ # It includes the CurationConcerns::GenericWorkBehavior module and nothing else
5
+ # So this test covers both the GenericWorkBehavior module and the generated GenericWork model
6
+ describe GenericWork do
7
+
8
+ it "has a title" do
9
+ subject.title = ['foo']
10
+ expect(subject.title).to eq ['foo']
11
+ end
12
+
13
+ context "with attached files" do
14
+ subject { FactoryGirl.create(:work_with_files) }
15
+
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
19
+ end
20
+ end
21
+
22
+ describe "#indexer" do
23
+ subject { described_class.indexer }
24
+ it { is_expected.to eq CurationConcerns::GenericWorkIndexingService }
25
+ end
26
+
27
+ describe "to_solr" do
28
+ subject { FactoryGirl.build(:work, date_uploaded: Date.today).to_solr }
29
+ it "indexes some fields" do
30
+ expect(subject.keys).to include 'date_uploaded_dtsi'
31
+ end
32
+ it "inherits (and extends) to_solr behaviors from superclass" do
33
+ expect(subject.keys).to include(:id)
34
+ expect(subject.keys).to include("has_model_ssim")
35
+ end
36
+ end
37
+
38
+ describe "#to_partial_path" do
39
+ let(:work) { described_class.new }
40
+ subject { work.to_partial_path }
41
+ it { is_expected.to eq 'curation_concerns/generic_works/generic_work' }
42
+ end
43
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe User, :type => :model do
4
+ let(:user) { FactoryGirl.build(:user) }
5
+ let(:another_user) { FactoryGirl.build(:user) }
6
+
7
+ it "should have an email" do
8
+ expect(user.user_key).to be_kind_of String
9
+ end
10
+
11
+ describe "#to_param" do
12
+ let(:user) { User.new(email: 'jilluser@example.com') }
13
+
14
+ it "should override to_param to make keys more recognizable in redis (and useable within Rails URLs)" do
15
+ expect(user.to_param).to eq("jilluser@example-dot-com")
16
+ end
17
+ end
18
+
19
+ it "should have a cancan ability defined" do
20
+ expect(user).to respond_to(:can?)
21
+ end
22
+
23
+ end