sufia 7.2.0 → 7.3.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (259) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +2 -0
  3. data/.rubocop.yml +3 -0
  4. data/.rubocop_todo.yml +1 -2
  5. data/.travis.yml +0 -1
  6. data/Gemfile +2 -1
  7. data/README.md +23 -106
  8. data/app/actors/sufia/apply_permission_template_actor.rb +19 -0
  9. data/app/actors/sufia/create_with_remote_files_actor.rb +2 -2
  10. data/app/actors/sufia/default_admin_set_actor.rb +42 -0
  11. data/app/actors/sufia/interpret_visibility_actor.rb +115 -0
  12. data/app/assets/images/collection.png +0 -0
  13. data/app/assets/javascripts/sufia.js +6 -0
  14. data/app/assets/javascripts/sufia/admin/admin_set/participants.es6 +9 -0
  15. data/app/assets/javascripts/sufia/admin/admin_set/visibility.es6 +134 -0
  16. data/app/assets/javascripts/sufia/admin/admin_set_controls.es6 +11 -0
  17. data/app/assets/javascripts/sufia/app.js +27 -5
  18. data/app/assets/javascripts/sufia/autocomplete.es6 +15 -0
  19. data/app/assets/javascripts/sufia/autocomplete/work.es6 +29 -0
  20. data/app/assets/javascripts/sufia/dashboard_actions.js +2 -4
  21. data/app/assets/javascripts/sufia/save_work/save_work_control.es6 +14 -2
  22. data/app/assets/javascripts/sufia/save_work/uploaded_files.es6 +7 -2
  23. data/app/assets/javascripts/sufia/save_work/visibility_component.es6 +245 -4
  24. data/app/assets/javascripts/sufia/select_work_type.es6 +38 -0
  25. data/app/assets/javascripts/sufia/workflow_actions_affix.js +14 -0
  26. data/app/assets/stylesheets/sufia/_dashboard.scss +50 -29
  27. data/app/assets/stylesheets/sufia/_footer.scss +30 -0
  28. data/app/assets/stylesheets/sufia/_header.scss +3 -4
  29. data/app/assets/stylesheets/sufia/_home-page.scss +10 -8
  30. data/app/assets/stylesheets/sufia/_select_work_type.scss +43 -0
  31. data/app/assets/stylesheets/sufia/_sufia.scss +4 -1
  32. data/app/assets/stylesheets/sufia/_variables.scss +3 -0
  33. data/app/assets/stylesheets/sufia/admin.scss +66 -169
  34. data/app/assets/stylesheets/sufia/blacklight_gallery.scss +17 -0
  35. data/app/authorities/qa/authorities/find_works.rb +15 -0
  36. data/app/controllers/concerns/sufia/batch_edits_controller_behavior.rb +2 -1
  37. data/app/controllers/concerns/sufia/batch_uploads_controller_behavior.rb +26 -13
  38. data/app/controllers/concerns/sufia/collections_controller_behavior.rb +25 -0
  39. data/app/controllers/concerns/sufia/controller.rb +8 -0
  40. data/app/controllers/concerns/sufia/deny_access_override_behavior.rb +1 -1
  41. data/app/controllers/concerns/sufia/file_sets_controller_behavior.rb +5 -14
  42. data/app/controllers/concerns/sufia/homepage_controller_behavior.rb +2 -0
  43. data/app/controllers/concerns/sufia/users_controller_behavior.rb +18 -7
  44. data/app/controllers/concerns/sufia/works_controller_behavior.rb +13 -10
  45. data/app/controllers/my/collections_controller.rb +5 -0
  46. data/app/controllers/my/shares_controller.rb +5 -0
  47. data/app/controllers/my/works_controller.rb +5 -0
  48. data/app/controllers/stats_controller.rb +1 -1
  49. data/app/controllers/sufia/admin/admin_sets_controller.rb +20 -2
  50. data/app/controllers/sufia/admin/permission_template_accesses_controller.rb +15 -0
  51. data/app/controllers/sufia/admin/permission_templates_controller.rb +29 -0
  52. data/app/controllers/sufia/admin_controller.rb +2 -0
  53. data/app/controllers/sufia/trophies_controller.rb +0 -2
  54. data/app/forms/sufia/forms/admin_set_form.rb +19 -0
  55. data/app/forms/sufia/forms/batch_edit_form.rb +16 -6
  56. data/app/forms/sufia/forms/batch_upload_form.rb +3 -2
  57. data/app/forms/sufia/forms/permission_template_form.rb +115 -0
  58. data/app/forms/sufia/forms/work_form.rb +6 -0
  59. data/app/helpers/batch_edits_helper.rb +1 -1
  60. data/app/helpers/sufia/citations_behavior.rb +0 -5
  61. data/app/helpers/sufia/citations_behaviors/formatters.rb +0 -1
  62. data/app/helpers/sufia/sufia_helper_behavior.rb +38 -6
  63. data/app/indexers/sufia/collection_indexer.rb +6 -0
  64. data/app/jobs/batch_create_job.rb +7 -15
  65. data/app/models/batch_upload_item.rb +2 -0
  66. data/app/models/concerns/sufia/ability.rb +12 -1
  67. data/app/models/sufia/permission_template.rb +102 -0
  68. data/app/models/sufia/permission_template_access.rb +18 -0
  69. data/app/presenters/sufia/admin_set_presenter.rb +1 -1
  70. data/app/presenters/sufia/model_icon.rb +7 -0
  71. data/app/presenters/sufia/select_type_list_presenter.rb +37 -0
  72. data/app/presenters/sufia/select_type_presenter.rb +35 -0
  73. data/app/presenters/sufia/work_show_presenter.rb +0 -2
  74. data/app/search_builders/collection_search_builder.rb +0 -2
  75. data/app/search_builders/sufia/admin_set_search_builder.rb +24 -0
  76. data/app/search_builders/sufia/catalog_search_builder.rb +10 -4
  77. data/app/search_builders/sufia/find_works_search_builder.rb +44 -0
  78. data/app/search_builders/sufia/my_search_builder_behavior.rb +0 -4
  79. data/app/search_builders/sufia/my_works_search_builder.rb +1 -1
  80. data/app/services/sufia/actor_factory.rb +6 -2
  81. data/app/services/sufia/admin_set_create_service.rb +22 -0
  82. data/app/services/sufia/admin_set_service.rb +46 -16
  83. data/app/services/sufia/collection_thumbnail_path_service.rb +10 -0
  84. data/app/services/sufia/workflow/abstract_notification.rb +39 -0
  85. data/app/services/sufia/workflow/changes_required_notification.rb +22 -0
  86. data/app/services/sufia/workflow/complete_notification.rb +22 -0
  87. data/app/services/sufia/workflow/pending_review_notification.rb +21 -0
  88. data/app/services/sufia/workflow/workflow_by_admin_set_strategy.rb +15 -0
  89. data/app/views/_masthead.html.erb +4 -4
  90. data/app/views/_toolbar.html.erb +31 -9
  91. data/app/views/_user_util_links.html.erb +7 -7
  92. data/app/views/batch_edits/edit.html.erb +24 -12
  93. data/app/views/catalog/_thumbnail_list_collection.html.erb +1 -1
  94. data/app/views/collections/_form.html.erb +2 -2
  95. data/app/views/collections/_media_display.html.erb +1 -1
  96. data/app/views/curation_concerns/base/_find_work_widget.html.erb +16 -0
  97. data/app/views/curation_concerns/base/_form.html.erb +6 -0
  98. data/app/views/curation_concerns/base/_form_child_work_relationships.html.erb +1 -1
  99. data/app/views/curation_concerns/base/_form_metadata.html.erb +1 -1
  100. data/app/views/curation_concerns/base/_form_parent_work_relationships.html.erb +43 -0
  101. data/app/views/curation_concerns/base/_form_progress.html.erb +7 -4
  102. data/app/views/curation_concerns/base/_form_relationships.html.erb +6 -6
  103. data/app/views/curation_concerns/base/_form_share.html.erb +1 -2
  104. data/app/views/curation_concerns/base/_guts4form.html.erb +1 -1
  105. data/app/views/curation_concerns/base/_social_media.html.erb +1 -1
  106. data/app/views/curation_concerns/base/_workflow_actions_widget.erb +3 -0
  107. data/app/views/curation_concerns/base/edit.html.erb +1 -1
  108. data/app/views/curation_concerns/base/new.html.erb +1 -1
  109. data/app/views/curation_concerns/base/show.html.erb +4 -1
  110. data/app/views/curation_concerns/file_sets/_show_actions.html.erb +0 -3
  111. data/app/views/dashboard/_create_work_action.html.erb +20 -0
  112. data/app/views/dashboard/_index_partials/_heading_actions.html.erb +9 -22
  113. data/app/views/layouts/admin.html.erb +8 -68
  114. data/app/views/layouts/curation_concerns/1_column.html.erb +4 -31
  115. data/app/views/layouts/homepage.html.erb +15 -45
  116. data/app/views/layouts/sufia-dashboard.html.erb +1 -36
  117. data/app/views/layouts/sufia.html.erb +49 -0
  118. data/app/views/my/_document_list.html.erb +1 -1
  119. data/app/views/my/_facet_limit.html.erb +2 -2
  120. data/app/views/my/_index_partials/_default_group.html.erb +10 -10
  121. data/app/views/my/_index_partials/_list_collections.html.erb +1 -1
  122. data/app/views/my/_sort_and_per_page.html.erb +8 -8
  123. data/app/views/records/edit_fields/_rights.html.erb +0 -1
  124. data/app/views/shared/_footer.html.erb +1 -1
  125. data/app/views/shared/_select_work_type_modal.html.erb +34 -0
  126. data/app/views/sufia/admin/_collections.html.erb +31 -0
  127. data/app/views/sufia/admin/_sidebar.html.erb +35 -23
  128. data/app/views/sufia/admin/admin_sets/_form.html.erb +38 -15
  129. data/app/views/sufia/admin/admin_sets/_form_metadata.html.erb +2 -0
  130. data/app/views/sufia/admin/admin_sets/_form_participant_table.html.erb +21 -0
  131. data/app/views/sufia/admin/admin_sets/_form_participants.html.erb +68 -0
  132. data/app/views/sufia/admin/admin_sets/_form_visibility.html.erb +58 -0
  133. data/app/views/sufia/admin/admin_sets/index.html.erb +29 -33
  134. data/app/views/sufia/admin/admin_sets/show.html.erb +3 -0
  135. data/app/views/sufia/admin/show.html.erb +22 -19
  136. data/app/views/sufia/batch_uploads/_form.html.erb +2 -1
  137. data/app/views/sufia/homepage/index.html.erb +11 -3
  138. data/app/views/sufia/uploads/_js_templates.html.erb +15 -11
  139. data/app/views/users/_user_row.html.erb +10 -0
  140. data/app/views/users/index.html.erb +1 -12
  141. data/config/features.rb +2 -0
  142. data/config/locales/sufia.en.yml +122 -37
  143. data/config/routes.rb +4 -1
  144. data/db/migrate/20161021175854_create_permission_template.rb +11 -0
  145. data/db/migrate/20161021180154_create_permission_template_access.rb +11 -0
  146. data/db/migrate/20161116222307_add_release_to_permission_templates.rb +6 -0
  147. data/lib/generators/sufia/install_generator.rb +12 -3
  148. data/lib/generators/sufia/templates/catalog_controller.rb +3 -13
  149. data/lib/generators/sufia/templates/workflow.json.erb +65 -0
  150. data/lib/generators/sufia/upgrade700_generator.rb +1 -1
  151. data/lib/generators/sufia/work/templates/locale.en.yml.erb +37 -0
  152. data/lib/generators/sufia/{work_generator.rb → work/work_generator.rb} +25 -5
  153. data/lib/sufia.rb +0 -1
  154. data/lib/sufia/engine.rb +7 -0
  155. data/lib/sufia/move_all_works_to_admin_set.rb +8 -0
  156. data/lib/sufia/version.rb +1 -1
  157. data/lib/tasks/migrate.rake +8 -0
  158. data/spec/actors/sufia/apply_permission_template_actor_spec.rb +64 -0
  159. data/spec/actors/sufia/create_with_remote_files_actor_spec.rb +8 -0
  160. data/spec/actors/sufia/default_admin_set_actor_spec.rb +43 -0
  161. data/spec/actors/sufia/interpret_visibility_actor_spec.rb +266 -0
  162. data/spec/authorities/qa/authorities/find_works_spec.rb +55 -0
  163. data/spec/controllers/batch_edits_controller_spec.rb +1 -6
  164. data/spec/controllers/citations_controller_spec.rb +49 -10
  165. data/spec/controllers/collections_controller_spec.rb +39 -0
  166. data/spec/controllers/curation_concerns/generic_works_controller_spec.rb +22 -1
  167. data/spec/controllers/dashboard_controller_spec.rb +0 -8
  168. data/spec/controllers/depositors_controller_spec.rb +2 -2
  169. data/spec/controllers/downloads_controller_spec.rb +2 -2
  170. data/spec/controllers/my/collections_controller_spec.rb +5 -0
  171. data/spec/controllers/my/shares_controller_spec.rb +5 -0
  172. data/spec/controllers/my/works_controller_spec.rb +5 -0
  173. data/spec/controllers/stats_controller_spec.rb +1 -1
  174. data/spec/controllers/sufia/admin/admin_sets_controller_spec.rb +33 -5
  175. data/spec/controllers/sufia/admin/permission_template_accesses_controller_spec.rb +36 -0
  176. data/spec/controllers/sufia/admin/permission_templates_controller_spec.rb +46 -0
  177. data/spec/controllers/sufia/admin_controller_spec.rb +6 -0
  178. data/spec/controllers/sufia/batch_uploads_controller_spec.rb +40 -42
  179. data/spec/controllers/sufia/homepage_controller_spec.rb +14 -0
  180. data/spec/controllers/sufia/trophies_controller_spec.rb +17 -4
  181. data/spec/controllers/users_controller_spec.rb +13 -4
  182. data/spec/factories/permission_template_accesses.rb +5 -0
  183. data/spec/factories/permission_templates.rb +5 -0
  184. data/spec/factories/sipity_entities.rb +7 -0
  185. data/spec/factories/users.rb +4 -0
  186. data/spec/factories/workflow_states.rb +6 -0
  187. data/spec/factories/workflows.rb +5 -0
  188. data/spec/features/admin_admin_set_spec.rb +6 -4
  189. data/spec/features/batch_edit_spec.rb +0 -1
  190. data/spec/features/collection_spec.rb +4 -4
  191. data/spec/features/edit_work_spec.rb +1 -0
  192. data/spec/features/work_show_spec.rb +10 -0
  193. data/spec/forms/sufia/forms/admin_set_form_spec.rb +2 -1
  194. data/spec/forms/sufia/forms/batch_edit_form_spec.rb +30 -0
  195. data/spec/forms/sufia/forms/permission_template_form_spec.rb +196 -0
  196. data/spec/forms/sufia/forms/work_form_spec.rb +35 -1
  197. data/spec/helpers/batch_edits_helper_spec.rb +4 -4
  198. data/spec/helpers/blacklight_helper_spec.rb +1 -1
  199. data/spec/helpers/sufia_helper_spec.rb +39 -7
  200. data/spec/indexers/sufia/collection_indexer_spec.rb +12 -0
  201. data/spec/javascripts/autocomplete_spec.js.coffee +46 -6
  202. data/spec/javascripts/visibility_component_spec.js +491 -0
  203. data/spec/jobs/batch_create_job_spec.rb +27 -28
  204. data/spec/lib/sufia/arkivo_spec.rb +14 -0
  205. data/spec/lib/sufia/controlled_vocabulary/importer/downloader_spec.rb +31 -0
  206. data/spec/lib/sufia/move_all_works_to_admin_set_spec.rb +13 -0
  207. data/spec/lib/sufia/zotero_spec.rb +8 -0
  208. data/spec/models/sufia/ability_spec.rb +54 -14
  209. data/spec/models/sufia/permission_template_spec.rb +144 -0
  210. data/spec/models/sufia/user_usage_stats_spec.rb +8 -2
  211. data/spec/presenters/sufia/homepage_presenter_spec.rb +1 -1
  212. data/spec/presenters/sufia/select_type_list_presenter_spec.rb +26 -0
  213. data/spec/presenters/sufia/select_type_presenter_spec.rb +21 -0
  214. data/spec/search_builder/sufia/admin_set_search_builder_spec.rb +57 -0
  215. data/spec/search_builder/sufia/catalog_search_builder_spec.rb +40 -14
  216. data/spec/search_builder/sufia/find_works_search_builder_spec.rb +60 -0
  217. data/spec/search_builder/sufia/my_shares_search_builder_spec.rb +4 -1
  218. data/spec/search_builder/sufia/single_admin_set_search_builder_spec.rb +5 -1
  219. data/spec/services/sufia/actor_factory_spec.rb +13 -5
  220. data/spec/services/sufia/admin_set_create_service_spec.rb +27 -0
  221. data/spec/services/sufia/admin_set_service_spec.rb +104 -17
  222. data/spec/services/sufia/workflow/changes_required_notification_spec.rb +32 -0
  223. data/spec/services/sufia/workflow/complete_notification_spec.rb +32 -0
  224. data/spec/services/sufia/workflow/pending_review_notification_spec.rb +31 -0
  225. data/spec/services/sufia/workflow/workflow_by_admin_set_strategy_spec.rb +22 -0
  226. data/spec/spec_helper.rb +24 -5
  227. data/spec/support/proxies.rb +1 -1
  228. data/spec/test_app_templates/lib/generators/test_app_generator.rb +4 -0
  229. data/spec/views/_toolbar.html.erb_spec.rb +23 -6
  230. data/spec/views/batch_edits/edit.html.erb_spec.rb +7 -1
  231. data/spec/views/collections/_form_for_select_collection.html.erb_spec.rb +1 -3
  232. data/spec/views/curation_concerns/base/_find_work_widget.html.erb_spec.rb +22 -0
  233. data/spec/views/curation_concerns/base/_form.html.erb_spec.rb +7 -0
  234. data/spec/views/curation_concerns/base/_form_child_work_relationships.html.erb_spec.rb +1 -0
  235. data/spec/views/curation_concerns/base/_form_parent_work_relationships.html.erb_spec.rb +114 -0
  236. data/spec/views/curation_concerns/base/_form_progress.html.erb_spec.rb +3 -2
  237. data/spec/views/curation_concerns/base/_social_media.html.erb_spec.rb +1 -1
  238. data/spec/views/curation_concerns/base/edit.html.erb_spec.rb +1 -1
  239. data/spec/views/curation_concerns/base/show.html.erb_spec.rb +5 -1
  240. data/spec/views/curation_concerns/file_sets/_show_actions.html.erb_spec.rb +2 -2
  241. data/spec/views/dashboard/create_work_action.html.erb_spec.rb +27 -0
  242. data/spec/views/dashboard/index_spec.rb +7 -2
  243. data/spec/views/my/_sort_and_per_page.html.erb_spec.rb +33 -0
  244. data/spec/views/shared/select_work_type_modal.html.erb_spec.rb +32 -0
  245. data/spec/views/sufia/admin/admin_sets/_form.html.erb_spec.rb +18 -0
  246. data/spec/views/sufia/admin/admin_sets/_form_participants.html.erb_spec.rb +13 -0
  247. data/spec/views/sufia/admin/admin_sets/_form_visibility.html.erb_spec.rb +23 -0
  248. data/spec/views/sufia/batch_uploads/_form.html.erb_spec.rb +2 -12
  249. data/spec/views/sufia/homepage/index.html.erb_spec.rb +29 -8
  250. data/sufia.gemspec +5 -6
  251. data/tasks/sufia-dev.rake +6 -10
  252. data/template.rb +15 -0
  253. metadata +140 -28
  254. data/app/assets/stylesheets/sufia/widgets.css +0 -288
  255. data/app/helpers/sufia/citations_behaviors/formatters/endnote_formatter.rb +0 -49
  256. data/app/models/domain_term.rb +0 -4
  257. data/app/views/citations/file.html.erb +0 -0
  258. data/app/views/records/_rights_modal.html.erb +0 -1
  259. data/db/migrate/20160328222160_create_local_authorities.rb +0 -50
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Sufia::Workflow::ChangesRequiredNotification do
4
+ let(:approver) { create(:user) }
5
+ let(:depositor) { create(:user) }
6
+ let(:to_user) { create(:user) }
7
+ let(:cc_user) { create(:user) }
8
+ let(:work) { create(:generic_work, user: depositor) }
9
+ let(:entity) { create(:sipity_entity, proxy_for_global_id: work.to_global_id.to_s) }
10
+ let(:comment) { double("comment", comment: 'A pleasant read') }
11
+ let(:recipients) { { 'to' => [to_user], 'cc' => [cc_user] } }
12
+
13
+ describe ".send_notification" do
14
+ it 'sends a message to all users' do
15
+ expect(approver).to receive(:send_message).once.and_call_original
16
+
17
+ expect { described_class.send_notification(entity: entity, user: approver, comment: comment, recipients: recipients) }
18
+ .to change { depositor.mailbox.inbox.count }.by(1)
19
+ .and change { to_user.mailbox.inbox.count }.by(1)
20
+ .and change { cc_user.mailbox.inbox.count }.by(1)
21
+ end
22
+ context 'without carbon-copied users' do
23
+ let(:recipients) { { 'to' => [to_user] } }
24
+ it 'sends a message to the to user(s)' do
25
+ expect(approver).to receive(:send_message).once.and_call_original
26
+ expect { described_class.send_notification(entity: entity, user: approver, comment: comment, recipients: recipients) }
27
+ .to change { depositor.mailbox.inbox.count }.by(1)
28
+ .and change { to_user.mailbox.inbox.count }.by(1)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Sufia::Workflow::CompleteNotification do
4
+ let(:approver) { create(:user) }
5
+ let(:depositor) { create(:user) }
6
+ let(:to_user) { create(:user) }
7
+ let(:cc_user) { create(:user) }
8
+ let(:work) { create(:generic_work, user: depositor) }
9
+ let(:entity) { create(:sipity_entity, proxy_for_global_id: work.to_global_id.to_s) }
10
+ let(:comment) { double("comment", comment: 'A pleasant read') }
11
+ let(:recipients) { { 'to' => [to_user], 'cc' => [cc_user] } }
12
+
13
+ describe ".send_notification" do
14
+ it 'sends a message to all users' do
15
+ expect(approver).to receive(:send_message).once.and_call_original
16
+
17
+ expect { described_class.send_notification(entity: entity, user: approver, comment: comment, recipients: recipients) }
18
+ .to change { depositor.mailbox.inbox.count }.by(1)
19
+ .and change { to_user.mailbox.inbox.count }.by(1)
20
+ .and change { cc_user.mailbox.inbox.count }.by(1)
21
+ end
22
+ context 'without carbon-copied users' do
23
+ let(:recipients) { { 'to' => [to_user] } }
24
+ it 'sends a message to the to user(s)' do
25
+ expect(approver).to receive(:send_message).once.and_call_original
26
+ expect { described_class.send_notification(entity: entity, user: approver, comment: comment, recipients: recipients) }
27
+ .to change { depositor.mailbox.inbox.count }.by(1)
28
+ .and change { to_user.mailbox.inbox.count }.by(1)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Sufia::Workflow::PendingReviewNotification do
4
+ let(:depositor) { create(:user) }
5
+ let(:to_user) { create(:user) }
6
+ let(:cc_user) { create(:user) }
7
+ let(:work) { create(:generic_work, user: depositor) }
8
+ let(:entity) { create(:sipity_entity, proxy_for_global_id: work.to_global_id.to_s) }
9
+ let(:comment) { double("comment", comment: 'A pleasant read') }
10
+ let(:recipients) { { 'to' => [to_user], 'cc' => [cc_user] } }
11
+
12
+ describe ".send_notification" do
13
+ it 'sends a message to all users except depositor' do
14
+ expect(depositor).to receive(:send_message).once.and_call_original
15
+
16
+ expect { described_class.send_notification(entity: entity, user: depositor, comment: comment, recipients: recipients) }
17
+ .to change { depositor.mailbox.inbox.count }.by(1)
18
+ .and change { to_user.mailbox.inbox.count }.by(1)
19
+ .and change { cc_user.mailbox.inbox.count }.by(1)
20
+ end
21
+ context 'without carbon-copied users' do
22
+ let(:recipients) { { 'to' => [to_user] } }
23
+ it 'sends a message to the to user(s)' do
24
+ expect(depositor).to receive(:send_message).once.and_call_original
25
+ expect { described_class.send_notification(entity: entity, user: depositor, comment: comment, recipients: recipients) }
26
+ .to change { depositor.mailbox.inbox.count }.by(1)
27
+ .and change { to_user.mailbox.inbox.count }.by(1)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,22 @@
1
+ describe Sufia::Workflow::WorkflowByAdminSetStrategy, :no_clean do
2
+ context "when using default workflow strategy" do
3
+ let(:workflow_strategy) { described_class.new(nil, {}) }
4
+
5
+ describe '#workflow_name' do
6
+ subject { workflow_strategy.workflow_name }
7
+ it { is_expected.to eq 'default' }
8
+ end
9
+ end
10
+
11
+ context "when using a non-default workflow strategy" do
12
+ let!(:admin_set) { AdminSet.create(title: ["test"]) }
13
+ let!(:permission_template) { Sufia::PermissionTemplate.create(workflow_name: workflow_name, admin_set_id: admin_set.id) }
14
+ let(:workflow_name) { 'work' }
15
+ let(:workflow_strategy) { described_class.new(nil, admin_set_id: admin_set.id) }
16
+
17
+ describe '#workflow_name' do
18
+ subject { workflow_strategy.workflow_name }
19
+ it { is_expected.to eq workflow_name }
20
+ end
21
+ end
22
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,3 @@
1
- require 'coveralls'
2
- Coveralls.wear!
3
-
4
1
  ENV["RAILS_ENV"] ||= 'test'
