sufia 4.0.1 → 4.1.0

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 (169) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +247 -215
  3. data/README.md +7 -3
  4. data/SUFIA_VERSION +1 -1
  5. data/app/assets/javascripts/sufia.js +5 -2
  6. data/app/assets/javascripts/sufia/proxy_rights.js +68 -0
  7. data/app/assets/javascripts/sufia/transfers.js +3 -0
  8. data/app/assets/javascripts/sufia/user_search.js +31 -0
  9. data/app/assets/stylesheets/jquery-ui.css +17 -17
  10. data/app/assets/stylesheets/sufia.css.scss +3 -2
  11. data/app/assets/stylesheets/sufia/_proxy-rights.scss +10 -0
  12. data/app/controllers/concerns/sufia/contact_form_controller_behavior.rb +22 -23
  13. data/app/controllers/concerns/sufia/depositors_controller_behavior.rb +41 -0
  14. data/app/controllers/concerns/sufia/files_controller_behavior.rb +1 -0
  15. data/app/controllers/concerns/sufia/transfers_controller_behavior.rb +76 -0
  16. data/app/controllers/concerns/sufia/users_controller_behavior.rb +9 -11
  17. data/app/controllers/depositors_controller.rb +3 -0
  18. data/app/controllers/transfers_controller.rb +3 -0
  19. data/app/helpers/sufia/dashboard_helper_behavior.rb +15 -0
  20. data/app/helpers/sufia/sufia_helper_behavior.rb +24 -2
  21. data/app/jobs/content_depositor_change_event_job.rb +50 -0
  22. data/app/views/dashboard/_index_partials/_contents.html.erb +18 -0
  23. data/app/views/dashboard/_index_partials/_proxy_rights.html.erb +23 -0
  24. data/app/views/dashboard/_index_partials/_transfers.html.erb +14 -0
  25. data/app/views/generic_files/proxy.html.erb +5 -0
  26. data/app/views/generic_files/upload/_form.html.erb +7 -2
  27. data/app/views/my/_action_menu.html.erb +3 -1
  28. data/app/views/records/edit_fields/_default.html.erb +1 -1
  29. data/app/views/transfers/_received.html.erb +58 -0
  30. data/app/views/transfers/_sent.html.erb +38 -0
  31. data/app/views/transfers/index.html.erb +7 -0
  32. data/app/views/transfers/new.html.erb +23 -0
  33. data/app/views/users/_proxies.html.erb +8 -0
  34. data/app/views/users/_user_util_links_extra.html.erb +1 -0
  35. data/app/views/users/edit.html.erb +6 -1
  36. data/config/locales/sufia.en.yml +9 -4
  37. data/config/routes.rb +14 -3
  38. data/lib/sufia.rb +7 -5
  39. data/lib/sufia/version.rb +1 -1
  40. data/spec/controllers/authorities_controller_spec.rb +6 -6
  41. data/spec/controllers/batch_controller_spec.rb +29 -29
  42. data/spec/controllers/batch_edits_controller_spec.rb +7 -7
  43. data/spec/controllers/catalog_controller_spec.rb +9 -9
  44. data/spec/controllers/collections_controller_spec.rb +28 -28
  45. data/spec/controllers/content_blocks_controller_spec.rb +3 -3
  46. data/spec/controllers/dashboard_controller_spec.rb +1 -1
  47. data/spec/controllers/depositors_controller_spec.rb +50 -0
  48. data/spec/controllers/downloads_controller_spec.rb +22 -22
  49. data/spec/controllers/featured_work_lists_controller_spec.rb +1 -1
  50. data/spec/controllers/featured_works_controller_spec.rb +1 -1
  51. data/spec/controllers/generic_files_controller_spec.rb +98 -90
  52. data/spec/controllers/homepage_controller_spec.rb +1 -1
  53. data/spec/controllers/mailbox_controller_spec.rb +10 -10
  54. data/spec/controllers/my/collections_controller_spec.rb +1 -1
  55. data/spec/controllers/my/files_controller_spec.rb +1 -1
  56. data/spec/controllers/my/highlights_controller_spec.rb +1 -1
  57. data/spec/controllers/my/shares_controller_spec.rb +1 -1
  58. data/spec/controllers/my_controller_spec.rb +1 -1
  59. data/spec/controllers/pages_controller_spec.rb +1 -1
  60. data/spec/controllers/single_use_links_controller_spec.rb +46 -50
  61. data/spec/controllers/single_use_links_viewer_controller_spec.rb +16 -16
  62. data/spec/controllers/static_controller_spec.rb +9 -9
  63. data/spec/controllers/tinymce_assets_controller_spec.rb +1 -1
  64. data/spec/controllers/transfers_controller_spec.rb +212 -0
  65. data/spec/controllers/users_controller_spec.rb +1 -1
  66. data/spec/factories/generic_files.rb +4 -4
  67. data/spec/factories/proxy_deposit_requests.rb +6 -0
  68. data/spec/features/browse_dashboard_files_spec.rb +25 -36
  69. data/spec/features/browse_files_spec.rb +18 -13
  70. data/spec/features/catalog_search_spec.rb +3 -6
  71. data/spec/features/cloud_upload_spec.rb +5 -7
  72. data/spec/features/collection_spec.rb +28 -35
  73. data/spec/features/contact_form_spec.rb +24 -24
  74. data/spec/features/display_dashboard_spec.rb +11 -11
  75. data/spec/features/ingest_upload_files_spec.rb +10 -10
  76. data/spec/features/notifications_spec.rb +11 -11
  77. data/spec/features/ownership_transfer_spec.rb +111 -0
  78. data/spec/features/proxy_spec.rb +52 -0
  79. data/spec/features/search_spec.rb +1 -1
  80. data/spec/features/single_use_links_spec.rb +28 -18
  81. data/spec/features/users_spec.rb +3 -3
  82. data/spec/helpers/batch_edits_helper_spec.rb +1 -1
  83. data/spec/helpers/content_block_helper_spec.rb +1 -1
  84. data/spec/helpers/dashboard_helper_spec.rb +1 -1
  85. data/spec/helpers/generic_file_helper_spec.rb +1 -1
  86. data/spec/helpers/records_helper_spec.rb +1 -1
  87. data/spec/helpers/sufia_helper_spec.rb +8 -8
  88. data/spec/helpers/trophy_helper_spec.rb +1 -1
  89. data/spec/jobs/audit_job_spec.rb +5 -5
  90. data/spec/jobs/batch_update_job_spec.rb +14 -14
  91. data/spec/jobs/content_depositor_change_event_job_spec.rb +22 -0
  92. data/spec/jobs/event_jobs_spec.rb +104 -104
  93. data/spec/jobs/import_url_job_spec.rb +2 -2
  94. data/spec/jobs/ingest_local_file_job_spec.rb +1 -1
  95. data/spec/lib/sufia/breadcrumbs_spec.rb +3 -3
  96. data/spec/lib/sufia/id_service_spec.rb +1 -1
  97. data/spec/lib/sufia/upload_complete_behavior_spec.rb +4 -4
  98. data/spec/models/ability_spec.rb +59 -15
  99. data/spec/models/batch_spec.rb +16 -16
  100. data/spec/models/characterization_spec.rb +1 -1
  101. data/spec/models/checksum_audit_log_spec.rb +34 -26
  102. data/spec/models/collection_spec.rb +1 -1
  103. data/spec/models/download_spec.rb +1 -1
  104. data/spec/models/featured_work_list_spec.rb +1 -1
  105. data/spec/models/featured_work_spec.rb +15 -4
  106. data/spec/models/file_content_datastream_spec.rb +14 -14
  107. data/spec/models/file_usage_spec.rb +1 -1
  108. data/spec/models/fits_datastream_spec.rb +1 -1
  109. data/spec/models/generic_file/reload_on_save_spec.rb +4 -4
  110. data/spec/models/generic_file/visibility_spec.rb +1 -1
  111. data/spec/models/generic_file/web_form_spec.rb +6 -5
  112. data/spec/models/generic_file_rdf_datastream_spec.rb +1 -1
  113. data/spec/models/generic_file_spec.rb +254 -220
  114. data/spec/models/geo_names_resource_spec.rb +2 -2
  115. data/spec/models/local_authority_spec.rb +60 -59
  116. data/spec/models/pageview_spec.rb +1 -1
  117. data/spec/models/properties_datastream_spec.rb +29 -10
  118. data/spec/models/proxy_deposit_request_spec.rb +107 -0
  119. data/spec/models/single_use_link_spec.rb +13 -13
  120. data/spec/models/solr_document_spec.rb +1 -1
  121. data/spec/models/trophy_spec.rb +6 -6
  122. data/spec/models/user_spec.rb +38 -22
  123. data/spec/routing/featured_works_route_spec.rb +1 -1
  124. data/spec/routing/ownership_transfers_route_spec.rb +45 -0
  125. data/spec/routing/route_spec.rb +42 -42
  126. data/spec/services/noid_spec.rb +2 -2
  127. data/spec/spec_helper.rb +10 -5
  128. data/spec/support/cleaner.rb +12 -0
  129. data/spec/support/features.rb +5 -0
  130. data/spec/support/features/session_helpers.rb +3 -17
  131. data/spec/support/locations.rb +36 -0
  132. data/spec/support/poltergeist.rb +11 -0
  133. data/spec/support/proxies.rb +14 -0
  134. data/spec/support/selectors.rb +122 -0
  135. data/spec/views/batch/edit.html.erb_spec.rb +1 -1
  136. data/spec/views/batch_edits/check_all_spec.rb +4 -4
  137. data/spec/views/catalog/index.html.erb_spec.rb +1 -1
  138. data/spec/views/catalog/sort_and_per_page.html.erb_spec.rb +1 -1
  139. data/spec/views/collections/_form.html.erb_spec.rb +3 -1
  140. data/spec/views/collections/_show_descriptions.html.erb_spec.rb +1 -1
  141. data/spec/views/dashboard/index_spec.rb +3 -6
  142. data/spec/views/generic_file/edit.html.erb_spec.rb +1 -1
  143. data/spec/views/generic_file/show.html.erb_spec.rb +1 -1
  144. data/spec/views/generic_file/stats.html.erb_spec.rb +1 -1
  145. data/spec/views/my/facet.html.erb_spec.rb +2 -2
  146. data/spec/views/users/_follower_modal.html.erb_spec.rb +1 -1
  147. data/spec/views/users/_following_modal.html.erb_spec.rb +1 -1
  148. data/spec/views/users/_notify_number.html.erb_spec.rb +1 -1
  149. data/spec/views/users/_user_util_links.html.erb_spec.rb +1 -1
  150. data/spec/views/users/index.html.erb_spec.rb +2 -2
  151. data/spec/views/users/show.html.erb_spec.rb +2 -2
  152. data/sufia-models/app/models/concerns/sufia/ability.rb +22 -0
  153. data/sufia-models/app/models/concerns/sufia/generic_file.rb +1 -0
  154. data/sufia-models/app/models/concerns/sufia/generic_file/proxy_deposit.rb +22 -0
  155. data/sufia-models/app/models/concerns/sufia/properties_datastream_behavior.rb +3 -0
  156. data/sufia-models/app/models/concerns/sufia/user.rb +9 -0
  157. data/sufia-models/app/models/proxy_deposit_request.rb +85 -0
  158. data/sufia-models/app/models/proxy_deposit_rights.rb +4 -0
  159. data/sufia-models/app/models/sufia/avatar_uploader.rb +2 -3
  160. data/sufia-models/lib/generators/sufia/models/install_generator.rb +9 -1
  161. data/sufia-models/lib/generators/sufia/models/proxies_generator.rb +53 -0
  162. data/sufia-models/lib/generators/sufia/models/templates/migrations/create_proxy_deposit_requests.rb +16 -0
  163. data/sufia-models/lib/generators/sufia/models/templates/migrations/create_proxy_deposit_rights.rb +11 -0
  164. data/sufia-models/lib/sufia/models/engine.rb +1 -1
  165. data/sufia-models/lib/sufia/models/version.rb +1 -1
  166. data/sufia.gemspec +2 -1
  167. data/tasks/sufia-dev.rake +5 -0
  168. metadata +82 -6
  169. data/tasks/sufia-db.rake +0 -21
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe TrophyHelper do
3
+ describe TrophyHelper, :type => :helper do
4
4
  describe "#display_trophy_link" do
