curation_concerns 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (155) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +8 -0
  4. data/Gemfile +1 -2
  5. data/README.md +1 -1
  6. data/Rakefile +1 -1
  7. data/VERSION +1 -1
  8. data/app/assets/javascripts/curation_concerns/curation_concerns.js +2 -0
  9. data/app/assets/javascripts/curation_concerns/uploader.js +4 -4
  10. data/app/assets/stylesheets/curation_concerns/_modules.scss +1 -0
  11. data/app/assets/stylesheets/curation_concerns/_positioning.scss +3 -0
  12. data/app/assets/stylesheets/curation_concerns/modules/icons.scss +11 -0
  13. data/app/controllers/concerns/curation_concerns/api.rb +1 -12
  14. data/app/controllers/concerns/curation_concerns/application_controller_behavior.rb +20 -6
  15. data/app/controllers/concerns/curation_concerns/curation_concern_controller.rb +44 -25
  16. data/app/controllers/concerns/curation_concerns/file_sets_controller_behavior.rb +32 -23
  17. data/app/controllers/concerns/curation_concerns/parent_container.rb +0 -11
  18. data/app/controllers/concerns/curation_concerns/single_use_links_controller_behavior.rb +1 -1
  19. data/app/controllers/concerns/curation_concerns/single_use_links_viewer_controller_behavior.rb +7 -1
  20. data/app/controllers/concerns/curation_concerns/upload_sets_controller_behavior.rb +19 -7
  21. data/app/controllers/curation_concerns/permissions_controller.rb +1 -1
  22. data/app/forms/curation_concerns/forms/collection_edit_form.rb +6 -2
  23. data/app/forms/curation_concerns/forms/work_form.rb +14 -3
  24. data/app/forms/curation_concerns/upload_set_form.rb +43 -0
  25. data/app/helpers/curation_concerns/ability_helper.rb +12 -18
  26. data/app/helpers/curation_concerns/file_set_helper.rb +1 -1
  27. data/app/helpers/curation_concerns/main_app_helpers.rb +1 -0
  28. data/app/helpers/curation_concerns/permissions_helper.rb +20 -0
  29. data/app/helpers/curation_concerns/url_helper.rb +3 -11
  30. data/app/inputs/multi_value_with_help_input.rb +8 -0
  31. data/app/inputs/select_with_help_input.rb +3 -0
  32. data/app/inputs/select_with_modal_help_input.rb +36 -0
  33. data/app/inputs/with_help_icon.rb +34 -0
  34. data/app/presenters/curation_concerns/collection_presenter.rb +9 -0
  35. data/app/presenters/curation_concerns/file_set_presenter.rb +2 -1
  36. data/app/presenters/curation_concerns/presents_attributes.rb +16 -0
  37. data/app/presenters/curation_concerns/work_show_presenter.rb +3 -2
  38. data/app/renderers/curation_concerns/attribute_renderer.rb +22 -4
  39. data/app/renderers/curation_concerns/configured_microdata.rb +40 -0
  40. data/app/services/curation_concerns/parent_service.rb +1 -1
  41. data/app/views/catalog/_action_menu_partials/_default.html.erb +2 -2
  42. data/app/views/collections/_form.html.erb +8 -9
  43. data/app/views/collections/_sort_and_per_page.html.erb +25 -23
  44. data/app/views/collections/show.html.erb +1 -1
  45. data/app/views/curation_concerns/base/_attributes.html.erb +1 -1
  46. data/app/views/curation_concerns/base/_form.html.erb +6 -7
  47. data/app/views/curation_concerns/base/_form_permission.html.erb +3 -0
  48. data/app/views/curation_concerns/base/_multiple_upload.html.erb +3 -0
  49. data/app/views/curation_concerns/base/_show_actions.html.erb +2 -2
  50. data/app/views/curation_concerns/base/_versioning.html.erb +1 -1
  51. data/app/views/curation_concerns/base/_visibility.html.erb +17 -0
  52. data/app/views/curation_concerns/base/show.html.erb +1 -1
  53. data/app/views/curation_concerns/classify_concerns/new.html.erb +1 -1
  54. data/app/views/curation_concerns/file_sets/_actions.html.erb +2 -2
  55. data/app/views/curation_concerns/file_sets/_form.html.erb +1 -1
  56. data/app/views/curation_concerns/file_sets/_rights_modal.html.erb +41 -0
  57. data/app/views/curation_concerns/file_sets/media_display/_default.html.erb +4 -1
  58. data/app/views/curation_concerns/file_sets/media_display/_image.html.erb +9 -8
  59. data/app/views/curation_concerns/file_sets/media_display/_office_document.html.erb +9 -7
  60. data/app/views/curation_concerns/file_sets/media_display/_pdf.html.erb +7 -5
  61. data/app/views/curation_concerns/file_sets/show.html.erb +2 -2
  62. data/app/views/curation_concerns/file_sets/upload/_alerts.html.erb +3 -3
  63. data/app/views/curation_concerns/file_sets/upload/_form.html.erb +1 -1
  64. data/app/views/curation_concerns/file_sets/upload/_script_templates.html.erb +1 -1
  65. data/app/views/curation_concerns/permissions/confirm.html.erb +1 -1
  66. data/app/views/curation_concerns/single_use_links_viewer/show.html.erb +1 -1
  67. data/app/views/embargoes/edit.html.erb +4 -4
  68. data/app/views/layouts/curation_concerns.html.erb +1 -1
  69. data/app/views/leases/edit.html.erb +3 -3
  70. data/app/views/shared/_add_works.html.erb +6 -3
  71. data/app/views/upload_sets/_base_metadata.html.erb +12 -0
  72. data/app/views/upload_sets/_metadata.html.erb +3 -13
  73. data/app/views/upload_sets/edit.html.erb +1 -1
  74. data/config/locales/curation_concerns.en.yml +46 -0
  75. data/curation_concerns.gemspec +5 -4
  76. data/lib/curation_concerns/engine.rb +5 -0
  77. data/lib/curation_concerns/form_builder.rb +16 -0
  78. data/lib/curation_concerns/rails/routes.rb +7 -5
  79. data/lib/generators/curation_concerns/install_generator.rb +1 -1
  80. data/lib/generators/curation_concerns/work/work_generator.rb +1 -1
  81. data/spec/actors/curation_concerns/file_set_actor_spec.rb +26 -16
  82. data/spec/controllers/curation_concerns/file_sets_controller_json_spec.rb +14 -4
  83. data/spec/controllers/curation_concerns/file_sets_controller_spec.rb +3 -3
  84. data/spec/controllers/curation_concerns/generic_works_controller_json_spec.rb +4 -4
  85. data/spec/controllers/curation_concerns/generic_works_controller_spec.rb +21 -0
  86. data/spec/controllers/curation_concerns/single_use_links_controller_spec.rb +2 -2
  87. data/spec/controllers/curation_concerns/single_use_links_viewer_controller_spec.rb +1 -1
  88. data/spec/controllers/upload_sets_controller_spec.rb +20 -27
  89. data/spec/factories/file_sets.rb +1 -0
  90. data/spec/factories/generic_works.rb +1 -0
  91. data/spec/factories/users.rb +0 -12
  92. data/spec/features/collection_spec.rb +1 -3
  93. data/spec/forms/collection_edit_form_spec.rb +16 -1
  94. data/spec/forms/upload_set_form_spec.rb +55 -0
  95. data/spec/forms/work_form_spec.rb +68 -3
  96. data/spec/helpers/curation_concerns/ability_helper_spec.rb +45 -0
  97. data/spec/helpers/curation_concerns/permissions_helper_spec.rb +12 -0
  98. data/spec/helpers/url_helper_spec.rb +0 -3
  99. data/spec/indexers/collection_indexer_spec.rb +5 -0
  100. data/spec/indexers/{file_set_indexing_service_spec.rb → file_set_indexer_spec.rb} +40 -2
  101. data/spec/indexers/{generic_work_indexing_service_spec.rb → work_indexer_spec.rb} +1 -1
  102. data/spec/inputs/multi_value_with_help_input_spec.rb +32 -0
  103. data/spec/inputs/select_with_help_input_spec.rb +43 -0
  104. data/spec/inputs/select_with_modal_help_input_spec.rb +21 -0
  105. data/spec/jobs/import_url_job_spec.rb +33 -1
  106. data/spec/jobs/ingest_file_job_spec.rb +29 -16
  107. data/spec/jobs/upload_set_update_job_spec.rb +24 -11
  108. data/spec/lib/curation_concerns/messages_spec.rb +2 -2
  109. data/spec/lib/curation_concerns/name_spec.rb +20 -0
  110. data/spec/lib/curation_concerns/null_logger_spec.rb +10 -0
  111. data/spec/models/curation_concerns/collection_behavior_spec.rb +41 -10
  112. data/spec/models/curation_concerns/work_behavior_spec.rb +1 -13
  113. data/spec/models/file_set_spec.rb +19 -4
  114. data/spec/models/generic_work_spec.rb +7 -2
  115. data/spec/models/quick_classification_query_spec.rb +35 -0
  116. data/spec/models/upload_set_spec.rb +5 -7
  117. data/spec/presenters/curation_concerns/collection_presenter_spec.rb +20 -0
  118. data/spec/presenters/curation_concerns/file_set_presenter_spec.rb +10 -3
  119. data/spec/presenters/curation_concerns/work_show_presenter_spec.rb +13 -1
  120. data/spec/renderers/curation_concerns/attribute_renderer_spec.rb +41 -8
  121. data/spec/routing/curation_concerns/routes_spec.rb +2 -2
  122. data/spec/routing/route_spec.rb +1 -1
  123. data/spec/services/file_set_audit_service_spec.rb +46 -4
  124. data/spec/spec_helper.rb +5 -7
  125. data/spec/views/collections/_sort_and_per_page.html.erb_spec.rb +32 -0
  126. data/spec/views/curation_concerns/base/_attributes.html.erb_spec.rb +8 -1
  127. data/spec/views/curation_concerns/base/show.html.erb_spec.rb +36 -2
  128. data/spec/views/curation_concerns/file_sets/_file_set.html.erb_spec.rb +3 -2
  129. data/spec/views/curation_concerns/file_sets/show.html.erb_spec.rb +56 -0
  130. data/spec/views/curation_concerns/single_use_links_viewer/show.html.erb_spec.rb +19 -0
  131. data/spec/views/shared/_add_content.html.erb_spec.rb +3 -3
  132. data/spec/views/single_use_links/new_download.html.erb_spec.rb +1 -1
  133. data/spec/views/upload_sets/_metadata.html.erb_spec.rb +28 -0
  134. metadata +80 -50
  135. data/app/assets/stylesheets/curation_concerns/help_requests.scss +0 -3
  136. data/app/controllers/concerns/curation_concerns/without_namespace.rb +0 -16
  137. data/app/controllers/registrations_controller.rb +0 -19
  138. data/app/controllers/sessions_controller.rb +0 -4
  139. data/app/views/curation_concerns/file_sets/_multiple_upload.html.erb +0 -3
  140. data/spec/fixtures/Example.ogg +0 -0
  141. data/spec/fixtures/charter.docx +0 -0
  142. data/spec/fixtures/countdown.avi +0 -0
  143. data/spec/fixtures/curation_concerns_generic_stub.txt +0 -1
  144. data/spec/fixtures/empty_file.txt +0 -0
  145. data/spec/fixtures/files/image.png +0 -0
  146. data/spec/fixtures/image.jp2 +0 -0
  147. data/spec/fixtures/image.jpg +0 -0
  148. data/spec/fixtures/piano_note.wav +0 -0
  149. data/spec/fixtures/sample_mpeg4.mp4 +0 -0
  150. data/spec/fixtures/small_file.txt +0 -1
  151. data/spec/fixtures/spoken-text.m4a +0 -0
  152. data/spec/fixtures/test.pdf +0 -0
  153. data/spec/fixtures/test4.pdf +0 -0
  154. data/spec/fixtures/test5.mp3 +0 -0
  155. data/spec/fixtures/world.png +0 -0