5
2
  require "bundler/setup"
6
3
 
@@ -11,12 +8,16 @@ end
11
8
 
12
9
  if coverage_needed?
13
10
  require 'simplecov'
11
+ require 'coveralls'
14
12
  SimpleCov.root(File.expand_path('../..', __FILE__))
15
13
  SimpleCov.formatter = Coveralls::SimpleCov::Formatter
16
14
  SimpleCov.start('rails') do
17
15
  add_filter '/.internal_test_app'
18
16
  add_filter '/lib/generators'
19
17
  add_filter '/spec'
18
+ add_filter '/tasks'
19
+ add_filter '/lib/sufia/version.rb'
20
+ add_filter '/lib/sufia/engine.rb'
20
21
  end
21
22
  SimpleCov.command_name 'spec'
22
23
  end
@@ -47,6 +48,21 @@ require 'byebug' unless ENV['TRAVIS']
47
48
  Capybara.default_driver = :rack_test # This is a faster driver
48
49
  Capybara.javascript_driver = :poltergeist # This is slower
49
50
  Capybara.default_max_wait_time = ENV['TRAVIS'] ? 30 : 15
51
+ # Adding the below to deal with random Capybara-related timeouts in CI.
52
+ # Found in this thread: https://github.com/teampoltergeist/poltergeist/issues/375
53
+ poltergeist_options = {
54
+ js_errors: true,
55
+ timeout: 30,
56
+ logger: nil,
57
+ phantomjs_logger: StringIO.new,
58
+ phantomjs_options: [
59
+ '--load-images=no',
60
+ '--ignore-ssl-errors=yes'
61
+ ]
62
+ }
63
+ Capybara.register_driver(:poltergeist) do |app|
64
+ Capybara::Poltergeist::Driver.new(app, poltergeist_options)
65
+ end
50
66
 