5
5
  let(:user) { FactoryGirl.create(:user) }
6
6
  let(:noid) { '9999' }
@@ -13,19 +13,19 @@ describe AuditJob do
13
13
  end
14
14
  describe "passing audit" do
15
15
  it "should not send passing mail" do
16
- ActiveFedora::RelsExtDatastream.any_instance.stub(:dsChecksumValid).and_return(true)
16
+ allow_any_instance_of(ActiveFedora::RelsExtDatastream).to receive(:dsChecksumValid).and_return(true)
17
17
  AuditJob.new(@file.pid, "RELS-EXT", @file.rels_ext.versionID).run
18
18
  @inbox = @user.mailbox.inbox
19
- @inbox.count.should == 0
19
+ expect(@inbox.count).to eq(0)
20
20
  end
21
21
  end
22
22
  describe "failing audit" do
23
23
  it "should send failing mail" do
24
- ActiveFedora::RelsExtDatastream.any_instance.stub(:dsChecksumValid).and_return(false)
24
+ allow_any_instance_of(ActiveFedora::RelsExtDatastream).to receive(:dsChecksumValid).and_return(false)
25
25
  AuditJob.new(@file.pid, "RELS-EXT", @file.rels_ext.versionID).run
26
26
  @inbox = @user.mailbox.inbox
