sufia 6.3.0 → 6.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -2
  3. data/.rubocop.yml +10 -0
  4. data/Gemfile +16 -7
  5. data/History.md +43 -0
  6. data/README.md +26 -19
  7. data/SUFIA_VERSION +1 -1
  8. data/app/assets/javascripts/notifications_check.js.erb +46 -0
  9. data/app/assets/javascripts/sufia.js +1 -2
  10. data/app/assets/javascripts/sufia/uploader.js +3 -3
  11. data/app/assets/stylesheets/sufia/_collections.scss +5 -0
  12. data/app/assets/stylesheets/sufia/_dashboard.scss +6 -1
  13. data/app/assets/stylesheets/sufia/_file-listing.scss +44 -6
  14. data/app/assets/stylesheets/sufia/_file-show.scss +4 -0
  15. data/app/assets/stylesheets/sufia/_settings.scss +3 -0
  16. data/app/controllers/api/items_controller.rb +7 -3
  17. data/app/controllers/concerns/sufia/admin/depositor_stats.rb +1 -1
  18. data/app/controllers/concerns/sufia/admin/stats_behavior.rb +6 -76
  19. data/app/controllers/concerns/sufia/batch_controller_behavior.rb +10 -2
  20. data/app/controllers/concerns/sufia/contact_form_controller_behavior.rb +1 -0
  21. data/app/controllers/concerns/sufia/files_controller_behavior.rb +11 -1
  22. data/app/controllers/concerns/sufia/homepage_controller.rb +1 -1
  23. data/app/controllers/concerns/sufia/my_controller_behavior.rb +2 -0
  24. data/app/controllers/concerns/sufia/users_controller_behavior.rb +2 -2
  25. data/app/helpers/generic_file_helper.rb +8 -5
  26. data/app/jobs/content_delete_event_job.rb +16 -11
  27. data/app/jobs/content_deposit_event_job.rb +4 -16
  28. data/app/jobs/content_depositor_change_event_job.rb +32 -20
  29. data/app/jobs/content_event_job.rb +39 -0
  30. data/app/jobs/content_new_version_event_job.rb +4 -16
  31. data/app/jobs/content_restored_version_event_job.rb +6 -19
  32. data/app/jobs/content_update_event_job.rb +4 -16
  33. data/app/jobs/event_job.rb +48 -4
  34. data/app/jobs/user_edit_profile_event_job.rb +4 -17
  35. data/app/jobs/user_follow_event_job.rb +10 -12
  36. data/app/jobs/user_unfollow_event_job.rb +10 -15
  37. data/app/models/concerns/sufia/solr_document_behavior.rb +11 -1
  38. data/app/models/system_stats.rb +108 -0
  39. data/app/presenters/sufia/admin_stats_presenter.rb +49 -0
  40. data/app/views/_controls.html.erb +1 -1
  41. data/app/views/_footer.html.erb +1 -1
  42. data/app/views/_logo.html.erb +1 -3
  43. data/app/views/admin/stats/_date_form.html.erb +8 -0
  44. data/app/views/admin/stats/_deposits.html.erb +2 -10
  45. data/app/views/admin/stats/_files.html.erb +6 -14
  46. data/app/views/admin/stats/_new_users.html.erb +7 -14
  47. data/app/views/admin/stats/_stats_by_date.html.erb +8 -0
  48. data/app/views/admin/stats/_top_data.html.erb +24 -0
  49. data/app/views/admin/stats/index.html.erb +5 -31
  50. data/app/views/collections/_form_for_select_collection.html.erb +5 -4
  51. data/app/views/collections/_show_actions.html.erb +7 -2
  52. data/app/views/collections/_show_document_list_row.html.erb +1 -9
  53. data/app/views/generic_files/_browse_everything.html.erb +3 -0
  54. data/app/views/generic_files/_descriptions.html.erb +1 -1
  55. data/app/views/generic_files/_generic_file.html.erb +1 -1
  56. data/app/views/generic_files/_local_file_import.html.erb +3 -0
  57. data/app/views/generic_files/_show_actions.html.erb +4 -0
  58. data/app/views/generic_files/upload/_form.html.erb +3 -0
  59. data/app/views/generic_files/upload/_to_collection.html.erb +5 -0
  60. data/app/views/homepage/_recent_document.html.erb +1 -7
  61. data/app/views/my/_index_partials/_default_group.html.erb +1 -1
  62. data/app/views/my/_index_partials/_list_collections.html.erb +3 -10
  63. data/app/views/my/_index_partials/_list_files.html.erb +13 -22
  64. data/app/views/my/_sort_and_per_page.html.erb +3 -3
  65. data/app/views/records/edit_fields/_rights.html.erb +2 -1
  66. data/app/views/static/terms.html.erb +1 -1
  67. data/config/locales/sufia.en.yml +13 -0
  68. data/lib/generators/sufia/templates/catalog_controller.rb +2 -2
  69. data/lib/sufia/version.rb +1 -1
  70. data/spec/actors/generic_file/actor_spec.rb +35 -0
  71. data/spec/controllers/admin_stats_controller_spec.rb +53 -23
  72. data/spec/controllers/api/items_controller_spec.rb +47 -41
  73. data/spec/controllers/batch_controller_spec.rb +1 -0
  74. data/spec/controllers/generic_files_controller_spec.rb +35 -1
  75. data/spec/controllers/my/files_controller_spec.rb +5 -0
  76. data/spec/factories/generic_files.rb +3 -0
  77. data/spec/features/collection_spec.rb +91 -0
  78. data/spec/features/contact_form_spec.rb +1 -0
  79. data/spec/forms/collection_edit_form_spec.rb +3 -3
  80. data/spec/forms/generic_file_edit_form_spec.rb +1 -1
  81. data/spec/jobs/create_derivatives_job_spec.rb +6 -0
  82. data/spec/models/file_content_datastream_spec.rb +1 -1
  83. data/spec/models/file_download_stat_spec.rb +4 -4
  84. data/spec/models/file_usage_spec.rb +2 -2
  85. data/spec/models/file_view_stat_spec.rb +4 -4
  86. data/spec/models/generic_file_spec.rb +15 -3
  87. data/spec/models/geo_names_resource_spec.rb +10 -0
  88. data/spec/models/solr_document_spec.rb +28 -0
  89. data/spec/models/system_stats_spec.rb +184 -0
  90. data/spec/models/user_spec.rb +1 -1
  91. data/spec/models/user_usage_stats_spec.rb +1 -1
  92. data/spec/services/generic_file_csv_service_spec.rb +66 -0
  93. data/spec/services/generic_file_indexing_service_spec.rb +35 -0
  94. data/spec/services/lock_manager_spec.rb +12 -0
  95. data/spec/spec_helper.rb +2 -1
  96. data/spec/views/admin/stats/index.html.erb_spec.rb +11 -10
  97. data/spec/views/catalog/sort_and_per_page.html.erb_spec.rb +1 -1
  98. data/spec/views/collections/_form_for_select_collection.html.erb_spec.rb +51 -0
  99. data/spec/views/generic_file/_browse_everything.html.erb_spec.rb +4 -0
  100. data/spec/views/generic_file/edit.html.erb_spec.rb +31 -24
  101. data/spec/views/generic_file/new.html.erb_spec.rb +70 -0
  102. data/spec/views/generic_file/show.html.erb_spec.rb +23 -0
  103. data/sufia.gemspec +3 -2
  104. data/tasks/sufia-dev.rake +2 -0
  105. metadata +42 -9
  106. data/lib/sufia/role_mapper.rb +0 -7