51
67
  ActiveJob::Base.queue_adapter = :inline
52
68
 
@@ -170,7 +186,6 @@ RSpec.configure do |config|
170
186
  config.include Shoulda::Matchers::Independent
171
187
 
172
188
  if Devise::VERSION >= '4.2'
173
- # This is for an unreleased version of Devise (will either be 4.2 or 5.0)
174
189
  config.include Devise::Test::ControllerHelpers, type: :controller
175
190
  else
176
191
  config.include Devise::TestHelpers, type: :controller
@@ -182,7 +197,11 @@ RSpec.configure do |config|
182
197
 
183
198
  config.include EngineRoutes, type: :controller
184
199
  config.include Warden::Test::Helpers, type: :feature
185
- config.after(:each, type: :feature) { Warden.test_reset! }
200
+ config.after(:each, type: :feature) do
201
+ Warden.test_reset!
202
+ Capybara.reset_sessions!
203
+ page.driver.reset!
204
+ end
186
205
 
187
206
  config.include Capybara::RSpecMatchers, type: :input
188
207
  config.include FactoryGirl::Syntax::Methods
@@ -1,7 +1,7 @@
1
1
  module ProxiesHelper
2
2
  def create_proxy_using_partial(*users)
3
3
  users.each do |user|
4
- sleep(1)
4
+ sleep(0.5)
5
5
  first('a.select2-choice').click