27
- @inbox.count.should == 1
28
- @inbox.each { |msg| msg.last_message.subject.should == AuditJob::FAIL }
27
+ expect(@inbox.count).to eq(1)
28
+ @inbox.each { |msg| expect(msg.last_message.subject).to eq(AuditJob::FAIL) }
29
29
  end
30
30
  end
31
31
  end
@@ -34,28 +34,28 @@ describe BatchUpdateJob do
34
34
  end
35
35
  context "with a failing update" do
36
36
  it "should check permissions for each file before updating" do
37
- User.any_instance.should_receive(:can?).with(:edit, @file).and_return(false)
38
- User.any_instance.should_receive(:can?).with(:edit, @file2).and_return(false)
37
+ expect_any_instance_of(User).to receive(:can?).with(:edit, @file).and_return(false)
38
+ expect_any_instance_of(User).to receive(:can?).with(:edit, @file2).and_return(false)
39
39
  BatchUpdateJob.new(@user.user_key, params).run
40
- @user.mailbox.inbox[0].messages[0].subject.should == "Batch upload permission denied"
41
- @user.mailbox.inbox[0].messages[0].body.should include("data-content")
42
- @user.mailbox.inbox[0].messages[0].body.should include("These files")
40
+ expect(@user.mailbox.inbox[0].messages[0].subject).to eq("Batch upload permission denied")
41
+ expect(@user.mailbox.inbox[0].messages[0].body).to include("data-content")
42
+ expect(@user.mailbox.inbox[0].messages[0].body).to include("These files")
43
43
  end
