Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-06-18 14:18:50 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-06-18 14:18:50 +0300
commit8c7f4e9d5f36cff46365a7f8c4b9c21578c1e781 (patch)
treea77e7fe7a93de11213032ed4ab1f33a3db51b738 /spec/requests/api/projects_spec.rb
parent00b35af3db1abfe813a778f643dad221aad51fca (diff)
Add latest changes from gitlab-org/gitlab@13-1-stable-ee
Diffstat (limited to 'spec/requests/api/projects_spec.rb')
-rw-r--r--spec/requests/api/projects_spec.rb105
1 files changed, 99 insertions, 6 deletions
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index 3abcf1cb7ed..c3f29ec47a9 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -597,6 +597,10 @@ describe API::Projects do
expect(response.header).to include('Links')
expect(response.header['Links']).to include('pagination=keyset')
expect(response.header['Links']).to include("id_after=#{public_project.id}")
+
+ expect(response.header).to include('Link')
+ expect(response.header['Link']).to include('pagination=keyset')
+ expect(response.header['Link']).to include("id_after=#{public_project.id}")
end
it 'contains only the first project with per_page = 1' do
@@ -613,12 +617,17 @@ describe API::Projects do
expect(response.header).to include('Links')
expect(response.header['Links']).to include('pagination=keyset')
expect(response.header['Links']).to include("id_after=#{project3.id}")
+
+ expect(response.header).to include('Link')
+ expect(response.header['Link']).to include('pagination=keyset')
+ expect(response.header['Link']).to include("id_after=#{project3.id}")
end
it 'does not include a next link when the page does not have any records' do
get api('/projects', current_user), params: params.merge(id_after: Project.maximum(:id))
expect(response.header).not_to include('Links')
+ expect(response.header).not_to include('Link')
end
it 'returns an empty array when the page does not have any records' do
@@ -644,6 +653,10 @@ describe API::Projects do
expect(response.header).to include('Links')
expect(response.header['Links']).to include('pagination=keyset')
expect(response.header['Links']).to include("id_before=#{project3.id}")
+
+ expect(response.header).to include('Link')
+ expect(response.header['Link']).to include('pagination=keyset')
+ expect(response.header['Link']).to include("id_before=#{project3.id}")
end
it 'contains only the last project with per_page = 1' do
@@ -672,6 +685,11 @@ describe API::Projects do
match[1]
end
+ link = response.header['Link']
+ url = link&.match(/<[^>]+(\/projects\?[^>]+)>; rel="next"/) do |match|
+ match[1]
+ end
+
ids += Gitlab::Json.parse(response.body).map { |p| p['id'] }
end
@@ -746,7 +764,8 @@ describe API::Projects do
resolve_outdated_diff_discussions: false,
remove_source_branch_after_merge: true,
autoclose_referenced_issues: true,
- only_allow_merge_if_pipeline_succeeds: false,
+ only_allow_merge_if_pipeline_succeeds: true,
+ allow_merge_on_skipped_pipeline: true,
request_access_enabled: true,
only_allow_merge_if_all_discussions_are_resolved: false,
ci_config_path: 'a/custom/path',
@@ -894,6 +913,22 @@ describe API::Projects do
expect(json_response['only_allow_merge_if_pipeline_succeeds']).to be_truthy
end
+ it 'sets a project as not allowing merge when pipeline is skipped' do
+ project_params = attributes_for(:project, allow_merge_on_skipped_pipeline: false)
+
+ post api('/projects', user), params: project_params
+
+ expect(json_response['allow_merge_on_skipped_pipeline']).to be_falsey
+ end
+
+ it 'sets a project as allowing merge when pipeline is skipped' do
+ project_params = attributes_for(:project, allow_merge_on_skipped_pipeline: true)
+
+ post api('/projects', user), params: project_params
+
+ expect(json_response['allow_merge_on_skipped_pipeline']).to be_truthy
+ end
+
it 'sets a project as allowing merge even if discussions are unresolved' do
project = attributes_for(:project, only_allow_merge_if_all_discussions_are_resolved: false)
@@ -1227,16 +1262,36 @@ describe API::Projects do
it 'sets a project as allowing merge even if build fails' do
project = attributes_for(:project, only_allow_merge_if_pipeline_succeeds: false)
+
post api("/projects/user/#{user.id}", admin), params: project
+
expect(json_response['only_allow_merge_if_pipeline_succeeds']).to be_falsey
end
it 'sets a project as allowing merge only if pipeline succeeds' do
project = attributes_for(:project, only_allow_merge_if_pipeline_succeeds: true)
+
post api("/projects/user/#{user.id}", admin), params: project
+
expect(json_response['only_allow_merge_if_pipeline_succeeds']).to be_truthy
end
+ it 'sets a project as not allowing merge when pipeline is skipped' do
+ project = attributes_for(:project, allow_merge_on_skipped_pipeline: false)
+
+ post api("/projects/user/#{user.id}", admin), params: project
+
+ expect(json_response['allow_merge_on_skipped_pipeline']).to be_falsey
+ end
+
+ it 'sets a project as allowing merge when pipeline is skipped' do
+ project = attributes_for(:project, allow_merge_on_skipped_pipeline: true)
+
+ post api("/projects/user/#{user.id}", admin), params: project
+
+ expect(json_response['allow_merge_on_skipped_pipeline']).to be_truthy
+ end
+
it 'sets a project as allowing merge even if discussions are unresolved' do
project = attributes_for(:project, only_allow_merge_if_all_discussions_are_resolved: false)
@@ -1376,6 +1431,7 @@ describe API::Projects do
expect(json_response['shared_with_groups'][0]['group_name']).to eq(group.name)
expect(json_response['shared_with_groups'][0]['group_access_level']).to eq(link.group_access)
expect(json_response['only_allow_merge_if_pipeline_succeeds']).to eq(project.only_allow_merge_if_pipeline_succeeds)
+ expect(json_response['allow_merge_on_skipped_pipeline']).to eq(project.allow_merge_on_skipped_pipeline)
expect(json_response['only_allow_merge_if_all_discussions_are_resolved']).to eq(project.only_allow_merge_if_all_discussions_are_resolved)
end
end
@@ -1443,6 +1499,7 @@ describe API::Projects do
expect(json_response['shared_with_groups'][0]['group_access_level']).to eq(link.group_access)
expect(json_response['shared_with_groups'][0]).to have_key('expires_at')
expect(json_response['only_allow_merge_if_pipeline_succeeds']).to eq(project.only_allow_merge_if_pipeline_succeeds)
+ expect(json_response['allow_merge_on_skipped_pipeline']).to eq(project.allow_merge_on_skipped_pipeline)
expect(json_response['only_allow_merge_if_all_discussions_are_resolved']).to eq(project.only_allow_merge_if_all_discussions_are_resolved)
expect(json_response['ci_default_git_depth']).to eq(project.ci_default_git_depth)
expect(json_response['merge_method']).to eq(project.merge_method.to_s)
@@ -2055,10 +2112,12 @@ describe API::Projects do
end
describe "POST /projects/:id/share" do
- let(:group) { create(:group) }
+ let_it_be(:group) { create(:group, :private) }
+ let_it_be(:group_user) { create(:user) }
before do
group.add_developer(user)
+ group.add_developer(group_user)
end
it "shares project with group" do
@@ -2074,6 +2133,14 @@ describe API::Projects do
expect(json_response['expires_at']).to eq(expires_at.to_s)
end
+ it 'updates project authorization' do
+ expect do
+ post api("/projects/#{project.id}/share", user), params: { group_id: group.id, group_access: Gitlab::Access::DEVELOPER }
+ end.to(
+ change { group_user.can?(:read_project, project) }.from(false).to(true)
+ )
+ end
+
it "returns a 400 error when group id is not given" do
post api("/projects/#{project.id}/share", user), params: { group_access: Gitlab::Access::DEVELOPER }
expect(response).to have_gitlab_http_status(:bad_request)
@@ -2123,9 +2190,12 @@ describe API::Projects do
describe 'DELETE /projects/:id/share/:group_id' do
context 'for a valid group' do
- let(:group) { create(:group, :public) }
+ let_it_be(:group) { create(:group, :private) }
+ let_it_be(:group_user) { create(:user) }
before do
+ group.add_developer(group_user)
+
create(:project_group_link, group: group, project: project)
end
@@ -2136,6 +2206,14 @@ describe API::Projects do
expect(project.project_group_links).to be_empty
end
+ it 'updates project authorization' do
+ expect do
+ delete api("/projects/#{project.id}/share/#{group.id}", user)
+ end.to(
+ change { group_user.can?(:read_project, project) }.from(true).to(false)
+ )
+ end
+
it_behaves_like '412 response' do
let(:request) { api("/projects/#{project.id}/share/#{group.id}", user) }
end
@@ -2438,6 +2516,21 @@ describe API::Projects do
expect(json_response['container_expiration_policy']['keep_n']).to eq(1)
expect(json_response['container_expiration_policy']['name_regex_keep']).to eq('foo.*')
end
+
+ it "doesn't update container_expiration_policy with invalid regex" do
+ project_param = {
+ container_expiration_policy_attributes: {
+ cadence: '1month',
+ keep_n: 1,
+ name_regex_keep: '['
+ }
+ }
+
+ put api("/projects/#{project3.id}", user4), params: project_param
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']['container_expiration_policy.name_regex_keep']).to contain_exactly('not valid RE2 syntax: missing ]: [')
+ end
end
context 'when authenticated as project developer' do
@@ -2477,11 +2570,11 @@ describe API::Projects do
let(:admin) { create(:admin) }
- it 'returns 500 when repository storage is unknown' do
+ it 'returns 400 when repository storage is unknown' do
put(api("/projects/#{new_project.id}", admin), params: { repository_storage: unknown_storage })
- expect(response).to have_gitlab_http_status(:internal_server_error)
- expect(json_response['message']).to match('ArgumentError')
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']['repository_storage_moves']).to eq(['is invalid'])
end
it 'returns 200 when repository storage has changed' do