6
6
  find(".select2-input").set(user.user_key)
7
7
  expect(page).to have_css("div.select2-result-label")
@@ -10,6 +10,10 @@ class TestAppGenerator < Rails::Generators::Base
10
10
  def create_generic_work
11
11
  generate 'sufia:work GenericWork'
12
12
  end
13
+
14
+ def create_atlas_work
15
+ generate 'sufia:work Atlas'
16
+ end
13
17
 
14
18
  def comment_out_web_console
15
19
  gsub_file "Gemfile",
@@ -1,5 +1,7 @@
1
1
  describe '/_toolbar.html.erb', type: :view do
2
+ let(:presenter) { instance_double(Sufia::SelectTypeListPresenter, many?: false, first_model: GenericWork) }
2
3
  before do
4
+ allow(view).to receive(:create_work_presenter).and_return(presenter)
3
5
  allow(view).to receive(:user_signed_in?).and_return(true)
4
6
  allow(controller).to receive(:current_user).and_return(stub_model(User, user_key: 'userX'))
5
7
  allow(view).to receive(:can?).and_call_original
@@ -38,25 +40,40 @@ describe '/_toolbar.html.erb', type: :view do
38
40
  expect(rendered).to have_link 'Shares', href: sufia.dashboard_shares_path
39
41
  end