@@ -20,11 +20,11 @@ class CatalogController < ApplicationController
20
20
  skip_before_filter :default_html_head
21
21
 
22
22
  def self.uploaded_field
23
- solr_name('date_uploaded', :stored_sortable, type: :date)
23
+ solr_name('system_create', :stored_sortable, type: :date)
24
24
  end
25
25
 
26
26
  def self.modified_field
27
- solr_name('date_modified', :stored_sortable, type: :date)
27
+ solr_name('system_modified', :stored_sortable, type: :date)
28
28
  end
29
29
 
30
30
  configure_blacklight do |config|
data/lib/sufia/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Sufia
2
- VERSION = "6.3.0"
2
+ VERSION = "6.4.0"
3
3
  end
@@ -69,6 +69,41 @@ describe Sufia::GenericFile::Actor do
69
69
  expect(VersionCommitter.where(version_id: versions.last.uri).pluck(:committer_login)).to eq [second_user.user_key]
70
70
  end
71
71
  end
72
+
73
+ context "with collection" do
74
+ let(:file) { "world.png" }
75
+ let(:actor) { described_class.new(generic_file, user) }
76
+ let(:col_editable) do
77
+ Collection.new(title: 'editable', description: 'user can edit this collection') do |c|
78
+ c.apply_depositor_metadata(user)
79
+ end
80
+ end
81
+ let(:col_editable_id) { col_editable.id }
82
+ let(:col_not_editable) { Collection.new(title: 'not editable', description: 'user cannot edit this collection') }
83
+ let(:col_not_editable_id) { col_not_editable.id }
84
+ before do
85
+ allow(generic_file).to receive(:label).and_return(file)
86
+ allow(col_editable).to receive(:id).and_return('ce')
87
+ allow(Collection).to receive(:find).with(col_editable_id).and_return(col_editable)
88
+ allow(user).to receive(:can?).with(:edit, col_editable).and_return(true)
89
+ allow(col_not_editable).to receive(:id).and_return('cne')
90
+ allow(Collection).to receive(:find).with(col_not_editable_id).and_return(col_not_editable)
91
+ allow(user).to receive(:can?).with(:edit, col_not_editable).and_return(false)
92
+ allow(Sufia.queue).to receive(:push)
93
+ end
94
+
95
+ it "adds file to collection when user can edit the collection" do
96
+ actor.create_content(fixture_file_upload(file), file, 'content', 'image/png', col_editable_id)
97
+ updated_collection = Collection.find(col_editable_id)
98
+ expect(updated_collection.member_ids).to eq [generic_file.id]
99
+ end
100
+
101
+ it "does not add file to collection when user can NOT edit the collection" do
102
+ actor.create_content(fixture_file_upload(file), file, 'content', 'image/png', col_not_editable_id)
103
+ updated_collection = Collection.find(col_not_editable_id)
104
+ expect(updated_collection.member_ids).to eq []
105
+ end
106
+ end
72
107
  end