@@ -24,6 +24,7 @@ describe CurationConcerns::FileSetsController do
24
24
  end
25
25
  it { is_expected.to respond_unauthorized }
26
26
  end
27
+
27
28
  describe "forbidden" do
28
29
  before do
29
30
  sign_in create(:user)
@@ -31,14 +32,15 @@ describe CurationConcerns::FileSetsController do
31
32
  end
32
33
  it { is_expected.to respond_forbidden }
33
34
  end
35
+
34
36
  describe 'not found' do
35
37
  before { get :show, id: "non-existent-pid", format: :json }
36
- it { is_expected.to respond_not_found(description: 'Object non-existent-pid not found in solr') }
38
+ it { is_expected.to respond_not_found(description: 'Could not find a resource that matches your request.') }
37
39
  end
38
40
 
39
41
  describe 'created' do
40
42
  it "returns 201, renders jq_upload json template and sets location header" do
41
- expect(controller.send(:actor)).to receive(:create_metadata).with(nil, parent, hash_including(:files, title: ['a title']))
43
+ expect(controller.send(:actor)).to receive(:create_metadata).with(parent, hash_including(:files, title: ['a title']))
42
44
  expect(controller.send(:actor)).to receive(:create_content).with(file).and_return(true)
43
45
 
44
46
  allow_any_instance_of(FileSet).to receive(:persisted?).and_return(true)