40
42
 
41
- describe "New Work button" do
42
- context "when the user can create file sets" do
43
+ describe "New Work link" do
44
+ context "when the user can create multiple work types" do
45
+ let(:presenter) { instance_double(Sufia::SelectTypeListPresenter, many?: true) }
46
+ it "has a link to upload" do
47
+ render
48
+ expect(rendered).to have_selector 'a[data-behavior="select-work"][data-target="#worktypes-to-create"][data-create-type="single"]'
49
+ expect(rendered).to have_link('New Work', href: '#')
50
+
51
+ expect(rendered).to have_selector 'a[data-behavior="select-work"][data-target="#worktypes-to-create"][data-create-type="batch"]'
52
+ expect(rendered).to have_link('Batch Create', href: '#')
53
+ end
54
+ end
55
+
56
+ context "when the user can create a single work type" do
57
+ let(:presenter) { instance_double(Sufia::SelectTypeListPresenter, many?: false, first_model: GenericWork) }
43
58
  it "has a link to upload" do
44
- allow(view).to receive(:can?).with(:create, GenericWork).and_return(true)
45
59
  render
46
60
  expect(rendered).to have_link('New Work', href: new_curation_concerns_generic_work_path)
61
+ expect(rendered).to have_link('Batch Create', href: sufia.new_batch_upload_path(payload_concern: 'GenericWork'))
47
62
  end
