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,95 @@
1
+ require 'spec_helper'
2
+
3
+ describe LeasesController 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_during_lease = Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC
57
+ a_work.visibility_after_lease = Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE
58
+ a_work.lease_expiration_date = release_date.to_s
59
+ expect(Sufia.queue).to receive(:push).with(an_instance_of(VisibilityCopyWorker))
60
+ get :destroy, id: a_work
61
+ end
62
+
63
+ context "with an active lease" do
64
+ let(:release_date) { Date.today+2 }
65
+ it "should deactivate the lease without updating visibility and redirect" do
66
+ expect(a_work.visibility).to eq Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC
67
+ expect(response).to redirect_to edit_lease_path(a_work)
68
+ end
69
+ end
70
+
71
+ context "with an expired lease" do
72
+ let(:release_date) { Date.today-2 }
73
+
74
+ it "should deactivate the lease, update the visibility and redirect" do
75
+ expect(a_work.visibility).to eq Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE
76
+ expect(response).to redirect_to edit_lease_path(a_work)
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ describe "#update" do
83
+ context "when I have permission to edit the object" do
84
+ before do
85
+ expect(ActiveFedora::Base).to receive(:find).with(a_work.pid).and_return(a_work)
86
+ end
87
+ it "should deactivate lease and redirect" do
88
+ expect(a_work).to receive(:deactivate_lease!)
89
+ expect(a_work).to receive(:save)
90
+ patch :update, batch_document_ids: [a_work.pid]
91
+ expect(response).to redirect_to leases_path
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Worthwhile::ClassifyConcernsController do
4
+ routes { Worthwhile::Engine.routes }
5
+ let(:user) { FactoryGirl.create(:user) }
6
+
7
+ describe '#new' do
8
+ it 'requires authentication' do
9
+ get :new
10
+ expect(response).to redirect_to(main_app.user_session_path)
11
+ end
12
+ it 'renders when signed in' do
13
+ sign_in(user)
14
+ get :new
15
+ expect(response).to be_successful
16
+ end
17
+ end
18
+
19
+ describe '#create' do
20
+ it 'redirect to login page if user is not logged in' do
21
+ post :create, classify: { curation_concern_type: 'GenericWork' }
22
+ expect(response).to redirect_to(main_app.user_session_path)
23
+ end
24
+
25
+ it 'requires authentication' do
26
+ sign_in(user)
27
+ # Had to stub the actual handling of curation_concern paths since those paths live outside the engine while the path to this controller lives inside the engine.
28
+ new_curation_concern_generic_work_path = "/stub/path"
29
+ subject.should_receive(:new_polymorphic_path).with([:curation_concern, GenericWork]).and_return(new_curation_concern_generic_work_path)
30
+ post :create, classify_concern: { curation_concern_type: 'GenericWork' }
31
+ expect(response).to redirect_to(new_curation_concern_generic_work_path)
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,21 @@
1
+ FactoryGirl.define do
2
+ factory :collection do
3
+ ignore do
4
+ user {FactoryGirl.create(:user)}
5
+ end
6
+ sequence(:title) {|n| "Title #{n}"}
7
+ before(:create) { |work, evaluator|
8
+ work.apply_depositor_metadata(evaluator.user.user_key)
9
+ }
10
+
11
+ factory :public_collection do
12
+ visibility Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC
13
+ end
14
+
15
+ factory :private_collection do
16
+ visibility Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE
17
+ end
18
+ end
19
+
20
+ end
21
+
@@ -0,0 +1,3 @@
1
+ def FactoryGirl.create_curation_concern(factory_name, user, override_attributes = {})
2
+ FactoryGirl.create(factory_name, override_attributes.merge(user: user))
3
+ end
@@ -0,0 +1,18 @@
1
+ FactoryGirl.define do
2
+ factory :generic_file, class: Worthwhile::GenericFile do
3
+ factory :file_with_work do
4
+ ignore do
5
+ user { FactoryGirl.create(:user) }
6
+ content nil
7
+ end
8
+ batch { FactoryGirl.create(:generic_work, user: user) }
9
+
10
+ after(:build) do |file, evaluator|
11
+ file.apply_depositor_metadata(evaluator.user.user_key)
12
+ if evaluator.content
13
+ file.add_file(evaluator.content.read, 'content', evaluator.content.original_filename)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,37 @@
1
+ FactoryGirl.define do
2
+ factory :work, aliases: [:generic_work, :private_generic_work], class: GenericWork do
3
+ ignore do
4
+ user { FactoryGirl.create(:user) }
5
+ end
6
+
7
+ title ["Test title"]
8
+ visibility Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE
9
+
10
+ before(:create) do |work, evaluator|
11
+ work.apply_depositor_metadata(evaluator.user.user_key)
12
+ end
13
+
14
+
15
+ factory :public_generic_work do
16
+ visibility Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC
17
+ end
18
+
19
+ factory :work_with_files do
20
+ after(:build) { |work, _| 2.times { work.generic_files << FactoryGirl.build(:generic_file) }}
21
+ end
22
+
23
+ factory :embargoed_work do
24
+ after(:build) { |work, _| work.apply_embargo(Date.tomorrow.to_s, Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE, Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC) }
25
+ end
26
+
27
+ factory :embargoed_work_with_files do
28
+ after(:build) { |work, _| 2.times { work.generic_files << FactoryGirl.build(:generic_file) }}
29
+ after(:build) { |work, _| work.apply_embargo(Date.tomorrow.to_s, Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE, Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC) }
30
+ end
31
+
32
+ factory :leased_work_with_files do
33
+ after(:build) { |work, _| 2.times { work.generic_files << FactoryGirl.build(:generic_file) }}
34
+ after(:build) { |work, _| work.apply_lease(Date.tomorrow.to_s, Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC, Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE) }
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,18 @@
1
+ FactoryGirl.define do
2
+ factory :linked_resource, class: Worthwhile::LinkedResource do
3
+ ignore do
4
+ user {FactoryGirl.create(:user)}
5
+ end
6
+ visibility Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED
7
+ url 'http://www.youtube.com/watch?v=oHg5SJYRHA0'
8
+ batch { FactoryGirl.create(:generic_work, user: user) }
9
+ before(:create) { |file, evaluator|
10
+ file.apply_depositor_metadata(evaluator.user.user_key)
11
+ }
12
+
13
+ factory :private_linked_resource do
14
+ visibility Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ FactoryGirl.define do
2
+ factory :user do
3
+ sequence(:email) {|n| "email-#{srand}@test.com" }
4
+ password 'a password'
5
+ password_confirmation 'a password'
6
+ factory :admin do
7
+ after(:build) do |user|
8
+ def user.groups
9
+ ["admin"]
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Adding a work with external links" do
4
+ let(:user) { FactoryGirl.create(:user) }
5
+ before do
6
+ sign_in user
7
+ visit '/'
8
+ end
9
+
10
+ it "adds external links" do
11
+ click_link 'New Generic Work'
12
+ fill_in 'External link', with: 'http://dp.la'
13
+ fill_in 'Title', with: 'DPLA link'
14
+ check 'I have read and accept the contributor license agreement'
15
+ click_button 'Create Generic work'
16
+ expect(page).to have_link 'http://dp.la'
17
+
18
+ click_link 'Add an External Link'
19
+ fill_in 'External link', with: 'http://loc.gov'
20
+ click_button 'Add External Link to Generic Work'
21
+ expect(page).to have_link 'http://dp.la'
22
+ expect(page).to have_link 'http://loc.gov'
23
+ end
24
+
25
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Add an attached file" do
4
+ let(:user) { FactoryGirl.create(:user) }
5
+ let!(:work) { FactoryGirl.create(:work, user: user) }
6
+
7
+ before do
8
+ sign_in user
9
+
10
+ # stub out characterization. Travis doesn't have fits installed, and it's not relevant to the test.
11
+ s2 = double('resque message')
12
+ expect(CharacterizeJob).to receive(:new).and_return(s2)
13
+ expect(Sufia.queue).to receive(:push).with(s2).once
14
+ end
15
+
16
+ it "should update the file" do
17
+ visit "/concern/generic_works/#{work.id}"
18
+ click_link 'Attach a File'
19
+
20
+ attach_file("Upload a file", fixture_file_path('files/image.png'))
21
+ click_button "Attach to Generic Work"
22
+
23
+ within '.related_files' do
24
+ expect(page).to have_link "image.png"
25
+ end
26
+ end
27
+ end
28
+
@@ -0,0 +1,238 @@
1
+ require 'spec_helper'
2
+ include Worthwhile::SearchPathsHelper
3
+
4
+ describe 'collection' do
5
+ def create_collection(title, description)
6
+ click_link 'Add a Collection'
7
+ fill_in('Title', with: title)
8
+ fill_in('collection_description', with: description)
9
+ click_button("Create Collection")
10
+ expect(page).to have_content 'Items in this Collection'
11
+ expect(page).to have_content title
12
+ expect(page).to have_content description
13
+ end
14
+
15
+ let(:title1) {"Test Collection 1"}
16
+ let(:description1) {"Description for collection 1 we are testing."}
17
+ let(:title2) {"Test Collection 2"}
18
+ let(:description2) {"Description for collection 2 we are testing."}
19
+
20
+ let(:user) { FactoryGirl.create(:user, email: 'user1@example.com') }
21
+ let(:user_key) { user.user_key }
22
+
23
+ before(:all) do
24
+ @old_resque_inline_value = Resque.inline
25
+ Resque.inline = true
26
+
27
+ @gws = []
28
+ (0..12).each do |x|
29
+ @gws[x] = GenericWork.new.tap do |f|
30
+ f.title = ["title #{x}"]
31
+ f.apply_depositor_metadata('user1@example.com')
32
+ f.save!
33
+ end
34
+ end
35
+ @gw1 = @gws[0]
36
+ @gw2 = @gws[1]
37
+ end
38
+
39
+ after(:all) do
40
+ Resque.inline = @old_resque_inline_value
41
+ Batch.destroy_all
42
+ GenericWork.destroy_all
43
+ Collection.destroy_all
44
+ end
45
+
46
+ describe 'create collection' do
47
+ before do
48
+ sign_in user
49
+ visit search_path_for_my_collections
50
+ end
51
+ it "should create a collection" do
52
+ title = "Genealogies of the American West"
53
+ description = "All about Genealogies of the American West"
54
+ click_link 'Add a Collection'
55
+ fill_in('Title', with: title)
56
+ fill_in('collection_description', with: description)
57
+ click_button("Create Collection")
58
+ expect(page).to have_content 'Items in this Collection'
59
+ expect(page).to have_content title
60
+ expect(page).to have_content description
61
+ end
62
+ it "should create collection from the dashboard and include works" do
63
+ skip "batch collection operations (add/remove)"
64
+ create_collection(title2, description2)
65
+
66
+ visit search_path_for_my_works
67
+ first('input#check_all').click
68
+ click_button "Add to Collection" # opens the modal
69
+ # since there is only one collection, it's not necessary to choose a radio button
70
+ click_button "Update Collection"
71
+ expect(page).to have_content "Items in this Collection"
72
+ expect(page).to have_selector "ol.catalog li:nth-child(9)" # at least 9 works in this collection
73
+ end
74
+ end
75
+
76
+ describe 'delete collection' do
77
+ before (:each) do
78
+ @collection = Collection.new title:'collection title'
79
+ @collection.description = 'collection description'
80
+ @collection.apply_depositor_metadata(user_key)
81
+ @collection.save
82
+ sign_in user
83
+ visit main_app.catalog_index_path(:'f[generic_type_sim][]' => 'Collection', works: 'mine')
84
+ end
85
+
86
+ it "should delete a collection" do
87
+ page.should have_content(@collection.title)
88
+ within("#document_#{@collection.noid}") do
89
+ first(".itemtrash").click
90
+ end
91
+ page.should_not have_content(@collection.title)
92
+ page.should have_content("Collection was successfully deleted.")
93
+ end
94
+ end
95
+
96
+ describe 'show collection' do
97
+ before do
98
+ @collection = Collection.new title: 'collection title'
99
+ @collection.description = 'collection description'
100
+ @collection.apply_depositor_metadata(user_key)
101
+ @collection.members = [@gw1,@gw2]
102
+ @collection.save
103
+ sign_in user
104
+ visit search_path_for_my_collections
105
+ end
106
+
107
+ it "should show a collection with a listing of Descriptive Metadata and catalog-style search results" do
108
+ page.should have_content(@collection.title)
109
+ within('#document_'+@collection.noid) do
110
+ click_link("collection title")
111
+ end
112
+ page.should have_content(@collection.title)
113
+ page.should have_content(@collection.description)
114
+ # Should have search results / contents listing
115
+ page.should have_content(@gw1.title.first)
116
+ page.should have_content(@gw2.title.first)
117
+ page.should_not have_css(".pager")
118
+
119
+ #click_link "Gallery"
120
+ #expect(page).to have_content(@gw1.title)
121
+ #expect(page).to have_content(@gw2.title)
122
+ end
123
+
124
+ it "should hide collection descriptive metadata when searching a collection" do
125
+ page.should have_content(@collection.title)
126
+ within("#document_#{@collection.noid}") do
127
+ click_link("collection title")
128
+ end
129
+ page.should have_content(@collection.title)
130
+ page.should have_content(@collection.description)
131
+ page.should have_content(@gw1.title.first)
132
+ page.should have_content(@gw2.title.first)
133
+ fill_in('collection_search', with: @gw1.title.first)
134
+ click_button('collection_submit')
135
+ # Should not have Collection Descriptive metadata table
136
+ page.should_not have_content("Descriptions")
137
+ page.should have_content(@collection.title)
138
+ page.should have_content(@collection.description)
139
+ # Should have search results / contents listing
140
+ page.should have_content(@gw1.title.first)
141
+ page.should_not have_content(@gw2.title.first)
142
+ # Should not have Dashboard content in contents listing
143
+ page.should_not have_content("Visibility")
144
+ end
145
+ end
146
+
147
+ describe 'edit collection' do
148
+ before (:each) do
149
+ @collection = Collection.new(title: 'Awesome Title')
150
+ @collection.description = 'collection description'
151
+ @collection.apply_depositor_metadata(user_key)
152
+ @collection.members = [@gw1, @gw2]
153
+ @collection.save
154
+ sign_in user
155
+ visit search_path_for_my_collections
156
+ end
157
+
158
+ it "should edit and update collection metadata" do
159
+ page.should have_content(@collection.title)
160
+ within("#document_#{@collection.noid}") do
161
+ click_link('Edit Collection')
162
+ end
163
+ page.should have_field('collection_title', with: @collection.title)
164
+ page.should have_field('collection_description', with: @collection.description)
165
+ new_title = "Altered Title"
166
+ new_description = "Completely new Description text."
167
+ creators = ["Dorje Trollo", "Vajrayogini"]
168
+ fill_in('Title', with: new_title)
169
+ fill_in('collection_description', with: new_description)
170
+ fill_in('Creator', with: creators.first)
171
+ #within('.form-actions') do
172
+ click_button('Update Collection')
173
+ #end
174
+ page.should_not have_content(@collection.title)
175
+ page.should_not have_content(@collection.description)
176
+ page.should have_content(new_title)
177
+ page.should have_content(new_description)
178
+ page.should have_content(creators.first)
179
+ end
180
+
181
+ it "should remove a work from a collection" do
182
+ skip "BUG removing works from a collection"
183
+ page.should have_content(@collection.title)
184
+ within("#document_#{@collection.noid}") do
185
+ click_link('Edit Collection')
186
+ end
187
+ page.should have_field('collection_title', with: @collection.title)
188
+ page.should have_field('collection_description', with: @collection.description)
189
+ page.should have_content(@gw1.title)
190
+ page.should have_content(@gw2.title)
191
+ within("#document_#{@gw1.noid}") do
192
+ click_button('Remove From Collection')
193
+ end
194
+ page.should have_content(@collection.title)
195
+ page.should have_content(@collection.description)
196
+ page.should_not have_content(@gw1.title)
197
+ page.should have_content(@gw2.title)
198
+ end
199
+
200
+ it "should remove all works from a collection" do
201
+ skip "batch collection operations (add/remove)"
202
+ page.should have_content(@collection.title)
203
+ within('#document_'+@collection.noid) do
204
+ click_link('Edit Collection')
205
+ end
206
+ page.should have_field('collection_title', with: @collection.title)
207
+ page.should have_field('collection_description', with: @collection.description)
208
+ page.should have_content(@gw1.title)
209
+ page.should have_content(@gw2.title)
210
+ first('input#check_all').click
211
+ click_button('Remove From Collection')
212
+ page.should have_content(@collection.title)
213
+ page.should have_content(@collection.description)
214
+ page.should_not have_content(@gw1.title)
215
+ page.should_not have_content(@gw2.title)
216
+ end
217
+ end
218
+
219
+ describe 'show pages of a collection' do
220
+ before (:each) do
221
+ @collection = Collection.new title:'collection title'
222
+ @collection.description = 'collection description'
223
+ @collection.apply_depositor_metadata(user_key)
224
+ @collection.members = @gws
225
+ @collection.save!
226
+ sign_in user
227
+ visit search_path_for_my_collections
228
+ end
229
+
230
+ it "should show a collection with a listing of Descriptive Metadata and catalog-style search results" do
231
+ page.should have_content(@collection.title)
232
+ within('#document_'+@collection.noid) do
233
+ click_link("collection title")
234
+ end
235
+ page.should have_css(".pager")
236
+ end
237
+ end
238
+ end