diff options
author | Jan Provaznik <jprovaznik@gitlab.com> | 2018-06-12 17:54:37 +0200 |
---|---|---|
committer | Jan Provaznik <jprovaznik@gitlab.com> | 2018-06-18 09:11:02 +0200 |
commit | 656d4ebf67b597e012f97edd04432e402d26fbc2 (patch) | |
tree | 47f64eb022598a158cece229d18b0450f0121573 /spec | |
parent | 937c1b5be91be4b500fa7cc1faf5d1aabbd16d41 (diff) | |
download | gitlab-ce-656d4ebf67b597e012f97edd04432e402d26fbc2.tar.gz |
Add workhorse authorize method for project/group uploads
This method can be used by workhorse to get presigned
URLs used for direct upload of files.
Diffstat (limited to 'spec')
3 files changed, 95 insertions, 0 deletions
diff --git a/spec/controllers/groups/uploads_controller_spec.rb b/spec/controllers/groups/uploads_controller_spec.rb index 6a1869d1a48..5a7281ed704 100644 --- a/spec/controllers/groups/uploads_controller_spec.rb +++ b/spec/controllers/groups/uploads_controller_spec.rb @@ -1,6 +1,8 @@ require 'spec_helper' describe Groups::UploadsController do + include WorkhorseHelpers + let(:model) { create(:group, :public) } let(:params) do { group_id: model } @@ -9,4 +11,10 @@ describe Groups::UploadsController do it_behaves_like 'handle uploads' do let(:uploader_class) { NamespaceFileUploader } end + + def post_authorize(verified: true) + request.headers.merge!(workhorse_internal_api_request_header) if verified + + post :authorize, group_id: model.full_path, format: :json + end end diff --git a/spec/controllers/projects/uploads_controller_spec.rb b/spec/controllers/projects/uploads_controller_spec.rb index eca9baed9c9..325ee53aafb 100644 --- a/spec/controllers/projects/uploads_controller_spec.rb +++ b/spec/controllers/projects/uploads_controller_spec.rb @@ -1,6 +1,8 @@ require 'spec_helper' describe Projects::UploadsController do + include WorkhorseHelpers + let(:model) { create(:project, :public) } let(:params) do { namespace_id: model.namespace.to_param, project_id: model } @@ -15,4 +17,10 @@ describe Projects::UploadsController do expect(response).to redirect_to(new_user_session_path) end end + + def post_authorize(verified: true) + request.headers.merge!(workhorse_internal_api_request_header) if verified + + post :authorize, namespace_id: model.namespace, project_id: model.path, format: :json + end end diff --git a/spec/support/shared_examples/controllers/uploads_actions_shared_examples.rb b/spec/support/shared_examples/controllers/uploads_actions_shared_examples.rb index bbbad86dcd5..7088fb1e5fb 100644 --- a/spec/support/shared_examples/controllers/uploads_actions_shared_examples.rb +++ b/spec/support/shared_examples/controllers/uploads_actions_shared_examples.rb @@ -260,4 +260,83 @@ shared_examples 'handle uploads' do end end end + + describe "POST #authorize" do + context 'when a user is not authorized to upload a file' do + it 'returns 404 status' do + post_authorize + + expect(response.status).to eq(404) + end + end + + context 'when a user can upload a file' do + before do + sign_in(user) + model.add_developer(user) + end + + context 'and the request bypassed workhorse' do + it 'raises an exception' do + expect { post_authorize(verified: false) }.to raise_error JWT::DecodeError + end + end + + context 'and request is sent by gitlab-workhorse to authorize the request' do + shared_examples 'a valid response' do + before do + post_authorize + end + + it 'responds with status 200' do + expect(response).to have_gitlab_http_status(200) + end + + it 'uses the gitlab-workhorse content type' do + expect(response.headers["Content-Type"]).to eq(Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE) + end + end + + shared_examples 'a local file' do + it_behaves_like 'a valid response' do + it 'responds with status 200, location of uploads store and object details' do + expect(json_response['TempPath']).to eq(uploader_class.workhorse_local_upload_path) + expect(json_response['RemoteObject']).to be_nil + end + end + end + + context 'when using local storage' do + it_behaves_like 'a local file' + end + + context 'when using remote storage' do + context 'when direct upload is enabled' do + before do + stub_uploads_object_storage(uploader_class, direct_upload: true) + end + + it_behaves_like 'a valid response' do + it 'responds with status 200, location of uploads remote store and object details' do + expect(json_response['TempPath']).to eq(uploader_class.workhorse_local_upload_path) + expect(json_response['RemoteObject']).to have_key('ID') + expect(json_response['RemoteObject']).to have_key('GetURL') + expect(json_response['RemoteObject']).to have_key('StoreURL') + expect(json_response['RemoteObject']).to have_key('DeleteURL') + expect(json_response['RemoteObject']).to have_key('MultipartUpload') + end + end + end + + context 'when direct upload is disabled' do + before do + stub_uploads_object_storage(uploader_class, direct_upload: false) + end + + it_behaves_like 'a local file' + end + end + end + end + end end |