sufia 6.3.0 → 6.4.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 (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 }