diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-06-10 06:10:01 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-06-10 06:10:01 +0300 |
commit | ebc589e90ca9bc03315411b912d2ce957cb84903 (patch) | |
tree | f0a84c8b0d79a916b4de68c153b6b369d91ba87e | |
parent | 26774b8d98581b2f211cd5cf04dcec0e352c04a6 (diff) |
Add latest changes from gitlab-org/gitlab@master
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 |