44
44
  end
45
45
  context "with a passing update" do
46
46
  let(:s1) { double('one') }
47
47
  let(:s2) { double('two') }
48
48
  it "should log a content update event" do
49
- User.any_instance.should_receive(:can?).with(:edit, @file).and_return(true)
50
- User.any_instance.should_receive(:can?).with(:edit, @file2).and_return(true)
51
- ContentUpdateEventJob.should_receive(:new).with(@file.pid, @user.user_key).and_return(s1)
52
- Sufia.queue.should_receive(:push).with(s1).once
53
- ContentUpdateEventJob.should_receive(:new).with(@file2.pid, @user.user_key).and_return(s2)
54
- Sufia.queue.should_receive(:push).with(s2).once
49
+ expect_any_instance_of(User).to receive(:can?).with(:edit, @file).and_return(true)
50
+ expect_any_instance_of(User).to receive(:can?).with(:edit, @file2).and_return(true)
51
+ expect(ContentUpdateEventJob).to receive(:new).with(@file.pid, @user.user_key).and_return(s1)
52
+ expect(Sufia.queue).to receive(:push).with(s1).once
53
+ expect(ContentUpdateEventJob).to receive(:new).with(@file2.pid, @user.user_key).and_return(s2)
54
+ expect(Sufia.queue).to receive(:push).with(s2).once
55
55
  BatchUpdateJob.new(@user.user_key, params).run
56
- @user.mailbox.inbox[0].messages[0].subject.should == "Batch upload complete"
57
- @user.mailbox.inbox[0].messages[0].body.should include("data-content")
58
- @user.mailbox.inbox[0].messages[0].body.should include("These files")
56
+ expect(@user.mailbox.inbox[0].messages[0].subject).to eq("Batch upload complete")
57
+ expect(@user.mailbox.inbox[0].messages[0].body).to include("data-content")
58
+ expect(@user.mailbox.inbox[0].messages[0].body).to include("These files")
59
59
  end
60
60
  end
61
61
  end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe ContentDepositorChangeEventJob do
4
+ before do
5
+ @depositor = FactoryGirl.find_or_create(:jill)
6
+ @receiver = FactoryGirl.find_or_create(:archivist)
7
+ @file = ::GenericFile.new.tap do |gf|
8
+ gf.apply_depositor_metadata(@depositor.user_key)
9
+ gf.save!
10
+ end
11
+ ContentDepositorChangeEventJob.new(@file.pid, @receiver.user_key).run
12
+ end
13
+ after do
14
+ @file.destroy
15
+ end
16
+ it "changes the depositor and records an original depositor" do
17
+ @file.reload
18
+ expect(@file.depositor).to eq @receiver.user_key
19
+ expect(@file.proxy_depositor).to eq @depositor.user_key
20
+ expect(@file.edit_users).to include(@receiver.user_key, @depositor.user_key)
21
+ end
22
+ end
@@ -24,168 +24,168 @@ describe 'event jobs' do
24
24
  @another_user.follow(@user)
25
25
  count_user = @user.events.length
26
26
  count_another = @another_user.events.length
27
- Time.should_receive(:now).at_least(:once).and_return(1)
27
+ expect(Time).to receive(:now).at_least(:once).and_return(1)
28
28
  event = { action: 'User <a href="/users/jilluser@example-dot-com">jilluser@example.com</a> has edited his or her profile', timestamp: '1' }
29
29
  UserEditProfileEventJob.new(@user.user_key).run
30
- @user.events.length.should == count_user + 1
31
- @user.events.first.should == event
32
- @another_user.events.length.should == count_another + 1
33
- @another_user.events.first.should == event
30
+ expect(@user.events.length).to eq(count_user + 1)
31
+ expect(@user.events.first).to eq(event)
32
+ expect(@another_user.events.length).to eq(count_another + 1)
33
+ expect(@another_user.events.first).to eq(event)
34
34
  end