73
108
 
74
109
  describe "#virus_check" do
@@ -14,6 +14,10 @@ describe Admin::StatsController, type: :controller do
14
14
  before do
15
15
  sign_in user1
16
16
  end
17
+ it "counts the users" do
18
+ get :index
19
+ expect(assigns[:presenter].users_count).to eq 2
20
+ end
17
21
 
18
22
  it 'allows an authorized user to view the page' do
19
23
  get :index
@@ -22,26 +26,26 @@ describe Admin::StatsController, type: :controller do
22
26
  expect(response.body).to include('Total Blacklight Users')
23
27
  end
24
28
 
25
- describe "querying user_stats" do
26
- let(:one_day_ago_date) { 1.days.ago.to_datetime }
29
+ describe "querying stats_filters" do
30
+ let(:one_day_ago_date) { 1.day.ago.to_datetime }
27
31
  let(:two_days_ago_date) { 2.days.ago.to_datetime.end_of_day }
28
32
  let(:one_day_ago) { one_day_ago_date.strftime("%Y-%m-%d") }
29
33
  let(:two_days_ago) { two_days_ago_date.strftime("%Y-%m-%d") }
30
34
 
31
35
  it "defaults to latest 5 users" do
32
36
  get :index
33
- expect(assigns[:recent_users]).to eq(User.order('created_at DESC').limit(5))
37
+ expect(assigns[:presenter].recent_users).to eq(User.order('created_at DESC').limit(5))
34
38
  end
35
- it "allows queries against user_stats without an end date " do
39
+ it "allows queries against stats_filters without an end date " do
36
40
  expect(User).to receive(:where).with('id' => user1.id).once.and_return([user1])
37
41
  expect(User).to receive(:recent_users).with(one_day_ago_date, nil).and_return([user2])
38
- get :index, users_stats: { start_date: one_day_ago }
39
- expect(assigns[:recent_users]).to eq([user2])
42
+ get :index, stats_filters: { start_date: one_day_ago }
43
+ expect(assigns[:presenter].recent_users).to eq([user2])
40
44
  end
41
- it "allows queries against user_stats with an end date" do
45
+ it "allows queries against stats_filters with an end date" do
42
46
  expect(User).to receive(:recent_users).with(two_days_ago_date, one_day_ago_date).and_return([user2])
