worthwhile 0.0.1.alpha → 0.0.1

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 (316) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.rspec +1 -0
  4. data/.travis.yml +19 -0
  5. data/Gemfile +7 -11
  6. data/README.md +8 -12
  7. data/Rakefile +17 -2
  8. data/app/actors/concerns/worthwhile/manages_embargoes_actor.rb +79 -0
  9. data/app/actors/curation_concern/base_actor.rb +68 -0
  10. data/app/actors/curation_concern/generic_file_actor.rb +40 -0
  11. data/app/actors/curation_concern/generic_work_actor.rb +92 -0
  12. data/app/actors/curation_concern/linked_resource_actor.rb +4 -0
  13. data/app/assets/images/default.png +0 -0
  14. data/app/assets/images/nope.png +0 -0
  15. data/app/assets/javascripts/.gitkeep +0 -0
  16. data/app/assets/javascripts/modernizr.js +3 -0
  17. data/app/assets/javascripts/worthwhile/.gitkeep +0 -0
  18. data/app/assets/javascripts/worthwhile/accept_contributor_agreement.js +15 -0
  19. data/app/assets/javascripts/worthwhile/application.js +18 -0
  20. data/app/assets/javascripts/worthwhile/browse_everything_implement.js +7 -0
  21. data/app/assets/javascripts/worthwhile/embargoes.js +17 -0
  22. data/app/assets/javascripts/worthwhile/facet_mine.js +22 -0
  23. data/app/assets/javascripts/worthwhile/help_modal.js +36 -0
  24. data/app/assets/javascripts/worthwhile/link_groups.js.coffee +123 -0
  25. data/app/assets/javascripts/worthwhile/link_users.js.coffee +126 -0
  26. data/app/assets/javascripts/worthwhile/manage_repeating_fields.js +74 -0
  27. data/app/assets/javascripts/worthwhile/proxy_rights.js.coffee +95 -0
  28. data/app/assets/javascripts/worthwhile/proxy_submission.js +23 -0
  29. data/app/assets/javascripts/worthwhile/select_works.js.coffee +20 -0
  30. data/app/assets/javascripts/worthwhile/worthwhile.js +45 -0
  31. data/app/assets/stylesheets/worthwhile.css.scss +23 -0
  32. data/app/assets/stylesheets/worthwhile/_global-variables.css.scss +5 -0
  33. data/app/assets/stylesheets/worthwhile/_modules.css.scss +14 -0
  34. data/app/assets/stylesheets/worthwhile/_positioning.css.scss +138 -0
  35. data/app/assets/stylesheets/worthwhile/_theme.css.scss +46 -0
  36. data/app/assets/stylesheets/worthwhile/_typography.css.scss +142 -0
  37. data/app/assets/stylesheets/worthwhile/_variables_bootstrap.css.scss +7 -0
  38. data/app/assets/stylesheets/worthwhile/_worthwhile.css.scss +7 -0
  39. data/app/assets/stylesheets/worthwhile/downloads.css.scss +3 -0
  40. data/app/assets/stylesheets/worthwhile/help_requests.css.scss +3 -0
  41. data/app/assets/stylesheets/worthwhile/modules/accessibility.css.scss +50 -0
  42. data/app/assets/stylesheets/worthwhile/modules/accordion.css.scss +33 -0
  43. data/app/assets/stylesheets/worthwhile/modules/attributes.css.scss +26 -0
  44. data/app/assets/stylesheets/worthwhile/modules/classify_work.css.scss +100 -0
  45. data/app/assets/stylesheets/worthwhile/modules/collections.css.scss +42 -0
  46. data/app/assets/stylesheets/worthwhile/modules/embargoes.css.scss +15 -0
  47. data/app/assets/stylesheets/worthwhile/modules/emphatic_action_area.css.scss +14 -0
  48. data/app/assets/stylesheets/worthwhile/modules/forms.css.scss +116 -0
  49. data/app/assets/stylesheets/worthwhile/modules/multi_value_fields.css.scss +52 -0
  50. data/app/assets/stylesheets/worthwhile/modules/pagination.css.scss +4 -0
  51. data/app/assets/stylesheets/worthwhile/modules/search_results.css.scss +55 -0
  52. data/app/assets/stylesheets/worthwhile/modules/site_actions.css.scss +53 -0
  53. data/app/assets/stylesheets/worthwhile/modules/site_search.css.scss +46 -0
  54. data/app/controllers/catalog_controller.rb +3 -0
  55. data/app/controllers/collections_controller.rb +59 -0
  56. data/app/controllers/concerns/worthwhile/application_controller_behavior.rb +23 -0
  57. data/app/controllers/concerns/worthwhile/catalog_controller.rb +347 -0
  58. data/app/controllers/concerns/worthwhile/curation_concern_controller.rb +131 -0
  59. data/app/controllers/concerns/worthwhile/files_controller.rb +149 -0
  60. data/app/controllers/concerns/worthwhile/manages_embargoes.rb +22 -0
  61. data/app/controllers/concerns/worthwhile/parent_container.rb +31 -0
  62. data/app/controllers/concerns/worthwhile/themed_layout_controller.rb +31 -0
  63. data/app/controllers/concerns/worthwhile/without_namespace.rb +15 -0
  64. data/app/controllers/curation_concern/generic_files_controller.rb +6 -0
  65. data/app/controllers/curation_concern/generic_works_controller.rb +6 -0
  66. data/app/controllers/curation_concern/linked_resources_controller.rb +68 -0
  67. data/app/controllers/curation_concern/permissions_controller.rb +19 -0
  68. data/app/controllers/downloads_controller.rb +4 -0
  69. data/app/controllers/embargoes_controller.rb +44 -0
  70. data/app/controllers/leases_controller.rb +34 -0
  71. data/app/controllers/registrations_controller.rb +20 -0
  72. data/app/controllers/sessions_controller.rb +4 -0
  73. data/app/controllers/worthwhile/application_controller.rb +7 -0
  74. data/app/controllers/worthwhile/classify_concerns_controller.rb +35 -0
  75. data/app/datastreams/generic_work_metadata.rb +3 -0
  76. data/app/datastreams/worthwhile/generic_work_rdf_properties.rb +57 -0
  77. data/app/datastreams/worthwhile/properties_datastream.rb +28 -0
  78. data/app/helpers/curate/collections_helper.rb +133 -0
  79. data/app/helpers/worthwhile/ability_helper.rb +46 -0
  80. data/app/helpers/worthwhile/attribute_helper.rb +67 -0
  81. data/app/helpers/worthwhile/catalog_helper.rb +38 -0
  82. data/app/helpers/worthwhile/collections_helper.rb +19 -0
  83. data/app/helpers/worthwhile/embargo_helper.rb +17 -0
  84. data/app/helpers/worthwhile/generic_file_helper.rb +19 -0
  85. data/app/helpers/worthwhile/lease_helper.rb +18 -0
  86. data/app/helpers/worthwhile/main_app_helpers.rb +14 -0
  87. data/app/helpers/worthwhile/render_constraints_helper.rb +42 -0
  88. data/app/helpers/worthwhile/search_paths_helper.rb +13 -0
  89. data/app/helpers/worthwhile/thumbnail_helper.rb +11 -0
  90. data/app/helpers/worthwhile/title_helper.rb +23 -0
  91. data/app/helpers/worthwhile/url_helper.rb +16 -0
  92. data/app/inputs/multi_value_input.rb +72 -0
  93. data/app/models/collection.rb +15 -0
  94. data/app/models/concerns/curation_concern/collection_model.rb +62 -0
  95. data/app/models/concerns/curation_concern/curatable.rb +77 -0
  96. data/app/models/concerns/curation_concern/has_representative.rb +14 -0
  97. data/app/models/concerns/curation_concern/human_readable_type.rb +23 -0
  98. data/app/models/concerns/curation_concern/with_basic_metadata.rb +49 -0
  99. data/app/models/concerns/curation_concern/with_editors.rb +44 -0
  100. data/app/models/concerns/curation_concern/with_generic_files.rb +23 -0
  101. data/app/models/concerns/curation_concern/with_linked_resources.rb +21 -0
  102. data/app/models/concerns/curation_concern/work.rb +24 -0
  103. data/app/models/concerns/worthwhile/ability.rb +34 -0
  104. data/app/models/concerns/worthwhile/generic_file/versioned_content.rb +18 -0
  105. data/app/models/concerns/worthwhile/generic_file_base.rb +64 -0
  106. data/app/models/concerns/worthwhile/solr_document_behavior.rb +140 -0
  107. data/app/models/generic_work.rb +5 -0
  108. data/app/models/worthwhile/classify_concern.rb +47 -0
  109. data/app/models/worthwhile/content_version.rb +23 -0
  110. data/app/models/worthwhile/contributor_agreement.rb +23 -0
  111. data/app/models/worthwhile/generic_file.rb +5 -0
  112. data/app/models/worthwhile/linked_resource.rb +41 -0
  113. data/app/models/worthwhile/quick_classification_query.rb +31 -0
  114. data/app/services/worthwhile/curation_concern.rb +21 -0
  115. data/app/services/worthwhile/embargo_service.rb +26 -0
  116. data/app/services/worthwhile/lease_service.rb +23 -0
  117. data/app/views/catalog/_action_menu_partials/_collection.html.erb +27 -0
  118. data/app/views/catalog/_action_menu_partials/_default.html.erb +27 -0
  119. data/app/views/catalog/_document.html.erb +3 -0
  120. data/app/views/catalog/_document_list.html.erb +5 -0
  121. data/app/views/catalog/_home_text.html.erb +8 -0
  122. data/app/views/catalog/_index_default.html.erb +17 -0
  123. data/app/views/catalog/_index_header_list_default.html.erb +17 -0
  124. data/app/views/catalog/_navbar.html.erb +12 -0
  125. data/app/views/catalog/_show_partials/_default.html.erb +22 -0
  126. data/app/views/catalog/_show_partials/_default_details.html.erb +15 -0
  127. data/app/views/catalog/_show_partials/_facets.html.erb +52 -0
  128. data/app/views/catalog/index.html.erb +48 -0
  129. data/app/views/collections/_batch_edits_actions.html.erb +3 -0
  130. data/app/views/collections/_button_for_creating_empty_collection.html.erb +3 -0
  131. data/app/views/collections/_collection.html.erb +1 -0
  132. data/app/views/collections/_dashboard_document_list.html.erb +6 -0
  133. data/app/views/collections/_document_list.html.erb +7 -0
  134. data/app/views/collections/_edit_actions.html.erb +5 -0
  135. data/app/views/collections/_edit_descriptions.html.erb +20 -0
  136. data/app/views/collections/_form.html.erb +26 -0
  137. data/app/views/collections/_form_for_select_collection.html.erb +34 -0
  138. data/app/views/collections/_form_permission.html.erb +36 -0
  139. data/app/views/collections/_form_required_information.html.erb +11 -0
  140. data/app/views/collections/_identifier_and_action.html.erb +15 -0
  141. data/app/views/collections/_media_display.html.erb +1 -0
  142. data/app/views/collections/_paginate.html.erb +6 -0
  143. data/app/views/collections/_search_collection_dashboard_form.html.erb +10 -0
  144. data/app/views/collections/_show_actions.html.erb +8 -0
  145. data/app/views/collections/_show_descriptions.html.erb +10 -0
  146. data/app/views/collections/_show_fields.html.erb +0 -0
  147. data/app/views/collections/_single_item_action_fields.html.erb +6 -0
  148. data/app/views/collections/_sort_and_per_page.html.erb +29 -0
  149. data/app/views/collections/_view_type_group.html.erb +13 -0
  150. data/app/views/collections/edit.html.erb +22 -0
  151. data/app/views/collections/new.html.erb +15 -0
  152. data/app/views/collections/show.html.erb +24 -0
  153. data/app/views/curate/collections/_add_to_collection_modal.html.erb +15 -0
  154. data/app/views/curate/collections/_button_remove_from_collection.html.erb +6 -0
  155. data/app/views/curate/collections/_form_to_add_member.html.erb +27 -0
  156. data/app/views/curate/collections/add_member_form.html.erb +6 -0
  157. data/app/views/curation_concern/base/_attributes.html.erb +25 -0
  158. data/app/views/curation_concern/base/_collections.html.erb +26 -0
  159. data/app/views/curation_concern/base/_form.html.erb +27 -0
  160. data/app/views/curation_concern/base/_form_additional_information.html.erb +9 -0
  161. data/app/views/curation_concern/base/_form_content_license.html.erb +16 -0
  162. data/app/views/curation_concern/base/_form_contributor_agreement.html.erb +29 -0
  163. data/app/views/curation_concern/base/_form_descriptive_fields.erb +23 -0
  164. data/app/views/curation_concern/base/_form_files_and_links.html.erb +29 -0
  165. data/app/views/curation_concern/base/_form_permission.html.erb +52 -0
  166. data/app/views/curation_concern/base/_form_permission_embargo.html.erb +6 -0
  167. data/app/views/curation_concern/base/_form_permission_lease.html.erb +6 -0
  168. data/app/views/curation_concern/base/_form_permission_under_embargo.html.erb +16 -0
  169. data/app/views/curation_concern/base/_form_permission_under_lease.html.erb +18 -0
  170. data/app/views/curation_concern/base/_form_representative_image.html.erb +13 -0
  171. data/app/views/curation_concern/base/_form_required_information.html.erb +11 -0
  172. data/app/views/curation_concern/base/_form_supplementary_fields.html.erb +15 -0
  173. data/app/views/curation_concern/base/_legally_binding_text.html.erb +33 -0
  174. data/app/views/curation_concern/base/_related_files.html.erb +24 -0
  175. data/app/views/curation_concern/base/_related_resources.html.erb +40 -0
  176. data/app/views/curation_concern/base/_representative_media.html.erb +8 -0
  177. data/app/views/curation_concern/base/edit.html.erb +15 -0
  178. data/app/views/curation_concern/base/new.html.erb +14 -0
  179. data/app/views/curation_concern/base/show.html.erb +32 -0
  180. data/app/views/curation_concern/base/unauthorized.html.erb +3 -0
  181. data/app/views/curation_concern/generic_files/_form.html.erb +35 -0
  182. data/app/views/curation_concern/generic_files/_media_display.html.erb +20 -0
  183. data/app/views/curation_concern/generic_files/edit.html.erb +5 -0
  184. data/app/views/curation_concern/generic_files/show.html.erb +15 -0
  185. data/app/views/curation_concern/generic_works/_generic_work.html.erb +3 -0
  186. data/app/views/curation_concern/linked_resources/_form.html.erb +11 -0
  187. data/app/views/curation_concern/linked_resources/edit.html.erb +5 -0
  188. data/app/views/curation_concern/linked_resources/new.html.erb +5 -0
  189. data/app/views/curation_concern/permissions/confirm.html.erb +13 -0
  190. data/app/views/curation_concern/worthwhile/generic_files/_actions.html.erb +16 -0
  191. data/app/views/curation_concern/worthwhile/generic_files/_generic_file.html.erb +12 -0
  192. data/app/views/embargoes/_embargo_history.html.erb +7 -0
  193. data/app/views/embargoes/_list_active_embargoes.html.erb +16 -0
  194. data/app/views/embargoes/_list_deactivated_embargoes.html.erb +10 -0
  195. data/app/views/embargoes/_list_expired_active_embargoes.html.erb +44 -0
  196. data/app/views/embargoes/edit.html.erb +43 -0
  197. data/app/views/embargoes/index.html.erb +18 -0
  198. data/app/views/layouts/boilerplate.html.erb +22 -0
  199. data/app/views/layouts/common_objects.html.erb +36 -0
  200. data/app/views/layouts/curate_nd.html.erb +33 -0
  201. data/app/views/layouts/curate_nd/1_column.html.erb +22 -0
  202. data/app/views/layouts/curate_nd/2_column.html.erb +26 -0
  203. data/app/views/layouts/curate_nd/catalog.html.erb +38 -0
  204. data/app/views/layouts/curate_nd/dashboard.html.erb +22 -0
  205. data/app/views/leases/_lease_history.html.erb +7 -0
  206. data/app/views/leases/_list_active_leases.html.erb +16 -0
  207. data/app/views/leases/_list_deactivated_leases.html.erb +4 -0
  208. data/app/views/leases/_list_expired_active_leases.html.erb +38 -0
  209. data/app/views/leases/edit.html.erb +43 -0
  210. data/app/views/leases/index.html.erb +18 -0
  211. data/app/views/shared/_add_content.html.erb +32 -0
  212. data/app/views/shared/_brand_bar.html.erb +10 -0
  213. data/app/views/shared/_flash_message.html.erb +17 -0
  214. data/app/views/shared/_footer.html.erb +10 -0
  215. data/app/views/shared/_ga.html.erb +6 -0
  216. data/app/views/shared/_header.html.erb +12 -0
  217. data/app/views/shared/_my_actions.html.erb +21 -0
  218. data/app/views/shared/_site_actions.html.erb +7 -0
  219. data/app/views/shared/_site_search.html.erb +12 -0
  220. data/app/views/shared/_title_bar.html.erb +16 -0
  221. data/app/views/worthwhile/classify_concerns/new.html.erb +27 -0
  222. data/app/workers/visibility_copy_worker.rb +29 -0
  223. data/config/initializers/simple_form.rb +31 -0
  224. data/config/locales/sufia.en.yml +26 -0
  225. data/config/locales/worthwhile.en.yml +68 -0
  226. data/config/routes.rb +4 -0
  227. data/lib/generators/worthwhile/install_generator.rb +74 -0
  228. data/lib/generators/worthwhile/templates/worthwhile.css.scss +3 -0
  229. data/lib/generators/worthwhile/templates/worthwhile.js +1 -0
  230. data/lib/generators/worthwhile/templates/worthwhile_config.rb +3 -0
  231. data/lib/generators/worthwhile/templates/worthwhile_helper.rb +4 -0
  232. data/lib/worthwhile.rb +3 -1
  233. data/lib/worthwhile/configuration.rb +74 -0
  234. data/lib/worthwhile/controller_resource.rb +10 -0
  235. data/lib/worthwhile/engine.rb +20 -0
  236. data/lib/worthwhile/rails/routes.rb +78 -0
  237. data/lib/worthwhile/spec_support.rb +10 -0
  238. data/lib/worthwhile/version.rb +1 -1
  239. data/spec/abilities/generic_file_abilities_spec.rb +62 -0
  240. data/spec/abilities/generic_work_abilities_spec.rb +58 -0
  241. data/spec/actors/curation_concern/generic_work_actor_spec.rb +215 -0
  242. data/spec/actors/curation_concern/linked_resource_actor_spec.rb +36 -0
  243. data/spec/actors/worthwile/manages_embargoes_actor_spec.rb +95 -0
  244. data/spec/controllers/catalog_controller_spec.rb +114 -0
  245. data/spec/controllers/collections_controller_spec.rb +216 -0
  246. data/spec/controllers/curation_concern/generic_files_controller_spec.rb +258 -0
  247. data/spec/controllers/curation_concern/generic_works_controller_spec.rb +171 -0
  248. data/spec/controllers/curation_concern/linked_resources_controller_spec.rb +123 -0
  249. data/spec/controllers/curation_concern/permissions_controller_spec.rb +29 -0
  250. data/spec/controllers/downloads_controller_spec.rb +53 -0
  251. data/spec/controllers/embargoes_controller_spec.rb +107 -0
  252. data/spec/controllers/leases_controller_spec.rb +95 -0
  253. data/spec/controllers/worthwhile/classify_concerns_controller_spec.rb +35 -0
  254. data/spec/factories/collections_factory.rb +21 -0
  255. data/spec/factories/create_curation_concern.rb +3 -0
  256. data/spec/factories/generic_files.rb +18 -0
  257. data/spec/factories/generic_works.rb +37 -0
  258. data/spec/factories/linked_resources_factory.rb +18 -0
  259. data/spec/factories/users.rb +15 -0
  260. data/spec/features/add_external_link_spec.rb +25 -0
  261. data/spec/features/add_file_spec.rb +28 -0
  262. data/spec/features/collection_spec.rb +238 -0
  263. data/spec/features/embargo_spec.rb +45 -0
  264. data/spec/features/lease_spec.rb +43 -0
  265. data/spec/features/update_file_spec.rb +28 -0
  266. data/spec/fixtures/files/image.png +0 -0
  267. data/spec/helpers/catalog_helper_spec.rb +58 -0
  268. data/spec/helpers/configuration_helper_spec.rb +13 -0
  269. data/spec/helpers/render_constraints_helper_spec.rb +19 -0
  270. data/spec/helpers/thumbnail_helper_spec.rb +21 -0
  271. data/spec/helpers/url_helper_spec.rb +19 -0
  272. data/spec/matchers.rb +24 -0
  273. data/spec/matchers/metadata_field_matchers.rb +28 -0
  274. data/spec/models/collection_spec.rb +136 -0
  275. data/spec/models/curation_concern/collection_model_spec.rb +50 -0
  276. data/spec/models/curation_concern/work_spec.rb +30 -0
  277. data/spec/models/generic_work_spec.rb +24 -0
  278. data/spec/models/worthwhile/content_version_spec.rb +27 -0
  279. data/spec/models/worthwhile/generic_file_spec.rb +77 -0
  280. data/spec/models/worthwhile/linked_resource_spec.rb +76 -0
  281. data/spec/routing/worthwhile/routes_spec.rb +23 -0
  282. data/spec/services/embargo_service_spec.rb +38 -0
  283. data/spec/services/lease_service_spec.rb +37 -0
  284. data/spec/spec_helper.rb +30 -5
  285. data/spec/support/controllers/engine_helpers.rb +7 -0
  286. data/spec/support/curation_concern/factory_helpers.rb +14 -0
  287. data/spec/support/features.rb +19 -0
  288. data/spec/support/features/fixture_file_upload.rb +14 -0
  289. data/spec/support/features/session_helpers.rb +41 -0
  290. data/spec/support/shared/shared_examples_has_dc_metadata.rb +17 -0
  291. data/spec/support/shared/shared_examples_is_a_curation_concern_model.rb +40 -0
  292. data/spec/support/shared/shared_examples_is_embargoable.rb +8 -0
  293. data/spec/support/shared/shared_examples_with_access_rights.rb +63 -0
  294. data/spec/test_app_templates/lib/generators/test_app_generator.rb +8 -29
  295. data/spec/views/curation_concern/base/_attributes.html.erb_spec.rb +25 -0
  296. data/spec/views/curation_concern/base/show.html.erb_spec.rb +25 -0
  297. data/spec/views/shared/_add_content.html.erb_spec.rb +42 -0
  298. data/spec/views/shared/_my_actions.html.erb_spec.rb +23 -0
  299. data/spec/workers/visibility_copy_worker_spec.rb +68 -0
  300. data/vendor/assets/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  301. data/vendor/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  302. data/vendor/assets/javascripts/handlebars.js +2278 -0
  303. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.autocomplete.js +602 -0
  304. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.core.js +356 -0
  305. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.effect-highlight.js +50 -0
  306. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.effect.js +1276 -0
  307. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.menu.js +610 -0
  308. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.position.js +498 -0
  309. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.widget.js +528 -0
  310. data/vendor/assets/javascripts/jquery.tokeninput.js +1061 -0
  311. data/vendor/assets/stylesheets/jquery-ui-lightness.css +474 -0
  312. data/vendor/assets/stylesheets/token-input-facebook.css +122 -0
  313. data/vendor/assets/stylesheets/token-input-mac.css +204 -0
  314. data/vendor/assets/stylesheets/token-input.css +127 -0
  315. data/worthwhile.gemspec +9 -3
  316. metadata +469 -9
