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,171 @@
1
+ require 'spec_helper'
2
+
3
+ describe CurationConcern::GenericWorksController do
4
+ let(:public_work_factory_name) { :public_generic_work }
5
+ let(:private_work_factory_name) { :work }
6
+
7
+ let(:user) { FactoryGirl.create(:user) }
8
+ before { sign_in user }
9
+
10
+ describe "#show" do
11
+ context "my own private work" do
12
+ let(:a_work) { FactoryGirl.create(private_work_factory_name, user: user) }
13
+ it "should show me the page" do
14
+ get :show, id: a_work
15
+ expect(response).to be_success
16
+ end
17
+ end
18
+
19
+ context "someone elses private work" do
20
+ let(:a_work) { FactoryGirl.create(private_work_factory_name) }
21
+ it "should show 401 Unauthorized" do
22
+ get :show, id: a_work
23
+ expect(response.status).to eq 401
24
+ expect(response).to render_template(:unauthorized)
25
+ end
26
+ end
27
+
28
+ context "someone elses public work" do
29
+ let(:a_work) { FactoryGirl.create(public_work_factory_name) }
30
+ it "should show me the page" do
31
+ get :show, id: a_work
32
+ expect(response).to be_success
33
+ end
34
+ end
35
+
36
+ context "when I am a repository manager" do
37
+ before { allow_any_instance_of(User).to receive(:groups).and_return(['admin']) }
38
+ let(:a_work) { FactoryGirl.create(private_work_factory_name) }
39
+ it "someone elses private work should show me the page" do
40
+ get :show, id: a_work
41
+ expect(response).to be_success
42
+ end
43
+ end
44
+ end
45
+
46
+ describe "#new" do
47
+ context "my work" do
48
+ it "should show me the page" do
49
+ get :new
50
+ expect(response).to be_success
51
+ end
52
+ end
53
+ end
54
+
55
+ describe "#create" do
56
+ it "should create a work" do
57
+ expect {
58
+ post :create, accept_contributor_agreement: "accept", generic_work: { title: ["a title"] }
59
+ }.to change { GenericWork.count }.by(1)
60
+ expect(response).to redirect_to [:curation_concern, assigns[:curation_concern]]
61
+ end
62
+ end
63
+
64
+ describe "#edit" do
65
+ context "my own private work" do
66
+ let(:a_work) { FactoryGirl.create(private_work_factory_name, user: user) }
67
+ it "should show me the page" do
68
+ get :edit, id: a_work
69
+ expect(response).to be_success
70
+ end
71
+ end
72
+
73
+ context "someone elses private work" do
74
+ let(:a_work) { FactoryGirl.create(private_work_factory_name) }
75
+ it "should show 401 Unauthorized" do
76
+ get :edit, id: a_work
77
+ expect(response.status).to eq 401
78
+ expect(response).to render_template(:unauthorized)
79
+ end
80
+ end
81
+
82
+ context "someone elses public work" do
83
+ let(:a_work) { FactoryGirl.create(public_work_factory_name) }
84
+ it "should show me the page" do
85
+ get :edit, id: a_work
86
+ expect(response.status).to eq 401
87
+ expect(response).to render_template(:unauthorized)
88
+ end
89
+ end
90
+
91
+ context "when I am a repository manager" do
92
+ before { allow_any_instance_of(User).to receive(:groups).and_return(['admin']) }
93
+ let(:a_work) { FactoryGirl.create(private_work_factory_name) }
94
+ it "someone elses private work should show me the page" do
95
+ get :edit, id: a_work
96
+ expect(response).to be_success
97
+ end
98
+ end
99
+ end
100
+
101
+ describe "#update" do
102
+ let(:a_work) { FactoryGirl.create(private_work_factory_name, user: user) }
103
+
104
+ it "should update the work " do
105
+ patch :update, id: a_work, generic_work: { }
106
+ expect(response).to redirect_to [:curation_concern, assigns[:curation_concern]]
107
+ end
108
+
109
+ describe "changing rights" do
110
+ it "should prompt to change the files access" do
111
+ allow(controller).to receive(:actor).and_return(double(update: true, visibility_changed?: true))
112
+ patch :update, id: a_work
113
+ expect(response).to redirect_to confirm_curation_concern_permission_path(controller.curation_concern)
114
+ end
115
+ end
116
+
117
+ describe "failure" do
118
+ it "renders the form" do
119
+ allow(controller).to receive(:actor).and_return(double(update: false, visibility_changed?: false))
120
+ patch :update, id: a_work
121
+ expect(response).to render_template('edit')
122
+ end
123
+ end
124
+
125
+ context "someone elses public work" do
126
+ let(:a_work) { FactoryGirl.create(public_work_factory_name) }
127
+ it "should show 401 Unauthorized" do
128
+ get :update, id: a_work
129
+ expect(response.status).to eq 401
130
+ expect(response).to render_template(:unauthorized)
131
+ end
132
+ end
133
+
134
+ context "when I am a repository manager" do
135
+ before { allow_any_instance_of(User).to receive(:groups).and_return(['admin']) }
136
+ let(:a_work) { FactoryGirl.create(private_work_factory_name) }
137
+ it "someone elses private work should update the work" do
138
+ patch :update, id: a_work, generic_work: { }
139
+ expect(response).to redirect_to [:curation_concern, assigns[:curation_concern]]
140
+ end
141
+ end
142
+ end
143
+
144
+ describe "#destroy" do
145
+ let(:work_to_be_deleted) { FactoryGirl.create(private_work_factory_name, user: user) }
146
+
147
+ it "should delete the work" do
148
+ delete :destroy, id: work_to_be_deleted
149
+ expect(response).to redirect_to catalog_index_path()
150
+ expect { GenericWork.find(work_to_be_deleted.pid) }.to raise_error
151
+ end
152
+
153
+ context "someone elses public work" do
154
+ let(:work_to_be_deleted) { FactoryGirl.create(private_work_factory_name) }
155
+ it "should show 401 Unauthorized" do
156
+ delete :destroy, id: work_to_be_deleted
157
+ expect(response.status).to eq 401
158
+ expect(response).to render_template(:unauthorized)
159
+ end
160
+ end
161
+
162
+ context "when I am a repository manager" do
163
+ let(:work_to_be_deleted) { FactoryGirl.create(private_work_factory_name) }
164
+ before { allow_any_instance_of(User).to receive(:groups).and_return(['admin']) }
165
+ it "someone elses private work should delete the work" do
166
+ delete :destroy, id: work_to_be_deleted
167
+ expect { GenericWork.find(work_to_be_deleted.pid) }.to raise_error
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,123 @@
1
+ require 'spec_helper'
2
+
3
+ describe CurationConcern::LinkedResourcesController do
4
+ let(:user) { FactoryGirl.create(:user) }
5
+ let(:another_user) { FactoryGirl.create(:user) }
6
+ let(:visibility) { Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE }
7
+ let(:parent) {
8
+ FactoryGirl.create_curation_concern(:generic_work, user, {visibility: visibility})
9
+ }
10
+
11
+ let(:linked_resource) { FactoryGirl.create(:linked_resource, batch: parent, user: user) }
12
+
13
+ let(:you_tube_link) { 'http://www.youtube.com/watch?v=oHg5SJYRHA0' }
14
+
15
+ describe '#new' do
16
+ it 'renders a form if you can edit the parent' do
17
+ sign_in(user)
18
+ parent
19
+ get :new, parent_id: parent.to_param
20
+ expect(response).to be_successful
21
+ expect(response).to render_template(:new)
22
+ end
23
+
24
+ it 'redirects if you cannot edit the parent' do
25
+ sign_in(another_user)
26
+ parent
27
+ get :new, parent_id: parent.to_param
28
+ expect(response.status).to eq 401
29
+ expect(response).to render_template(:unauthorized)
30
+ end
31
+ end
32
+
33
+ describe '#create' do
34
+ let(:actor) { double('actor') }
35
+ let(:actors_action) { :create }
36
+ let(:success) { true }
37
+ let(:failure) { false }
38
+
39
+ it 'redirects to the parent work' do
40
+ sign_in(user)
41
+ parent
42
+ expect(actor).to receive(actors_action).and_return(success)
43
+ controller.actor = actor
44
+
45
+ post(:create, parent_id: parent.to_param,
46
+ linked_resource: { url: you_tube_link }
47
+ )
48
+
49
+ expect(response).to(
50
+ redirect_to(controller.polymorphic_path([:curation_concern, parent]))
51
+ )
52
+ end
53
+
54
+ describe 'failure' do
55
+ it 'renders the form' do
56
+ sign_in(user)
57
+ parent
58
+ expect(actor).to receive(actors_action).and_return(failure)
59
+ controller.actor = actor
60
+
61
+ post(:create, parent_id: parent.to_param,
62
+ linked_resource: { url: you_tube_link }
63
+ )
64
+ expect(response).to render_template('new')
65
+ expect(response.status).to eq 422
66
+ end
67
+ end
68
+ end
69
+ describe '#edit' do
70
+ it 'should be successful' do
71
+ linked_resource
72
+ sign_in user
73
+ get :edit, id: linked_resource.to_param
74
+ expect(controller.curation_concern).to be_kind_of(Worthwhile::LinkedResource)
75
+ expect(response).to be_successful
76
+ end
77
+ end
78
+
79
+ describe '#update' do
80
+ let(:updated_title) { Time.now.to_s }
81
+ let(:failing_actor) {
82
+ expect(actor).to receive(:update).and_return(false)
83
+ actor
84
+ }
85
+ let(:successful_actor) {
86
+ expect(actor).to receive(:update).and_return(true)
87
+ actor
88
+ }
89
+ let(:actor) { double('actor') }
90
+ it 'renders form when unsuccessful' do
91
+ linked_resource
92
+ controller.actor = failing_actor
93
+ sign_in(user)
94
+ put :update, id: linked_resource.to_param, linked_resource: {title: updated_title}
95
+ expect(response).to render_template('edit')
96
+ expect(response.status).to eq 422
97
+ end
98
+
99
+ it 'redirects to parent when successful' do
100
+ linked_resource
101
+ controller.actor = successful_actor
102
+ sign_in(user)
103
+ put :update, id: linked_resource.to_param, linked_resource: {title: updated_title}
104
+ expect(response.status).to eq(302)
105
+ expect(response).to(
106
+ redirect_to(
107
+ controller.polymorphic_path([:curation_concern, linked_resource.batch])
108
+ )
109
+ )
110
+ end
111
+ end
112
+
113
+ describe '#destroy' do
114
+ it 'should be successful if file exists' do
115
+ parent = linked_resource.batch
116
+ sign_in(user)
117
+ delete :destroy, id: linked_resource.to_param
118
+ expect(response.status).to eq(302)
119
+ expect(response).to redirect_to(controller.polymorphic_path([:curation_concern, parent]))
120
+ end
121
+ end
122
+
123
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe CurationConcern::PermissionsController do
4
+ let(:user) { FactoryGirl.create(:user) }
5
+ before { sign_in user }
6
+
7
+ describe "#confirm" do
8
+ let(:generic_work) { FactoryGirl.create(:generic_work, user: user) }
9
+
10
+ it "should draw the page" do
11
+ get :confirm, id: generic_work
12
+ expect(response).to be_success
13
+ end
14
+ end
15
+
16
+ describe "#copy" do
17
+ let(:generic_work) { FactoryGirl.create(:generic_work, user: user) }
18
+
19
+ it "should add a worker to the queue" do
20
+ worker = double
21
+ VisibilityCopyWorker.should_receive(:new).with(generic_work.pid).and_return(worker)
22
+ Sufia.queue.should_receive(:push).with(worker)
23
+ post :copy, id: generic_work
24
+ expect(response).to redirect_to controller.polymorphic_path([:curation_concern, generic_work])
25
+ expect(flash[:notice]).to eq 'Updating file permissions. This may take a few minutes. You may want to refresh your browser or return to this record later to see the updated file permissions.'
26
+ end
27
+ end
28
+
29
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe DownloadsController do
4
+ describe '#show' do
5
+ let(:user) { FactoryGirl.create(:user) }
6
+ let(:another_user) { FactoryGirl.create(:user) }
7
+ let(:image_file) { File.open(Rails.root.join('../fixtures/files/image.png')) }
8
+ let(:generic_file) {
9
+ FactoryGirl.create(:file_with_work, user: user, content: worthwhile_fixture_file_upload('files/image.png', 'image/png', false))
10
+ }
11
+
12
+ it "raise not_found if the object does not exist" do
13
+ get :show, id: '8675309'
14
+ expect(response).to be_not_found
15
+ end
16
+
17
+ context "when user doesn't have access" do
18
+ before do
19
+ generic_file
20
+ sign_in another_user
21
+ end
22
+ it "redirects to root" do
23
+ get :show, id: generic_file.to_param
24
+ expect(response).to redirect_to root_path
25
+ expect(flash["alert"]).to eq "You are not authorized to access this page."
26
+ end
27
+ end
28
+
29
+ context "when user isn't logged in" do
30
+ before { generic_file }
31
+ it "redirects to sign in" do
32
+ get :show, id: generic_file.to_param
33
+ expect(response).to redirect_to new_user_session_path
34
+ expect(flash["alert"]).to eq "You are not authorized to access this page."
35
+ end
36
+ end
37
+
38
+ it 'sends the file if the user has access' do
39
+ generic_file
40
+ sign_in user
41
+ get :show, id: generic_file.to_param
42
+ response.body.should == generic_file.content.content
43
+ end
44
+
45
+ it 'sends requested datastream content' do
46
+ generic_file.datastreams['thumbnail'].content = image_file
47
+ generic_file.save!
48
+ sign_in user
49
+ get :show, id: generic_file.to_param, datastream_id: 'thumbnail'
50
+ response.body.should == generic_file.thumbnail.content
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+
3
+ describe EmbargoesController do
4
+ let(:user) { FactoryGirl.create(:user) }
5
+ let(:a_work) { FactoryGirl.create(:generic_work, user: user) }
6
+ let(:not_my_work) { FactoryGirl.create(:generic_work) }
7
+
8
+ before { sign_in user }
9
+
10
+ describe "#index" do
11
+ context "when I am NOT a repository manager" do
12
+ it "should redirect" do
13
+ get :index
14
+ expect(response).to redirect_to root_path
15
+ end
16
+ end
17
+ context "when I am a repository manager" do
18
+ before { allow_any_instance_of(User).to receive(:groups).and_return(['admin']) }
19
+ it "should show me the page" do
20
+ get :index
21
+ expect(response).to be_success
22
+ end
23
+ end
24
+ end
25
+
26
+ describe "#edit" do
27
+ context "when I do not have edit permissions for the object" do
28
+ it "should redirect" do
29
+ get :edit, id: not_my_work
30
+ expect(response.status).to eq 401
31
+ expect(response).to render_template :unauthorized
32
+ end
33
+ end
34
+ context "when I have permission to edit the object" do
35
+ it "should show me the page" do
36
+ get :edit, id: a_work
37
+ expect(response).to be_success
38
+ end
39
+ end
40
+ end
41
+
42
+
43
+
44
+ describe "#destroy" do
45
+ context "when I do not have edit permissions for the object" do
46
+ it "should deny access" do
47
+ get :destroy, id: not_my_work
48
+ expect(response.status).to eq 401
49
+ expect(response).to render_template :unauthorized
50
+ end
51
+ end
52
+
53
+ context "when I have permission to edit the object" do
54
+ before do
55
+ expect(ActiveFedora::Base).to receive(:find).with(a_work.pid).and_return(a_work)
56
+ a_work.visibility = Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED
57
+ a_work.visibility_during_embargo = Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED
58
+ a_work.visibility_after_embargo = Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC
59
+ a_work.embargo_release_date = release_date.to_s
60
+ a_work.save(validate: false)
61
+ get :destroy, id: a_work
62
+ end
63
+
64
+ context "with an active embargo" do
65
+ let(:release_date) { Date.today+2 }
66
+
67
+ it "should deactivate embargo without updating visibility and redirect" do
68
+ expect(a_work.visibility).to eq Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED
69
+ expect(response).to redirect_to edit_embargo_path(a_work)
70
+ end
71
+ end
72
+
73
+ context "with an expired embargo" do
74
+ let(:release_date) { Date.today-2 }
75
+
76
+ it "should deactivate embargo, update the visibility and redirect" do
77
+ expect(a_work.visibility).to eq Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC
78
+ expect(response).to redirect_to confirm_curation_concern_permission_path(a_work)
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ describe "#update" do
85
+ context "when I have permission to edit the object" do
86
+ let(:a_file) { FactoryGirl.build(:generic_file, visibility: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED) }
87
+ before do
88
+ a_work.generic_files << a_file
89
+ a_work.visibility = Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED
90
+ a_work.visibility_during_embargo = Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED
91
+ a_work.visibility_after_embargo = Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC
92
+ a_work.embargo_release_date = release_date.to_s
93
+ a_work.save(validate: false)
94
+ end
95
+
96
+ context "with an expired embargo" do
97
+ let(:release_date) { Date.today-2 }
98
+ it "should deactivate embargo, update the visibility and redirect" do
99
+ patch :update, batch_document_ids: [a_work.pid], embargoes: { "0" => { copy_visibility: a_work.id} }
100
+ expect(a_work.reload.visibility).to eq Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC
101
+ expect(a_file.reload.visibility).to eq Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC
102
+ expect(response).to redirect_to embargoes_path
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end