35
35
  it "should log user follow events" do
36
36
  # UserFollow should log the event to the follower's dashboard, the followee's dashboard, and followers' dashboards
37
37
  @third_user.follow(@user)
38
- @user.events.length.should == 0
39
- @another_user.events.length.should == 0
40
- @third_user.events.length.should == 0
41
- Time.should_receive(:now).at_least(:once).and_return(1)
38
+ expect(@user.events.length).to eq(0)
39
+ expect(@another_user.events.length).to eq(0)
40
+ expect(@third_user.events.length).to eq(0)
41
+ expect(Time).to receive(:now).at_least(:once).and_return(1)
42
42
  event = { action: 'User <a href="/users/jilluser@example-dot-com">jilluser@example.com</a> is now following <a href="/users/archivist1@example-dot-com">archivist1@example.com</a>', timestamp: '1' }
43
43
  UserFollowEventJob.new(@user.user_key, @another_user.user_key).run
44
- @user.events.length.should == 1
45
- @user.events.first.should == event
46
- @another_user.events.length.should == 1
47
- @another_user.events.first.should == event
48
- @third_user.events.length.should == 1
49
- @third_user.events.first.should == event
44
+ expect(@user.events.length).to eq(1)
45
+ expect(@user.events.first).to eq(event)
46
+ expect(@another_user.events.length).to eq(1)
47
+ expect(@another_user.events.first).to eq(event)
48
+ expect(@third_user.events.length).to eq(1)
49
+ expect(@third_user.events.first).to eq(event)
50
50
  end
51
51
  it "should log user unfollow events" do
52
52
  # UserUnfollow should log the event to the unfollower's dashboard, the unfollowee's dashboard, and followers' dashboards
53
53
  @third_user.follow(@user)
54
54
  @user.follow(@another_user)
55
- @user.events.length.should == 0
56
- @another_user.events.length.should == 0
57
- @third_user.events.length.should == 0
58
- Time.should_receive(:now).at_least(:once).and_return(1)
55
+ expect(@user.events.length).to eq(0)
56
+ expect(@another_user.events.length).to eq(0)
57
+ expect(@third_user.events.length).to eq(0)
58
+ expect(Time).to receive(:now).at_least(:once).and_return(1)
59
59
  event = { action: 'User <a href="/users/jilluser@example-dot-com">jilluser@example.com</a> has unfollowed <a href="/users/archivist1@example-dot-com">archivist1@example.com</a>', timestamp: '1' }
60
60
  UserUnfollowEventJob.new(@user.user_key, @another_user.user_key).run
61
- @user.events.length.should == 1
62
- @user.events.first.should == event
63
- @another_user.events.length.should == 1
64
- @another_user.events.first.should == event
65
- @third_user.events.length.should == 1
66
- @third_user.events.first.should == event
61
+ expect(@user.events.length).to eq(1)
62
+ expect(@user.events.first).to eq(event)
63
+ expect(@another_user.events.length).to eq(1)
64
+ expect(@another_user.events.first).to eq(event)
65
+ expect(@third_user.events.length).to eq(1)
66
+ expect(@third_user.events.first).to eq(event)
67
67
  end
68
68
  it "should log content deposit events" do
69
69
  # ContentDeposit should log the event to the depositor's profile, followers' dashboards, and the GF
70
70
  @another_user.follow(@user)
71
71
  @third_user.follow(@user)
72
- User.any_instance.stub(:can?).and_return(true)
73
- @user.profile_events.length.should == 0
74
- @another_user.events.length.should == 0
75
- @third_user.events.length.should == 0
76
- @gf.events.length.should == 0
77
- Time.should_receive(:now).at_least(:once).and_return(1)
72
+ allow_any_instance_of(User).to receive(:can?).and_return(true)
73
+ expect(@user.profile_events.length).to eq(0)
74
+ expect(@another_user.events.length).to eq(0)
75
+ expect(@third_user.events.length).to eq(0)
76
+ expect(@gf.events.length).to eq(0)
77
+ expect(Time).to receive(:now).at_least(:once).and_return(1)
78
78
  event = {action: 'User <a href="/users/jilluser@example-dot-com">jilluser@example.com</a> has deposited <a href="/files/123">Hamlet</a>', timestamp: '1' }
79
79
  ContentDepositEventJob.new('test:123', @user.user_key).run
80
- @user.profile_events.length.should == 1
81
- @user.profile_events.first.should == event
82
- @another_user.events.length.should == 1
83
- @another_user.events.first.should == event
84
- @third_user.events.length.should == 1
85
- @third_user.events.first.should == event
86
- @gf.events.length.should == 1
87
- @gf.events.first.should == event
80
+ expect(@user.profile_events.length).to eq(1)
81
+ expect(@user.profile_events.first).to eq(event)
82
+ expect(@another_user.events.length).to eq(1)
83
+ expect(@another_user.events.first).to eq(event)
84
+ expect(@third_user.events.length).to eq(1)
85
+ expect(@third_user.events.first).to eq(event)
86
+ expect(@gf.events.length).to eq(1)
87
+ expect(@gf.events.first).to eq(event)
88
88
  end