43
- get :index, users_stats: { start_date: two_days_ago, end_date: one_day_ago }
44
- expect(assigns[:recent_users]).to eq([user2])
47
+ get :index, stats_filters: { start_date: two_days_ago, end_date: one_day_ago }
48
+ expect(assigns[:presenter].recent_users).to eq([user2])
45
49
  end
46
50
  end
47
51
 
@@ -56,7 +60,7 @@ describe Admin::StatsController, type: :controller do
56
60
  end
57
61
  it "provides accurate files_count, ensuring that solr deletes have been expunged first" do
58
62
  get :index
59
- expect(assigns[:files_count][:total]).to eq(original_files_count - 1)
63
+ expect(assigns[:presenter].files_count[:total]).to eq(original_files_count - 1)
60
64
  end
61
65
  end
62
66
 
@@ -72,28 +76,28 @@ describe Admin::StatsController, type: :controller do
72
76
  end
73
77
  it "includes files but not collections" do
74
78
  get :index
75
- expect(assigns[:files_count][:total]).to eq(3)
76
- expect(assigns[:files_count][:public]).to eq(1)
77
- expect(assigns[:files_count][:registered]).to eq(1)
78
- expect(assigns[:files_count][:private]).to eq(1)
79
+ expect(assigns[:presenter].files_count[:total]).to eq(3)
80
+ expect(assigns[:presenter].files_count[:public]).to eq(1)
81
+ expect(assigns[:presenter].files_count[:registered]).to eq(1)
82
+ expect(assigns[:presenter].files_count[:private]).to eq(1)
79
83
  end
80
84
  end
81
85
 
82
86
  context "when start date set" do
83
87
  it "queries by start date" do
84
- expect(GenericFile).to receive(:find_by_date_created).exactly(3).times.with(1.days.ago.to_datetime, nil).and_call_original
88
+ expect(GenericFile).to receive(:find_by_date_created).exactly(3).times.with(1.day.ago.to_datetime, nil).and_call_original
85
89
  expect(GenericFile).to receive(:where_public).and_call_original
86
90
  expect(GenericFile).to receive(:where_registered).and_call_original
87
- get :index, users_stats: { file_start_date: 1.days.ago.strftime("%Y-%m-%d") }
91
+ get :index, stats_filters: { start_date: 1.day.ago.strftime("%Y-%m-%d") }
88
92
  end
89
93
  end
90
94
 
91
95
  context "when date range set" do
92
96
  it "queries by start and date" do
93
- expect(GenericFile).to receive(:find_by_date_created).exactly(3).times.with(1.days.ago.to_datetime, 0.days.ago.to_datetime.end_of_day).and_call_original
97
+ expect(GenericFile).to receive(:find_by_date_created).exactly(3).times.with(1.day.ago.to_datetime, 0.days.ago.to_datetime.end_of_day).and_call_original
94
98
  expect(GenericFile).to receive(:where_public).and_call_original
95
99
  expect(GenericFile).to receive(:where_registered).and_call_original
96
- get :index, users_stats: { file_start_date: 1.days.ago.strftime("%Y-%m-%d"), file_end_date: 0.days.ago.strftime("%Y-%m-%d") }
100
+ get :index, stats_filters: { start_date: 1.day.ago.strftime("%Y-%m-%d"), end_date: 0.days.ago.strftime("%Y-%m-%d") }
97
101
  end
98
102
  end
99
103
  end
@@ -121,12 +125,13 @@ describe Admin::StatsController, type: :controller do
121
125
 
122
126
  it "gathers user deposits" do
123
127
  get :index
124
- expect(assigns[:depositors]).to include({ key: user1.user_key, deposits: 2, user: user1 }, key: user2.user_key, deposits: 1, user: user2)
128
+ expect(assigns[:presenter].depositors).to include({ key: user1.user_key, deposits: 2, user: user1 }, key: user2.user_key, deposits: 1, user: user2)
129
+ expect(assigns[:presenter].active_users).to eq("example.com" => 4, user1.user_key.split('@')[0] => 3, user2.user_key.split('@')[0] => 1)
125
130
  end
126
131
 
127
132
  it "gathers user deposits during a date range" do
