debian-mirror-gitlab/spec/requests/lfs_locks_api_spec.rb

172 lines
4.7 KiB
Ruby
Raw Normal View History

2019-12-26 22:10:19 +05:30
# frozen_string_literal: true
2018-03-17 18:26:18 +05:30
require 'spec_helper'
2023-03-04 22:38:38 +05:30
RSpec.describe 'Git LFS File Locking API', feature_category: :source_code_management do
2021-01-29 00:20:46 +05:30
include LfsHttpHelpers
2018-03-17 18:26:18 +05:30
include WorkhorseHelpers
2021-01-29 00:20:46 +05:30
let_it_be(:project) { create(:project) }
let_it_be(:maintainer) { create(:user) }
let_it_be(:developer) { create(:user) }
let_it_be(:reporter) { create(:user) }
let_it_be(:guest) { create(:user) }
let_it_be(:path) { 'README.md' }
let(:user) { developer }
2018-03-17 18:26:18 +05:30
let(:headers) do
{
2021-01-29 00:20:46 +05:30
'Authorization' => authorize_user
2018-03-17 18:26:18 +05:30
}.compact
end
shared_examples 'unauthorized request' do
2021-01-29 00:20:46 +05:30
context 'when user does not have download permission' do
let(:user) { guest }
2018-03-17 18:26:18 +05:30
2021-01-29 00:20:46 +05:30
it 'returns a 404 response' do
post_lfs_json url, body, headers
expect(response).to have_gitlab_http_status(:not_found)
end
end
context 'when user does not have upload permission' do
let(:user) { reporter }
it 'returns a 403 response' do
2018-03-17 18:26:18 +05:30
post_lfs_json url, body, headers
2020-03-13 15:44:24 +05:30
expect(response).to have_gitlab_http_status(:forbidden)
2018-03-17 18:26:18 +05:30
end
end
end
before do
allow(Gitlab.config.lfs).to receive(:enabled).and_return(true)
2021-01-29 00:20:46 +05:30
project.add_maintainer(maintainer)
2018-03-17 18:26:18 +05:30
project.add_developer(developer)
2021-01-29 00:20:46 +05:30
project.add_reporter(reporter)
2018-03-17 18:26:18 +05:30
project.add_guest(guest)
end
describe 'Create File Lock endpoint' do
2021-01-29 00:20:46 +05:30
let(:url) { "#{project.http_url_to_repo}/info/lfs/locks" }
let(:body) { { path: path } }
2018-03-17 18:26:18 +05:30
include_examples 'unauthorized request'
context 'with an existent lock' do
before do
lock_file('README.md', developer)
end
it 'return an error message' do
post_lfs_json url, body, headers
2020-03-13 15:44:24 +05:30
expect(response).to have_gitlab_http_status(:conflict)
2018-03-17 18:26:18 +05:30
expect(json_response.keys).to match_array(%w(lock message documentation_url))
expect(json_response['message']).to match(/already locked/)
end
it 'returns the existen lock' do
post_lfs_json url, body, headers
expect(json_response['lock']['path']).to eq('README.md')
end
end
context 'without an existent lock' do
it 'creates the lock' do
post_lfs_json url, body, headers
2020-03-13 15:44:24 +05:30
expect(response).to have_gitlab_http_status(:created)
2018-03-17 18:26:18 +05:30
expect(json_response['lock'].keys).to match_array(%w(id path locked_at owner))
end
end
end
describe 'Listing File Locks endpoint' do
2021-01-29 00:20:46 +05:30
let(:url) { "#{project.http_url_to_repo}/info/lfs/locks" }
2018-03-17 18:26:18 +05:30
include_examples 'unauthorized request'
it 'returns the list of locked files' do
lock_file('README.md', developer)
lock_file('README', developer)
do_get url, nil, headers
2020-03-13 15:44:24 +05:30
expect(response).to have_gitlab_http_status(:ok)
2018-03-17 18:26:18 +05:30
expect(json_response['locks'].size).to eq(2)
expect(json_response['locks'].first.keys).to match_array(%w(id path locked_at owner))
end
end
describe 'List File Locks for verification endpoint' do
2021-01-29 00:20:46 +05:30
let(:url) { "#{project.http_url_to_repo}/info/lfs/locks/verify" }
2018-03-17 18:26:18 +05:30
include_examples 'unauthorized request'
it 'returns the list of locked files grouped by owner' do
2018-11-18 11:00:15 +05:30
lock_file('README.md', maintainer)
2018-03-17 18:26:18 +05:30
lock_file('README', developer)
post_lfs_json url, nil, headers
2020-03-13 15:44:24 +05:30
expect(response).to have_gitlab_http_status(:ok)
2018-03-17 18:26:18 +05:30
expect(json_response['ours'].size).to eq(1)
expect(json_response['ours'].first['path']).to eq('README')
expect(json_response['theirs'].size).to eq(1)
expect(json_response['theirs'].first['path']).to eq('README.md')
end
end
describe 'Delete File Lock endpoint' do
2021-01-29 00:20:46 +05:30
let!(:lock) { lock_file('README.md', developer) }
let(:url) { "#{project.http_url_to_repo}/info/lfs/locks/#{lock[:id]}/unlock" }
2018-03-17 18:26:18 +05:30
include_examples 'unauthorized request'
context 'with an existent lock' do
it 'deletes the lock' do
post_lfs_json url, nil, headers
2020-03-13 15:44:24 +05:30
expect(response).to have_gitlab_http_status(:ok)
2018-03-17 18:26:18 +05:30
end
it 'returns the deleted lock' do
post_lfs_json url, nil, headers
expect(json_response['lock'].keys).to match_array(%w(id path locked_at owner))
end
2019-03-02 22:35:43 +05:30
context 'when a maintainer uses force' do
2021-01-29 00:20:46 +05:30
let(:user) { maintainer }
2019-03-02 22:35:43 +05:30
it 'deletes the lock' do
project.add_maintainer(maintainer)
post_lfs_json url, { force: true }, headers
2020-03-13 15:44:24 +05:30
expect(response).to have_gitlab_http_status(:ok)
2019-03-02 22:35:43 +05:30
end
end
2018-03-17 18:26:18 +05:30
end
end
def lock_file(path, author)
result = Lfs::LockFileService.new(project, author, { path: path }).execute
result[:lock]
end
2019-03-02 22:35:43 +05:30
def do_get(url, params = nil, headers = nil)
2019-02-15 15:39:39 +05:30
get(url, params: (params || {}), headers: (headers || {}).merge('Content-Type' => LfsRequest::CONTENT_TYPE))
2018-03-17 18:26:18 +05:30
end
end