89
89
  it "should log content update events" do
90
90
  # ContentUpdate should log the event to the depositor's profile, followers' dashboards, and the GF
91
91
  @another_user.follow(@user)
92
92
  @third_user.follow(@user)
93
- User.any_instance.stub(:can?).and_return(true)
94
- @user.profile_events.length.should == 0
95
- @another_user.events.length.should == 0
96
- @third_user.events.length.should == 0
97
- @gf.events.length.should == 0
98
- Time.should_receive(:now).at_least(:once).and_return(1)
93
+ allow_any_instance_of(User).to receive(:can?).and_return(true)
94
+ expect(@user.profile_events.length).to eq(0)
95
+ expect(@another_user.events.length).to eq(0)
96
+ expect(@third_user.events.length).to eq(0)
97
+ expect(@gf.events.length).to eq(0)
98
+ expect(Time).to receive(:now).at_least(:once).and_return(1)
99
99
  event = {action: 'User <a href="/users/jilluser@example-dot-com">jilluser@example.com</a> has updated <a href="/files/123">Hamlet</a>', timestamp: '1' }
100
100
  ContentUpdateEventJob.new('test:123', @user.user_key).run
101
- @user.profile_events.length.should == 1
102
- @user.profile_events.first.should == event
103
- @another_user.events.length.should == 1
104
- @another_user.events.first.should == event
105
- @third_user.events.length.should == 1
106
- @third_user.events.first.should == event
107
- @gf.events.length.should == 1
108
- @gf.events.first.should == event
101
+ expect(@user.profile_events.length).to eq(1)
102
+ expect(@user.profile_events.first).to eq(event)
103
+ expect(@another_user.events.length).to eq(1)
104
+ expect(@another_user.events.first).to eq(event)
105
+ expect(@third_user.events.length).to eq(1)
106
+ expect(@third_user.events.first).to eq(event)
107
+ expect(@gf.events.length).to eq(1)
108
+ expect(@gf.events.first).to eq(event)
109
109
  end
110
110
  it "should log content new version events" do
111
111
  # ContentNewVersion should log the event to the depositor's profile, followers' dashboards, and the GF
112
112
  @another_user.follow(@user)
113
113
  @third_user.follow(@user)
114
- User.any_instance.stub(:can?).and_return(true)
115
- @user.profile_events.length.should == 0
116
- @another_user.events.length.should == 0
117
- @third_user.events.length.should == 0
118
- @gf.events.length.should == 0
119
- Time.should_receive(:now).at_least(:once).and_return(1)
114
+ allow_any_instance_of(User).to receive(:can?).and_return(true)
115
+ expect(@user.profile_events.length).to eq(0)
116
+ expect(@another_user.events.length).to eq(0)
117
+ expect(@third_user.events.length).to eq(0)
118
+ expect(@gf.events.length).to eq(0)
119
+ expect(Time).to receive(:now).at_least(:once).and_return(1)
120
120
  event = {action: 'User <a href="/users/jilluser@example-dot-com">jilluser@example.com</a> has added a new version of <a href="/files/123">Hamlet</a>', timestamp: '1' }
121
121
  ContentNewVersionEventJob.new('test:123', @user.user_key).run
122
- @user.profile_events.length.should == 1
123
- @user.profile_events.first.should == event
124
- @another_user.events.length.should == 1
125
- @another_user.events.first.should == event
126
- @third_user.events.length.should == 1
127
- @third_user.events.first.should == event
128
- @gf.events.length.should == 1
129
- @gf.events.first.should == event
122
+ expect(@user.profile_events.length).to eq(1)
123
+ expect(@user.profile_events.first).to eq(event)
124
+ expect(@another_user.events.length).to eq(1)
125
+ expect(@another_user.events.first).to eq(event)
126
+ expect(@third_user.events.length).to eq(1)
127
+ expect(@third_user.events.first).to eq(event)
128
+ expect(@gf.events.length).to eq(1)
129
+ expect(@gf.events.first).to eq(event)
130
130
  end
131
131
  it "should log content restored version events" do
132
132
  # ContentRestoredVersion should log the event to the depositor's profile, followers' dashboards, and the GF
133
133
  @another_user.follow(@user)
134
134
  @third_user.follow(@user)