@@ -0,0 +1,10 @@
1
+ # Given that curate provides custom matchers, factories, etc.
2
+ # When someone makes use of curate in their Rails application
3
+ # Then we should expose those spec support files to that applications
4
+ spec_directory = File.expand_path('../../../spec', __FILE__)
5
+
6
+ # Dir["#{spec_directory}/factories/**/*.rb"].each { |f| require f }
7
+ Dir["#{spec_directory}/support/curation_concern/*.rb"].each { |f| require f }
8
+ Dir["#{spec_directory}/support/shared/*.rb"].each { |f| require f }
9
+
10
+
@@ -1,3 +1,3 @@
1
1
  module Worthwhile
2
- VERSION = "0.0.1.alpha"
2
+ VERSION = "0.0.1"
3
3
  end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+ require "cancan/matchers"
3
+
4
+ describe "User" do
5
+ describe "Abilities" do
6
+ subject { ability }
7
+ let(:ability) { Ability.new(current_user) }
8
+ let(:visibility) { Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE }
9
+ let(:creating_user) { FactoryGirl.create(:user) }
10
+ let(:user) { FactoryGirl.create(:user) }
11
+ let(:current_user) { user }
12
+ let(:generic_work) { FactoryGirl.create(:generic_work, visibility: visibility, user:creating_user) }
13
+ let(:generic_file) { FactoryGirl.create(:file_with_work, visibility: visibility, user:creating_user) }
14
+
15
+ describe 'without embargo' do
16
+ describe 'creator of object' do
17
+ let(:creating_user) { user }
18
+ let(:current_user) { user }
19
+ it {
20
+ should be_able_to(:create, Worthwhile::GenericFile.new)
21
+ should be_able_to(:read, generic_file)
22
+ should be_able_to(:update, generic_file)
23
+ should_not be_able_to(:delete, generic_file)
24
+ }
25
+ end
26
+
27
+ describe 'as a repository manager' do
28
+ let(:manager_user) { FactoryGirl.create(:admin) }
29
+ let(:creating_user) { user }
30
+ let(:current_user) { manager_user }
31
+ it {
32
+ should be_able_to(:create, Worthwhile::GenericFile.new)
33
+ should be_able_to(:read, generic_file)
34
+ should be_able_to(:update, generic_file)
35
+ should be_able_to(:destroy, generic_file)
36
+ }
37
+ end
38
+
39
+ describe 'another authenticated user' do
40
+ let(:creating_user) { FactoryGirl.create(:user) }
41
+ let(:current_user) { user }
42
+ it {
43
+ should be_able_to(:create, Worthwhile::GenericFile.new)
44
+ should_not be_able_to(:read, generic_file)
45
+ should_not be_able_to(:update, generic_file)
46
+ should_not be_able_to(:delete, generic_file)
47
+ }
48
+ end
49
+
50
+ describe 'a nil user' do
51
+ let(:creating_user) { FactoryGirl.create(:user) }
52
+ let(:current_user) { nil }
53
+ it {
54
+ should_not be_able_to(:create, Worthwhile::GenericFile.new)
55
+ should_not be_able_to(:read, generic_file)
56
+ should_not be_able_to(:update, generic_file)
57
+ should_not be_able_to(:delete, generic_file)
58
+ }
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+ require "cancan/matchers"
3
+
4
+ describe "User" do
5
+ describe "Abilities" do
6
+ subject { Ability.new(current_user) }
7
+
8
+ let(:generic_work) { FactoryGirl.create(:private_generic_work, user: creating_user ) }
9
+ let(:user) { FactoryGirl.create(:user) }
10
+
11
+ describe 'without embargo' do
12
+ describe 'creator of object' do
13
+ let(:creating_user) { user }
14
+ let(:current_user) { user }
15
+ it {
16
+ should be_able_to(:create, GenericWork.new)
17
+ should be_able_to(:read, generic_work)
18
+ should be_able_to(:update, generic_work)
19
+ should be_able_to(:destroy, generic_work)
20
+ }
21
+ end
22
+
23
+ describe 'as a repository manager' do
24
+ let(:manager_user) { FactoryGirl.create(:admin) }
25
+ let(:creating_user) { user }
26
+ let(:current_user) { manager_user }
27
+ it {
28
+ should be_able_to(:create, GenericWork.new)
29
+ should be_able_to(:read, generic_work)
30
+ should be_able_to(:update, generic_work)
31
+ should be_able_to(:destroy, generic_work)
32
+ }
33
+ end
34
+
35
+ describe 'another authenticated user' do
36
+ let(:creating_user) { FactoryGirl.create(:user) }
37
+ let(:current_user) { user }
38
+ it {
39
+ should be_able_to(:create, GenericWork.new)
40
+ should_not be_able_to(:read, generic_work)
41
+ should_not be_able_to(:update, generic_work)
42
+ should_not be_able_to(:destroy, generic_work)
43
+ }
44
+ end
45
+
46
+ describe 'a nil user' do
47
+ let(:creating_user) { FactoryGirl.create(:user) }
48
+ let(:current_user) { nil }
49
+ it {
50
+ should_not be_able_to(:create, GenericWork.new)
51
+ should_not be_able_to(:read, generic_work)
52
+ should_not be_able_to(:update, generic_work)
53
+ should_not be_able_to(:destroy, generic_work)
54
+ }
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,215 @@
1
+ require 'spec_helper'
2
+
3
+ describe CurationConcern::GenericWorkActor do
4
+ include ActionDispatch::TestProcess
5
+
6
+ let(:user) { FactoryGirl.create(:user) }
7
+ let(:file) { worthwhile_fixture_file_upload('files/image.png', 'image/png') }
8
+
9
+ subject {
10
+ Worthwhile::CurationConcern.actor(curation_concern, user, attributes)
11
+ }
12
+
13
+ describe '#create' do
14
+ let(:curation_concern) { GenericWork.new(pid: Worthwhile::CurationConcern.mint_a_pid )}
15
+
16
+ context 'failure' do
17
+ let(:attributes) {{}}
18
+
19
+ it 'returns false' do
20
+ expect_any_instance_of(CurationConcern::GenericWorkActor).to receive(:save).and_return(false)
21
+ allow(subject).to receive(:attach_files).and_return(true)
22
+ allow(subject).to receive(:create_linked_resource).and_return(true)
23
+ expect(subject.create).to be false
24
+ end
25
+ end
26
+
27
+ context 'valid attributes' do
28
+ let(:visibility) { Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED }
29
+ context 'with embargo' do
30
+ let(:attributes) { { title: ["New embargo"], visibility: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_EMBARGO,
31
+ visibility_during_embargo: "authenticated", embargo_release_date: date.to_s,
32
+ visibility_after_embargo: "open", visibility_during_lease: "open",
33
+ lease_expiration_date: "2014-06-12", visibility_after_lease: "restricted",
34
+ rights: ["http://creativecommons.org/licenses/by/3.0/us/"] } }
35
+
36
+ context "with a valid embargo date" do
37
+ let(:date) { Date.today + 2 }
38
+ it "should interpret and apply embargo and lease visibility settings" do
39
+ subject.create
40
+ expect(curation_concern).to be_persisted
41
+ expect(curation_concern.visibility_during_embargo).to eq 'authenticated'
42
+ expect(curation_concern.visibility_after_embargo).to eq 'open'
43
+ expect(curation_concern.visibility).to eq 'authenticated'
44
+ end
45
+ end
46
+
47
+ context "when embargo_release_date is in the past" do
48
+ let(:date) { Date.today-2 }
49
+ it "should set error on curation_concern and return false" do
50
+ expect(subject.create).to be false
51
+ expect(subject.curation_concern.errors[:embargo_release_date].first).to eq 'Must be a future date'
52
+ end
53
+ end
54
+ end
55
+
56
+ context 'with lease' do
57
+ let(:attributes) { { title: ["New embargo"], visibility: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_LEASE,
58
+ visibility_during_embargo: "authenticated", embargo_release_date: '2099-05-12',
59
+ visibility_after_embargo: "open", visibility_during_lease: "open",
60
+ lease_expiration_date: date.to_s, visibility_after_lease: "restricted",
61
+ rights: ["http://creativecommons.org/licenses/by/3.0/us/"] } }
62
+
63
+ context "with a valid lease date" do
64
+ let(:date) { Date.today + 2 }
65
+ it "should interpret and apply embargo and lease visibility settings" do
66
+ subject.create
67
+ expect(curation_concern).to be_persisted
68
+ expect(curation_concern.embargo_release_date).to be_nil
69
+ expect(curation_concern.visibility_during_lease).to eq 'open'
70
+ expect(curation_concern.visibility_after_lease).to eq 'restricted'
71
+ expect(curation_concern.visibility).to eq 'open'
72
+ end
73
+ end
74
+
75
+ context "when lease_expiration_date is in the past" do
76
+ let(:date) { Date.today-2 }
77
+ it "should set error on curation_concern and return false" do
78
+ expect(subject.create).to be false
79
+ expect(subject.curation_concern.errors[:lease_expiration_date].first).to eq 'Must be a future date'
80
+ end
81
+ end
82
+ end
83
+
84
+ context 'with a file' do
85
+ let(:attributes) {
86
+ FactoryGirl.attributes_for(:generic_work, visibility: visibility).tap {|a|
87
+ a[:files] = file
88
+ }
89
+ }
90
+
91
+ context 'authenticated visibility' do
92
+ it 'should stamp each file with the access rights' do
93
+ s2 = double('characterize job')
94
+ allow(CharacterizeJob).to receive(:new).and_return(s2)
95
+ expect(Sufia.queue).to receive(:push).with(s2).once
96
+ expect(subject.create).to be true
97
+ expect(curation_concern).to be_persisted
98
+ expect(curation_concern.date_uploaded).to eq Date.today
99
+ expect(curation_concern.date_modified).to eq Date.today
100
+ expect(curation_concern.depositor).to eq user.user_key
101
+ expect(curation_concern.representative).to_not be_nil
102
+
103
+ expect(curation_concern.generic_files.count).to eq 1
104
+ # Sanity test to make sure the file we uploaded is stored and has same permission as parent.
105
+ generic_file = curation_concern.generic_files.first
106
+ expect(generic_file.content.content).to eq file.read
107
+ expect(generic_file.filename).to eq 'image.png'
108
+
109
+ expect(curation_concern).to be_authenticated_only_access
110
+ expect(generic_file).to be_authenticated_only_access
111
+ end
112
+ end
113
+ end
114
+
115
+ context 'with multiple files file' do
116
+ let(:attributes) {
117
+ FactoryGirl.attributes_for(:generic_work, visibility: visibility).tap {|a|
118
+ a[:files] = [file, file]
119
+ }
120
+ }
121
+
122
+ context 'authenticated visibility' do
123
+ it 'should stamp each file with the access rights' do
124
+ s2 = double('characterize job')
125
+ allow(CharacterizeJob).to receive(:new).and_return(s2)
126
+ expect(Sufia.queue).to receive(:push).with(s2).twice
127
+
128
+ expect(subject.create).to be true
129
+ expect(curation_concern).to be_persisted
130
+ expect(curation_concern.date_uploaded).to eq Date.today
131
+ expect(curation_concern.date_modified).to eq Date.today
132
+ expect(curation_concern.depositor).to eq user.user_key
133
+
134
+ expect(curation_concern.generic_files.count).to eq 2
135
+ # Sanity test to make sure the file we uploaded is stored and has same permission as parent.
136
+
137
+ expect(curation_concern).to be_authenticated_only_access
138
+ end
139
+ end
140
+ end
141
+
142
+ context 'with linked resources' do
143
+
144
+ let(:attributes) {
145
+ FactoryGirl.attributes_for(:generic_work, visibility: visibility, linked_resource_urls: ['http://www.youtube.com/watch?v=oHg5SJYRHA0', "http://google.com"])
146
+ }
147
+
148
+ it 'should stamp each link with the access rights' do
149
+ expect(subject.create).to be true
150
+ expect(curation_concern).to be_persisted
151
+ expect(curation_concern.date_uploaded).to eq Date.today
152
+ expect(curation_concern.date_modified).to eq Date.today
153
+ expect(curation_concern.depositor).to eq user.user_key
154
+
155
+ expect(curation_concern.generic_files.count).to eq 0
156
+ expect(curation_concern.linked_resources.count).to eq 2
157
+ # Sanity test to make sure the file we uploaded is stored and has same permission as parent.
158
+ link = curation_concern.linked_resources.first
159
+ expect(link.url).to eq 'http://www.youtube.com/watch?v=oHg5SJYRHA0'
160
+ expect(curation_concern).to be_authenticated_only_access
161
+ end
162
+ end
163
+ end
164
+ end
165
+
166
+ describe '#update' do
167
+ let(:curation_concern) { FactoryGirl.create(:generic_work, user: user)}
168
+
169
+ context 'failure' do
170
+ let(:attributes) {{}}
171
+
172
+ it 'returns false' do
173
+ expect_any_instance_of(CurationConcern::GenericWorkActor).to receive(:save).and_return(false)
174
+ expect(subject.update).to be false
175
+ end
176
+ end
177
+ context 'valid attributes' do
178
+ let(:attributes) {{}}
179
+ it "should interpret and apply embargo and lease visibility settings" do
180
+ expect(subject).to receive(:interpret_lease_visibility).and_return(true)
181
+ expect(subject).to receive(:interpret_embargo_visibility).and_return(true)
182
+ subject.update
183
+ end
184
+ end
185
+ context 'adding to collections' do
186
+ let!(:collection1) { FactoryGirl.create(:collection, user: user) }
187
+ let!(:collection2) { FactoryGirl.create(:collection, user: user) }
188
+ let(:attributes) {
189
+ FactoryGirl.attributes_for(:generic_work,
190
+ visibility: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC,
191
+ collection_ids: [collection2.pid])
192
+ }
193
+ before do
194
+ curation_concern.apply_depositor_metadata(user.user_key)
195
+ curation_concern.save!
196
+ collection1.add_member(curation_concern)
197
+ end
198
+
199
+ it "should add to collections" do
200
+ reload = GenericWork.find(curation_concern.pid)
201
+ expect(reload.collections).to eq [collection1]
202
+
203
+ expect(subject.update).to be true
204
+
205
+ reload = GenericWork.find(curation_concern.pid)
206
+ expect(reload.identifier).to be_blank
207
+ expect(reload).to be_persisted
208
+ expect(reload).to be_open_access
209
+ expect(reload.collections.count).to eq 1
210
+ expect(reload.collections).to eq [collection2]
211
+ expect(subject).to be_visibility_changed
212
+ end
213
+ end
214
+ end
215
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe CurationConcern::LinkedResourceActor do
4
+ let(:user) { FactoryGirl.create(:user) }
5
+ let(:parent) { FactoryGirl.create(:generic_work, user: user) }
6
+ let(:link) { Worthwhile::LinkedResource.new.tap {|lr| lr.batch = parent } }
7
+ let(:you_tube_link) { 'http://www.youtube.com/watch?v=oHg5SJYRHA0' }
8
+
9
+ subject {
10
+ CurationConcern::LinkedResourceActor.new(link, user, url: you_tube_link)
11
+ }
12
+
13
+ describe '#create' do
14
+ describe 'success' do
15
+ it 'adds a linked resource to the parent work' do
16
+ expect(parent.linked_resources).to be_empty
17
+ subject.create
18
+ expect(parent.reload.linked_resources).to eq [link]
19
+ link.reload
20
+ expect(link.batch).to eq parent
21
+ expect(link.url).to eq you_tube_link
22
+ end
23
+ end
24
+
25
+ describe 'failure' do
26
+ it 'returns false' do
27
+ allow(link).to receive(:valid?).and_return(false)
28
+ expect {
29
+ expect(subject.create).to be false
30
+ }.to_not change { Worthwhile::LinkedResource.count }
31
+ expect(parent.reload.linked_resources).to eq []
32
+ end
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+ describe Worthwhile::ManagesEmbargoesActor do
3
+
4
+ let(:model) {
5
+ Class.new(CurationConcern::BaseActor) {
6
+ include Worthwhile::ManagesEmbargoesActor
7
+ }
8
+ }
9
+
10
+ let(:user) { User.new }
11
+ let(:curation_concern) { GenericWork.new(pid: Worthwhile::CurationConcern.mint_a_pid )}
12
+ let(:attributes) {{}}
13
+ subject {
14
+ model.new(curation_concern, user, attributes)
15
+ }
16
+ let(:date) { Date.today+2 }
17
+
18
+ context "#interpret_visibility" do
19
+ it "should interpret lease and embargo visibility" do
20
+ expect(subject).to receive(:interpret_lease_visibility).and_return(true)
21
+ expect(subject).to receive(:interpret_embargo_visibility).and_return(true)
22
+ expect(subject.interpret_visibility).to be true
23
+ end
24
+ it "should collect failures from interpreting lease & embargo visibility" do
25
+ expect(subject).to receive(:interpret_embargo_visibility).and_return(true)
26
+ expect(subject).to receive(:interpret_lease_visibility).and_return(false)
27
+ expect(subject.interpret_visibility).to be false
28
+ end
29
+ end
30
+
31
+ context "#interpret_embargo_visibility" do
32
+ context 'when visibility is not set to embargo' do
33
+ let(:attributes) { { visibility: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC,
34
+ visibility_during_embargo: 'restricted', visibility_after_embargo: 'open' } }
35
+ it "removes the embargo attributes and returns true" do
36
+ expect(subject.interpret_embargo_visibility).to be true
37
+ expect(subject.attributes.keys).to eq ['visibility']
38
+ end
39
+ end
40
+
41
+ context "when visibility is set to embargo" do
42
+ let(:attributes) { { visibility: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_EMBARGO,
43
+ visibility_during_embargo: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE,
44
+ visibility_after_embargo: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC,
45
+ embargo_release_date: date.to_s } }
46
+
47
+ it "should apply the embargo remove embargo attributes except for embargo_release_date and return true" do
48
+ expect(subject.curation_concern).to receive(:apply_embargo).with(date.to_s, Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE,Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC)
49
+ expect(subject.interpret_embargo_visibility).to be true
50
+ expect(subject.attributes.keys).to eq ['embargo_release_date']
51
+ end
52
+
53
+ context "when embargo_release_date is not set" do
54
+ let(:attributes) { { visibility: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_EMBARGO } }
55
+ it "should set error on curation_concern and return false" do
56
+ expect(subject.interpret_embargo_visibility).to be false
57
+ expect(subject.curation_concern.errors[:visibility].first).to eq 'When setting visibility to "embargo" you must also specify embargo release date.'
58
+ end
59
+ end
60
+
61
+ end
62
+ end
63
+
64
+ context "#interpret_lease_visibility" do
65
+ context 'when visibility is not set to lease' do
66
+ let(:attributes) { { visibility: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC,
67
+ visibility_during_lease: 'open', visibility_after_lease: 'restricted' } }
68
+ it "removes the lease attributes and returns true" do
69
+ expect(subject.interpret_lease_visibility).to be true
70
+ expect(subject.attributes.keys).to eq ['visibility']
71
+ end
72
+ end
73
+
74
+ context "when visibility is set to lease" do
75
+ let(:attributes) { { visibility: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_LEASE,
76
+ visibility_during_lease: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE,
77
+ visibility_after_lease: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC,
78
+ lease_expiration_date: date.to_s } }
79
+
80
+ it "should apply the lease, remove lease attributes except for lease_expiration_date and return true" do
81
+ expect(subject.curation_concern).to receive(:apply_lease).with(date.to_s, Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE, Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC)
82
+ expect(subject.interpret_lease_visibility).to be true
83
+ expect(subject.attributes.keys).to eq ['lease_expiration_date']
84
+ end
85
+
86
+ context "when lease_expiration_date is not set" do
87
+ let(:attributes) { { visibility: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_LEASE } }
88
+ it "should set error on curation_concern and return false" do
89
+ expect(subject.interpret_lease_visibility).to be false
90
+ expect(subject.curation_concern.errors[:visibility].first).to eq 'When setting visibility to "lease" you must also specify lease expiration date.'
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end