@@ -53,25 +55,31 @@ describe CurationConcerns::FileSetsController do
53
55
  expect(response.location).to eq main_app.curation_concerns_file_set_path(created_resource)
54
56
  end
55
57
  end
58
+
56
59
  describe 'failed create: no file' do
57
60
  before { post :create, file_set: { title: ["foo"] }, parent_id: parent.id, format: :json }
58
61
  it { is_expected.to respond_bad_request(message: 'Error! No file to save') }
59
62
  end
63
+
60
64
  describe 'failed create: bad file' do
61
65
  before { post :create, file_set: { files: ['not a file'] }, parent_id: parent.id, format: :json }
62
66
  it { is_expected.to respond_bad_request(message: 'Error! No file for upload', description: 'unknown file') }
63
67
  end
68
+
64
69
  describe 'failed create: empty file' do
65
70
  before { post :create, file_set: { files: [empty_file] }, parent_id: parent.id, format: :json }
66
71
  it { is_expected.to respond_unprocessable_entity(errors: { files: "#{empty_file.original_filename} has no content! (Zero length file)" }, description: I18n.t('curation_concerns.api.unprocessable_entity.empty_file')) }
67
72
  end
73
+
68
74
  describe 'failed create: solr error' do
69
75
  before do
70
76
  allow(controller).to receive(:process_file).and_raise(RSolr::Error::Http.new(controller.request, response))
71
77
  post :create, file_set: { files: [file] }, parent_id: parent.id, format: :json
72
78
  end
73
- it { is_expected.to respond_internal_error(message: 'Error occurred while creating generic file.') }
79
+
80
+ it { is_expected.to respond_internal_error(message: 'Error occurred while creating a FileSet.') }
74
81
  end
82
+
75
83
  describe 'found' do
76
84
  before { resource_request }
77
85
  it "returns json of the work" do
@@ -80,6 +88,7 @@ describe CurationConcerns::FileSetsController do
80
88
  expect(response.code).to eq "200"
81
89
  end
82
90
  end
91
+
83
92
  describe 'updated' do
84
93
  before { put :update, id: resource, file_set: { title: ['updated title'] }, format: :json }
85
94
  it "returns json of updated work and sets location header" do