135
- User.any_instance.stub(:can?).and_return(true)
136
- @user.profile_events.length.should == 0
137
- @another_user.events.length.should == 0
138
- @third_user.events.length.should == 0
139
- @gf.events.length.should == 0
140
- Time.should_receive(:now).at_least(:once).and_return(1)
135
+ allow_any_instance_of(User).to receive(:can?).and_return(true)
136
+ expect(@user.profile_events.length).to eq(0)
137
+ expect(@another_user.events.length).to eq(0)
138
+ expect(@third_user.events.length).to eq(0)
139
+ expect(@gf.events.length).to eq(0)
140
+ expect(Time).to receive(:now).at_least(:once).and_return(1)
141
141
  event = {action: 'User <a href="/users/jilluser@example-dot-com">jilluser@example.com</a> has restored a version \'content.0\' of <a href="/files/123">Hamlet</a>', timestamp: '1' }
142
142
  ContentRestoredVersionEventJob.new('test:123', @user.user_key, 'content.0').run
143
- @user.profile_events.length.should == 1
144
- @user.profile_events.first.should == event
145
- @another_user.events.length.should == 1
146
- @another_user.events.first.should == event
147
- @third_user.events.length.should == 1
148
- @third_user.events.first.should == event
149
- @gf.events.length.should == 1
150
- @gf.events.first.should == event
143
+ expect(@user.profile_events.length).to eq(1)
144
+ expect(@user.profile_events.first).to eq(event)
145
+ expect(@another_user.events.length).to eq(1)
146
+ expect(@another_user.events.first).to eq(event)
147
+ expect(@third_user.events.length).to eq(1)
148
+ expect(@third_user.events.first).to eq(event)
149
+ expect(@gf.events.length).to eq(1)
150
+ expect(@gf.events.first).to eq(event)
151
151
  end
152
152
  it "should log content delete events" do
153
153
  # ContentDelete should log the event to the depositor's profile and followers' dashboards
154
154
  @another_user.follow(@user)
155
155
  @third_user.follow(@user)
156
- @user.profile_events.length.should == 0
157
- @another_user.events.length.should == 0
158
- @third_user.events.length.should == 0
159
- Time.should_receive(:now).at_least(:once).and_return(1)
156
+ expect(@user.profile_events.length).to eq(0)
157
+ expect(@another_user.events.length).to eq(0)
158
+ expect(@third_user.events.length).to eq(0)
159
+ expect(Time).to receive(:now).at_least(:once).and_return(1)
160
160
  event = {action: 'User <a href="/users/jilluser@example-dot-com">jilluser@example.com</a> has deleted file \'123\'', timestamp: '1' }
161
161
  ContentDeleteEventJob.new('test:123', @user.user_key).run
162
- @user.profile_events.length.should == 1
163
- @user.profile_events.first.should == event
164
- @another_user.events.length.should == 1
165
- @another_user.events.first.should == event
166
- @third_user.events.length.should == 1
167
- @third_user.events.first.should == event
162
+ expect(@user.profile_events.length).to eq(1)
163
+ expect(@user.profile_events.first).to eq(event)
164
+ expect(@another_user.events.length).to eq(1)
165
+ expect(@another_user.events.first).to eq(event)
166
+ expect(@third_user.events.length).to eq(1)
167
+ expect(@third_user.events.first).to eq(event)
168
168
  end
169
169
  it "should not log content-related jobs to followers who lack access" do
170
170
  # No Content-related eventjobs should log an event to a follower who does not have access to the GF
171
171
  @another_user.follow(@user)
172
172
  @third_user.follow(@user)
173
- @user.profile_events.length.should == 0
174
- @another_user.events.length.should == 0
175
- @third_user.events.length.should == 0
176
- @gf.events.length.should == 0
173
+ expect(@user.profile_events.length).to eq(0)
174
+ expect(@another_user.events.length).to eq(0)
175
+ expect(@third_user.events.length).to eq(0)
176
+ expect(@gf.events.length).to eq(0)
177
177
  @now = Time.now
178
- Time.should_receive(:now).at_least(:once).and_return(@now)
178
+ expect(Time).to receive(:now).at_least(:once).and_return(@now)
179
179
  event = {action: 'User <a href="/users/jilluser@example-dot-com">jilluser@example.com</a> has updated <a href="/files/123">Hamlet</a>', timestamp: @now.to_i.to_s }
180
180
  ContentUpdateEventJob.new('test:123', @user.user_key).run
181
- @user.profile_events.length.should == 1
182
- @user.profile_events.first.should == event
183
- @another_user.events.length.should == 0
184
- @another_user.events.first.should be_nil
185
- @third_user.events.length.should == 0
186
- @third_user.events.first.should be_nil
187
- @gf.events.length.should == 1
188
- @gf.events.first.should == event
181
+ expect(@user.profile_events.length).to eq(1)
182
+ expect(@user.profile_events.first).to eq(event)
183
+ expect(@another_user.events.length).to eq(0)
184
+ expect(@another_user.events.first).to be_nil
185
+ expect(@third_user.events.length).to eq(0)
186
+ expect(@third_user.events.first).to be_nil
187
+ expect(@gf.events.length).to eq(1)
188
+ expect(@gf.events.first).to eq(event)
189
189
  end
