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,114 @@
1
+ require 'spec_helper'
2
+
3
+ describe CatalogController do
4
+ before do
5
+ ActiveFedora::Base.delete_all
6
+ end
7
+
8
+ describe "when logged in" do
9
+ let(:user) { FactoryGirl.create(:user) }
10
+ let!(:work1) { FactoryGirl.create(:public_generic_work, user: user) }
11
+ let!(:work2) { FactoryGirl.create(:public_generic_work) }
12
+ let!(:linked_resource) { FactoryGirl.create(:linked_resource, user: user, batch:work1) }
13
+ let!(:collection) { FactoryGirl.create(:collection, user: user) }
14
+ let!(:file) { FactoryGirl.create(:generic_file, batch:work1) }
15
+ before do
16
+ sign_in user
17
+ end
18
+
19
+ context "when there is private content" do
20
+ let!(:private_work) { FactoryGirl.create(:private_generic_work) }
21
+ let!(:private_collection) { FactoryGirl.create(:private_collection) }
22
+
23
+ it "excludes it" do
24
+ get 'index'
25
+ expect(response).to be_successful
26
+ expect(assigns(:document_list).map(&:id)).to match_array [work1.id, work2.id, collection.id]
27
+ end
28
+ end
29
+
30
+ context "Searching all content" do
31
+ it "should exclude linked resources" do
32
+ get 'index'
33
+ expect(response).to be_successful
34
+ expect(assigns(:document_list).map(&:id)).to match_array [work1.id, work2.id, collection.id]
35
+ end
36
+ end
37
+
38
+ context "Searching all works" do
39
+ it "should return all the works" do
40
+ get 'index', 'f' => {'generic_type_sim' => 'Work'}
41
+ expect(response).to be_successful
42
+ expect(assigns(:document_list).map(&:id)).to eq [work1.id, work2.id]
43
+ end
44
+ end
45
+
46
+ context "Searching all collections" do
47
+ it "should return all the works" do
48
+ get 'index', 'f' => {'generic_type_sim' => 'Collection'}
49
+ expect(response).to be_successful
50
+ expect(assigns(:document_list).map(&:id)).to eq [collection.id]
51
+ end
52
+ end
53
+
54
+ context "searching just my works" do
55
+ it "should return just my works" do
56
+ get 'index', works: 'mine', 'f' => {'generic_type_sim' => 'Work'}
57
+ expect(response).to be_successful
58
+ expect(assigns(:document_list).map(&:id)).to eq [work1.id]
59
+ end
60
+ end
61
+
62
+ context "searching for one kind of work" do
63
+ it "returns just the specified type" do
64
+ get 'index', 'f' => {'human_readable_type_sim' => 'Generic Work'}
65
+ expect(response).to be_successful
66
+ expect(assigns(:document_list).map(&:id)).to include(work1.id, work2.id)
67
+ end
68
+ end
69
+
70
+ context "when json is requested for autosuggest of related works" do
71
+ let!(:work) { FactoryGirl.create(:generic_work, user: user, title: ["All my #{srand}"]) }
72
+ it "should return json" do
73
+ xhr :get, :index, format: :json, q: work.title
74
+ json = JSON.parse(response.body)
75
+ # Grab the doc corresponding to work and inspect the json
76
+ work_json = json["docs"].first
77
+ expect(work_json).to eq("pid"=>work.pid, "title"=> "#{work.title.first} (#{work.human_readable_type})")
78
+ end
79
+ end
80
+
81
+ end
82
+
83
+ describe "when logged in as a repository manager" do
84
+ let(:creating_user) { FactoryGirl.create(:user) }
85
+ let(:manager_user) { FactoryGirl.create(:user) }
86
+ let!(:work1) { FactoryGirl.create(:private_generic_work, user: creating_user) }
87
+ let!(:work2) { FactoryGirl.create(:embargoed_work, user: creating_user) }
88
+ let!(:collection) { FactoryGirl.create(:private_collection, user: creating_user) }
89
+
90
+ before do
91
+ allow_any_instance_of(User).to receive(:groups).and_return(['admin'])
92
+ sign_in manager_user
93
+ end
94
+
95
+ context "searching all works" do
96
+ it "should return other users' private works" do
97
+ get 'index', 'f' => {'generic_type_sim' => 'Work'}
98
+ expect(response).to be_successful
99
+ expect(assigns(:document_list).map(&:id)).to include(work1.id)
100
+ end
101
+ it "should return other users' embargoed works" do
102
+ get 'index', 'f' => {'generic_type_sim' => 'Work'}
103
+ expect(response).to be_successful
104
+ expect(assigns(:document_list).map(&:id)).to include(work2.id)
105
+ end
106
+ it "should return other users' private collections" do
107
+ get 'index', 'f' => {'generic_type_sim' => 'Collection'}
108
+ expect(response).to be_successful
109
+ expect(assigns(:document_list).map(&:id)).to include(collection.id)
110
+ end
111
+ end
112
+
113
+ end
114
+ end
@@ -0,0 +1,216 @@
1
+ require 'spec_helper'
2
+
3
+ describe CollectionsController do
4
+ routes { Hydra::Collections::Engine.routes }
5
+ before do
6
+ allow(controller).to receive(:has_access?).and_return(true)
7
+ allow_any_instance_of(User).to receive(:groups).and_return([])
8
+ end
9
+
10
+ let(:user) { FactoryGirl.create(:admin) }
11
+ let(:otheruser) { FactoryGirl.create(:user) }
12
+ let(:work1) { FactoryGirl.create(:generic_work, user:user) }
13
+ let(:work2) { FactoryGirl.create(:generic_work, user: user) }
14
+ let(:my_public_generic_work) { FactoryGirl.create(:public_generic_work, user:user) }
15
+ let(:my_other_public_generic_work) { FactoryGirl.create(:public_generic_work, user:user) }
16
+ let(:private_asset_not_mine) { FactoryGirl.create(:private_generic_work, user:otheruser) }
17
+ let(:public_asset_not_mine) { FactoryGirl.create(:public_generic_work, user:otheruser) }
18
+ let(:collection) { FactoryGirl.create(:collection, user:user) }
19
+
20
+ after (:all) do
21
+ Collection.destroy_all
22
+ GenericWork.destroy_all
23
+ User.destroy_all
24
+ end
25
+
26
+ describe '#new' do
27
+ before do
28
+ sign_in user
29
+ end
30
+
31
+ it 'should assign collection' do
32
+ get :new
33
+ expect(assigns(:collection)).to be_kind_of(Collection)
34
+ end
35
+ end
36
+
37
+ describe '#create' do
38
+ before do
39
+ sign_in user
40
+ end
41
+
42
+ it "should create a Collection" do
43
+ expect {
44
+ post :create, collection: {title: "My First Collection ", description: "The Description\r\n\r\nand more"}
45
+ }.to change {Collection.count}.by 1
46
+ end
47
+ it "should create a Collection with files I can access" do
48
+ expect {
49
+ post :create, collection: {title: "My own Collection ", description: "The Description\r\n\r\nand more"}, batch_document_ids:[work1.id, work2.id, private_asset_not_mine.id]
50
+ }.to change {Collection.count}.by 1
51
+ collection = assigns(:collection)
52
+ expect(collection.members).to include work1
53
+ expect(collection.members).to include work2
54
+ expect(collection.members).to_not include private_asset_not_mine
55
+ work1.destroy
56
+ work2.destroy
57
+ my_public_generic_work.destroy
58
+ end
59
+
60
+ it "should add docs to collection if batch ids provided and add the collection id to the documents int he colledction" do
61
+ post :create, batch_document_ids: [work1.id], collection: {title: "My Secong Collection ", description: "The Description\r\n\r\nand more"}
62
+ expect(assigns[:collection].members).to eq [work1]
63
+ asset_results = ActiveFedora::SolrService.instance.conn.get "select", params:{fq:["id:\"#{work1.id}\""],fl:['id',Solrizer.solr_name(:collection)]}
64
+ expect(asset_results["response"]["numFound"]).to eq 1
65
+ doc = asset_results["response"]["docs"].first
66
+ expect(doc["id"]).to eq work1.id
67
+ afterupdate = GenericFile.find(work1.pid)
68
+ expect(doc[Solrizer.solr_name(:collection)]).to eq afterupdate.to_solr[Solrizer.solr_name(:collection)]
69
+ end
70
+
71
+ end
72
+
73
+ describe "#update" do
74
+ before do
75
+ sign_in user
76
+ end
77
+ after do
78
+ collection.destroy
79
+ work1.destroy
80
+ work2.destroy
81
+ my_public_generic_work.destroy
82
+ end
83
+
84
+ it "should set collection on members" do
85
+ put :update, id: collection.id, collection: {members:"add"}, batch_document_ids:[my_public_generic_work.pid,work1.pid, work2.pid]
86
+ expect(response).to redirect_to collection_path(collection)
87
+ expect(assigns[:collection].members.map(&:pid)).to match_array([work2, my_public_generic_work, work1].map(&:pid))
88
+ asset_results = ActiveFedora::SolrService.instance.conn.get "select", params:{fq:["id:\"#{work2.pid}\""],fl:['id',Solrizer.solr_name(:collection)]}
89
+ expect(asset_results["response"]["numFound"]).to eq 1
90
+ doc = asset_results["response"]["docs"].first
91
+ expect(doc["id"]).to eq work2.id
92
+ afterupdate = GenericFile.find(work2.pid)
93
+ expect(doc[Solrizer.solr_name(:collection)]).to eq afterupdate.to_solr[Solrizer.solr_name(:collection)]
94
+ put :update, id: collection.id, collection: {members: "remove"}, batch_document_ids: [work2]
95
+ asset_results = ActiveFedora::SolrService.instance.conn.get "select", params:{fq:["id:\"#{work2.pid}\""],fl:['id',Solrizer.solr_name(:collection)]}
96
+ expect(asset_results["response"]["numFound"]).to eq 1
97
+ doc = asset_results["response"]["docs"].first
98
+ expect(doc["id"]).to eq work2.id
99
+ afterupdate = GenericFile.find(work2.pid)
100
+ expect(doc[Solrizer.solr_name(:collection)]).to be_nil
101
+ end
102
+
103
+ describe "adding members" do
104
+ it "should add members and update all of the relevant solr documents" do
105
+ expect(collection.members).to_not include my_other_public_generic_work
106
+ solr_doc_before_remove = ActiveFedora::SolrInstanceLoader.new(ActiveFedora::Base, my_other_public_generic_work.pid).send(:solr_doc)
107
+ expect(solr_doc_before_remove[Solrizer.solr_name(:collection)]).to be_nil
108
+ put :update, id: collection.id, collection: {members:"add"}, batch_document_ids:[my_other_public_generic_work.pid]
109
+ expect(collection.reload.members).to include my_other_public_generic_work
110
+ solr_doc_after_add = ActiveFedora::SolrInstanceLoader.new(ActiveFedora::Base, my_other_public_generic_work.pid).send(:solr_doc)
111
+ expect(solr_doc_after_add[Solrizer.solr_name(:collection)]).to eq [collection.pid]
112
+ end
113
+ end
114
+
115
+ describe "removing members" do
116
+ before do
117
+ collection.members << public_asset_not_mine
118
+ collection.save
119
+ end
120
+ it "should remove members and update all of the relevant solr documents" do
121
+ # BUG: This is returning inaccurate information
122
+ # collection.reload.members.should include public_asset_not_mine
123
+ solr_doc_before_remove = ActiveFedora::SolrInstanceLoader.new(ActiveFedora::Base, public_asset_not_mine.pid).send(:solr_doc)
124
+ expect(solr_doc_before_remove[Solrizer.solr_name(:collection)]).to eq [collection.pid]
125
+ put :update, id: collection.id, collection: {members:"remove"}, batch_document_ids:[public_asset_not_mine.pid]
126
+ expect(collection.reload.members.count).to eq 0
127
+ solr_doc_after_remove = ActiveFedora::SolrInstanceLoader.new(ActiveFedora::Base, public_asset_not_mine.pid).send(:solr_doc)
128
+ expect(solr_doc_after_remove[Solrizer.solr_name(:collection)]).to be_nil
129
+ end
130
+ end
131
+ end
132
+
133
+ describe "#show" do
134
+ before do
135
+ collection.members = [work1,work2,my_public_generic_work,private_asset_not_mine,public_asset_not_mine]
136
+ collection.save
137
+ allow(controller).to receive(:authorize!).and_return(true)
138
+ allow(controller).to receive(:apply_gated_search)
139
+ end
140
+
141
+ context "when signed in" do
142
+ before do
143
+ sign_in user
144
+ end
145
+
146
+ it "should return the collection and its members I have access to" do
147
+ get :show, id: collection.id
148
+ expect(response).to be_successful
149
+ expect(assigns[:collection].title).to eq collection.title
150
+ ids = assigns[:member_docs].map(&:id)
151
+ expect(ids).to include work1.pid, work2.pid, my_public_generic_work.pid, public_asset_not_mine.pid
152
+ expect(ids).to_not include my_other_public_generic_work.pid, private_asset_not_mine.pid
153
+ end
154
+
155
+ context "as an admin" do
156
+ before { allow_any_instance_of(User).to receive(:groups).and_return(['admin']) }
157
+ it "shows all the collection members" do
158
+ get :show, id: collection.id
159
+ expect(response).to be_successful
160
+ expect(assigns[:collection].title).to eq collection.title
161
+ ids = assigns[:member_docs].map(&:id)
162
+ expect(ids).to include work1.pid, work2.pid, my_public_generic_work.pid, public_asset_not_mine.pid, private_asset_not_mine.pid
163
+ expect(ids).to_not include my_other_public_generic_work.pid
164
+ end
165
+ end
166
+
167
+ context "when query limited to 'mine'" do
168
+ it "should return only the collection members that I own" do
169
+ get :show, id: collection.id, owner:'mine'
170
+ expect(response).to be_successful
171
+ expect(assigns[:collection].title).to eq collection.title
172
+ ids = assigns[:member_docs].map(&:id)
173
+ expect(ids).to include work1.pid, work2.pid, my_public_generic_work.pid
174
+ expect(ids).to_not include my_other_public_generic_work.pid, private_asset_not_mine.pid, public_asset_not_mine.pid
175
+ end
176
+ end
177
+
178
+ context "when items have been added and removed" do
179
+ it "should return the items that are in the collection and not return items that have been removed" do
180
+ put :update, id: collection.id, collection: {members:"remove"}, batch_document_ids:[public_asset_not_mine.pid]
181
+ panm_solr_doc = ActiveFedora::SolrInstanceLoader.new(ActiveFedora::Base, public_asset_not_mine.pid).send(:solr_doc)
182
+ expect(panm_solr_doc[Solrizer.solr_name(:collection)]).to be_nil
183
+ controller.batch = nil
184
+ put :update, id: collection.id, collection: {members:"add"}, batch_document_ids:[my_other_public_generic_work.pid]
185
+ get :show, id: collection.id
186
+ ids = assigns[:member_docs].map(&:id)
187
+ expect(ids).to include work1.pid, work2.pid, my_public_generic_work.pid, my_other_public_generic_work.pid
188
+ expect(ids).to_not include public_asset_not_mine.pid
189
+ end
190
+ end
191
+ end
192
+
193
+ context "not signed in" do
194
+ it "should only show me public access files in the collection" do
195
+ get :show, id: collection.id
196
+ expect(assigns[:member_docs].count).to eq 2
197
+ ids = assigns[:member_docs].map(&:id)
198
+ expect(ids).to include my_public_generic_work.pid, public_asset_not_mine.pid
199
+ end
200
+ end
201
+ end
202
+
203
+ describe "#edit" do
204
+ before do
205
+ collection = Collection.new(title: "My collection", description: "My incredibly detailed description of the collection")
206
+ collection.apply_depositor_metadata(user.user_key)
207
+ collection.save
208
+ sign_in user
209
+ end
210
+
211
+ it "should not show flash" do
212
+ get :edit, id: collection.id
213
+ expect(flash[:notice]).to be_nil
214
+ end
215
+ end
216
+ end
@@ -0,0 +1,258 @@
1
+ require 'spec_helper'
2
+
3
+ describe CurationConcern::GenericFilesController do
4
+ let(:user) { FactoryGirl.create(:user) }
5
+ let(:file) { fixture_file_upload('files/image.png','image/png') }
6
+ let(:parent) { FactoryGirl.create(:generic_work, edit_users: [user.user_key], visibility:Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC) }
7
+
8
+ context "when signed in" do
9
+ before { sign_in user }
10
+
11
+ describe "#create" do
12
+ before do
13
+ Worthwhile::GenericFile.destroy_all
14
+ allow(Worthwhile::GenericFile).to receive(:new).and_return(Worthwhile::GenericFile.new(pid: 'test:123'))
15
+ end
16
+
17
+ context "on the happy path" do
18
+ let(:date_today) { Date.today }
19
+
20
+ before do
21
+ allow(Date).to receive(:today).and_return(date_today)
22
+ end
23
+
24
+ it "spawns a CharacterizeJob" do
25
+ s2 = double('one')
26
+ expect(CharacterizeJob).to receive(:new).with('test:123').and_return(s2)
27
+ expect(Sufia.queue).to receive(:push).with(s2).once
28
+ expect {
29
+ xhr :post, :create, files: [file], parent_id: parent,
30
+ generic_file: { "title"=>[""], visibility_during_embargo: "restricted",
31
+ embargo_release_date: "2014-08-23",
32
+ visibility_after_embargo: "open", visibility_during_lease: "open",
33
+ lease_expiration_date: "2014-08-23",
34
+ visibility_after_lease: "restricted",
35
+ visibility: "restricted"}
36
+ expect(response).to be_success
37
+ }.to change { Worthwhile::GenericFile.count }.by(1)
38
+ expect(flash[:error]).to be_nil
39
+ saved_file = assigns[:generic_file].reload
40
+
41
+ expect(saved_file.label).to eq 'image.png'
42
+ expect(saved_file.batch).to eq parent
43
+
44
+ # Confirming that date_uploaded and date_modified were set
45
+ expect(saved_file.date_uploaded).to eq date_today
46
+ expect(saved_file.date_modified).to eq date_today
47
+ expect(saved_file.depositor).to eq user.email
48
+ version = saved_file.content.latest_version
49
+ expect(version.versionID).to eq "content.0"
50
+ expect(saved_file.content.version_committer(version)).to eq user.email
51
+
52
+ # Confirm that embargo/lease are not set.
53
+ expect(saved_file).to_not be_under_embargo
54
+ expect(saved_file).to_not be_active_lease
55
+ # Presently it's coping from the parent and disregarding what is on the form.
56
+ # expect(saved_file.visibility).to eq 'restricted'
57
+ expect(saved_file.visibility).to eq 'open'
58
+ end
59
+
60
+ it "copies visibility from the parent" do
61
+ s2 = double('one')
62
+ expect(CharacterizeJob).to receive(:new).with('test:123').and_return(s2)
63
+ expect(Sufia.queue).to receive(:push).with(s2).once
64
+ xhr :post, :create, files: [file], parent_id: parent
65
+ expect(assigns[:generic_file]).to be_persisted
66
+ saved_file = assigns[:generic_file].reload
67
+ expect(saved_file.visibility).to eq Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC
68
+ end
69
+ end
70
+
71
+ context "on something that isn't a file" do
72
+ it "should render error" do
73
+ xhr :post, :create, files: ['hello'], parent_id: parent,
74
+ permission: { group: { 'public' => 'read' } }, terms_of_service: '1'
75
+ expect(response.status).to eq 422
76
+ err = JSON.parse(response.body).first['error']
77
+ expect(err).to match(/no file for upload/i)
78
+ end
79
+ end
80
+
81
+ context "when the file has a virus" do
82
+ it "displays a flash error" do
83
+ skip
84
+ expect(Sufia::GenericFile::Actions).to receive(:virus_check).with(file.path).and_raise(Sufia::VirusFoundError.new('A virus was found'))
85
+ xhr :post, :create, files: [file], parent_id: parent,
86
+ permission: { group: { 'public' => 'read' } }, terms_of_service: '1'
87
+ expect(flash[:error]).to include('A virus was found')
88
+ end
89
+ end
90
+
91
+ context "when solr is down" do
92
+ it "should error out of create and save after on continuos rsolr error" do
93
+ allow_any_instance_of(Worthwhile::GenericFile).to receive(:save).and_raise(RSolr::Error::Http.new({},{}))
94
+
95
+ xhr :post, :create, files: [file], parent_id: parent,
96
+ permission: { group: { 'public' => 'read' } }, terms_of_service: '1'
97
+ expect(response.body).to include("Error occurred while creating generic file.")
98
+ end
99
+ end
100
+
101
+ end
102
+
103
+ describe "destroy" do
104
+ let(:generic_file) do
105
+ Worthwhile::GenericFile.new.tap do |gf|
106
+ gf.apply_depositor_metadata(user)
107
+ gf.batch = parent
108
+ gf.save!
109
+ end
110
+ end
111
+
112
+ it "should delete the file" do
113
+ expect(Worthwhile::GenericFile.find(generic_file.pid)).to be_kind_of Worthwhile::GenericFile
114
+ delete :destroy, id: generic_file
115
+ expect { Worthwhile::GenericFile.find(generic_file.pid) }.to raise_error ActiveFedora::ObjectNotFoundError
116
+ expect(response).to redirect_to [:curation_concern, parent]
117
+ end
118
+ end
119
+
120
+ describe "update" do
121
+ let!(:generic_file) do
122
+ Worthwhile::GenericFile.new.tap do |gf|
123
+ gf.apply_depositor_metadata(user)
124
+ gf.batch = parent
125
+ gf.visibility = Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE
126
+ gf.save!
127
+ end
128
+ end
129
+
130
+ after do
131
+ generic_file.destroy
132
+ end
133
+
134
+ context "updating metadata" do
135
+ it "should be successful" do
136
+ post :update, id: generic_file, generic_file:
137
+ {title: 'new_title', tag: [''], permissions: { new_user_name: {'archivist1'=>'edit'}}}
138
+ expect(response).to redirect_to [:curation_concern, generic_file]
139
+ end
140
+
141
+ it "should go back to edit on an error" do
142
+ allow_any_instance_of(Worthwhile::GenericFile).to receive(:valid?).and_return(false)
143
+ post :update, id: generic_file, generic_file:
144
+ {title: 'new_title', tag: [''], permissions: { new_user_name: {'archivist1'=>'edit'}}}
145
+ expect(response).to be_successful
146
+ expect(response).to render_template('edit')
147
+ expect(assigns[:generic_file]).to eq generic_file
148
+ end
149
+
150
+ it "should add a new groups and users" do
151
+ skip
152
+ post :update, id: generic_file, generic_file:
153
+ { title: 'new_title', tag: [''], permissions: { new_group_name: {'group1'=>'read'}, new_user_name: {'user1'=>'edit'}}}
154
+
155
+ expect(assigns[:generic_file].read_groups).to eq ["group1"]
156
+ expect(assigns[:generic_file].edit_users).to include("user1", @user.user_key)
157
+ end
158
+
159
+ it "should update existing groups and users" do
160
+ skip
161
+ generic_file.read_groups = ['group3']
162
+ generic_file.save! # TODO slow test, more than one save.
163
+ post :update, id: generic_file, generic_file:
164
+ { title: 'new_title', tag: [''], permissions: { new_group_name: '', new_user_name: '', group: {'group3' => 'read' }}}
165
+ expect(assigns[:generic_file].read_groups).to eq ["group3"]
166
+ end
167
+
168
+ context "updating visibility" do
169
+ it "should apply public" do
170
+ new_visibility = Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC
171
+ post :update, id: generic_file, generic_file: {visibility: new_visibility, embargo_release_date:""}
172
+ expect(generic_file.reload.visibility).to eq new_visibility
173
+ end
174
+
175
+ it "should apply embargo" do
176
+ post :update, id: generic_file, generic_file: {
177
+ visibility: 'embargo',
178
+ visibility_during_embargo: "restricted",
179
+ embargo_release_date: "2099-09-05",
180
+ visibility_after_embargo: "open",
181
+ visibility_during_lease: "open",
182
+ lease_expiration_date: "2099-09-05",
183
+ visibility_after_lease: "restricted"
184
+ }
185
+ generic_file.reload
186
+ expect(generic_file).to be_under_embargo
187
+ expect(generic_file).to_not be_active_lease
188
+ end
189
+ end
190
+ end
191
+
192
+ context "updating file content" do
193
+ it "should be successful" do
194
+ s2 = double('one')
195
+ expect(CharacterizeJob).to receive(:new).with(generic_file.pid).and_return(s2)
196
+ expect(Sufia.queue).to receive(:push).with(s2).once
197
+ post :update, id: generic_file, files: [file]
198
+ expect(response).to redirect_to [:curation_concern, generic_file]
199
+ expect(generic_file.reload.label).to eq 'image.png'
200
+ end
201
+ end
202
+
203
+ context "restoring an old version" do
204
+ before do
205
+ allow(Sufia.queue).to receive(:push) # don't run characterization jobs
206
+ # Create version 0
207
+ generic_file.add_file('test123', 'content', 'file.txt')
208
+ generic_file.save!
209
+
210
+ # Create version 1
211
+ generic_file.add_file('<xml>This is version 2</xml>', 'content', 'md.xml')
212
+ generic_file.save!
213
+ end
214
+
215
+ it "should be successful" do
216
+ post :update, id: generic_file, revision: 'content.0'
217
+ expect(response).to redirect_to [:curation_concern, generic_file]
218
+ reloaded = generic_file.reload.content
219
+ expect(reloaded.latest_version.versionID).to eq 'content.2'
220
+ expect(reloaded.content).to eq 'test123'
221
+ expect(reloaded.mimeType).to eq 'text/plain'
222
+ end
223
+ end
224
+ end
225
+ end
226
+
227
+ context "someone elses files" do
228
+ let(:generic_file) do
229
+ Worthwhile::GenericFile.new.tap do |gf|
230
+ gf.apply_depositor_metadata('archivist1@example.com')
231
+ gf.read_groups = ['public']
232
+ gf.batch = parent
233
+ gf.save!
234
+ end
235
+ end
236
+ after do
237
+ # GenericFile.find('sufia:test5').destroy
238
+ end
239
+ describe "edit" do
240
+ it "should give me a flash error" do
241
+ get :edit, id: generic_file
242
+ expect(response.code).to eq '401'
243
+ expect(response).to render_template(:unauthorized)
244
+ end
245
+ end
246
+ describe "view" do
247
+ it "should show me the file" do
248
+ get :show, id: generic_file
249
+ expect(response).to be_success
250
+ end
251
+ end
252
+ it "should not let the user submit if they logout" do
253
+ get :new, parent_id: parent
254
+ expect(response).to redirect_to root_path
255
+ expect(flash[:alert]).to eq "You are not authorized to access this page."
256
+ end
257
+ end
258
+ end