128
- get :index, deposit_stats: { start_date: 1.days.ago.strftime("%Y-%m-%d"), end_date: 0.days.ago.strftime("%Y-%m-%d") }
129
- expect(assigns[:depositors]).to include({ key: user1.user_key, deposits: 1, user: user1 }, key: user2.user_key, deposits: 1, user: user2)
133
+ get :index, stats_filters: { start_date: 1.day.ago.strftime("%Y-%m-%d"), end_date: 0.days.ago.strftime("%Y-%m-%d") }
134
+ expect(assigns[:presenter].depositors).to include({ key: user1.user_key, deposits: 1, user: user1 }, key: user2.user_key, deposits: 1, user: user2)
130
135
  end
131
136
 
132
137
  context "more than 10 users" do
@@ -144,10 +149,35 @@ describe Admin::StatsController, type: :controller do
144
149
 
145
150
  it "gathers user deposits" do
146
151
  get :index
147
- expect(assigns[:depositors]).to include({ key: user1.user_key, deposits: 2, user: user1 }, key: user2.user_key, deposits: 1, user: user2)
148
- users.each { |user| expect(assigns[:depositors]).to include(key: user.user_key, deposits: 1, user: user) }
152
+ expect(assigns[:presenter].depositors).to include({ key: user1.user_key, deposits: 2, user: user1 }, key: user2.user_key, deposits: 1, user: user2)
153
+ users.each { |user| expect(assigns[:presenter].depositors).to include(key: user.user_key, deposits: 1, user: user) }
149
154
  end
150
155
  end
151
156
  end
157
+ describe "top formats" do
158
+ before do
159
+ GenericFile.new(id: "abc123") do |gf|
160
+ gf.apply_depositor_metadata(user1)
161
+ gf.mime_type = 'image/png'
162
+ gf.update_index
163
+ end
164
+ GenericFile.new(id: "def123") do |gf|
165
+ gf.apply_depositor_metadata(user2)
166
+ gf.mime_type = 'image/png'
167
+ gf.update_index
168
+ end
169
+ GenericFile.new(id: "zzz123") do |gf|
170
+ gf.create_date = [2.days.ago]
171
+ gf.apply_depositor_metadata(user1)
172
+ gf.mime_type = 'image/jpeg'
173
+ gf.update_index
174
+ end
175
+ end
176
+
177
+ it "gathers formats" do
178
+ get :index
179
+ expect(assigns[:presenter].top_formats).to eq("png" => 2, "jpeg" => 1)
180
+ end
181
+ end
152
182
  end
153
183
  end
@@ -7,19 +7,25 @@ describe API::ItemsController, type: :controller do
7
7
  end
8
8
 
9
9
  let(:user) { FactoryGirl.find_or_create(:jill) }
10
+ let!(:default_file) do
11
+ GenericFile.create(title: ['Foo Bar']) do |gf|
12
+ gf.apply_depositor_metadata(user)
13
+ gf.arkivo_checksum = '6872d21557992f6ad1d07375f19fbfaf'
14
+ end
15
+ end
10
16
 
11
17
  context 'with an HTTP GET or HEAD' do
12
18
  before do
13
- post :create, format: :json, item: item
19
+ post :create, item, format: :json
14
20
  end
15
21
 
16
- let(:deposited_file) { GenericFile.where(label: item['file']['filename']).take }
17
22
  let(:token) { user.arkivo_token }
18
23
  let(:item) { FactoryGirl.json(:post_item, token: token) }
24
+ let(:item_hash) { JSON.parse(item) }
19
25
 
20
26
  context 'with a missing token' do
21
27
  before do
22
- get :show, format: :json, id: deposited_file.id
28
+ get :show, format: :json, id: default_file.id
23
29
  end
24
30
 
25
31
  subject { response }
@@ -33,7 +39,7 @@ describe API::ItemsController, type: :controller do
33
39
 
34
40
  context 'with an unfamiliar token' do
35
41
  before do
36
- get :show, format: :json, id: deposited_file.id, token: get_token
42
+ get :show, format: :json, id: default_file.id, token: get_token
37
43
  end
38
44
 
39
45
  let(:get_token) { 'foobar' }
@@ -49,8 +55,8 @@ describe API::ItemsController, type: :controller do
49
55
 
50
56
  context 'with an unauthorized resource' do
51
57
  before do