190
190
  end
191
191
 
@@ -29,7 +29,7 @@ describe ImportUrlJob do
29
29
  subject(:job) { ImportUrlJob.new(generic_file.id) }
30
30
 
31
31
  it "should have no content at the outset" do
32
- generic_file.content.size.should be_nil
32
+ expect(generic_file.content.size).to be_nil
33
33
  end
34
34
 
35
35
  context "after running the job" do
@@ -46,7 +46,7 @@ describe ImportUrlJob do
46
46
  end
47
47
 
48
48
  it "should create a content datastream" do
49
- Net::HTTP.any_instance.should_receive(:request_get).with(file_hash).and_yield(mock_response)
49
+ expect_any_instance_of(Net::HTTP).to receive(:request_get).with(file_hash).and_yield(mock_response)
50
50
  job.run
51
51
  expect(generic_file.reload.content.size).to eq 4218
52
52
  expect(generic_file.content.dsLabel).to eq file_path
@@ -21,7 +21,7 @@ describe IngestLocalFileJob do
21
21
 
22
22
  it "should have attached a file" do
23
23
  job.run
24
- generic_file.reload.content.size.should == 4218
24
+ expect(generic_file.reload.content.size).to eq(4218)
25
25
  end
26
26
 
27
27
  describe "virus checking" do
@@ -28,7 +28,7 @@ describe Sufia::Breadcrumbs do
28
28
  describe "#default_trail" do
29
29
  context "when the user is logged in" do
30
30
  before do
31
- crumbs.stub(:user_signed_in?) { true }
31
+ allow(crumbs).to receive(:user_signed_in?) { true }
32
32
  end
33
33
  specify "the default trail is nil" do
34
34
  expect(crumbs.default_trail).to eql([[I18n.t('sufia.dashboard.title'), sufia.dashboard_index_path]])
@@ -36,7 +36,7 @@ describe Sufia::Breadcrumbs do
36
36
  end
37
37
  context "when there is no user" do
38
38
  before do
39
- crumbs.stub(:user_signed_in?) { false }
39
+ allow(crumbs).to receive(:user_signed_in?) { false }
40
40
  end
41
41
  specify "the default trail is nil" do
42
42
  expect(crumbs.default_trail).to be_nil
@@ -57,7 +57,7 @@ describe Sufia::Breadcrumbs do
57
57
  context "when coming from the dashboard" do
58
58
  before do
59
59
  allow(crumbs.request).to receive(:referer).and_return("http://...dashboard/")
60
- crumbs.stub(:user_signed_in?) { true }
60
+ allow(crumbs).to receive(:user_signed_in?) { true }
61
61
  end
62
62
  specify "the trail goes back to the user's files" do
63
63
  allow(crumbs).to receive(:controller_name).and_return("my/files")
@@ -4,7 +4,7 @@ describe Sufia::IdService do
4
4
  describe "mint" do
5
5
  subject { Sufia::IdService.mint }
6
6
 
7
- it { should_not be_empty }
7
+ it { is_expected.not_to be_empty }
8
8
 
9
9
  it "should not mint the same id twice in a row" do
10
10
  expect(Sufia::IdService.mint).to_not eq subject
@@ -19,18 +19,18 @@ describe Sufia::FilesController::UploadCompleteBehavior do
19
19
  let (:test_id) {"123abc"}
20
20
  context "Not overridden" do
21
21
  it "respond with the batch edit path" do
22
- UploadThing.upload_complete_path(test_id).should == Sufia::Engine.routes.url_helpers.batch_edit_path(test_id)
22
+ expect(UploadThing.upload_complete_path(test_id)).to eq(Sufia::Engine.routes.url_helpers.batch_edit_path(test_id))
23
23
  end
24
24
  it "respond with the dashboard path" do
25
- UploadThing.destroy_complete_path({}).should == Sufia::Engine.routes.url_helpers.dashboard_files_path
25
+ expect(UploadThing.destroy_complete_path({})).to eq(Sufia::Engine.routes.url_helpers.dashboard_files_path)
26
26
  end
27
27
  end
28
28
  context "overriden path" do
29
29
  it "respond with the batch edit path" do
30
- UploadThingRedefine.upload_complete_path(test_id).should == "example.com"
30
+ expect(UploadThingRedefine.upload_complete_path(test_id)).to eq("example.com")
31
31
  end
32
32
  it "respond with the batch edit path" do
33
- UploadThingRedefine.destroy_complete_path(test_id).should == "destroy.com"
33
+ expect(UploadThingRedefine.destroy_complete_path(test_id)).to eq("destroy.com")
34
34
  end
35
35
  end
36
36
  end