@@ -90,6 +99,7 @@ describe CurationConcerns::FileSetsController do
90
99
  expect(response.location).to eq main_app.curation_concerns_file_set_path(created_resource)
91
100
  end
92
101
  end
102
+
93
103
  describe 'failed update' do
94
104
  before {
95
105
  expect(controller).to receive(:update_metadata) do
@@ -99,7 +109,7 @@ describe CurationConcerns::FileSetsController do
99
109
  post :update, id: resource, file_set: { title: nil, depositor: nil }, format: :json
100
110
  }
101
111
  it "returns 422 and the errors" do
102
- expect(response).to respond_unprocessable_entity(errors: { "some_field": ["This is not valid. Fix it."] })
112
+ expect(response).to respond_unprocessable_entity(errors: { some_field: ["This is not valid. Fix it."] })
103
113
  end
104
114
  end
105
115
  end
@@ -21,7 +21,7 @@ describe CurationConcerns::FileSetsController do
21
21
  end
22
22
 
23
23
  it 'calls the actor to create metadata and content' do
24
- expect(controller.send(:actor)).to receive(:create_metadata).with(nil, parent, files: [file], title: ['test title'], visibility: 'restricted')
24
+ expect(controller.send(:actor)).to receive(:create_metadata).with(parent, files: [file], title: ['test title'], visibility: 'restricted')
25
25
  expect(controller.send(:actor)).to receive(:create_content).with(file).and_return(true)
26
26
  xhr :post, :create, parent_id: parent,