52
- allow_any_instance_of(User).to receive(:can?).with(:edit, deposited_file) { false }
53
- get :show, format: :json, id: deposited_file.id, token: token
58
+ allow_any_instance_of(User).to receive(:can?).with(:edit, default_file) { false }
59
+ get :show, format: :json, id: default_file.id, token: token
54
60
  end
55
61
 
56
62
  subject { response }
@@ -58,18 +64,18 @@ describe API::ItemsController, type: :controller do
58
64
  it { is_expected.to have_http_status(401) }
59
65
 
60
66
  it 'loads the file' do
61
- expect(assigns[:file]).to eq deposited_file
67
+ expect(assigns[:file]).to eq default_file
62
68
  end
63
69
 
64
70
  it 'provides a reason for refusing to act' do
65
- expect(subject.body).to include("#{user} lacks access to #{deposited_file}")
71
+ expect(subject.body).to include("#{user} lacks access to #{default_file}")
66
72
  end
67
73
  end
68
74
 
69
75
  context 'with a resource not deposited via Arkivo' do
70
76
  before do
71
77
  allow_any_instance_of(GenericFile).to receive(:arkivo_checksum) { nil }
72
- get :show, format: :json, id: deposited_file.id, token: token
78
+ get :show, format: :json, id: default_file.id, token: token
73
79
  end
74
80
 
75
81
  subject { response }
@@ -77,14 +83,14 @@ describe API::ItemsController, type: :controller do
77
83
  it { is_expected.to have_http_status(403) }
78
84
 
79
85
  it 'provides a reason for refusing to act' do
80
- expect(subject.body).to include("Forbidden: #{deposited_file} not deposited via Arkivo")
86
+ expect(subject.body).to include("Forbidden: #{default_file} not deposited via Arkivo")
81
87
  end
82
88
  end
83
89
 
84
90
  context 'with a resource not found in the repository' do
85
91
  before do
86
- allow(GenericFile).to receive(:find).with(deposited_file.id).and_raise(ActiveFedora::ObjectNotFoundError)
87
- get :show, format: :json, id: deposited_file.id, token: token
92
+ allow(GenericFile).to receive(:find).with(default_file.id).and_raise(ActiveFedora::ObjectNotFoundError)
93
+ get :show, format: :json, id: default_file.id, token: token
88
94
  end
89
95
 
90
96
  subject { response }
@@ -92,13 +98,13 @@ describe API::ItemsController, type: :controller do
92
98
  it { is_expected.to have_http_status(404) }
93
99
 
94
100
  it 'provides a reason for refusing to act' do
95
- expect(subject.body).to include("id '#{deposited_file.id}' not found")
101
+ expect(subject.body).to include("id '#{default_file.id}' not found")
96
102
  end
97
103
  end
98
104
 
99
105
  context 'with an authorized Arkivo-deposited resource' do
100
106
  before do
101
- get :show, format: :json, id: deposited_file.id, token: token
107
+ get :show, format: :json, id: default_file.id, token: token
102
108
  end
103
109
 
104
110
  subject { response }
@@ -128,7 +134,7 @@ describe API::ItemsController, type: :controller do
128
134
 
129
135
  context 'with an invalid item' do
130
136
  before do
131
- post :create, format: :json, item: item
137
+ post :create, item, format: :json
132
138
  end
133
139
 
134
140
  let(:item) { { foo: 'bar' }.to_json }
@@ -144,10 +150,10 @@ describe API::ItemsController, type: :controller do
144
150
 
145
151
  context 'with a valid item and matching token' do
146
152
  before do
147
- expect { post :create, format: :json, item: item }.to change { GenericFile.count }.by(1)
153
+ expect { post :create, item, format: :json }.to change { GenericFile.count }.by(1)
148
154
  end
149
155
 
150
- let(:deposited_file) { GenericFile.where(label: item['file']['filename']).take }
156
+ let!(:deposited_file) { GenericFile.where(label: item_hash['file']['filename']).take }
151
157
  let(:token) { user.arkivo_token }
152
158
  let(:item) { FactoryGirl.json(:post_item, token: token) }
153
159
  let(:item_hash) { JSON.parse(item) }
@@ -195,7 +201,7 @@ describe API::ItemsController, type: :controller do
195
201
 
196
202
  context 'with a valid item and unfamiliar token' do
197
203
  before do
198
- post :create, format: :json, item: item
204
+ post :create, item, format: :json
199
205
  end
