Extract EE specific files/lines for Manage spec/requests/api
We have the following files containing EE specific code. We should move them to ee/
spec/requests/api/groups_spec.rb
diff --git a/spec/requests/api/groups_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/requests/api/groups_spec.rb
index 7176bc23e34..df120b91ea1 100644
--- a/spec/requests/api/groups_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/requests/api/groups_spec.rb
@@ -16,6 +16,7 @@ describe API::Groups do
before do
group1.add_owner(user1)
group2.add_owner(user2)
+ group1.ldap_group_links.create cn: 'ldap-group', group_access: Gitlab::Access::MAINTAINER, provider: 'ldap'
end
describe "GET /groups" do
@@ -57,6 +58,19 @@ describe API::Groups do
expect(json_response.length).to eq(1)
expect(json_response)
.to satisfy_one { |group| group['name'] == group1.name }
+
+ expect(json_response)
+ .to satisfy_one { |group| group['ldap_cn'] == group1.ldap_cn }
+ expect(json_response)
+ .to satisfy_one { |group| group['ldap_access'] == group1.ldap_access }
+
+ expect(json_response).to satisfy_one do |group|
+ ldap_group_link = group['ldap_group_links'].first
+
+ ldap_group_link['cn'] == group1.ldap_cn &&
+ ldap_group_link['group_access'] == group1.ldap_access &&
+ ldap_group_link['provider'] == 'ldap'
+ end
end
it "does not include statistics" do
@@ -452,6 +466,25 @@ describe API::Groups do
expect(response).to have_gitlab_http_status(404)
end
+
+ # EE
+ it 'returns 403 for updating shared_runners_minutes_limit' do
+ expect do
+ put api("/groups/#{group1.id}", user1), params: { shared_runners_minutes_limit: 133 }
+ end.not_to change { group1.shared_runners_minutes_limit }
+
+ expect(response).to have_gitlab_http_status(403)
+ end
+
+ it 'returns 200 if shared_runners_minutes_limit is not changing' do
+ group1.update(shared_runners_minutes_limit: 133)
+
+ expect do
+ put api("/groups/#{group1.id}", user1), params: { shared_runners_minutes_limit: 133 }
+ end.not_to change { group1.shared_runners_minutes_limit }
+
+ expect(response).to have_gitlab_http_status(200)
+ end
end
context 'when authenticated as the admin' do
@@ -461,6 +494,17 @@ describe API::Groups do
expect(response).to have_gitlab_http_status(200)
expect(json_response['name']).to eq(new_group_name)
end
+
+ # EE
+ it 'updates the group for shared_runners_minutes_limit' do
+ expect do
+ put api("/groups/#{group1.id}", admin), params: { shared_runners_minutes_limit: 133 }
+ end.to change { group1.reload.shared_runners_minutes_limit }
+ .from(nil).to(133)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response['shared_runners_minutes_limit']).to eq(133)
+ end
end
context 'when authenticated as an user that can see the group' do
@@ -855,6 +899,42 @@ describe API::Groups do
expect(response).to have_gitlab_http_status(400)
end
+
+ it "creates an ldap_group_link if ldap_cn and ldap_access are supplied" do
+ group_attributes = attributes_for(:group, ldap_cn: 'ldap-group', ldap_access: Gitlab::Access::DEVELOPER)
+ expect { post api("/groups", admin), params: group_attributes }.to change { LdapGroupLink.count }.by(1)
+ end
+
+ # EE
+ context 'when shared_runners_minutes_limit is given' do
+ context 'when the current user is not an admin' do
+ it "does not create a group with shared_runners_minutes_limit" do
+ group = attributes_for(:group, { shared_runners_minutes_limit: 133 })
+
+ expect do
+ post api("/groups", user3), params: group
+ end.not_to change { Group.count }
+
+ expect(response).to have_gitlab_http_status(403)
+ end
+ end
+
+ context 'when the current user is an admin' do
+ it "creates a group with shared_runners_minutes_limit" do
+ group = attributes_for(:group, { shared_runners_minutes_limit: 133 })
+
+ expect do
+ post api("/groups", admin), params: group
+ end.to change { Group.count }.by(1)
+
+ created_group = Group.find(json_response['id'])
+
+ expect(created_group.shared_runners_minutes_limit).to eq(133)
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['shared_runners_minutes_limit']).to eq(133)
+ end
+ end
+ end
end
end
@@ -981,4 +1061,100 @@ describe API::Groups do
group2.add_owner(user1)
end
end
+
+ describe 'POST /groups/:id/ldap_sync' do
+ before do
+ allow(Gitlab::Auth::LDAP::Config).to receive(:enabled?).and_return(true)
+ end
+
+ context 'when the ldap_group_sync feature is available' do
+ before do
+ stub_licensed_features(ldap_group_sync: true)
+ end
+
+ context 'when authenticated as the group owner' do
+ context 'when the group is ready to sync' do
+ it 'returns 202 Accepted' do
+ ldap_sync(group1.id, user1, :disable!)
+ expect(response).to have_gitlab_http_status(202)
+ end
+
+ it 'queues a sync job' do
+ expect { ldap_sync(group1.id, user1, :fake!) }.to change(LdapGroupSyncWorker.jobs, :size).by(1)
+ end
+
+ it 'sets the ldap_sync state to pending' do
+ ldap_sync(group1.id, user1, :disable!)
+ expect(group1.reload.ldap_sync_pending?).to be_truthy
+ end
+ end
+
+ context 'when the group is already pending a sync' do
+ before do
+ group1.pending_ldap_sync!
+ end
+
+ it 'returns 202 Accepted' do
+ ldap_sync(group1.id, user1, :disable!)
+ expect(response).to have_gitlab_http_status(202)
+ end
+
+ it 'does not queue a sync job' do
+ expect { ldap_sync(group1.id, user1, :fake!) }.not_to change(LdapGroupSyncWorker.jobs, :size)
+ end
+
+ it 'does not change the ldap_sync state' do
+ expect do
+ ldap_sync(group1.id, user1, :disable!)
+ end.not_to change { group1.reload.ldap_sync_status }
+ end
+ end
+
+ it 'returns 404 for a non existing group' do
+ ldap_sync(1328, user1, :disable!)
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
+
+ context 'when authenticated as the admin' do
+ it 'returns 202 Accepted' do
+ ldap_sync(group1.id, admin, :disable!)
+ expect(response).to have_gitlab_http_status(202)
+ end
+ end
+
+ context 'when authenticated as a non-owner user that can see the group' do
+ it 'returns 403' do
+ ldap_sync(group1.id, user2, :disable!)
+ expect(response).to have_gitlab_http_status(403)
+ end
+ end
+
+ context 'when authenticated as an user that cannot see the group' do
+ it 'returns 404' do
+ ldap_sync(group2.id, user1, :disable!)
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
+ end
+
+ context 'when the ldap_group_sync feature is not available' do
+ before do
+ stub_licensed_features(ldap_group_sync: false)
+ end
+
+ it 'returns 404 (same as CE would)' do
+ ldap_sync(group1.id, admin, :disable!)
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
+ end
+
+ def ldap_sync(group_id, user, sidekiq_testing_method)
+ Sidekiq::Testing.send(sidekiq_testing_method) do
+ post api("/groups/#{group_id}/ldap_sync", user)
+ end
+ end
end
spec/requests/api/members_spec.rb
diff --git a/spec/requests/api/members_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/requests/api/members_spec.rb
index 79edbb301f2..3e73ea3f7f8 100644
--- a/spec/requests/api/members_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/requests/api/members_spec.rb
@@ -293,6 +293,23 @@ describe API::Members do
end
end
+ ## EE specific
+ shared_examples 'POST /projects/:id/members with the project group membership locked' do
+ context 'project in a group' do
+ it 'returns a 405 method not allowed error when group membership lock is enabled' do
+ group_with_membership_locked = create(:group, membership_lock: true)
+ project = create(:project, group: group_with_membership_locked)
+ project.group.add_owner(maintainer)
+
+ post api("/projects/#{project.id}/members", maintainer),
+ params: { user_id: developer.id, access_level: Member::MAINTAINER }
+
+ expect(response.status).to eq 405
+ end
+ end
+ end
+ ## EE specific
+
shared_examples 'PUT /:source_type/:id/members/:user_id' do |source_type|
context "with :source_type == #{source_type.pluralize}" do
it_behaves_like 'a 404 response when source is private' do
@@ -433,6 +450,10 @@ describe API::Members do
let(:source) { project }
end
+ ## EE specific
+ it_behaves_like 'POST /projects/:id/members with the project group membership locked'
+ ## EE specific
+
it_behaves_like 'POST /:source_type/:id/members', 'group' do
let(:source) { group }
end
spec/requests/api/projects_spec.rb
diff --git a/spec/requests/api/projects_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/requests/api/projects_spec.rb
index 792abdb2972..ecfb84cd4ab 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/requests/api/projects_spec.rb
@@ -4,15 +4,6 @@ require 'spec_helper'
shared_examples 'languages and percentages JSON response' do
let(:expected_languages) { project.repository.languages.map { |language| language.values_at(:label, :value)}.to_h }
- before do
- allow(project.repository).to receive(:languages).and_return(
- [{ value: 66.69, label: "Ruby", color: "#701516", highlight: "#701516" },
- { value: 22.98, label: "JavaScript", color: "#f1e05a", highlight: "#f1e05a" },
- { value: 7.91, label: "HTML", color: "#e34c26", highlight: "#e34c26" },
- { value: 2.42, label: "CoffeeScript", color: "#244776", highlight: "#244776" }]
- )
- end
-
it 'returns expected language values' do
get api("/projects/#{project.id}/languages", user)
@@ -20,23 +11,6 @@ shared_examples 'languages and percentages JSON response' do
expect(json_response).to eq(expected_languages)
expect(json_response.count).to be > 1
end
-
- context 'when the languages were detected before' do
- before do
- Projects::DetectRepositoryLanguagesService.new(project, project.owner).execute
- end
-
- it 'returns the detection from the database' do
- # Allow this to happen once, so the expected languages can be determined
- expect(project.repository).to receive(:languages).once
-
- get api("/projects/#{project.id}/languages", user)
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to eq(expected_languages)
- expect(json_response.count).to be > 1
- end
- end
end
describe API::Projects do
@@ -981,7 +955,56 @@ describe API::Projects do
end
end
- context 'when authenticated' do
+ context 'when authenticated as an admin' do
+ it 'returns a project by id including repository_storage' do
+ project
+ project_member
+ group = create(:group)
+ link = create(:project_group_link, project: project, group: group)
+
+ get api("/projects/#{project.id}", admin)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response['id']).to eq(project.id)
+ expect(json_response['description']).to eq(project.description)
+ expect(json_response['default_branch']).to eq(project.default_branch)
+ expect(json_response['tag_list']).to be_an Array
+ expect(json_response['archived']).to be_falsey
+ expect(json_response['visibility']).to be_present
+ expect(json_response['ssh_url_to_repo']).to be_present
+ expect(json_response['http_url_to_repo']).to be_present
+ expect(json_response['web_url']).to be_present
+ expect(json_response['owner']).to be_a Hash
+ expect(json_response['owner']).to be_a Hash
+ expect(json_response['name']).to eq(project.name)
+ expect(json_response['path']).to be_present
+ expect(json_response['issues_enabled']).to be_present
+ expect(json_response['merge_requests_enabled']).to be_present
+ expect(json_response['wiki_enabled']).to be_present
+ expect(json_response['jobs_enabled']).to be_present
+ expect(json_response['snippets_enabled']).to be_present
+ expect(json_response['container_registry_enabled']).to be_present
+ expect(json_response['created_at']).to be_present
+ expect(json_response['last_activity_at']).to be_present
+ expect(json_response['shared_runners_enabled']).to be_present
+ expect(json_response['creator_id']).to be_present
+ expect(json_response['namespace']).to be_present
+ expect(json_response['avatar_url']).to be_nil
+ expect(json_response['star_count']).to be_present
+ expect(json_response['forks_count']).to be_present
+ expect(json_response['public_jobs']).to be_present
+ expect(json_response['shared_with_groups']).to be_an Array
+ expect(json_response['shared_with_groups'].length).to eq(1)
+ expect(json_response['shared_with_groups'][0]['group_id']).to eq(group.id)
+ 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['only_allow_merge_if_all_discussions_are_resolved']).to eq(project.only_allow_merge_if_all_discussions_are_resolved)
+ expect(json_response['repository_storage']).to eq(project.repository_storage)
+ end
+ end
+
+ context 'when authenticated as a regular user' do
before do
project
project_member
@@ -1037,6 +1060,7 @@ describe API::Projects do
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['merge_method']).to eq(project.merge_method.to_s)
expect(json_response['readme_url']).to eq(project.readme_url)
+ expect(json_response).not_to have_key('repository_storage')
end
it 'returns a group link with expiration date' do
@@ -1577,6 +1601,13 @@ describe API::Projects do
expect(project.project_group_links).to be_empty
end
+ it 'returns 204 when deleting a group share' do
+ delete api("/projects/#{project.id}/share/#{group.id}", user)
+
+ expect(response).to have_gitlab_http_status(204)
+ expect(project.project_group_links).to be_empty
+ end
+
it_behaves_like '412 response' do
let(:request) { api("/projects/#{project.id}/share/#{group.id}", user) }
end
@@ -1690,6 +1721,15 @@ describe API::Projects do
expect(json_response['request_access_enabled']).to eq(false)
end
+ it 'updates approvals_before_merge' do
+ project_param = { approvals_before_merge: 3 }
+
+ put api("/projects/#{project.id}", user), params: project_param
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response['approvals_before_merge']).to eq(3)
+ end
+
it 'updates path & name to existing path & name in different namespace' do
project_param = { path: project4.path, name: project4.name }
spec/requests/api/services_spec.rb
diff --git a/spec/requests/api/services_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/requests/api/services_spec.rb
index e260aa21e25..7f25e8dbd0a 100644
--- a/spec/requests/api/services_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/requests/api/services_spec.rb
@@ -198,4 +198,21 @@ describe API::Services do
expect(json_response['properties']['username']).to eq('new_username')
end
end
+
+ describe 'Slack application Service' do
+ before do
+ project.create_gitlab_slack_application_service
+
+ stub_application_setting(
+ slack_app_verification_token: 'token'
+ )
+ end
+
+ it 'returns status 200' do
+ post api('/slack/trigger'), params: { token: 'token', text: 'help' }
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response['response_type']).to eq("ephemeral")
+ end
+ end
end
spec/requests/api/settings_spec.rb
diff --git a/spec/requests/api/settings_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/requests/api/settings_spec.rb
index f33eb5b9e02..3304e75c1bb 100644
--- a/spec/requests/api/settings_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/requests/api/settings_spec.rb
@@ -13,6 +13,7 @@ describe API::Settings, 'Settings' do
expect(json_response['default_projects_limit']).to eq(42)
expect(json_response['password_authentication_enabled_for_web']).to be_truthy
expect(json_response['repository_storages']).to eq(['default'])
+ expect(json_response['password_authentication_enabled']).to be_truthy
expect(json_response['plantuml_enabled']).to be_falsey
expect(json_response['plantuml_url']).to be_nil
expect(json_response['default_project_visibility']).to be_a String
spec/requests/api/users_spec.rb
diff --git a/spec/requests/api/users_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/requests/api/users_spec.rb
index b381431306d..1b337f42042 100644
--- a/spec/requests/api/users_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/requests/api/users_spec.rb
@@ -269,6 +269,17 @@ describe API::Users do
expect(response).to have_gitlab_http_status(400)
end
end
+
+ context "when authenticated and ldap is enabled" do
+ it "returns non-ldap user" do
+ create :omniauth_user, provider: "ldapserver1"
+ get api("/users", user), params: { skip_ldap: "true" }
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response).to be_an Array
+ username = user.username
+ expect(json_response.first["username"]).to eq username
+ end
+ end
end
describe "GET /users/:id" do
@@ -613,10 +624,13 @@ describe API::Users do
end
it "updates user with new password and forces reset on next login" do
+ stub_licensed_features(extended_audit_events: true)
+
put api("/users/#{user.id}", admin), params: { password: '12345678' }
expect(response).to have_gitlab_http_status(200)
expect(user.reload.password_expires_at).to be <= Time.now
+ expect(AuditEvent.count).to eq(1)
end
it "updates user with organization" do
@@ -706,6 +720,17 @@ describe API::Users do
expect(user.reload.private_profile).to eq(true)
end
+ # EE
+ it "updates shared_runners_minutes_limit" do
+ expect do
+ put api("/users/#{user.id}", admin), params: { shared_runners_minutes_limit: 133 }
+ end.to change { user.reload.shared_runners_minutes_limit }
+ .from(nil).to(133)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response['shared_runners_minutes_limit']).to eq(133)
+ end
+
it "does not update admin status" do
put api("/users/#{admin_user.id}", admin), params: { can_create_group: false }
@@ -729,6 +754,14 @@ describe API::Users do
expect(response).to have_gitlab_http_status(403)
end
+
+ it "cannot update their own shared_runners_minutes_limit" do
+ expect do
+ put api("/users/#{user.id}", user), params: { shared_runners_minutes_limit: 133 }
+ end.not_to change { user.reload.shared_runners_minutes_limit }
+
+ expect(response).to have_gitlab_http_status(403)
+ end
end
it "returns 404 for non-existing user" do
A lot of files but most of them should be able to just move to EE files.