48
63
  end
49
64
 
50
- context "when the user can't create file sets" do
65
+ context "when the user can't create any work types" do
66
+ before do
67
+ allow(view).to receive(:can_ever_create_works?).and_return(false)
68
+ end
51
69
  it "does not have a link to upload" do
52
- allow(view).to receive(:can?).with(:create, GenericWork).and_return(false)
53
70
  render
54
71
  expect(rendered).not_to have_link('New Work')
55
72
  end
56
73
  end
57
74
  end
58
75
 
59
- describe "New Collection button" do
76
+ describe "New Collection link" do
60
77
  context "when the user can create collections" do
61
78
  it "has a link to upload" do
62
79
  allow(view).to receive(:can?).with(:create, Collection).and_return(true)
@@ -17,8 +17,14 @@ describe 'batch_edits/edit.html.erb', type: :view do
17
17
  render
18
18
  end
19
19
 
20
- it "draws help for description" do
20
+ it "draws the page" do
21
21
  expect(rendered).to have_selector 'form[data-model="generic_work"]'
22
+ # Help for the description
22
23
  expect(rendered).to have_selector ".generic_work_description p.help-block"
24
+
25
+ # param key for the permissions javascript
26
+ expect(rendered).to have_selector 'form#form_permissions[data-param-key="generic_work"]'
27
+ # batch ids for the permissions update form
28
+ expect(rendered).to have_selector "input[name=\"batch_document_ids[]\"]", visible: false
23
29
  end