200
206
 
201
207
  let(:token) { 'unfamiliar_token' }
@@ -216,21 +222,21 @@ describe API::ItemsController, type: :controller do
216
222
  end
217
223
 
218
224
  context 'with an HTTP PUT' do
219
- let(:post_deposited_file) { GenericFile.where(label: post_item['file']['filename']).take }
225
+ let(:post_deposited_file) { GenericFile.where(label: post_item_hash['file']['filename']).take }
220
226
  let(:post_token) { user.arkivo_token }
221
227
  let(:post_item) { FactoryGirl.json(:post_item, token: post_token) }
222
228
  let(:post_item_hash) { JSON.parse(post_item) }
223
229
 
224
230
  before do
225
- expect { post :create, format: :json, item: post_item }.to change { GenericFile.count }.by(1)
231
+ expect { post :create, post_item, format: :json }.to change { GenericFile.count }.by(1)
226
232
  end
227
233
 
228
234
  context 'with a valid item, matching token, and authorized resource' do
229
235
  before do
230
- put :update, id: post_deposited_file.id, format: :json, item: put_item
236
+ put :update, put_item, id: post_deposited_file.id, format: :json
231
237
  end
232
238
 
233
- let(:put_deposited_file) { GenericFile.where(label: put_item['file']['filename']).take }
239
+ let(:put_deposited_file) { post_deposited_file.reload }
234
240
  let(:put_token) { user.arkivo_token }
235
241
  let(:put_item) { FactoryGirl.json(:put_item, token: put_token) }
236
242
  let(:put_item_hash) { JSON.parse(put_item) }
@@ -272,7 +278,7 @@ describe API::ItemsController, type: :controller do
272
278
  context 'with a valid item, matching token, authorized resource, but not Arkivo-deposited' do
273
279
  before do
274
280
  allow_any_instance_of(GenericFile).to receive(:arkivo_checksum) { nil }
275
- put :update, id: post_deposited_file.id, format: :json, item: item
281
+ put :update, item, id: post_deposited_file.id, format: :json
276
282
  end
277
283
 
278
284
  let(:item) { FactoryGirl.json(:put_item, token: post_token) }
@@ -295,7 +301,7 @@ describe API::ItemsController, type: :controller do
295
301
  allow(GenericFile).to receive(:find).with(post_deposited_file.id) do
296
302
  raise(ActiveFedora::ObjectNotFoundError)
297
303
  end
298
- put :update, id: post_deposited_file.id, format: :json, item: item
304
+ put :update, item, id: post_deposited_file.id, format: :json
299
305
  end
300
306
 
301
307
  subject { response }
@@ -311,7 +317,7 @@ describe API::ItemsController, type: :controller do
311
317
  context 'with a valid item, matching token, and unauthorized resource' do
312
318
  before do
313
319
  allow_any_instance_of(User).to receive(:can?).with(:edit, post_deposited_file) { false }
314
- put :update, id: post_deposited_file.id, format: :json, item: item
320
+ put :update, item, id: post_deposited_file.id, format: :json
315
321
  end
316
322
 
317
323
  let(:item) { FactoryGirl.json(:put_item, token: post_token) }
@@ -335,7 +341,7 @@ describe API::ItemsController, type: :controller do
335
341
 
336
342
  context 'with a valid item and unfamiliar token' do
337
343
  before do
338
- put :update, id: post_deposited_file.id, format: :json, item: item
344
+ put :update, item, id: post_deposited_file.id, format: :json
339
345
  end
340
346
 
341
347
  let(:token) { 'unfamiliar_token' }
@@ -356,7 +362,7 @@ describe API::ItemsController, type: :controller do
356
362
 
357
363
  context 'with an invalid item' do
358
364
  before do
359
- put :update, id: post_deposited_file.id, format: :json, item: item
365
+ put :update, item, id: post_deposited_file.id, format: :json
360
366
  end
361
367
 
362
368
  let(:item) { { foo: 'bar' }.to_json }
@@ -373,16 +379,16 @@ describe API::ItemsController, type: :controller do
373
379
 
374
380
  context 'with an HTTP DELETE' do
375
381
  before do
376
- post :create, format: :json, item: item
382
+ post :create, item, format: :json
377
383
  end
378
384
 