27
27
  file_set: { files: [file],
@@ -68,7 +68,7 @@ describe CurationConcerns::FileSetsController do
68
68
  it 'errors out of create after on continuous rsolr error' do
69
69
  xhr :post, :create, parent_id: parent, file_set: { files: [file] },
70
70
  permission: { group: { 'public' => 'read' } }, terms_of_service: '1'
71
- expect(response.body).to include('Error occurred while creating generic file.')
71
+ expect(response.body).to include('Error occurred while creating a FileSet.')
72
72
  end
73
73
  end
74
74
  end
@@ -121,6 +121,7 @@ describe CurationConcerns::FileSetsController do
121
121
  { title: ['new_title'], tag: [''], permissions_attributes: [{ type: 'person', name: 'archivist1', access: 'edit' }] }
122
122
  expect(response.status).to eq 422
123
123
  expect(response).to render_template('edit')
124
+ expect(assigns[:groups]).to be_kind_of Array
124
125
  expect(assigns[:file_set]).to eq file_set
125
126
  end
126
127
 
@@ -221,7 +222,6 @@ describe CurationConcerns::FileSetsController do
221
222
  end
222
223
 
223
224
  it 'allows access to public files' do
224
- expect(controller).to receive(:additional_response_formats).with(ActionController::MimeResponds::Collector)
225
225
  get :show, id: public_file_set
226
226
  expect(response).to be_success
227
227
  end
@@ -36,7 +36,7 @@ describe CurationConcerns::GenericWorksController do
36
36
  before { post :create, generic_work: { title: ['a title'] }, format: :json }
37
37
  it "returns 201, renders show template sets location header" do
38
38
  # Ensure that @curation_concern is set for jbuilder template to use
39
- expect(assigns[:curation_concern]).to be_instance_of ::GenericWork
39
+ expect(assigns[:curation_concern]).to be_instance_of GenericWork
40
40
  expect(controller).to render_template('curation_concerns/base/show')
41
41
  expect(response.code).to eq "201"
42
42
  created_resource = assigns[:curation_concern]
@@ -56,7 +56,7 @@ describe CurationConcerns::GenericWorksController do
56
56
  before { resource_request }
57
57
  it "returns json of the work" do
58
58
  # Ensure that @curation_concern is set for jbuilder template to use
59
- expect(assigns[:curation_concern]).to be_instance_of ::GenericWork
59
+ expect(assigns[:curation_concern]).to be_instance_of GenericWork
60
60
  expect(controller).to render_template('curation_concerns/base/show')
61
61
  expect(response.code).to eq "200"
62
62
  end
@@ -66,7 +66,7 @@ describe CurationConcerns::GenericWorksController do
66
66
  before { put :update, id: resource, generic_work: { title: ['updated title'] }, format: :json }
67
67
  it "returns 200, renders show template sets location header" do
68
68
  # Ensure that @curation_concern is set for jbuilder template to use
69
- expect(assigns[:curation_concern]).to be_instance_of ::GenericWork
69
+ expect(assigns[:curation_concern]).to be_instance_of GenericWork
70
70
  expect(controller).to render_template('curation_concerns/base/show')
71
71
  expect(response.code).to eq "200"
72
72
  created_resource = assigns[:curation_concern]
@@ -78,7 +78,7 @@ describe CurationConcerns::GenericWorksController do
78
78
  before { post :update, id: resource, generic_work: { title: [] }, format: :json }
79
79
 
80
80
  it "returns 422 and the errors" do
81
- expect(response).to respond_unprocessable_entity(errors: { "title": ["Your work must have a title."] })
81
+ expect(response).to respond_unprocessable_entity(errors: { title: ["Your work must have a title."] })
82
82
  end
83
83
  end
84
84
  end
@@ -27,6 +27,7 @@ describe CurationConcerns::GenericWorksController do
27
27
  context 'someone elses public work' do
28
28
  let(:a_work) { create(:public_generic_work) }
29
29
  it 'shows me the page' do
30
+ expect(controller). to receive(:additional_response_formats).with(ActionController::MimeResponds::Collector)
30
31
  get :show, id: a_work
31
32
  expect(response).to be_success
32
33
  end
@@ -40,12 +41,22 @@ describe CurationConcerns::GenericWorksController do
40
41
  expect(response).to be_success
41
42
  end
42
43
  end
44
+
45
+ context 'when a ObjectNotFoundError is raised' do
46
+ it 'returns 404 page' do
47
+ allow(controller).to receive(:show).and_raise(ActiveFedora::ObjectNotFoundError)
48
+ get :show, id: 'abc123'
49
+ expect(response.status).to eq 404
50
+ expect(response.body).to match(/The page you were looking for doesn't exist/)
51
+ end
52
+ end
43
53
  end
44
54
 
45
55
  describe '#new' do
46
56
  context 'my work' do
47
57
  it 'shows me the page' do
48
58
  get :new
59
+ expect(assigns[:form]).to be_kind_of CurationConcerns::GenericWorkForm
49
60
  expect(response).to be_success
50
61
  end
51
62
  end
@@ -58,6 +69,16 @@ describe CurationConcerns::GenericWorksController do
58
69
  end.to change { GenericWork.count }.by(1)
59
70
  expect(response).to redirect_to main_app.curation_concerns_generic_work_path(assigns[:curation_concern])
60
71
  end
72
+
73
+ context 'when not authorized' do
74
+ before { allow(controller.current_ability).to receive(:can?).and_return(false) }
75
+
76
+ it 'shows the unauthorized message' do
77
+ post :create, generic_work: { title: ['a title'] }
78
+ expect(response.code).to eq '401'
79
+ expect(response).to render_template(:unauthorized)
80
+ end
81
+ end
61
82
  end
62
83
 
63
84
  describe '#edit' do
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe CurationConcerns::SingleUseLinksController, type: :controller do
4
4
  routes { CurationConcerns::Engine.routes }
5
- let(:user) { FactoryGirl.find_or_create(:jill) }
5
+ let(:user) { create(:user) }
6
6
 
7
7
  let(:file) do
8
8
  FileSet.create do |file|
@@ -38,7 +38,7 @@ describe CurationConcerns::SingleUseLinksController, type: :controller do
38
38
 
39
39
  describe "logged in user without edit permission" do
40
40
  before do
41
- @other_user = FactoryGirl.find_or_create(:archivist)
41
+ @other_user = create(:user)
42
42
  file.read_users << @other_user
43
43
  file.save
44
44
  sign_in @other_user
@@ -32,7 +32,7 @@ describe CurationConcerns::SingleUseLinksViewerController do
32
32
  let(:expected_content) { ActiveFedora::Base.find(file.id).original_file.content }
33
33
 
34
34
  it "and_return http success" do
35
- expect(controller).to receive(:send_file_headers!).with(filename: 'world.png', disposition: 'inline', type: 'image/png')
35
+ expect(controller).to receive(:send_file_headers!).with(filename: 'world.png', disposition: 'attachment', type: 'image/png')
36
36
  get :download, id: download_link_hash
37
37
  expect(response.body).to eq expected_content
38
38
  expect(response).to be_success
@@ -1,8 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe UploadSetsController do
4
- let(:user) { FactoryGirl.find_or_create(:jill) }
5
- let(:other_user) { FactoryGirl.find_or_create(:curator) }
4
+ let(:user) { create(:user) }
5
+ let(:other_user) { create(:user) }
6
6
  before do
7
7
  sign_in user
8
8
  allow_any_instance_of(User).to receive(:groups).and_return([])
@@ -14,7 +14,7 @@ describe UploadSetsController do
14
14
  it "enqueues a upload_set job and redirects to generic_works list with a flash message" do
15
15
  expect(UploadSetUpdateJob).to receive(:perform_later).with(user.user_key, upload_set.id, { '1' => 'foo' },
16
16
  { tag: [] }, 'open').once
17
- post :update, id: upload_set.id, title: { '1' => 'foo' }, visibility: 'open', file_set: { tag: [""] }
17
+ post :update, id: upload_set.id, title: { '1' => 'foo' }, visibility: 'open', upload_set: { tag: [""] }
18
18
  expect(response).to redirect_to routes.url_helpers.curation_concerns_generic_works_path
19
19
  expect(flash[:notice]).to include("Your files are being processed")
20
20
  end
@@ -22,55 +22,48 @@ describe UploadSetsController do
22
22
 
23
23
  describe "when user has edit permissions on a file" do
24
24
  # TODO: all these tests could move to upload_set_update_job_spec.rb
25
- let!(:file) { FileSet.create(upload_set: upload_set) { |f| f.apply_depositor_metadata(user) } }
25
+ let!(:work) { create(:generic_work, user: user, upload_set: upload_set) }
26
26
 
27
27
  it "they can set public read access" do
28
- post :update, id: upload_set, visibility: "open", file_set: { tag: [""] }
29
- expect(file.reload.read_groups).to eq ['public']
28
+ post :update, id: upload_set, visibility: "open", upload_set: { tag: [""] }
29
+ expect(work.reload.read_groups).to eq ['public']
30
30
  end
31
31
 
32
32
  it "they can set metadata like title" do
33
- post :update, id: upload_set, file_set: { tag: ["footag", "bartag"] }, title: { file.id => ["New Title"] }
34
- file.reload
35
- expect(file.title).to eq ["New Title"]
33
+ post :update, id: upload_set, upload_set: { tag: ["footag", "bartag"] }, title: { work.id => ["New Title"] }
34
+ work.reload
35
+ expect(work.title).to eq ["New Title"]
36
36
  # TODO: is order important?
37
- expect(file.tag).to include("footag", "bartag")
37
+ expect(work.tag).to include("footag", "bartag")
38
38
  end
39
39
 
40
40
  it "they cannot set any tags" do
41
- post :update, id: upload_set, file_set: { tag: [""] }
42
- expect(file.reload.tag).to be_empty
41
+ post :update, id: upload_set, upload_set: { tag: [""] }
42
+ expect(work.reload.tag).to be_empty
43
43
  end
44
44
  end
45
45
 
46
46
  describe "when user does not have edit permissions on a file" do
47
47
  # TODO: all these tests could move to upload_set_update_job_spec.rb
48
- let(:file) do
49
- FileSet.new(upload_set: upload_set, title: ['Original Title']) do |f|
50
- f.apply_depositor_metadata('someone_else')
51
- f.save!
52
- end
53
- end
48
+ let!(:work) { create(:generic_work, title: ['Original Title'], upload_set: upload_set) }
54
49
 
55
50
  it "they cannot modify the object" do
56
- post :update, id: upload_set, "file_set" => { "tag" => [""] },
57
- "title" => { file.id => "Title Wont Change" }
58
- file.reload
59
- expect(file.title).to eq ["Original Title"]
51
+ post :update, id: upload_set, upload_set: { "tag" => [""] },
52
+ title: { work.id => "Title Won't Change" }
53
+ work.reload
54
+ expect(work.title).to eq ["Original Title"]
60
55
  end
61
56
  end
62
57
  end
63
58
 
64
59
  describe "#edit" do
65
60
  let(:us1) { UploadSet.create }
66
- let!(:file) { FileSet.create(upload_set: us1, label: 'f1') { |f| f.apply_depositor_metadata(user) } }
67
- let!(:file2) { FileSet.create(upload_set: us1, label: 'f2') { |f| f.apply_depositor_metadata(user) } }
68
61
 
69
62
  it "sets up attributes for the form" do
70
63
  get :edit, id: us1
71
- expect(assigns[:form]).not_to be_persisted
72
- expect(assigns[:form].creator[0]).to eq user.user_key
73
- expect(assigns[:form].title[0]).to eq 'f1'
64
+ expect(assigns[:form]).to be_kind_of CurationConcerns::UploadSetForm
65
+ expect(assigns[:form].model).to eq us1
66
+ expect(response).to be_success
74
67
  end
75
68
  end
76
69
  end
@@ -24,6 +24,7 @@ FactoryGirl.define do
24
24
  FactoryGirl.create(:generic_work, user: evaluator.user).members << file
25
25
  end
26
26
  end
27
+
27
28
  after(:build) do |file, evaluator|
28
29
  file.apply_depositor_metadata(evaluator.user.user_key)
29
30
  end
@@ -26,6 +26,7 @@ FactoryGirl.define do
26
26
  factory :work_with_files do
27
27
  before(:create) { |work, evaluator| 2.times { work.ordered_members << FactoryGirl.create(:file_set, user: evaluator.user) } }
28
28
  end
29
+
29
30
  factory :work_with_ordered_files do
30
31
  before(:create) do |work, evaluator|
31
32
  work.ordered_members << FactoryGirl.create(:file_set, user: evaluator.user)
@@ -10,17 +10,5 @@ FactoryGirl.define do
10
10
  end
11
11
  end
12
12
  end
13
-
14
- factory :jill do
15
- email 'jilluser@example.com'
16
- end
17
-
18
- factory :archivist, aliases: [:user_with_fixtures] do
19
- email 'archivist1@example.com'
20
- end
21
-
22
- factory :curator do
23
- email 'curator1@example.com'
24
- end
25
13
  end
26
14
  end
@@ -21,10 +21,8 @@ describe 'collection' do
21
21
  let(:user_key) { user.user_key }
22
22
  let(:generic_works) do
23
23
  (0..12).map do |x|
24
- GenericWork.new.tap do |f|
25
- f.title = ["title #{x}"]
24
+ GenericWork.create!(title: ["title #{x}"]) do |f|
26
25
  f.apply_depositor_metadata('user1@example.com')
27
- f.save!
28
26
  end
29
27
  end
30
28
  end
@@ -9,10 +9,23 @@ describe CurationConcerns::Forms::CollectionEditForm do
9
9
  it do
10
10
  is_expected.to eq [:resource_type, :title, :creator, :contributor, :description,
11
11
  :tag, :rights, :publisher, :date_created, :subject, :language,
12
- :identifier, :based_near, :related_url, :visibility]
12
+ :representative_id, :thumbnail_id, :identifier, :based_near, :related_url, :visibility]
13
13
  end
14
14
  end
15
15
 
16
+ describe "#human_readable_type" do
17
+ subject { form.human_readable_type }
18
+ it { is_expected.to eq 'Collection' }
19
+ end
20
+
21
+ describe "#member_ids" do
22
+ before do
23
+ allow(collection).to receive(:member_ids).and_return(['9999'])
24
+ end
25
+ subject { form.member_ids }
26
+ it { is_expected.to eq ['9999'] }
27
+ end
28
+
16
29
  describe ".build_permitted_params" do
17
30
  subject { described_class.build_permitted_params }
18
31
  it { is_expected.to eq [{ resource_type: [] },
@@ -26,6 +39,8 @@ describe CurationConcerns::Forms::CollectionEditForm do
26
39
  { date_created: [] },
27
40
  { subject: [] },
28
41
  { language: [] },
42
+ :representative_id,
43
+ :thumbnail_id,
29
44
  { identifier: [] },
30
45
  { based_near: [] },
31
46
  { related_url: [] },
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe CurationConcerns::UploadSetForm do
4
+ let(:form) { described_class.new(upload_set, ability) }
5
+ let(:user) { build(:user) }
6
+ let(:ability) { Ability.new(user) }
7
+ let(:upload_set) { UploadSet.create }
8
+ let!(:work1) { create(:work, upload_set: upload_set) }
9
+ let!(:work2) { create(:work, upload_set: upload_set) }
10
+
11
+ describe "#to_param" do
12
+ subject { form.to_param }
13
+ it { is_expected.to eq upload_set.id }
14
+ end
15
+
16
+ describe "#terms" do
17
+ subject { form.terms }
18
+ it { is_expected.to eq [:title,
19
+ :creator,
20
+ :contributor,
21
+ :description,
22
+ :tag,
23
+ :rights,
24
+ :publisher,
25
+ :date_created,
26
+ :subject,
27
+ :language,
28
+ :identifier,
29
+ :based_near,
30
+ :related_url,
31
+ :representative_id,
32
+ :thumbnail_id,
33
+ :files,
34
+ :visibility_during_embargo,
35
+ :embargo_release_date,
36
+ :visibility_after_embargo,
37
+ :visibility_during_lease,
38
+ :lease_expiration_date,
39
+ :visibility_after_lease,
40
+ :visibility] }
41
+ end
42
+
43
+ describe "works" do
44
+ let!(:work1) { create(:work_with_one_file, upload_set: upload_set, title: ['B title']) }
45
+ let!(:work2) { create(:work_with_one_file, upload_set: upload_set, title: ['A title']) }
46
+ subject { form.works }
47
+ it { is_expected.to eq [work2, work1] }
48
+ end
49
+
50
+ describe "creator" do
51
+ let(:user) { build(:user, email: 'bob@example.com') }
52
+ subject { form.creator }
53
+ it { is_expected.to eq ['bob@example.com'] }
54
+ end
55
+ end
@@ -3,6 +3,7 @@ require 'spec_helper'
3
3
  describe CurationConcerns::Forms::WorkForm do
4
4
  before do
5
5
  class PirateShip < ActiveFedora::Base
6
+ include CurationConcerns::RequiredMetadata
6
7
  include CurationConcerns::BasicMetadata
7
8
  include CurationConcerns::HasRepresentative
8
9
  end
@@ -17,17 +18,25 @@ describe CurationConcerns::Forms::WorkForm do
17
18
  Object.send(:remove_const, :PirateShip)
18
19
  end
19
20
 
20
- let(:curation_concern) { create(:work_with_one_file) }
21
- let(:title) { curation_concern.file_sets.first.title.first }
22
- let(:file_id) { curation_concern.file_sets.first.id }
21
+ let(:curation_concern) { create(:work) }
23
22
  let(:ability) { nil }
24
23
  let(:form) { PirateShipForm.new(curation_concern, ability) }
25
24
 
26
25
  describe "#select_files" do
26
+ let(:curation_concern) { create(:work_with_one_file) }
27
+ let(:title) { curation_concern.file_sets.first.title.first }
28
+ let(:file_id) { curation_concern.file_sets.first.id }
29
+
27
30
  subject { form.select_files }
28
31
  it { is_expected.to eq(title => file_id) }
29
32
  end
30
33
 
34
+ describe "#[]" do
35
+ it 'has one element' do
36
+ expect(form['description']).to eq ['']
37
+ end
38
+ end
39
+
31
40
  describe '.model_attributes' do
32
41
  let(:params) { ActionController::Parameters.new(
33
42
  title: ['foo'],
@@ -36,6 +45,7 @@ describe CurationConcerns::Forms::WorkForm do
36
45
  admin_set_id: '123',
37
46
  representative_id: '456',
38
47
  thumbnail_id: '789',
48
+ tag: ['derp'],
39
49
  rights: 'http://creativecommons.org/licenses/by/3.0/us/')
40
50
  }
41
51
  subject { PirateShipForm.model_attributes(params) }
@@ -45,10 +55,65 @@ describe CurationConcerns::Forms::WorkForm do
45
55
  expect(subject['description']).to be_empty
46
56
  expect(subject['visibility']).to eq 'open'
47
57
  expect(subject['rights']).to eq ['http://creativecommons.org/licenses/by/3.0/us/']
58
+ expect(subject['tag']).to eq ['derp']
48
59
  end
49
60
 
50
61
  it 'excludes non-permitted params' do
51
62
  expect(subject).not_to have_key 'admin_set_id'
52
63
  end
53
64
  end
65
+
66
+ describe "initialized fields" do
67
+ context "for :description" do
68
+ subject { form[:description] }
69
+ it { is_expected.to eq [''] }
70
+ end
71
+
72
+ context "for :embargo_release_date" do
73
+ subject { form[:embargo_release_date] }
74
+ it { is_expected.to be nil }
75
+ end
76
+ end
77
+
78
+ describe '#human_readable_type' do
79
+ subject { form.human_readable_type }
80
+ it { is_expected.to eq 'Generic Work' }
81
+ end
82
+
83
+ describe "#open_access?" do
84
+ subject { form.open_access? }
85
+ it { is_expected.to be false }
86
+ end
87
+
88
+ describe "#authenticated_only_access?" do
89
+ subject { form.authenticated_only_access? }
90
+ it { is_expected.to be false }
91
+ end
92
+
93
+ describe "#open_access_with_embargo_release_date?" do
94
+ subject { form.open_access_with_embargo_release_date? }
95
+ it { is_expected.to be false }
96
+ end
97
+
98
+ describe "#private_access?" do
99
+ subject { form.private_access? }
100
+ it { is_expected.to be true }
101
+ end
102
+
103
+ describe "#member_ids" do
104
+ subject { form.member_ids }
105
+ it { is_expected.to eq curation_concern.member_ids }
106
+ end
107
+
108
+ describe "#embargo_release_date" do
109
+ let(:curation_concern) { create(:work, embargo_release_date: 5.days.from_now) }
110
+ subject { form.embargo_release_date }
111
+ it { is_expected.to eq curation_concern.embargo_release_date }
112
+ end
113
+
114
+ describe "#lease_expiration_date" do
115
+ let(:curation_concern) { create(:work, lease_expiration_date: 2.days.from_now) }
116
+ subject { form.lease_expiration_date }
117
+ it { is_expected.to eq curation_concern.lease_expiration_date }
118
+ end
54
119
  end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ describe CurationConcerns::AbilityHelper do
4
+ describe "#visibility_badge" do
5
+ subject { helper.visibility_badge visibility }
6
+ {
7
+ Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC =>
8
+ "<span class=\"label label-success\">Open Access</span>",
9
+ Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED =>
10
+ "<span class=\"label label-info\">%s</span>",
11
+ Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE =>
12
+ "<span class=\"label label-danger\">Private</span>",
13
+ Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_EMBARGO =>
14
+ "<span class=\"label label-warning\">Embargo</span>",
15
+ Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_LEASE =>
16
+ "<span class=\"label label-warning\">Lease</span>"
17
+ }.each do |value, output|
18
+ context value do
19
+ let(:visibility) { value }
20
+ it { expect(subject).to eql(output % t('curation_concerns.institution_name')) }
21
+ end
22
+ end
23
+ end
24
+ describe "#visibility_options" do
25
+ let(:public_opt) { ['Open Access', Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC] }
26
+ let(:authenticated_opt) { [t('curation_concerns.institution_name'), Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED] }
27
+ let(:private_opt) { ['Private', Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE] }
28
+ subject { helper.visibility_options(option) }
29
+ context 'all options' do
30
+ let(:options) { [public_opt, authenticated_opt, private_opt] }
31
+ let(:option) { nil }
32
+ it { is_expected.to eql(options) }
33
+ end
34
+ context 'restricting options' do
35
+ let(:options) { [private_opt, authenticated_opt] }
36
+ let(:option) { :restrict }
37
+ it { is_expected.to eql(options) }
38
+ end
39
+ context 'loosening options' do
40
+ let(:options) { [public_opt, authenticated_opt] }
41
+ let(:option) { :loosen }
42
+ it { is_expected.to eql(options) }
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe CurationConcerns::PermissionsHelper do
4
+ describe "#help_link" do
5
+ subject { helper.help_link 'curation_concerns/base/visibility', 'Visibility', 'Usage information for visibility' }
6
+
7
+ it "draws help_icon" do
8
+ expect(subject).to match(/data-content="<p>This setting will determine who can view your file/)
9
+ expect(subject).to have_selector 'a i.help-icon'
10
+ end
11
+ end
12
+ end
@@ -1,9 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe CurationConcerns::UrlHelper do
4
- before do
5
- GenericWork.destroy_all
6
- end
7
4
  let(:profile) { ["{\"datastreams\":{}}"] }
8
5
  let(:work) { create(:generic_work) }
9
6
  let(:document) { SolrDocument.new(work.to_solr) }
@@ -4,11 +4,16 @@ describe CurationConcerns::CollectionIndexer do
4
4
  let(:indexer) { described_class.new(collection) }
5
5
  let(:collection) { build(:collection) }
6
6
 
7
+ before { allow(collection).to receive(:bytes).and_return(1000) }
7
8
  describe "#generate_solr_document" do
8
9
  subject { indexer.generate_solr_document }
9
10
 
10
11
  it "has generic type" do
11
12
  expect(subject.fetch('generic_type_sim')).to eq ["Collection"]
12
13
  end
14
+
15
+ it "has bytes" do
16
+ expect(subject.fetch('bytes_is')).to eq(1000)
17
+ end
13
18
  end
14
19
  end