24
30
  end
@@ -9,9 +9,7 @@ describe 'collections/_form_for_select_collection.html.erb', type: :view do
9
9
  end
10
10
  let(:solr_collections) do
11
11
  collections.map do |c|
12
- SolrDocument.new(c.to_solr).tap do |sd|
13
- sd['system_create_dtsi'] = c.create_date.to_s
14
- end
12
+ SolrDocument.new(c.to_solr.merge('system_create_dtsi' => c.create_date.to_s))
15
13
  end
16
14
  end
17
15
 
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'curation_concerns/base/_find_work_widget.html.erb', type: :view do
4
+ let(:work) { stub_model(GenericWork) }
5
+ let(:form) do
6
+ view.simple_form_for(work, url: '/update') do |work_form|
7
+ return work_form
8
+ end
9
+ end
10
+ before do
11
+ allow(view).to receive(:current_user).and_return(stub_model(User))
12
+ render 'curation_concerns/base/find_work_widget',
13
+ f: form,
14
+ id_name: 'work_child_members_ids',
15
+ id_type: 'ordered_member_ids',
16
+ user_email: 'foo@bar.com',
17
+ id: '999'
18
+ end
19
+ it "has a widget" do
20
+ expect(rendered).to have_selector('input[data-autocomplete-url="/authorities/search/find_works"]')
21
+ end
22
+ end
@@ -68,6 +68,10 @@ describe 'curation_concerns/base/_form.html.erb', type: :view do
68
68
  end
69
69
 
70
70
  context "for a persisted object" do
71
+ before do
72
+ # Add an error to the work
73
+ work.errors.add :base, 'broken'
74
+ end
71
75
  it "draws the page" do
72
76
  expect(page).to have_selector("form[action='/concern/generic_works/456']")
73
77
  expect(page).to have_selector("select#generic_work_resource_type", count: 1)
@@ -75,6 +79,9 @@ describe 'curation_concerns/base/_form.html.erb', type: :view do
75
79
  expect(page).to have_selector("select#generic_work_representative_id", count: 1)
76
80
  expect(page).not_to have_link('Batch upload', href: '/batch_uploads')