379
- let(:deposited_file) { GenericFile.where(label: item['file']['filename']).take }
380
385
  let(:token) { user.arkivo_token }
381
386
  let(:item) { FactoryGirl.json(:post_item, token: token) }
387
+ let(:item_hash) { JSON.parse(item) }
382
388
 
383
389
  context 'with a missing token' do
384
390
  before do
385
- delete :destroy, format: :json, id: deposited_file.id
391
+ delete :destroy, format: :json, id: default_file.id
386
392
  end
387
393
 
388
394
  subject { response }
@@ -396,7 +402,7 @@ describe API::ItemsController, type: :controller do
396
402
 
397
403
  context 'with an unfamiliar token' do
398
404
  before do
399
- delete :destroy, format: :json, id: deposited_file.id, token: delete_token
405
+ delete :destroy, format: :json, id: default_file.id, token: delete_token
400
406
  end
401
407
 
402
408
  let(:delete_token) { 'foobar' }
@@ -412,8 +418,8 @@ describe API::ItemsController, type: :controller do
412
418
 
413
419
  context 'with an unauthorized resource' do
414
420
  before do
415
- allow_any_instance_of(User).to receive(:can?).with(:edit, deposited_file) { false }
416
- delete :destroy, format: :json, id: deposited_file.id, token: token
421
+ allow_any_instance_of(User).to receive(:can?).with(:edit, default_file) { false }
422
+ delete :destroy, format: :json, id: default_file.id, token: token
417
423
  end
418
424
 
419
425
  subject { response }
@@ -421,18 +427,18 @@ describe API::ItemsController, type: :controller do
421
427
  it { is_expected.to have_http_status(401) }
422
428
 
423
429
  it 'loads the file' do
424
- expect(assigns[:file]).to eq deposited_file
430
+ expect(assigns[:file]).to eq default_file
425
431
  end
426
432
 
427
433
  it 'provides a reason for refusing to act' do
428
- expect(subject.body).to include("#{user} lacks access to #{deposited_file}")
434
+ expect(subject.body).to include("#{user} lacks access to #{default_file}")
429
435
  end
430
436
  end
431
437
 
432
438
  context 'with a resource not deposited via Arkivo' do
433
439
  before do
434
440
  allow_any_instance_of(GenericFile).to receive(:arkivo_checksum) { nil }
435
- delete :destroy, format: :json, id: deposited_file.id, token: token
441
+ delete :destroy, format: :json, id: default_file.id, token: token
436
442
  end
437
443
 
438
444
  subject { response }
@@ -440,14 +446,14 @@ describe API::ItemsController, type: :controller do
440
446
  it { is_expected.to have_http_status(403) }
441
447
 
442
448
  it 'provides a reason for refusing to act' do
443
- expect(subject.body).to include("Forbidden: #{deposited_file} not deposited via Arkivo")
449
+ expect(subject.body).to include("Forbidden: #{default_file} not deposited via Arkivo")
444
450
  end
445
451
  end
446
452
 
447
453
  context 'with a resource not found in the repository' do
448
454
  before do
449
- allow(GenericFile).to receive(:find).with(deposited_file.id).and_raise(ActiveFedora::ObjectNotFoundError)
450
- delete :destroy, format: :json, id: deposited_file.id, token: token
455
+ allow(GenericFile).to receive(:find).with(default_file.id).and_raise(ActiveFedora::ObjectNotFoundError)
456
+ delete :destroy, format: :json, id: default_file.id, token: token
451
457
  end
452
458
 
453
459
  subject { response }
@@ -455,13 +461,13 @@ describe API::ItemsController, type: :controller do
455
461
  it { is_expected.to have_http_status(404) }
456
462
 
457
463
  it 'provides a reason for refusing to act' do
458
- expect(subject.body).to include("id '#{deposited_file.id}' not found")
464
+ expect(subject.body).to include("id '#{default_file.id}' not found")
459
465
  end
460
466
  end
461
467
 
462
468
  context 'with an authorized Arkivo-deposited resource' do
463
469
  before do
464
- expect { delete :destroy, format: :json, id: deposited_file.id, token: token }.to change { GenericFile.count }.by(-1)
470
+ expect { delete :destroy, format: :json, id: default_file.id, token: token }.to change { GenericFile.count }.by(-1)
465
471
  end
466
472
 
467
473
  subject { response }