diff options
Diffstat (limited to 'spec/requests/lfs_http_spec.rb')
-rw-r--r-- | spec/requests/lfs_http_spec.rb | 824 |
1 files changed, 412 insertions, 412 deletions
diff --git a/spec/requests/lfs_http_spec.rb b/spec/requests/lfs_http_spec.rb index 1781759c54b..dfaf813aff0 100644 --- a/spec/requests/lfs_http_spec.rb +++ b/spec/requests/lfs_http_spec.rb @@ -1,6 +1,6 @@ -require 'spec_helper' +require "spec_helper" -describe 'Git LFS API and storage' do +describe "Git LFS API and storage" do include WorkhorseHelpers include ProjectForksHelper @@ -9,8 +9,8 @@ describe 'Git LFS API and storage' do let(:headers) do { - 'Authorization' => authorization, - 'X-Sendfile-Type' => sendfile + "Authorization" => authorization, + "X-Sendfile-Type" => sendfile, }.compact end let(:authorization) { } @@ -20,17 +20,17 @@ describe 'Git LFS API and storage' do let(:sample_oid) { lfs_object.oid } let(:sample_size) { lfs_object.size } - describe 'when lfs is disabled' do + describe "when lfs is disabled" do let(:project) { create(:project) } let(:body) do { - 'objects' => [ - { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078 }, - { 'oid' => sample_oid, - 'size' => sample_size } + "objects" => [ + {"oid" => "91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897", + "size" => 1575078,}, + {"oid" => sample_oid, + "size" => sample_size,}, ], - 'operation' => 'upload' + "operation" => "upload", } end let(:authorization) { authorize_user } @@ -40,63 +40,63 @@ describe 'Git LFS API and storage' do post_lfs_json "#{project.http_url_to_repo}/info/lfs/objects/batch", body, headers end - it 'responds with 501' do + it "responds with 501" do expect(response).to have_gitlab_http_status(501) - expect(json_response).to include('message' => 'Git LFS is not enabled on this GitLab server, contact your admin.') + expect(json_response).to include("message" => "Git LFS is not enabled on this GitLab server, contact your admin.") end end - context 'project specific LFS settings' do + context "project specific LFS settings" do let(:project) { create(:project) } let(:body) do { - 'objects' => [ - { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078 }, - { 'oid' => sample_oid, - 'size' => sample_size } + "objects" => [ + {"oid" => "91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897", + "size" => 1575078,}, + {"oid" => sample_oid, + "size" => sample_size,}, ], - 'operation' => 'upload' + "operation" => "upload", } end let(:authorization) { authorize_user } - context 'with LFS disabled globally' do + context "with LFS disabled globally" do before do project.add_maintainer(user) allow(Gitlab.config.lfs).to receive(:enabled).and_return(false) end - describe 'LFS disabled in project' do + describe "LFS disabled in project" do before do project.update_attribute(:lfs_enabled, false) end - it 'responds with a 501 message on upload' do + it "responds with a 501 message on upload" do post_lfs_json "#{project.http_url_to_repo}/info/lfs/objects/batch", body, headers expect(response).to have_gitlab_http_status(501) end - it 'responds with a 501 message on download' do + it "responds with a 501 message on download" do get "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", params: {}, headers: headers expect(response).to have_gitlab_http_status(501) end end - describe 'LFS enabled in project' do + describe "LFS enabled in project" do before do project.update_attribute(:lfs_enabled, true) end - it 'responds with a 501 message on upload' do + it "responds with a 501 message on upload" do post_lfs_json "#{project.http_url_to_repo}/info/lfs/objects/batch", body, headers expect(response).to have_gitlab_http_status(501) end - it 'responds with a 501 message on download' do + it "responds with a 501 message on download" do get "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", params: {}, headers: headers expect(response).to have_gitlab_http_status(501) @@ -104,45 +104,45 @@ describe 'Git LFS API and storage' do end end - context 'with LFS enabled globally' do + context "with LFS enabled globally" do before do project.add_maintainer(user) enable_lfs end - describe 'LFS disabled in project' do + describe "LFS disabled in project" do before do project.update_attribute(:lfs_enabled, false) end - it 'responds with a 403 message on upload' do + it "responds with a 403 message on upload" do post_lfs_json "#{project.http_url_to_repo}/info/lfs/objects/batch", body, headers expect(response).to have_gitlab_http_status(403) - expect(json_response).to include('message' => 'Access forbidden. Check your access level.') + expect(json_response).to include("message" => "Access forbidden. Check your access level.") end - it 'responds with a 403 message on download' do + it "responds with a 403 message on download" do get "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", params: {}, headers: headers expect(response).to have_gitlab_http_status(403) - expect(json_response).to include('message' => 'Access forbidden. Check your access level.') + expect(json_response).to include("message" => "Access forbidden. Check your access level.") end end - describe 'LFS enabled in project' do + describe "LFS enabled in project" do before do project.update_attribute(:lfs_enabled, true) end - it 'responds with a 200 message on upload' do + it "responds with a 200 message on upload" do post_lfs_json "#{project.http_url_to_repo}/info/lfs/objects/batch", body, headers expect(response).to have_gitlab_http_status(200) - expect(json_response['objects'].first['size']).to eq(1575078) + expect(json_response["objects"].first["size"]).to eq(1575078) end - it 'responds with a 200 message on download' do + it "responds with a 200 message on download" do get "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", params: {}, headers: headers expect(response).to have_gitlab_http_status(200) @@ -151,44 +151,44 @@ describe 'Git LFS API and storage' do end end - describe 'deprecated API' do + describe "deprecated API" do let(:project) { create(:project) } before do enable_lfs end - shared_examples 'a deprecated' do - it 'responds with 501' do + shared_examples "a deprecated" do + it "responds with 501" do expect(response).to have_gitlab_http_status(501) end - it 'returns deprecated message' do - expect(json_response).to include('message' => 'Server supports batch API only, please update your Git LFS client to version 1.0.1 and up.') + it "returns deprecated message" do + expect(json_response).to include("message" => "Server supports batch API only, please update your Git LFS client to version 1.0.1 and up.") end end - context 'when fetching lfs object using deprecated API' do + context "when fetching lfs object using deprecated API" do let(:authorization) { authorize_user } before do get "#{project.http_url_to_repo}/info/lfs/objects/#{sample_oid}", params: {}, headers: headers end - it_behaves_like 'a deprecated' + it_behaves_like "a deprecated" end - context 'when handling lfs request using deprecated API' do + context "when handling lfs request using deprecated API" do let(:authorization) { authorize_user } before do post_lfs_json "#{project.http_url_to_repo}/info/lfs/objects", nil, headers end - it_behaves_like 'a deprecated' + it_behaves_like "a deprecated" end end - describe 'when fetching lfs object' do + describe "when fetching lfs object" do let(:project) { create(:project) } let(:update_permissions) { } let(:before_get) { } @@ -200,75 +200,75 @@ describe 'Git LFS API and storage' do get "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", params: {}, headers: headers end - context 'and request comes from gitlab-workhorse' do - context 'without user being authorized' do - it 'responds with status 401' do + context "and request comes from gitlab-workhorse" do + context "without user being authorized" do + it "responds with status 401" do expect(response).to have_gitlab_http_status(401) end end - context 'with required headers' do - shared_examples 'responds with a file' do - let(:sendfile) { 'X-Sendfile' } + context "with required headers" do + shared_examples "responds with a file" do + let(:sendfile) { "X-Sendfile" } - it 'responds with status 200' do + it "responds with status 200" do expect(response).to have_gitlab_http_status(200) end - it 'responds with the file location' do - expect(response.headers['Content-Type']).to eq('application/octet-stream') - expect(response.headers['X-Sendfile']).to eq(lfs_object.file.path) + it "responds with the file location" do + expect(response.headers["Content-Type"]).to eq("application/octet-stream") + expect(response.headers["X-Sendfile"]).to eq(lfs_object.file.path) end end - context 'with user is authorized' do + context "with user is authorized" do let(:authorization) { authorize_user } - context 'and does not have project access' do + context "and does not have project access" do let(:update_permissions) do project.lfs_objects << lfs_object end - it 'responds with status 404' do + it "responds with status 404" do expect(response).to have_gitlab_http_status(404) end end - context 'and does have project access' do + context "and does have project access" do let(:update_permissions) do project.add_maintainer(user) project.lfs_objects << lfs_object end - it_behaves_like 'responds with a file' + it_behaves_like "responds with a file" - context 'when LFS uses object storage' do - context 'when proxy download is enabled' do + context "when LFS uses object storage" do + context "when proxy download is enabled" do let(:before_get) do stub_lfs_object_storage(proxy_download: true) lfs_object.file.migrate!(LfsObjectUploader::Store::REMOTE) end - it 'responds with redirect' do + it "responds with redirect" do expect(response).to have_gitlab_http_status(200) end - it 'responds with the workhorse send-url' do + it "responds with the workhorse send-url" do expect(response.headers[Gitlab::Workhorse::SEND_DATA_HEADER]).to start_with("send-url:") end end - context 'when proxy download is disabled' do + context "when proxy download is disabled" do let(:before_get) do stub_lfs_object_storage(proxy_download: false) lfs_object.file.migrate!(LfsObjectUploader::Store::REMOTE) end - it 'responds with redirect' do + it "responds with redirect" do expect(response).to have_gitlab_http_status(302) end - it 'responds with the file location' do + it "responds with the file location" do expect(response.location).to include(lfs_object.reload.file.path) end end @@ -276,7 +276,7 @@ describe 'Git LFS API and storage' do end end - context 'when deploy key is authorized' do + context "when deploy key is authorized" do let(:key) { create(:deploy_key) } let(:authorization) { authorize_deploy_key } @@ -285,47 +285,47 @@ describe 'Git LFS API and storage' do project.lfs_objects << lfs_object end - it_behaves_like 'responds with a file' + it_behaves_like "responds with a file" end - describe 'when using a user key' do + describe "when using a user key" do let(:authorization) { authorize_user_key } - context 'when user allowed' do + context "when user allowed" do let(:update_permissions) do project.add_maintainer(user) project.lfs_objects << lfs_object end - it_behaves_like 'responds with a file' + it_behaves_like "responds with a file" end - context 'when user not allowed' do + context "when user not allowed" do let(:update_permissions) do project.lfs_objects << lfs_object end - it 'responds with status 404' do + it "responds with status 404" do expect(response).to have_gitlab_http_status(404) end end end - context 'when build is authorized as' do + context "when build is authorized as" do let(:authorization) { authorize_ci_project } - shared_examples 'can download LFS only from own projects' do - context 'for owned project' do + shared_examples "can download LFS only from own projects" do + context "for owned project" do let(:project) { create(:project, namespace: user.namespace) } let(:update_permissions) do project.lfs_objects << lfs_object end - it_behaves_like 'responds with a file' + it_behaves_like "responds with a file" end - context 'for member of project' do + context "for member of project" do let(:pipeline) { create(:ci_empty_pipeline, project: project) } let(:update_permissions) do @@ -333,10 +333,10 @@ describe 'Git LFS API and storage' do project.lfs_objects << lfs_object end - it_behaves_like 'responds with a file' + it_behaves_like "responds with a file" end - context 'for other project' do + context "for other project" do let(:other_project) { create(:project) } let(:pipeline) { create(:ci_empty_pipeline, project: other_project) } @@ -344,36 +344,36 @@ describe 'Git LFS API and storage' do project.lfs_objects << lfs_object end - it 'rejects downloading code' do + it "rejects downloading code" do expect(response).to have_gitlab_http_status(other_project_status) end end end - context 'administrator' do + context "administrator" do let(:user) { create(:admin) } let(:build) { create(:ci_build, :running, pipeline: pipeline, user: user) } - it_behaves_like 'can download LFS only from own projects' do + it_behaves_like "can download LFS only from own projects" do # We render 403, because administrator does have normally access let(:other_project_status) { 403 } end end - context 'regular user' do + context "regular user" do let(:user) { create(:user) } let(:build) { create(:ci_build, :running, pipeline: pipeline, user: user) } - it_behaves_like 'can download LFS only from own projects' do + it_behaves_like "can download LFS only from own projects" do # We render 404, to prevent data leakage about existence of the project let(:other_project_status) { 404 } end end - context 'does not have user' do + context "does not have user" do let(:build) { create(:ci_build, :running, pipeline: pipeline) } - it_behaves_like 'can download LFS only from own projects' do + it_behaves_like "can download LFS only from own projects" do # We render 404, to prevent data leakage about existence of the project let(:other_project_status) { 404 } end @@ -381,17 +381,17 @@ describe 'Git LFS API and storage' do end end - context 'without required headers' do + context "without required headers" do let(:authorization) { authorize_user } - it 'responds with status 404' do + it "responds with status 404" do expect(response).to have_gitlab_http_status(404) end end end end - describe 'when handling lfs batch request' do + describe "when handling lfs batch request" do let(:update_lfs_permissions) { } let(:update_user_permissions) { } @@ -402,113 +402,113 @@ describe 'Git LFS API and storage' do post_lfs_json "#{project.http_url_to_repo}/info/lfs/objects/batch", body, headers end - describe 'download' do + describe "download" do let(:project) { create(:project) } let(:body) do { - 'operation' => 'download', - 'objects' => [ - { 'oid' => sample_oid, - 'size' => sample_size } - ] + "operation" => "download", + "objects" => [ + {"oid" => sample_oid, + "size" => sample_size,}, + ], } end - shared_examples 'an authorized requests' do - context 'when downloading an lfs object that is assigned to our project' do + shared_examples "an authorized requests" do + context "when downloading an lfs object that is assigned to our project" do let(:update_lfs_permissions) do project.lfs_objects << lfs_object end - it 'responds with status 200' do + it "responds with status 200" do expect(response).to have_gitlab_http_status(200) end - it 'with href to download' do + it "with href to download" do expect(json_response).to eq({ - 'objects' => [ + "objects" => [ { - 'oid' => sample_oid, - 'size' => sample_size, - 'actions' => { - 'download' => { - 'href' => "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", - 'header' => { 'Authorization' => authorization } - } - } - } - ] + "oid" => sample_oid, + "size" => sample_size, + "actions" => { + "download" => { + "href" => "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", + "header" => {"Authorization" => authorization}, + }, + }, + }, + ], }) end end - context 'when downloading an lfs object that is assigned to other project' do + context "when downloading an lfs object that is assigned to other project" do let(:other_project) { create(:project) } let(:update_lfs_permissions) do other_project.lfs_objects << lfs_object end - it 'responds with status 200' do + it "responds with status 200" do expect(response).to have_gitlab_http_status(200) end - it 'with href to download' do + it "with href to download" do expect(json_response).to eq({ - 'objects' => [ + "objects" => [ { - 'oid' => sample_oid, - 'size' => sample_size, - 'error' => { - 'code' => 404, - 'message' => "Object does not exist on the server or you don't have permissions to access it" - } - } - ] + "oid" => sample_oid, + "size" => sample_size, + "error" => { + "code" => 404, + "message" => "Object does not exist on the server or you don't have permissions to access it", + }, + }, + ], }) end end - context 'when downloading a lfs object that does not exist' do + context "when downloading a lfs object that does not exist" do let(:body) do { - 'operation' => 'download', - 'objects' => [ - { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078 } - ] + "operation" => "download", + "objects" => [ + {"oid" => "91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897", + "size" => 1575078,}, + ], } end - it 'responds with status 200' do + it "responds with status 200" do expect(response).to have_gitlab_http_status(200) end - it 'with an 404 for specific object' do + it "with an 404 for specific object" do expect(json_response).to eq({ - 'objects' => [ + "objects" => [ { - 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078, - 'error' => { - 'code' => 404, - 'message' => "Object does not exist on the server or you don't have permissions to access it" - } - } - ] + "oid" => "91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897", + "size" => 1575078, + "error" => { + "code" => 404, + "message" => "Object does not exist on the server or you don't have permissions to access it", + }, + }, + ], }) end end - context 'when downloading one new and one existing lfs object' do + context "when downloading one new and one existing lfs object" do let(:body) do { - 'operation' => 'download', - 'objects' => [ - { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078 }, - { 'oid' => sample_oid, - 'size' => sample_size } - ] + "operation" => "download", + "objects" => [ + {"oid" => "91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897", + "size" => 1575078,}, + {"oid" => sample_oid, + "size" => sample_size,}, + ], } end @@ -516,66 +516,66 @@ describe 'Git LFS API and storage' do project.lfs_objects << lfs_object end - it 'responds with status 200' do + it "responds with status 200" do expect(response).to have_gitlab_http_status(200) end - it 'responds with upload hypermedia link for the new object' do + it "responds with upload hypermedia link for the new object" do expect(json_response).to eq({ - 'objects' => [ + "objects" => [ { - 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078, - 'error' => { - 'code' => 404, - 'message' => "Object does not exist on the server or you don't have permissions to access it" - } + "oid" => "91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897", + "size" => 1575078, + "error" => { + "code" => 404, + "message" => "Object does not exist on the server or you don't have permissions to access it", + }, }, { - 'oid' => sample_oid, - 'size' => sample_size, - 'actions' => { - 'download' => { - 'href' => "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", - 'header' => { 'Authorization' => authorization } - } - } - } - ] + "oid" => sample_oid, + "size" => sample_size, + "actions" => { + "download" => { + "href" => "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", + "header" => {"Authorization" => authorization}, + }, + }, + }, + ], }) end end end - context 'when user is authenticated' do + context "when user is authenticated" do let(:authorization) { authorize_user } let(:update_user_permissions) do project.add_role(user, role) end - it_behaves_like 'an authorized requests' do + it_behaves_like "an authorized requests" do let(:role) { :reporter } end - context 'when user does is not member of the project' do + context "when user does is not member of the project" do let(:update_user_permissions) { nil } - it 'responds with 404' do + it "responds with 404" do expect(response).to have_gitlab_http_status(404) end end - context 'when user does not have download access' do + context "when user does not have download access" do let(:role) { :guest } - it 'responds with 403' do + it "responds with 403" do expect(response).to have_gitlab_http_status(403) end end end - context 'when using Deploy Tokens' do + context "when using Deploy Tokens" do let(:project) { create(:project, :repository) } let(:authorization) { authorize_deploy_token } let(:update_user_permissions) { nil } @@ -584,201 +584,201 @@ describe 'Git LFS API and storage' do project.lfs_objects << lfs_object end - context 'when Deploy Token is valid' do + context "when Deploy Token is valid" do let(:deploy_token) { create(:deploy_token, projects: [project]) } - it_behaves_like 'an authorized requests' + it_behaves_like "an authorized requests" end - context 'when Deploy Token is not valid' do + context "when Deploy Token is not valid" do let(:deploy_token) { create(:deploy_token, projects: [project], read_repository: false) } - it 'responds with access denied' do + it "responds with access denied" do expect(response).to have_gitlab_http_status(401) end end - context 'when Deploy Token is not related to the project' do + context "when Deploy Token is not related to the project" do let(:another_project) { create(:project, :repository) } let(:deploy_token) { create(:deploy_token, projects: [another_project]) } - it 'responds with access forbidden' do + it "responds with access forbidden" do # We render 404, to prevent data leakage about existence of the project expect(response).to have_gitlab_http_status(404) end end end - context 'when build is authorized as' do + context "when build is authorized as" do let(:authorization) { authorize_ci_project } let(:update_lfs_permissions) do project.lfs_objects << lfs_object end - shared_examples 'can download LFS only from own projects' do - context 'for own project' do + shared_examples "can download LFS only from own projects" do + context "for own project" do let(:pipeline) { create(:ci_empty_pipeline, project: project) } let(:update_user_permissions) do project.add_reporter(user) end - it_behaves_like 'an authorized requests' + it_behaves_like "an authorized requests" end - context 'for other project' do + context "for other project" do let(:other_project) { create(:project) } let(:pipeline) { create(:ci_empty_pipeline, project: other_project) } - it 'rejects downloading code' do + it "rejects downloading code" do expect(response).to have_gitlab_http_status(other_project_status) end end end - context 'administrator' do + context "administrator" do let(:user) { create(:admin) } let(:build) { create(:ci_build, :running, pipeline: pipeline, user: user) } - it_behaves_like 'can download LFS only from own projects' do + it_behaves_like "can download LFS only from own projects" do # We render 403, because administrator does have normally access let(:other_project_status) { 403 } end end - context 'regular user' do + context "regular user" do let(:user) { create(:user) } let(:build) { create(:ci_build, :running, pipeline: pipeline, user: user) } - it_behaves_like 'can download LFS only from own projects' do + it_behaves_like "can download LFS only from own projects" do # We render 404, to prevent data leakage about existence of the project let(:other_project_status) { 404 } end end - context 'does not have user' do + context "does not have user" do let(:build) { create(:ci_build, :running, pipeline: pipeline) } - it_behaves_like 'can download LFS only from own projects' do + it_behaves_like "can download LFS only from own projects" do # We render 404, to prevent data leakage about existence of the project let(:other_project_status) { 404 } end end end - context 'when user is not authenticated' do - describe 'is accessing public project' do + context "when user is not authenticated" do + describe "is accessing public project" do let(:project) { create(:project, :public) } let(:update_lfs_permissions) do project.lfs_objects << lfs_object end - it 'responds with status 200 and href to download' do + it "responds with status 200 and href to download" do expect(response).to have_gitlab_http_status(200) end - it 'responds with status 200 and href to download' do + it "responds with status 200 and href to download" do expect(json_response).to eq({ - 'objects' => [ + "objects" => [ { - 'oid' => sample_oid, - 'size' => sample_size, - 'authenticated' => true, - 'actions' => { - 'download' => { - 'href' => "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", - 'header' => {} - } - } - } - ] + "oid" => sample_oid, + "size" => sample_size, + "authenticated" => true, + "actions" => { + "download" => { + "href" => "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", + "header" => {}, + }, + }, + }, + ], }) end end - describe 'is accessing non-public project' do + describe "is accessing non-public project" do let(:update_lfs_permissions) do project.lfs_objects << lfs_object end - it 'responds with authorization required' do + it "responds with authorization required" do expect(response).to have_gitlab_http_status(401) end end end end - describe 'upload' do + describe "upload" do let(:project) { create(:project, :public) } let(:body) do { - 'operation' => 'upload', - 'objects' => [ - { 'oid' => sample_oid, - 'size' => sample_size } - ] + "operation" => "upload", + "objects" => [ + {"oid" => sample_oid, + "size" => sample_size,}, + ], } end - shared_examples 'pushes new LFS objects' do + shared_examples "pushes new LFS objects" do let(:sample_size) { 150.megabytes } - let(:sample_oid) { '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897' } + let(:sample_oid) { "91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897" } - it 'responds with upload hypermedia link' do + it "responds with upload hypermedia link" do expect(response).to have_gitlab_http_status(200) - expect(json_response['objects']).to be_kind_of(Array) - expect(json_response['objects'].first['oid']).to eq(sample_oid) - expect(json_response['objects'].first['size']).to eq(sample_size) - expect(json_response['objects'].first['actions']['upload']['href']).to eq("#{Gitlab.config.gitlab.url}/#{project.full_path}.git/gitlab-lfs/objects/#{sample_oid}/#{sample_size}") - expect(json_response['objects'].first['actions']['upload']['header']).to eq({ 'Authorization' => authorization, 'Content-Type' => 'application/octet-stream' }) + expect(json_response["objects"]).to be_kind_of(Array) + expect(json_response["objects"].first["oid"]).to eq(sample_oid) + expect(json_response["objects"].first["size"]).to eq(sample_size) + expect(json_response["objects"].first["actions"]["upload"]["href"]).to eq("#{Gitlab.config.gitlab.url}/#{project.full_path}.git/gitlab-lfs/objects/#{sample_oid}/#{sample_size}") + expect(json_response["objects"].first["actions"]["upload"]["header"]).to eq({"Authorization" => authorization, "Content-Type" => "application/octet-stream"}) end end - describe 'when request is authenticated' do - describe 'when user has project push access' do + describe "when request is authenticated" do + describe "when user has project push access" do let(:authorization) { authorize_user } let(:update_user_permissions) do project.add_developer(user) end - context 'when pushing an lfs object that already exists' do + context "when pushing an lfs object that already exists" do let(:other_project) { create(:project) } let(:update_lfs_permissions) do other_project.lfs_objects << lfs_object end - it 'responds with status 200' do + it "responds with status 200" do expect(response).to have_gitlab_http_status(200) end - it 'responds with links the object to the project' do - expect(json_response['objects']).to be_kind_of(Array) - expect(json_response['objects'].first['oid']).to eq(sample_oid) - expect(json_response['objects'].first['size']).to eq(sample_size) + it "responds with links the object to the project" do + expect(json_response["objects"]).to be_kind_of(Array) + expect(json_response["objects"].first["oid"]).to eq(sample_oid) + expect(json_response["objects"].first["size"]).to eq(sample_size) expect(lfs_object.projects.pluck(:id)).not_to include(project.id) expect(lfs_object.projects.pluck(:id)).to include(other_project.id) - expect(json_response['objects'].first['actions']['upload']['href']).to eq("#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}/#{sample_size}") - expect(json_response['objects'].first['actions']['upload']['header']).to eq({ 'Authorization' => authorization, 'Content-Type' => 'application/octet-stream' }) + expect(json_response["objects"].first["actions"]["upload"]["href"]).to eq("#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}/#{sample_size}") + expect(json_response["objects"].first["actions"]["upload"]["header"]).to eq({"Authorization" => authorization, "Content-Type" => "application/octet-stream"}) end end - context 'when pushing a lfs object that does not exist' do - it_behaves_like 'pushes new LFS objects' + context "when pushing a lfs object that does not exist" do + it_behaves_like "pushes new LFS objects" end - context 'when pushing one new and one existing lfs object' do + context "when pushing one new and one existing lfs object" do let(:body) do { - 'operation' => 'upload', - 'objects' => [ - { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078 }, - { 'oid' => sample_oid, - 'size' => sample_size } - ] + "operation" => "upload", + "objects" => [ + {"oid" => "91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897", + "size" => 1575078,}, + {"oid" => sample_oid, + "size" => sample_size,}, + ], } end @@ -786,69 +786,69 @@ describe 'Git LFS API and storage' do project.lfs_objects << lfs_object end - it 'responds with status 200' do + it "responds with status 200" do expect(response).to have_gitlab_http_status(200) end - it 'responds with upload hypermedia link for the new object' do - expect(json_response['objects']).to be_kind_of(Array) + it "responds with upload hypermedia link for the new object" do + expect(json_response["objects"]).to be_kind_of(Array) - expect(json_response['objects'].first['oid']).to eq("91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897") - expect(json_response['objects'].first['size']).to eq(1575078) - expect(json_response['objects'].first['actions']['upload']['href']).to eq("#{project.http_url_to_repo}/gitlab-lfs/objects/91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897/1575078") - expect(json_response['objects'].first['actions']['upload']['header']).to eq({ 'Authorization' => authorization, 'Content-Type' => 'application/octet-stream' }) + expect(json_response["objects"].first["oid"]).to eq("91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897") + expect(json_response["objects"].first["size"]).to eq(1575078) + expect(json_response["objects"].first["actions"]["upload"]["href"]).to eq("#{project.http_url_to_repo}/gitlab-lfs/objects/91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897/1575078") + expect(json_response["objects"].first["actions"]["upload"]["header"]).to eq({"Authorization" => authorization, "Content-Type" => "application/octet-stream"}) - expect(json_response['objects'].last['oid']).to eq(sample_oid) - expect(json_response['objects'].last['size']).to eq(sample_size) - expect(json_response['objects'].last).not_to have_key('actions') + expect(json_response["objects"].last["oid"]).to eq(sample_oid) + expect(json_response["objects"].last["size"]).to eq(sample_size) + expect(json_response["objects"].last).not_to have_key("actions") end end end - context 'when user does not have push access' do + context "when user does not have push access" do let(:authorization) { authorize_user } - it 'responds with 403' do + it "responds with 403" do expect(response).to have_gitlab_http_status(403) end end - context 'when build is authorized' do + context "when build is authorized" do let(:authorization) { authorize_ci_project } - context 'build has an user' do + context "build has an user" do let(:user) { create(:user) } - context 'tries to push to own project' do + context "tries to push to own project" do let(:build) { create(:ci_build, :running, pipeline: pipeline, user: user) } - it 'responds with 403 (not 404 because project is public)' do + it "responds with 403 (not 404 because project is public)" do expect(response).to have_gitlab_http_status(403) end end - context 'tries to push to other project' do + context "tries to push to other project" do let(:other_project) { create(:project) } let(:pipeline) { create(:ci_empty_pipeline, project: other_project) } let(:build) { create(:ci_build, :running, pipeline: pipeline, user: user) } # I'm not sure what this tests that is different from the previous test - it 'responds with 403 (not 404 because project is public)' do + it "responds with 403 (not 404 because project is public)" do expect(response).to have_gitlab_http_status(403) end end end - context 'does not have user' do + context "does not have user" do let(:build) { create(:ci_build, :running, pipeline: pipeline) } - it 'responds with 403 (not 404 because project is public)' do + it "responds with 403 (not 404 because project is public)" do expect(response).to have_gitlab_http_status(403) end end end - context 'when deploy key has project push access' do + context "when deploy key has project push access" do let(:key) { create(:deploy_key) } let(:authorization) { authorize_deploy_key } @@ -856,54 +856,54 @@ describe 'Git LFS API and storage' do project.deploy_keys_projects.create(deploy_key: key, can_push: true) end - it_behaves_like 'pushes new LFS objects' + it_behaves_like "pushes new LFS objects" end end - context 'when user is not authenticated' do - context 'when user has push access' do + context "when user is not authenticated" do + context "when user has push access" do let(:update_user_permissions) do project.add_maintainer(user) end - it 'responds with status 401' do + it "responds with status 401" do expect(response).to have_gitlab_http_status(401) end end - context 'when user does not have push access' do - it 'responds with status 401' do + context "when user does not have push access" do + it "responds with status 401" do expect(response).to have_gitlab_http_status(401) end end end end - describe 'unsupported' do + describe "unsupported" do let(:project) { create(:project) } let(:authorization) { authorize_user } let(:body) do { - 'operation' => 'other', - 'objects' => [ - { 'oid' => sample_oid, - 'size' => sample_size } - ] + "operation" => "other", + "objects" => [ + {"oid" => sample_oid, + "size" => sample_size,}, + ], } end - it 'responds with status 404' do + it "responds with status 404" do expect(response).to have_gitlab_http_status(404) end end end - describe 'when handling lfs batch request on a read-only GitLab instance' do + describe "when handling lfs batch request on a read-only GitLab instance" do let(:authorization) { authorize_user } let(:project) { create(:project) } let(:path) { "#{project.http_url_to_repo}/info/lfs/objects/batch" } let(:body) do - { 'objects' => [{ 'oid' => sample_oid, 'size' => sample_size }] } + {"objects" => [{"oid" => sample_oid, "size" => sample_size}]} end before do @@ -912,192 +912,192 @@ describe 'Git LFS API and storage' do enable_lfs end - it 'responds with a 200 message on download' do - post_lfs_json path, body.merge('operation' => 'download'), headers + it "responds with a 200 message on download" do + post_lfs_json path, body.merge("operation" => "download"), headers expect(response).to have_gitlab_http_status(200) end - it 'responds with a 403 message on upload' do - post_lfs_json path, body.merge('operation' => 'upload'), headers + it "responds with a 403 message on upload" do + post_lfs_json path, body.merge("operation" => "upload"), headers expect(response).to have_gitlab_http_status(403) - expect(json_response).to include('message' => 'You cannot write to this read-only GitLab instance.') + expect(json_response).to include("message" => "You cannot write to this read-only GitLab instance.") end end - describe 'when pushing a lfs object' do + describe "when pushing a lfs object" do before do enable_lfs end - shared_examples 'unauthorized' do - context 'and request is sent by gitlab-workhorse to authorize the request' do + shared_examples "unauthorized" do + context "and request is sent by gitlab-workhorse to authorize the request" do before do put_authorize end - it 'responds with status 401' do + it "responds with status 401" do expect(response).to have_gitlab_http_status(401) end end - context 'and request is sent by gitlab-workhorse to finalize the upload' do + context "and request is sent by gitlab-workhorse to finalize the upload" do before do put_finalize end - it 'responds with status 401' do + it "responds with status 401" do expect(response).to have_gitlab_http_status(401) end end - context 'and request is sent with a malformed headers' do + context "and request is sent with a malformed headers" do before do - put_finalize('/etc/passwd') + put_finalize("/etc/passwd") end - it 'does not recognize it as a valid lfs command' do + it "does not recognize it as a valid lfs command" do expect(response).to have_gitlab_http_status(401) end end end - shared_examples 'forbidden' do - context 'and request is sent by gitlab-workhorse to authorize the request' do + shared_examples "forbidden" do + context "and request is sent by gitlab-workhorse to authorize the request" do before do put_authorize end - it 'responds with 403' do + it "responds with 403" do expect(response).to have_gitlab_http_status(403) end end - context 'and request is sent by gitlab-workhorse to finalize the upload' do + context "and request is sent by gitlab-workhorse to finalize the upload" do before do put_finalize end - it 'responds with 403' do + it "responds with 403" do expect(response).to have_gitlab_http_status(403) end end - context 'and request is sent with a malformed headers' do + context "and request is sent with a malformed headers" do before do - put_finalize('/etc/passwd') + put_finalize("/etc/passwd") end - it 'does not recognize it as a valid lfs command' do + it "does not recognize it as a valid lfs command" do expect(response).to have_gitlab_http_status(403) end end end - describe 'to one project' do + describe "to one project" do let(:project) { create(:project) } - describe 'when user is authenticated' do + describe "when user is authenticated" do let(:authorization) { authorize_user } - describe 'when user has push access to the project' do + describe "when user has push access to the project" do before do project.add_developer(user) end - context 'and the request bypassed workhorse' do - it 'raises an exception' do + context "and the request bypassed workhorse" do + it "raises an exception" do expect { put_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 + context "and request is sent by gitlab-workhorse to authorize the request" do + shared_examples "a valid response" do before do put_authorize end - it 'responds with status 200' do + it "responds with status 200" do expect(response).to have_gitlab_http_status(200) end - it 'uses the gitlab-workhorse content type' do + it "uses the gitlab-workhorse content type" do expect(response.content_type.to_s).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 lfs store and object details' do - expect(json_response['TempPath']).to eq(LfsObjectUploader.workhorse_local_upload_path) - expect(json_response['RemoteObject']).to be_nil - expect(json_response['LfsOid']).to eq(sample_oid) - expect(json_response['LfsSize']).to eq(sample_size) + shared_examples "a local file" do + it_behaves_like "a valid response" do + it "responds with status 200, location of lfs store and object details" do + expect(json_response["TempPath"]).to eq(LfsObjectUploader.workhorse_local_upload_path) + expect(json_response["RemoteObject"]).to be_nil + expect(json_response["LfsOid"]).to eq(sample_oid) + expect(json_response["LfsSize"]).to eq(sample_size) end end end - context 'when using local storage' do - it_behaves_like 'a local file' + 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 + context "when using remote storage" do + context "when direct upload is enabled" do before do stub_lfs_object_storage(enabled: true, direct_upload: true) end - it_behaves_like 'a valid response' do - it 'responds with status 200, location of lfs remote store and object details' do - expect(json_response['TempPath']).to eq(LfsObjectUploader.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']).not_to have_key('MultipartUpload') - expect(json_response['LfsOid']).to eq(sample_oid) - expect(json_response['LfsSize']).to eq(sample_size) + it_behaves_like "a valid response" do + it "responds with status 200, location of lfs remote store and object details" do + expect(json_response["TempPath"]).to eq(LfsObjectUploader.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"]).not_to have_key("MultipartUpload") + expect(json_response["LfsOid"]).to eq(sample_oid) + expect(json_response["LfsSize"]).to eq(sample_size) end end end - context 'when direct upload is disabled' do + context "when direct upload is disabled" do before do stub_lfs_object_storage(enabled: true, direct_upload: false) end - it_behaves_like 'a local file' + it_behaves_like "a local file" end end end - context 'and request is sent by gitlab-workhorse to finalize the upload' do + context "and request is sent by gitlab-workhorse to finalize the upload" do before do put_finalize end - it 'responds with status 200' do + it "responds with status 200" do expect(response).to have_gitlab_http_status(200) end - it 'lfs object is linked to the project' do + it "lfs object is linked to the project" do expect(lfs_object.projects.pluck(:id)).to include(project.id) end end - context 'and request to finalize the upload is not sent by gitlab-workhorse' do - it 'fails with a JWT decode error' do + context "and request to finalize the upload is not sent by gitlab-workhorse" do + it "fails with a JWT decode error" do expect { put_finalize(lfs_tmp_file, verified: false) }.to raise_error(JWT::DecodeError) end end - context 'and workhorse requests upload finalize for a new lfs object' do + context "and workhorse requests upload finalize for a new lfs object" do before do lfs_object.destroy end - context 'with object storage disabled' do + context "with object storage disabled" do it "doesn't attempt to migrate file to object storage" do expect(ObjectStorage::BackgroundMoveWorker).not_to receive(:perform_async) @@ -1105,21 +1105,21 @@ describe 'Git LFS API and storage' do end end - context 'with object storage enabled' do - context 'and direct upload enabled' do + context "with object storage enabled" do + context "and direct upload enabled" do let!(:fog_connection) do stub_lfs_object_storage(direct_upload: true) end - ['123123', '../../123123'].each do |remote_id| + ["123123", "../../123123"].each do |remote_id| context "with invalid remote_id: #{remote_id}" do subject do put_finalize(with_tempfile: true, args: { - 'file.remote_id' => remote_id + "file.remote_id" => remote_id, }) end - it 'responds with status 403' do + it "responds with status 403" do subject expect(response).to have_gitlab_http_status(403) @@ -1127,34 +1127,34 @@ describe 'Git LFS API and storage' do end end - context 'with valid remote_id' do + context "with valid remote_id" do before do - fog_connection.directories.new(key: 'lfs-objects').files.create( - key: 'tmp/uploads/12312300', - body: 'content' + fog_connection.directories.new(key: "lfs-objects").files.create( + key: "tmp/uploads/12312300", + body: "content" ) end subject do put_finalize(with_tempfile: true, args: { - 'file.remote_id' => '12312300', - 'file.name' => 'name' + "file.remote_id" => "12312300", + "file.name" => "name", }) end - it 'responds with status 200' do + it "responds with status 200" do subject expect(response).to have_gitlab_http_status(200) end - it 'schedules migration of file to object storage' do + it "schedules migration of file to object storage" do subject expect(LfsObject.last.projects).to include(project) end - it 'have valid file' do + it "have valid file" do subject expect(LfsObject.last.file_store).to eq(ObjectStorage::Store::REMOTE) @@ -1163,13 +1163,13 @@ describe 'Git LFS API and storage' do end end - context 'and background upload enabled' do + context "and background upload enabled" do before do stub_lfs_object_storage(background_upload: true) end - it 'schedules migration of file to object storage' do - expect(ObjectStorage::BackgroundMoveWorker).to receive(:perform_async).with('LfsObjectUploader', 'LfsObject', :file, kind_of(Numeric)) + it "schedules migration of file to object storage" do + expect(ObjectStorage::BackgroundMoveWorker).to receive(:perform_async).with("LfsObjectUploader", "LfsObject", :file, kind_of(Numeric)) put_finalize(with_tempfile: true) end @@ -1177,34 +1177,34 @@ describe 'Git LFS API and storage' do end end - context 'invalid tempfiles' do + context "invalid tempfiles" do before do lfs_object.destroy end - it 'rejects slashes in the tempfile name (path traversal)' do - put_finalize('../bar', with_tempfile: true) + it "rejects slashes in the tempfile name (path traversal)" do + put_finalize("../bar", with_tempfile: true) expect(response).to have_gitlab_http_status(403) end end end - describe 'and user does not have push access' do + describe "and user does not have push access" do before do project.add_reporter(user) end - it_behaves_like 'forbidden' + it_behaves_like "forbidden" end end - context 'when build is authorized' do + context "when build is authorized" do let(:authorization) { authorize_ci_project } - context 'build has an user' do + context "build has an user" do let(:user) { create(:user) } - context 'tries to push to own project' do + context "tries to push to own project" do let(:build) { create(:ci_build, :running, pipeline: pipeline, user: user) } before do @@ -1212,12 +1212,12 @@ describe 'Git LFS API and storage' do put_authorize end - it 'responds with 403 (not 404 because the build user can read the project)' do + it "responds with 403 (not 404 because the build user can read the project)" do expect(response).to have_gitlab_http_status(403) end end - context 'tries to push to other project' do + context "tries to push to other project" do let(:other_project) { create(:project) } let(:pipeline) { create(:ci_empty_pipeline, project: other_project) } let(:build) { create(:ci_build, :running, pipeline: pipeline, user: user) } @@ -1226,123 +1226,123 @@ describe 'Git LFS API and storage' do put_authorize end - it 'responds with 404 (do not leak non-public project existence)' do + it "responds with 404 (do not leak non-public project existence)" do expect(response).to have_gitlab_http_status(404) end end end - context 'does not have user' do + context "does not have user" do let(:build) { create(:ci_build, :running, pipeline: pipeline) } before do put_authorize end - it 'responds with 404 (do not leak non-public project existence)' do + it "responds with 404 (do not leak non-public project existence)" do expect(response).to have_gitlab_http_status(404) end end end - context 'for unauthenticated' do - it_behaves_like 'unauthorized' + context "for unauthenticated" do + it_behaves_like "unauthorized" end end - describe 'to a forked project' do + describe "to a forked project" do let(:upstream_project) { create(:project, :public) } let(:project_owner) { create(:user) } let(:project) { fork_project(upstream_project, project_owner) } - describe 'when user is authenticated' do + describe "when user is authenticated" do let(:authorization) { authorize_user } - describe 'when user has push access to the project' do + describe "when user has push access to the project" do before do project.add_developer(user) end - context 'and request is sent by gitlab-workhorse to authorize the request' do + context "and request is sent by gitlab-workhorse to authorize the request" do before do put_authorize end - it 'responds with status 200' do + it "responds with status 200" do expect(response).to have_gitlab_http_status(200) end - it 'with location of lfs store and object details' do - expect(json_response['TempPath']).to eq(LfsObjectUploader.workhorse_local_upload_path) - expect(json_response['LfsOid']).to eq(sample_oid) - expect(json_response['LfsSize']).to eq(sample_size) + it "with location of lfs store and object details" do + expect(json_response["TempPath"]).to eq(LfsObjectUploader.workhorse_local_upload_path) + expect(json_response["LfsOid"]).to eq(sample_oid) + expect(json_response["LfsSize"]).to eq(sample_size) end end - context 'and request is sent by gitlab-workhorse to finalize the upload' do + context "and request is sent by gitlab-workhorse to finalize the upload" do before do put_finalize end - it 'responds with status 200' do + it "responds with status 200" do expect(response).to have_gitlab_http_status(200) end - it 'lfs object is linked to the source project' do + it "lfs object is linked to the source project" do expect(lfs_object.projects.pluck(:id)).to include(upstream_project.id) end end end - describe 'and user does not have push access' do - it_behaves_like 'forbidden' + describe "and user does not have push access" do + it_behaves_like "forbidden" end end - context 'when build is authorized' do + context "when build is authorized" do let(:authorization) { authorize_ci_project } before do put_authorize end - context 'build has an user' do + context "build has an user" do let(:user) { create(:user) } - context 'tries to push to own project' do + context "tries to push to own project" do let(:build) { create(:ci_build, :running, pipeline: pipeline, user: user) } - it 'responds with 403 (not 404 because project is public)' do + it "responds with 403 (not 404 because project is public)" do expect(response).to have_gitlab_http_status(403) end end - context 'tries to push to other project' do + context "tries to push to other project" do let(:other_project) { create(:project) } let(:pipeline) { create(:ci_empty_pipeline, project: other_project) } let(:build) { create(:ci_build, :running, pipeline: pipeline, user: user) } # I'm not sure what this tests that is different from the previous test - it 'responds with 403 (not 404 because project is public)' do + it "responds with 403 (not 404 because project is public)" do expect(response).to have_gitlab_http_status(403) end end end - context 'does not have user' do + context "does not have user" do let(:build) { create(:ci_build, :running, pipeline: pipeline) } - it 'responds with 403 (not 404 because project is public)' do + it "responds with 403 (not 404 because project is public)" do expect(response).to have_gitlab_http_status(403) end end end - context 'for unauthenticated' do - it_behaves_like 'unauthorized' + context "for unauthenticated" do + it_behaves_like "unauthorized" end - describe 'and second project not related to fork or a source project' do + describe "and second project not related to fork or a source project" do let(:second_project) { create(:project) } let(:authorization) { authorize_user } @@ -1351,22 +1351,22 @@ describe 'Git LFS API and storage' do upstream_project.lfs_objects << lfs_object end - context 'when pushing the same lfs object to the second project' do + context "when pushing the same lfs object to the second project" do before do finalize_headers = headers - .merge('X-Gitlab-Lfs-Tmp' => lfs_tmp_file) + .merge("X-Gitlab-Lfs-Tmp" => lfs_tmp_file) .merge(workhorse_internal_api_request_header) put "#{second_project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}/#{sample_size}", - params: {}, - headers: finalize_headers + params: {}, + headers: finalize_headers end - it 'responds with status 200' do + it "responds with status 200" do expect(response).to have_gitlab_http_status(200) end - it 'links the lfs object to the project' do + it "links the lfs object to the project" do expect(lfs_object.projects.pluck(:id)).to include(second_project.id, upstream_project.id) end end @@ -1382,7 +1382,7 @@ describe 'Git LFS API and storage' do def put_finalize(lfs_tmp = lfs_tmp_file, with_tempfile: false, verified: true, args: {}) upload_path = LfsObjectUploader.workhorse_local_upload_path - file_path = upload_path + '/' + lfs_tmp if lfs_tmp + file_path = upload_path + "/" + lfs_tmp if lfs_tmp if with_tempfile FileUtils.mkdir_p(upload_path) @@ -1390,8 +1390,8 @@ describe 'Git LFS API and storage' do end extra_args = { - 'file.path' => file_path, - 'file.name' => File.basename(file_path) + "file.path" => file_path, + "file.name" => File.basename(file_path), } put_finalize_with_args(args.merge(extra_args).compact, verified: verified) @@ -1414,7 +1414,7 @@ describe 'Git LFS API and storage' do end def authorize_ci_project - ActionController::HttpAuthentication::Basic.encode_credentials('gitlab-ci-token', build.token) + ActionController::HttpAuthentication::Basic.encode_credentials("gitlab-ci-token", build.token) end def authorize_user @@ -1435,7 +1435,7 @@ describe 'Git LFS API and storage' do def post_lfs_json(url, body = nil, headers = nil) params = body.try(:to_json) - headers = (headers || {}).merge('Content-Type' => LfsRequest::CONTENT_TYPE) + headers = (headers || {}).merge("Content-Type" => LfsRequest::CONTENT_TYPE) post(url, params: params, headers: headers) end |