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>2021-06-10 06:10:01 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-06-10 06:10:01 +0300
commitebc589e90ca9bc03315411b912d2ce957cb84903 (patch)
treef0a84c8b0d79a916b4de68c153b6b369d91ba87e
parent26774b8d98581b2f211cd5cf04dcec0e352c04a6 (diff)
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new Git repository type.md6
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new blob type.md6
-rw-r--r--app/controllers/admin/groups_controller.rb2
-rw-r--r--app/controllers/concerns/membership_actions.rb2
-rw-r--r--app/services/members/create_service.rb7
-rw-r--r--doc/api/commits.md1
-rw-r--r--doc/api/issues.md2
-rw-r--r--doc/api/merge_requests.md13
-rw-r--r--doc/api/search.md3
-rw-r--r--doc/api/todos.md3
-rw-r--r--lib/api/entities/merge_request_basic.rb6
-rw-r--r--lib/tasks/gitlab/storage.rake34
-rw-r--r--locale/gitlab.pot3
-rw-r--r--spec/controllers/admin/groups_controller_spec.rb21
-rw-r--r--spec/controllers/groups/group_members_controller_spec.rb39
-rw-r--r--spec/controllers/projects/project_members_controller_spec.rb74
-rw-r--r--spec/lib/api/entities/merge_request_basic_spec.rb11
-rw-r--r--spec/requests/api/merge_requests_spec.rb16
-rw-r--r--spec/services/members/create_service_spec.rb22
-rw-r--r--spec/services/members/invite_service_spec.rb2
-rw-r--r--spec/tasks/gitlab/storage_rake_spec.rb29
21 files changed, 214 insertions, 88 deletions
diff --git a/.gitlab/issue_templates/Geo Replicate a new Git repository type.md b/.gitlab/issue_templates/Geo Replicate a new Git repository type.md
index feabef36f20..be6fef40f3a 100644
--- a/.gitlab/issue_templates/Geo Replicate a new Git repository type.md
+++ b/.gitlab/issue_templates/Geo Replicate a new Git repository type.md
@@ -513,6 +513,12 @@ That's all of the required database changes.
last_synced_at { 1.day.ago }
retry_count { 0 }
end
+
+ trait :verification_succeeded do
+ verification_checksum { 'e079a831cab27bcda7d81cd9b48296d0c3dd92ef' }
+ verification_state { Geo::CoolWidgetRegistry.verification_state_value(:verification_succeeded) }
+ verified_at { 5.days.ago }
+ end
end
end
```
diff --git a/.gitlab/issue_templates/Geo Replicate a new blob type.md b/.gitlab/issue_templates/Geo Replicate a new blob type.md
index b9e69d36ecc..c7bbb6b937c 100644
--- a/.gitlab/issue_templates/Geo Replicate a new blob type.md
+++ b/.gitlab/issue_templates/Geo Replicate a new blob type.md
@@ -479,6 +479,12 @@ That's all of the required database changes.
last_synced_at { 1.day.ago }
retry_count { 0 }
end
+
+ trait :verification_succeeded do
+ verification_checksum { 'e079a831cab27bcda7d81cd9b48296d0c3dd92ef' }
+ verification_state { Geo::CoolWidgetRegistry.verification_state_value(:verification_succeeded) }
+ verified_at { 5.days.ago }
+ end
end
end
```
diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb
index 5b33ee78e8c..9abb244bc92 100644
--- a/app/controllers/admin/groups_controller.rb
+++ b/app/controllers/admin/groups_controller.rb
@@ -62,7 +62,7 @@ class Admin::GroupsController < Admin::ApplicationController
def members_update
member_params = params.permit(:user_ids, :access_level, :expires_at)
- result = Members::CreateService.new(current_user, member_params.merge(limit: -1, source: @group)).execute
+ result = Members::CreateService.new(current_user, member_params.merge(limit: -1, source: @group, invite_source: 'admin-group-page')).execute
if result[:status] == :success
redirect_to [:admin, @group], notice: _('Users were successfully added.')
diff --git a/app/controllers/concerns/membership_actions.rb b/app/controllers/concerns/membership_actions.rb
index a4b64a7848c..1d548fd4f85 100644
--- a/app/controllers/concerns/membership_actions.rb
+++ b/app/controllers/concerns/membership_actions.rb
@@ -6,7 +6,7 @@ module MembershipActions
def create
create_params = params.permit(:user_ids, :access_level, :expires_at)
- result = Members::CreateService.new(current_user, create_params.merge({ source: membershipable })).execute
+ result = Members::CreateService.new(current_user, create_params.merge({ source: membershipable, invite_source: "#{source_type}-members-page" })).execute
if result[:status] == :success
redirect_to members_page_url, notice: _('Users were successfully added.')
diff --git a/app/services/members/create_service.rb b/app/services/members/create_service.rb
index f2556966708..5d3c4a5c54a 100644
--- a/app/services/members/create_service.rb
+++ b/app/services/members/create_service.rb
@@ -16,6 +16,7 @@ module Members
end
def execute
+ validate_invite_source!
validate_invites!
add_members
@@ -33,6 +34,10 @@ module Members
params[:user_ids]
end
+ def validate_invite_source!
+ raise ArgumentError, s_('AddMember|No invite source provided.') unless invite_source.present?
+ end
+
def validate_invites!
raise BlankInvitesError, blank_invites_message if invites.blank?
@@ -79,7 +84,7 @@ module Members
end
def invite_source
- params[:invite_source] || 'unknown'
+ params[:invite_source]
end
def tracking_property(member)
diff --git a/doc/api/commits.md b/doc/api/commits.md
index 4238d6d05df..711b565bdbd 100644
--- a/doc/api/commits.md
+++ b/doc/api/commits.md
@@ -798,6 +798,7 @@ Example response:
"source_project_id":35,
"target_project_id":35,
"labels":[ ],
+ "draft":false,
"work_in_progress":false,
"milestone":null,
"merge_when_pipeline_succeeds":false,
diff --git a/doc/api/issues.md b/doc/api/issues.md
index 71610ba7422..f321c00e7f2 100644
--- a/doc/api/issues.md
+++ b/doc/api/issues.md
@@ -2080,6 +2080,7 @@ Example response:
"source_project_id": 1,
"target_project_id": 1,
"labels": [],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 27,
@@ -2231,6 +2232,7 @@ Example response:
"closed_at": null,
"closed_by": null,
"labels": [],
+ "draft": false,
"work_in_progress": false,
"milestone": null,
"merge_when_pipeline_succeeds": false,
diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md
index fd5da7d9180..57754f62d5a 100644
--- a/doc/api/merge_requests.md
+++ b/doc/api/merge_requests.md
@@ -16,6 +16,7 @@ type: reference, api
> - `with_merge_status_recheck` was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/31890) in GitLab 13.0.
> - `reviewer_username` and `reviewer_id` were [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49341) in GitLab 13.8.
> - `reviewer_ids` was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51186) in GitLab 13.8.
+> - `draft` was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63473) as an eventual replacement for `work_in_progress` in GitLab 14.0
Every API call to merge requests must be authenticated.
@@ -174,6 +175,7 @@ Parameters:
"Community contribution",
"Manage"
],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
@@ -357,6 +359,7 @@ Parameters:
"Community contribution",
"Manage"
],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
@@ -542,6 +545,7 @@ Parameters:
"Community contribution",
"Manage"
],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
@@ -680,6 +684,7 @@ Parameters:
"Community contribution",
"Manage"
],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
@@ -912,6 +917,7 @@ Parameters:
"target_project_id": 4,
"labels": [ ],
"description": "Qui voluptatibus placeat ipsa alias quasi. Deleniti rem ut sint. Optio velit qui distinctio.",
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
@@ -1122,6 +1128,7 @@ POST /projects/:id/merge_requests
"Community contribution",
"Manage"
],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
@@ -1292,6 +1299,7 @@ Must include at least one non-required attribute from above.
"Community contribution",
"Manage"
],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
@@ -1477,6 +1485,7 @@ Parameters:
"Community contribution",
"Manage"
],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
@@ -1665,6 +1674,7 @@ Parameters:
"Community contribution",
"Manage"
],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
@@ -1966,6 +1976,7 @@ Example response:
"Community contribution",
"Manage"
],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
@@ -2125,6 +2136,7 @@ Example response:
"Community contribution",
"Manage"
],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
@@ -2301,6 +2313,7 @@ Example response:
"source_project_id": 3,
"target_project_id": 3,
"labels": [],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 27,
diff --git a/doc/api/search.md b/doc/api/search.md
index cc5a23cd7a7..9714bc17f62 100644
--- a/doc/api/search.md
+++ b/doc/api/search.md
@@ -178,6 +178,7 @@ Example response:
"ruby",
"tests"
],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 13,
@@ -600,6 +601,7 @@ Example response:
"ruby",
"tests"
],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 13,
@@ -958,6 +960,7 @@ Example response:
"ruby",
"tests"
],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 13,
diff --git a/doc/api/todos.md b/doc/api/todos.md
index 864f87f988e..69c0f760a29 100644
--- a/doc/api/todos.md
+++ b/doc/api/todos.md
@@ -88,6 +88,7 @@ Example Response:
"source_project_id": 2,
"target_project_id": 2,
"labels": [],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 32,
@@ -161,6 +162,7 @@ Example Response:
"source_project_id": 2,
"target_project_id": 2,
"labels": [],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 32,
@@ -259,6 +261,7 @@ Example Response:
"source_project_id": 2,
"target_project_id": 2,
"labels": [],
+ "draft": false,
"work_in_progress": false,
"milestone": {
"id": 32,
diff --git a/lib/api/entities/merge_request_basic.rb b/lib/api/entities/merge_request_basic.rb
index cf8d03bf176..d5cf2f653db 100644
--- a/lib/api/entities/merge_request_basic.rb
+++ b/lib/api/entities/merge_request_basic.rb
@@ -36,7 +36,11 @@ module API
merge_request.labels.map(&:title).sort
end
end
- expose :work_in_progress?, as: :work_in_progress
+ expose :draft?, as: :draft
+
+ # [Deprecated] see draft
+ #
+ expose :draft?, as: :work_in_progress
expose :milestone, using: Entities::Milestone
expose :merge_when_pipeline_succeeds
diff --git a/lib/tasks/gitlab/storage.rake b/lib/tasks/gitlab/storage.rake
index ede6b6af80b..6fa39a26488 100644
--- a/lib/tasks/gitlab/storage.rake
+++ b/lib/tasks/gitlab/storage.rake
@@ -96,8 +96,12 @@ namespace :gitlab do
desc 'Gitlab | Storage | Summary of existing projects using Legacy Storage'
task legacy_projects: :environment do
- helper = Gitlab::HashedStorage::RakeHelper
- helper.relation_summary('projects using Legacy Storage', Project.without_storage_feature(:repository))
+ # Required to prevent Docker upgrade to 14.0 if there data on legacy storage
+ # See: https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5311#note_590454698
+ wait_until_database_is_ready do
+ helper = Gitlab::HashedStorage::RakeHelper
+ helper.relation_summary('projects using Legacy Storage', Project.without_storage_feature(:repository))
+ end
end
desc 'Gitlab | Storage | List existing projects using Legacy Storage'
@@ -135,8 +139,12 @@ namespace :gitlab do
desc 'Gitlab | Storage | Summary of project attachments using Legacy Storage'
task legacy_attachments: :environment do
- helper = Gitlab::HashedStorage::RakeHelper
- helper.relation_summary('attachments using Legacy Storage', helper.legacy_attachments_relation)
+ # Required to prevent Docker upgrade to 14.0 if there data on legacy storage
+ # See: https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5311#note_590454698
+ wait_until_database_is_ready do
+ helper = Gitlab::HashedStorage::RakeHelper
+ helper.relation_summary('attachments using Legacy Storage', helper.legacy_attachments_relation)
+ end
end
desc 'Gitlab | Storage | List existing project attachments using Legacy Storage'
@@ -156,5 +164,23 @@ namespace :gitlab do
helper = Gitlab::HashedStorage::RakeHelper
helper.attachments_list('attachments using Hashed Storage', helper.hashed_attachments_relation)
end
+
+ def wait_until_database_is_ready
+ attempts = (ENV['MAX_DATABASE_CONNECTION_CHECKS'] || 1).to_i
+ inverval = (ENV['MAX_DATABASE_CONNECTION_CHECK_INTERVAL'] || 10).to_f
+
+ attempts.to_i.times do
+ unless Gitlab::Database.exists?
+ puts "Waiting until database is ready before continuing...".color(:yellow)
+ sleep inverval
+ end
+ end
+
+ yield
+ rescue ActiveRecord::ConnectionNotEstablished => ex
+ puts "Failed to connect to the database...".color(:red)
+ puts "Error: #{ex}"
+ exit 1
+ end
end
end
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 78a85532525..ae3521dedab 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -2095,6 +2095,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
diff --git a/spec/controllers/admin/groups_controller_spec.rb b/spec/controllers/admin/groups_controller_spec.rb
index 8e31ef12adf..d9b7e00fd75 100644
--- a/spec/controllers/admin/groups_controller_spec.rb
+++ b/spec/controllers/admin/groups_controller_spec.rb
@@ -3,9 +3,9 @@
require 'spec_helper'
RSpec.describe Admin::GroupsController do
- let(:group) { create(:group) }
- let(:project) { create(:project, namespace: group) }
- let(:admin) { create(:admin) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, namespace: group) }
+ let_it_be(:admin) { create(:admin) }
before do
sign_in(admin)
@@ -46,9 +46,9 @@ RSpec.describe Admin::GroupsController do
end
describe 'PUT #members_update' do
- let(:group_user) { create(:user) }
+ let_it_be(:group_user) { create(:user) }
- it 'adds user to members' do
+ it 'adds user to members', :aggregate_failures, :snowplow do
put :members_update, params: {
id: group,
user_ids: group_user.id,
@@ -58,9 +58,16 @@ RSpec.describe Admin::GroupsController do
expect(controller).to set_flash.to 'Users were successfully added.'
expect(response).to redirect_to(admin_group_path(group))
expect(group.users).to include group_user
+ expect_snowplow_event(
+ category: 'Members::CreateService',
+ action: 'create_member',
+ label: 'admin-group-page',
+ property: 'existing_user',
+ user: admin
+ )
end
- it 'can add unlimited members' do
+ it 'can add unlimited members', :aggregate_failures do
put :members_update, params: {
id: group,
user_ids: 1.upto(1000).to_a.join(','),
@@ -71,7 +78,7 @@ RSpec.describe Admin::GroupsController do
expect(response).to redirect_to(admin_group_path(group))
end
- it 'adds no user to members' do
+ it 'adds no user to members', :aggregate_failures do
put :members_update, params: {
id: group,
user_ids: '',
diff --git a/spec/controllers/groups/group_members_controller_spec.rb b/spec/controllers/groups/group_members_controller_spec.rb
index a3e0c9f9ca4..4b17326de09 100644
--- a/spec/controllers/groups/group_members_controller_spec.rb
+++ b/spec/controllers/groups/group_members_controller_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe Groups::GroupMembersController do
end
describe 'GET index' do
- it 'renders index with 200 status code' do
+ it 'renders index with 200 status code', :aggregate_failures do
get :index, params: { group_id: group }
expect(response).to have_gitlab_http_status(:ok)
@@ -118,7 +118,7 @@ RSpec.describe Groups::GroupMembersController do
group.add_developer(user)
end
- it 'returns 403' do
+ it 'returns 403', :aggregate_failures do
post :create, params: {
group_id: group,
user_ids: group_user.id,
@@ -135,7 +135,7 @@ RSpec.describe Groups::GroupMembersController do
group.add_owner(user)
end
- it 'adds user to members' do
+ it 'adds user to members', :aggregate_failures, :snowplow do
post :create, params: {
group_id: group,
user_ids: group_user.id,
@@ -145,9 +145,16 @@ RSpec.describe Groups::GroupMembersController do
expect(controller).to set_flash.to 'Users were successfully added.'
expect(response).to redirect_to(group_group_members_path(group))
expect(group.users).to include group_user
+ expect_snowplow_event(
+ category: 'Members::CreateService',
+ action: 'create_member',
+ label: 'group-members-page',
+ property: 'existing_user',
+ user: user
+ )
end
- it 'adds no user to members' do
+ it 'adds no user to members', :aggregate_failures do
post :create, params: {
group_id: group,
user_ids: '',
@@ -177,7 +184,7 @@ RSpec.describe Groups::GroupMembersController do
context 'when set to a date in the past' do
let(:expires_at) { 2.days.ago }
- it 'does not add user to members' do
+ it 'does not add user to members', :aggregate_failures do
subject
expect(flash[:alert]).to include('Expires at cannot be a date in the past')
@@ -189,7 +196,7 @@ RSpec.describe Groups::GroupMembersController do
context 'when set to a date in the future' do
let(:expires_at) { 5.days.from_now }
- it 'adds user to members' do
+ it 'adds user to members', :aggregate_failures do
subject
expect(controller).to set_flash.to 'Users were successfully added.'
@@ -326,7 +333,7 @@ RSpec.describe Groups::GroupMembersController do
group.add_developer(user)
end
- it 'returns 403' do
+ it 'returns 403', :aggregate_failures do
delete :destroy, params: { group_id: group, id: member }
expect(response).to have_gitlab_http_status(:forbidden)
@@ -339,7 +346,7 @@ RSpec.describe Groups::GroupMembersController do
group.add_owner(user)
end
- it '[HTML] removes user from members' do
+ it '[HTML] removes user from members', :aggregate_failures do
delete :destroy, params: { group_id: group, id: member }
expect(controller).to set_flash.to 'User was successfully removed from group.'
@@ -348,7 +355,7 @@ RSpec.describe Groups::GroupMembersController do
expect(sub_group.members).to include sub_member
end
- it '[HTML] removes user from members including subgroups and projects' do
+ it '[HTML] removes user from members including subgroups and projects', :aggregate_failures do
delete :destroy, params: { group_id: group, id: member, remove_sub_memberships: true }
expect(controller).to set_flash.to 'User was successfully removed from group and any subgroups and projects.'
@@ -357,7 +364,7 @@ RSpec.describe Groups::GroupMembersController do
expect(sub_group.members).not_to include sub_member
end
- it '[JS] removes user from members' do
+ it '[JS] removes user from members', :aggregate_failures do
delete :destroy, params: { group_id: group, id: member }, xhr: true
expect(response).to be_successful
@@ -386,7 +393,7 @@ RSpec.describe Groups::GroupMembersController do
group.add_developer(user)
end
- it 'removes user from members' do
+ it 'removes user from members', :aggregate_failures do
delete :leave, params: { group_id: group }
expect(controller).to set_flash.to "You left the \"#{group.name}\" group."
@@ -394,7 +401,7 @@ RSpec.describe Groups::GroupMembersController do
expect(group.users).not_to include user
end
- it 'supports json request' do
+ it 'supports json request', :aggregate_failures do
delete :leave, params: { group_id: group }, format: :json
expect(response).to have_gitlab_http_status(:ok)
@@ -421,7 +428,7 @@ RSpec.describe Groups::GroupMembersController do
group.request_access(user)
end
- it 'removes user from members' do
+ it 'removes user from members', :aggregate_failures do
delete :leave, params: { group_id: group }
expect(controller).to set_flash.to 'Your access request to the group has been withdrawn.'
@@ -438,7 +445,7 @@ RSpec.describe Groups::GroupMembersController do
sign_in(user)
end
- it 'creates a new GroupMember that is not a team member' do
+ it 'creates a new GroupMember that is not a team member', :aggregate_failures do
post :request_access, params: { group_id: group }
expect(controller).to set_flash.to 'Your request for access has been queued for review.'
@@ -469,7 +476,7 @@ RSpec.describe Groups::GroupMembersController do
group.add_developer(user)
end
- it 'returns 403' do
+ it 'returns 403', :aggregate_failures do
post :approve_access_request, params: { group_id: group, id: member }
expect(response).to have_gitlab_http_status(:forbidden)
@@ -482,7 +489,7 @@ RSpec.describe Groups::GroupMembersController do
group.add_owner(user)
end
- it 'adds user to members' do
+ it 'adds user to members', :aggregate_failures do
post :approve_access_request, params: { group_id: group, id: member }
expect(response).to redirect_to(group_group_members_path(group))
diff --git a/spec/controllers/projects/project_members_controller_spec.rb b/spec/controllers/projects/project_members_controller_spec.rb
index bb817fc94b2..9ed43a251a2 100644
--- a/spec/controllers/projects/project_members_controller_spec.rb
+++ b/spec/controllers/projects/project_members_controller_spec.rb
@@ -3,9 +3,9 @@
require('spec_helper')
RSpec.describe Projects::ProjectMembersController do
- let(:user) { create(:user) }
- let(:group) { create(:group, :public) }
- let(:project) { create(:project, :public) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group, :public) }
+ let_it_be(:project, reload: true) { create(:project, :public) }
before do
travel_to DateTime.new(2019, 4, 1)
@@ -24,8 +24,8 @@ RSpec.describe Projects::ProjectMembersController do
context 'project members' do
context 'when project belongs to group' do
- let(:user_in_group) { create(:user) }
- let(:project_in_group) { create(:project, :public, group: group) }
+ let_it_be(:user_in_group) { create(:user) }
+ let_it_be(:project_in_group) { create(:project, :public, group: group) }
before do
group.add_owner(user_in_group)
@@ -69,7 +69,7 @@ RSpec.describe Projects::ProjectMembersController do
end
context 'group links' do
- let!(:project_group_link) { create(:project_group_link, project: project, group: group) }
+ let_it_be(:project_group_link) { create(:project_group_link, project: project, group: group) }
it 'lists group links' do
get :index, params: { namespace_id: project.namespace, project_id: project }
@@ -90,7 +90,7 @@ RSpec.describe Projects::ProjectMembersController do
end
context 'invited members' do
- let!(:invited_member) { create(:project_member, :invited, project: project) }
+ let_it_be(:invited_member) { create(:project_member, :invited, project: project) }
before do
project.add_maintainer(user)
@@ -123,7 +123,7 @@ RSpec.describe Projects::ProjectMembersController do
end
context 'access requests' do
- let(:access_requester_user) { create(:user) }
+ let_it_be(:access_requester_user) { create(:user) }
before do
project.request_access(access_requester_user)
@@ -158,7 +158,7 @@ RSpec.describe Projects::ProjectMembersController do
end
describe 'POST create' do
- let(:project_user) { create(:user) }
+ let_it_be(:project_user) { create(:user) }
before do
sign_in(user)
@@ -169,7 +169,7 @@ RSpec.describe Projects::ProjectMembersController do
project.add_developer(user)
end
- it 'returns 404' do
+ it 'returns 404', :aggregate_failures do
post :create, params: {
namespace_id: project.namespace,
project_id: project,
@@ -187,11 +187,7 @@ RSpec.describe Projects::ProjectMembersController do
project.add_maintainer(user)
end
- it 'adds user to members' do
- expect_next_instance_of(Members::CreateService) do |instance|
- expect(instance).to receive(:execute).and_return(status: :success)
- end
-
+ it 'adds user to members', :aggregate_failures, :snowplow do
post :create, params: {
namespace_id: project.namespace,
project_id: project,
@@ -201,9 +197,17 @@ RSpec.describe Projects::ProjectMembersController do
expect(controller).to set_flash.to 'Users were successfully added.'
expect(response).to redirect_to(project_project_members_path(project))
+ expect(project.users).to include project_user
+ expect_snowplow_event(
+ category: 'Members::CreateService',
+ action: 'create_member',
+ label: 'project-members-page',
+ property: 'existing_user',
+ user: user
+ )
end
- it 'adds no user to members' do
+ it 'adds no user to members', :aggregate_failures do
expect_next_instance_of(Members::CreateService) do |instance|
expect(instance).to receive(:execute).and_return(status: :failure, message: 'Message')
end
@@ -230,7 +234,7 @@ RSpec.describe Projects::ProjectMembersController do
unrelated_project.add_maintainer(project_bot)
end
- it 'returns error' do
+ it 'returns error', :aggregate_failures do
post :create, params: {
namespace_id: project.namespace,
project_id: project,
@@ -261,7 +265,7 @@ RSpec.describe Projects::ProjectMembersController do
context 'when set to a date in the past' do
let(:expires_at) { 2.days.ago }
- it 'does not add user to members' do
+ it 'does not add user to members', :aggregate_failures do
subject
expect(flash[:alert]).to include('Expires at cannot be a date in the past')
@@ -273,7 +277,7 @@ RSpec.describe Projects::ProjectMembersController do
context 'when set to a date in the future' do
let(:expires_at) { 5.days.from_now }
- it 'adds user to members' do
+ it 'adds user to members', :aggregate_failures do
subject
expect(controller).to set_flash.to 'Users were successfully added.'
@@ -285,7 +289,7 @@ RSpec.describe Projects::ProjectMembersController do
end
describe 'PUT update' do
- let(:requester) { create(:project_member, :access_request, project: project) }
+ let_it_be(:requester) { create(:project_member, :access_request, project: project) }
before do
project.add_maintainer(user)
@@ -393,7 +397,7 @@ RSpec.describe Projects::ProjectMembersController do
end
describe 'DELETE destroy' do
- let(:member) { create(:project_member, :developer, project: project) }
+ let_it_be(:member) { create(:project_member, :developer, project: project) }
before do
sign_in(user)
@@ -417,7 +421,7 @@ RSpec.describe Projects::ProjectMembersController do
project.add_developer(user)
end
- it 'returns 404' do
+ it 'returns 404', :aggregate_failures do
delete :destroy, params: {
namespace_id: project.namespace,
project_id: project,
@@ -434,7 +438,7 @@ RSpec.describe Projects::ProjectMembersController do
project.add_maintainer(user)
end
- it '[HTML] removes user from members' do
+ it '[HTML] removes user from members', :aggregate_failures do
delete :destroy, params: {
namespace_id: project.namespace,
project_id: project,
@@ -447,7 +451,7 @@ RSpec.describe Projects::ProjectMembersController do
expect(project.members).not_to include member
end
- it '[JS] removes user from members' do
+ it '[JS] removes user from members', :aggregate_failures do
delete :destroy, params: {
namespace_id: project.namespace,
project_id: project,
@@ -483,7 +487,7 @@ RSpec.describe Projects::ProjectMembersController do
project.add_developer(user)
end
- it 'removes user from members' do
+ it 'removes user from members', :aggregate_failures do
delete :leave, params: {
namespace_id: project.namespace,
project_id: project
@@ -517,7 +521,7 @@ RSpec.describe Projects::ProjectMembersController do
project.request_access(user)
end
- it 'removes user from members' do
+ it 'removes user from members', :aggregate_failures do
delete :leave, params: {
namespace_id: project.namespace,
project_id: project
@@ -537,7 +541,7 @@ RSpec.describe Projects::ProjectMembersController do
sign_in(user)
end
- it 'creates a new ProjectMember that is not a team member' do
+ it 'creates a new ProjectMember that is not a team member', :aggregate_failures do
post :request_access, params: {
namespace_id: project.namespace,
project_id: project
@@ -553,7 +557,7 @@ RSpec.describe Projects::ProjectMembersController do
end
describe 'POST approve' do
- let(:member) { create(:project_member, :access_request, project: project) }
+ let_it_be(:member) { create(:project_member, :access_request, project: project) }
before do
sign_in(user)
@@ -577,7 +581,7 @@ RSpec.describe Projects::ProjectMembersController do
project.add_developer(user)
end
- it 'returns 404' do
+ it 'returns 404', :aggregate_failures do
post :approve_access_request, params: {
namespace_id: project.namespace,
project_id: project,
@@ -594,7 +598,7 @@ RSpec.describe Projects::ProjectMembersController do
project.add_maintainer(user)
end
- it 'adds user to members' do
+ it 'adds user to members', :aggregate_failures do
post :approve_access_request, params: {
namespace_id: project.namespace,
project_id: project,
@@ -611,8 +615,8 @@ RSpec.describe Projects::ProjectMembersController do
end
describe 'POST apply_import' do
- let(:another_project) { create(:project, :private) }
- let(:member) { create(:user) }
+ let_it_be(:another_project) { create(:project, :private) }
+ let_it_be(:member) { create(:user) }
before do
project.add_maintainer(user)
@@ -637,7 +641,7 @@ RSpec.describe Projects::ProjectMembersController do
include_context 'import applied'
- it 'imports source project members' do
+ it 'imports source project members', :aggregate_failures do
expect(project.team_members).to include member
expect(controller).to set_flash.to 'Successfully imported'
expect(response).to redirect_to(
@@ -660,7 +664,7 @@ RSpec.describe Projects::ProjectMembersController do
end
describe 'POST create' do
- let(:stranger) { create(:user) }
+ let_it_be(:stranger) { create(:user) }
context 'when creating owner' do
before do
@@ -700,7 +704,7 @@ RSpec.describe Projects::ProjectMembersController do
end
describe 'POST resend_invite' do
- let(:member) { create(:project_member, project: project) }
+ let_it_be(:member) { create(:project_member, project: project) }
before do
project.add_maintainer(user)
diff --git a/spec/lib/api/entities/merge_request_basic_spec.rb b/spec/lib/api/entities/merge_request_basic_spec.rb
index 8572b067984..b9d6ab7a652 100644
--- a/spec/lib/api/entities/merge_request_basic_spec.rb
+++ b/spec/lib/api/entities/merge_request_basic_spec.rb
@@ -9,11 +9,22 @@ RSpec.describe ::API::Entities::MergeRequestBasic do
let_it_be(:labels) { create_list(:label, 3) }
let_it_be(:merge_requests) { create_list(:labeled_merge_request, 10, :unique_branches, labels: labels) }
+ let_it_be(:entity) { described_class.new(merge_request) }
+
# This mimics the behavior of the `Grape::Entity` serializer
def present(obj)
described_class.new(obj).presented
end
+ subject { entity.as_json }
+
+ it 'includes basic fields' do
+ is_expected.to include(
+ draft: merge_request.draft?,
+ work_in_progress: merge_request.draft?
+ )
+ end
+
context "with :with_api_entity_associations scope" do
let(:scope) { MergeRequest.with_api_entity_associations }
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index 0c3e74bd1fd..eb6e78aeda2 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -1186,7 +1186,8 @@ RSpec.describe API::MergeRequests do
expect(json_response['downvotes']).to eq(1)
expect(json_response['source_project_id']).to eq(merge_request.source_project.id)
expect(json_response['target_project_id']).to eq(merge_request.target_project.id)
- expect(json_response['work_in_progress']).to be_falsy
+ expect(json_response['draft']).to be false
+ expect(json_response['work_in_progress']).to be false
expect(json_response['merge_when_pipeline_succeeds']).to be_falsy
expect(json_response['merge_status']).to eq('can_be_merged')
expect(json_response['should_close_merge_request']).to be_falsy
@@ -1329,22 +1330,23 @@ RSpec.describe API::MergeRequests do
expect(response).to have_gitlab_http_status(:not_found)
end
- context 'Work in Progress' do
- let!(:merge_request_wip) do
+ context 'Draft' do
+ let!(:merge_request_draft) do
create(:merge_request,
author: user,
assignees: [user],
source_project: project,
target_project: project,
- title: "WIP: Test",
+ title: "Draft: Test",
created_at: base_time + 1.second
)
end
it "returns merge request" do
- get api("/projects/#{project.id}/merge_requests/#{merge_request_wip.iid}", user)
+ get api("/projects/#{project.id}/merge_requests/#{merge_request_draft.iid}", user)
expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['draft']).to eq(true)
expect(json_response['work_in_progress']).to eq(true)
end
end
@@ -2522,8 +2524,8 @@ RSpec.describe API::MergeRequests do
expect(json_response['message']).to eq('405 Method Not Allowed')
end
- it "returns 405 if merge_request is a work in progress" do
- merge_request.update_attribute(:title, "WIP: #{merge_request.title}")
+ it "returns 405 if merge_request is a draft" do
+ merge_request.update_attribute(:title, "Draft: #{merge_request.title}")
put api("/projects/#{project.id}/merge_requests/#{merge_request.iid}/merge", user)
expect(response).to have_gitlab_http_status(:method_not_allowed)
expect(json_response['message']).to eq('405 Method Not Allowed')
diff --git a/spec/services/members/create_service_spec.rb b/spec/services/members/create_service_spec.rb
index 803b0695345..ffe63a8a94b 100644
--- a/spec/services/members/create_service_spec.rb
+++ b/spec/services/members/create_service_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
let_it_be(:member) { create(:user) }
let_it_be(:user_ids) { member.id.to_s }
let_it_be(:access_level) { Gitlab::Access::GUEST }
- let(:additional_params) { {} }
+ let(:additional_params) { { invite_source: '_invite_source_' } }
let(:params) { { user_ids: user_ids, access_level: access_level }.merge(additional_params) }
subject(:execute_service) { described_class.new(user, params.merge({ source: source })).execute }
@@ -86,22 +86,16 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
context 'when tracking the invite source', :snowplow do
context 'when invite_source is not passed' do
+ let(:additional_params) { {} }
+
it 'tracks the invite source as unknown' do
- execute_service
+ expect { execute_service }.to raise_error(ArgumentError, 'No invite source provided.')
- expect_snowplow_event(
- category: described_class.name,
- action: 'create_member',
- label: 'unknown',
- property: 'existing_user',
- user: user
- )
+ expect_no_snowplow_event
end
end
- context 'when invite_source is not passed' do
- let(:additional_params) { { invite_source: '_invite_source_' } }
-
+ context 'when invite_source is passed' do
it 'tracks the invite source from params' do
execute_service
@@ -116,7 +110,7 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
end
context 'when it is a net_new_user' do
- let(:additional_params) { { user_ids: 'email@example.org' } }
+ let(:additional_params) { { invite_source: '_invite_source_', user_ids: 'email@example.org' } }
it 'tracks the invite source from params' do
execute_service
@@ -124,7 +118,7 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
expect_snowplow_event(
category: described_class.name,
action: 'create_member',
- label: 'unknown',
+ label: '_invite_source_',
property: 'net_new_user',
user: user
)
diff --git a/spec/services/members/invite_service_spec.rb b/spec/services/members/invite_service_spec.rb
index 7007d37ad8d..c530e3d0c53 100644
--- a/spec/services/members/invite_service_spec.rb
+++ b/spec/services/members/invite_service_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
let_it_be(:project_user) { create(:user) }
let_it_be(:namespace) { project.namespace }
let(:params) { {} }
- let(:base_params) { { access_level: Gitlab::Access::GUEST, source: project } }
+ let(:base_params) { { access_level: Gitlab::Access::GUEST, source: project, invite_source: '_invite_source_' } }
subject(:result) { described_class.new(user, base_params.merge(params) ).execute }
diff --git a/spec/tasks/gitlab/storage_rake_spec.rb b/spec/tasks/gitlab/storage_rake_spec.rb
index 9dee27ca391..fefcd05af3b 100644
--- a/spec/tasks/gitlab/storage_rake_spec.rb
+++ b/spec/tasks/gitlab/storage_rake_spec.rb
@@ -88,6 +88,27 @@ RSpec.describe 'rake gitlab:storage:*', :silence_stdout do
end
end
+ shared_examples 'wait until database is ready' do
+ it 'checks if the database is ready once' do
+ expect(Gitlab::Database).to receive(:exists?).once
+
+ run_rake_task(task)
+ end
+
+ context 'handles custom env vars' do
+ before do
+ stub_env('MAX_DATABASE_CONNECTION_CHECKS' => 3)
+ stub_env('MAX_DATABASE_CONNECTION_INTERVAL' => 0.1)
+ end
+
+ it 'tries for 3 times, polling every 0.1 seconds' do
+ expect(Gitlab::Database).to receive(:exists?).exactly(3).times.and_return(false)
+
+ run_rake_task(task)
+ end
+ end
+ end
+
describe 'gitlab:storage:migrate_to_hashed' do
let(:task) { 'gitlab:storage:migrate_to_hashed' }
@@ -198,6 +219,10 @@ RSpec.describe 'rake gitlab:storage:*', :silence_stdout do
let(:task) { 'gitlab:storage:legacy_projects' }
let(:create_collection) { create_list(:project, 3, :legacy_storage) }
end
+
+ it_behaves_like 'wait until database is ready' do
+ let(:task) { 'gitlab:storage:legacy_projects' }
+ end
end
describe 'gitlab:storage:list_legacy_projects' do
@@ -227,6 +252,10 @@ RSpec.describe 'rake gitlab:storage:*', :silence_stdout do
let(:project) { create(:project, storage_version: 1) }
let(:create_collection) { create_list(:upload, 3, model: project) }
end
+
+ it_behaves_like 'wait until database is ready' do
+ let(:task) { 'gitlab:storage:legacy_attachments' }
+ end
end
describe 'gitlab:storage:list_legacy_attachments' do