77
81
  expect(page).to have_link("Cancel", href: "/dashboard")
82
+
83
+ # It diplays form errors
84
+ expect(page).to have_content("broken")
78
85
  end
79
86
  end
80
87
  end
@@ -29,6 +29,7 @@ describe "curation_concerns/base/_form_child_work_relationships.html.erb", type:
29
29
  allow(view).to receive(:f).and_return(f)
30
30
  allow(f).to receive(:object).and_return(form)
31
31
  allow(controller).to receive(:current_user).and_return(stub_model(User))
32
+ stub_template '_find_work_widget.html.erb' => "<input value=''/>"
32
33
  assign(:form, form)
33
34
  end
34
35
 
@@ -0,0 +1,114 @@
1
+ require 'spec_helper'
2
+
3
+ describe "curation_concerns/base/_form_parent_work_relationships.html.erb", type: :view do
4
+ let(:work) do
5
+ stub_model(GenericWork, id: '456', title: ["MyWork"])
6
+ end
7
+
8
+ let(:work_2) do
9
+ stub_model(GenericWork, id: '567', title: ["Parent Work"])
10
+ end
11
+
12
+ let(:ability) { double }
13
+
14
+ let(:form) do
15
+ Sufia::Forms::WorkForm.new(work, ability)
16
+ end
17
+
18
+ let(:f) { double }
19
+
20
+ let(:page) do
21
+ render
22
+ Capybara::Node::Simple.new(rendered)
23
+ end
24
+
25
+ before do
26
+ view.lookup_context.view_paths.push 'app/views/curation_concerns'
27
+ allow(view).to receive(:params).and_return(id: work.id)
28
+ allow(view).to receive(:curation_concern).and_return(work)
29
+ allow(view).to receive(:f).and_return(f)
30
+ allow(f).to receive(:object).and_return(form)
31
+ allow(controller).to receive(:current_user).and_return(stub_model(User))
32
+ stub_template '_find_work_widget.html.erb' => "<input value=''/>"
33
+ assign(:form, form)
34
+ end
35
+
36
+ context "When editing a work" do
37
+ context "and no parent works are present" do
38
+ before do
39
+ allow(work).to receive(:in_works).and_return([])
40
+ end
41
+ it "has 1 empty parent work input" do
42
+ expect(page).to have_selector("input[value='']", count: 1)
43
+ end
44
+
45
+ it "will not display the remove button in the actions" do
46
+ expect(page).to have_selector(".btn-remove-row", visible: false)
47
+ end
48
+
49
+ it "will display the add button in the actions" do
50
+ expect(page).to have_selector(".btn-add-row", visible: true, count: 1)
51
+ end
52
+ end
53
+ context "When 1 parent work is present" do
54
+ let(:work_2) do
55
+ stub_model(GenericWork, id: '567', title: ["Test Parent Work"])
56
+ end
57
+
58
+ before do
59
+ allow(work).to receive(:in_works).and_return([work_2])
60
+ end
61
+ it "has 1 empty parent work input with add button" do
62
+ expect(page).to have_selector("input[value='']", count: 1)
63
+ expect(page).to have_selector(".btn-add-row", visible: true, count: 1)
64
+ end
65
+
66
+ it "has an input box that is filled in with the parent id" do
67
+ expect(page).to have_selector("input[value='#{work_2.id}']", count: 1)
68
+ end
69
+
70
+ it "generates a link for the parents first title" do
71
+ expect(page).to have_link("Test Parent Work")
72
+ end
73
+
74
+ it "has an edit and remove button" do
75
+ within ".old-row" do
76
+ expect(page).to have_selector(".btn-remove-row", visible: true, count: 1)
77
+ expect(page).to have_selector(".btn-edit-row", visible: true, count: 1)
78
+ end
79
+ end
80
+ end
81
+ context "When multiple parent works are present" do
82
+ let(:work_2) do
83
+ stub_model(GenericWork, id: '567', title: ["Test Parent Work"])
84
+ end
85
+ let(:work_3) do
86
+ stub_model(GenericWork, id: '789', title: ["Test Parent Work 2"])
87
+ end
88
+ before do
89
+ allow(work).to receive(:in_works).and_return([work_2, work_3])
90
+ end
91
+ it "has 1 empty parent work input with add button" do
92
+ expect(page).to have_selector("input[value='']", count: 1)
93
+ expect(page).to have_selector(".btn-add-row", visible: true, count: 1)
94
+ end
95
+
96
+ it "has an input box that is filled in with the parent ids" do
97
+ expect(page).to have_selector("input[value='#{work_2.id}']", count: 1)
98
+ expect(page).to have_selector("input[value='#{work_3.id}']", count: 1)
99
+ end
100
+
101
+ it "generates a link for the parents first title" do
102
+ expect(page).to have_link("Test Parent Work")
103
+ expect(page).to have_link("Test Parent Work 2")
104
+ end
105
+
106
+ it "has an edit and remove button" do
107
+ within ".old-row" do
108
+ expect(page).to have_selector(".btn-remove-row", visible: true, count: 2)
109
+ expect(page).to have_selector(".btn-edit-row", visible: true, count: 2)
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end