diff options
48 files changed, 114 insertions, 198 deletions
diff --git a/app/assets/javascripts/diffs/components/tree_list.vue b/app/assets/javascripts/diffs/components/tree_list.vue index 4748c587b8e..ab08c72b08f 100644 --- a/app/assets/javascripts/diffs/components/tree_list.vue +++ b/app/assets/javascripts/diffs/components/tree_list.vue @@ -138,6 +138,7 @@ export default { name="diff-tree-search" class="form-control" data-testid="diff-tree-search" + data-qa-selector="diff_tree_search" /> <button v-show="search" diff --git a/app/assets/javascripts/groups/components/invite_members_banner.vue b/app/assets/javascripts/groups/components/invite_members_banner.vue index 7afea815197..a0a775e2916 100644 --- a/app/assets/javascripts/groups/components/invite_members_banner.vue +++ b/app/assets/javascripts/groups/components/invite_members_banner.vue @@ -45,10 +45,7 @@ export default { }); }, openModal() { - eventHub.$emit('openModal', { - source: this.$options.openModalSource, - }); - this.track(this.$options.buttonClickEvent); + eventHub.$emit('openModal', { source: this.$options.openModalSource }); }, }, i18n: { @@ -59,7 +56,6 @@ export default { button_text: s__('InviteMembersBanner|Invite your colleagues'), }, displayEvent: 'invite_members_banner_displayed', - buttonClickEvent: 'invite_members_banner_button_clicked', openModalSource: 'invite_members_banner', dismissEvent: 'invite_members_banner_dismissed', }; diff --git a/app/assets/javascripts/invite_members/components/invite_members_trigger.vue b/app/assets/javascripts/invite_members/components/invite_members_trigger.vue index 91c029081d4..91a52c36e41 100644 --- a/app/assets/javascripts/invite_members/components/invite_members_trigger.vue +++ b/app/assets/javascripts/invite_members/components/invite_members_trigger.vue @@ -42,16 +42,6 @@ export default { required: false, default: 'button', }, - event: { - type: String, - required: false, - default: '', - }, - label: { - type: String, - required: false, - default: '', - }, qaSelector: { type: String, required: false, @@ -60,21 +50,11 @@ export default { }, computed: { componentAttributes() { - const baseAttributes = { + return { class: this.classes, 'data-qa-selector': this.qaSelector, 'data-test-id': 'invite-members-button', }; - - if (this.event && this.label) { - return { - ...baseAttributes, - 'data-track-action': this.event, - 'data-track-label': this.label, - }; - } - - return baseAttributes; }, }, methods: { diff --git a/app/assets/javascripts/sidebar/components/assignees/sidebar_invite_members.vue b/app/assets/javascripts/sidebar/components/assignees/sidebar_invite_members.vue index 28bc5afc1a4..b41d126be68 100644 --- a/app/assets/javascripts/sidebar/components/assignees/sidebar_invite_members.vue +++ b/app/assets/javascripts/sidebar/components/assignees/sidebar_invite_members.vue @@ -4,8 +4,6 @@ import { __ } from '~/locale'; export default { displayText: __('Invite members'), - dataTrackLabel: 'edit_assignee', - dataTrackEvent: 'click_invite_members', components: { InviteMembersTrigger, }, @@ -27,8 +25,6 @@ export default { <invite-members-trigger trigger-element="anchor" :display-text="$options.displayText" - :event="$options.dataTrackEvent" - :label="$options.dataTrackLabel" :trigger-source="triggerSource" classes="gl-display-block gl-pl-0 gl-hover-text-decoration-none gl-hover-text-blue-800!" /> diff --git a/app/views/projects/_invite_members_empty_project.html.haml b/app/views/projects/_invite_members_empty_project.html.haml index 1ab92d56d25..18d06c7d0bb 100644 --- a/app/views/projects/_invite_members_empty_project.html.haml +++ b/app/views/projects/_invite_members_empty_project.html.haml @@ -6,6 +6,4 @@ .js-invite-members-trigger{ data: { variant: 'confirm', classes: 'gl-mb-8 gl-xs-w-full', display_text: s_('InviteMember|Invite members'), - trigger_source: 'project-empty-page', - event: 'click_button', - label: 'invite_members_empty_project' } } + trigger_source: 'project-empty-page' } } diff --git a/app/views/shared/issuable/_sidebar_user_dropdown.html.haml b/app/views/shared/issuable/_sidebar_user_dropdown.html.haml index c058e7ebe3e..9bfdacc8cfd 100644 --- a/app/views/shared/issuable/_sidebar_user_dropdown.html.haml +++ b/app/views/shared/issuable/_sidebar_user_dropdown.html.haml @@ -14,8 +14,6 @@ %li .js-invite-members-trigger{ data: { trigger_element: 'anchor', display_text: _('Invite Members'), - event: 'click_invite_members', - trigger_source: local_assigns.fetch(:trigger_source), - label: data['track-label'] } } + trigger_source: local_assigns.fetch(:trigger_source) } } - else = dropdown_tag(data['dropdown-title'], options: options) diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index 2a7e6b86eff..83199d581c6 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -13068,10 +13068,10 @@ Returns [`[DoraMetric!]`](#dorametric). | Name | Type | Description | | ---- | ---- | ----------- | | <a id="dorametricsenddate"></a>`endDate` | [`Date`](#date) | Date range to end at. Default is the current date. | -| <a id="dorametricsenvironmenttier"></a>`environmentTier` | [`DeploymentTier`](#deploymenttier) | Deployment tier of the environments to return. Deprecated, please update to `environment_tiers` param. | +| <a id="dorametricsenvironmenttier"></a>`environmentTier` **{warning-solid}** | [`DeploymentTier`](#deploymenttier) | **Deprecated** in 15.2. Superseded by `environment_tiers` param. | | <a id="dorametricsenvironmenttiers"></a>`environmentTiers` | [`[DeploymentTier!]`](#deploymenttier) | Deployment tiers of the environments to return. Defaults to `[PRODUCTION]`. | -| <a id="dorametricsinterval"></a>`interval` | [`DoraMetricBucketingInterval`](#dorametricbucketinginterval) | How the metric should be aggregrated. Defaults to `DAILY`. In the case of `ALL`, the `date` field in the response will be `null`. | -| <a id="dorametricsmetric"></a>`metric` | [`DoraMetricType!`](#dorametrictype) | Type of metric to return. | +| <a id="dorametricsinterval"></a>`interval` | [`DoraMetricBucketingInterval`](#dorametricbucketinginterval) | How the metric should be aggregated. Defaults to `DAILY`. In the case of `ALL`, the `date` field in the response will be `null`. | +| <a id="dorametricsmetric"></a>`metric` **{warning-solid}** | [`DoraMetricType`](#dorametrictype) | **Deprecated** in 15.10. Superseded by metrics fields. See `DoraMetric` type. | | <a id="dorametricsstartdate"></a>`startDate` | [`Date`](#date) | Date range to start from. Default is 3 months ago. | ### `DoraMetric` @@ -13080,8 +13080,12 @@ Returns [`[DoraMetric!]`](#dorametric). | Name | Type | Description | | ---- | ---- | ----------- | +| <a id="dorametricchangefailurerate"></a>`changeFailureRate` | [`Float`](#float) | Percentage of deployments that caused incidents in production. | | <a id="dorametricdate"></a>`date` | [`String`](#string) | Date of the data point. | -| <a id="dorametricvalue"></a>`value` | [`Float`](#float) | Value of the data point. | +| <a id="dorametricdeploymentfrequency"></a>`deploymentFrequency` | [`Float`](#float) | Number of deployments per day. | +| <a id="dorametricleadtimeforchanges"></a>`leadTimeForChanges` | [`Float`](#float) | Median time to deploy a merged merge request. | +| <a id="dorametrictimetorestoreservice"></a>`timeToRestoreService` | [`Float`](#float) | Median time to close an incident. | +| <a id="dorametricvalue"></a>`value` **{warning-solid}** | [`Float`](#float) | **Deprecated** in 15.10. Moved to corresponding metric field. | ### `EgressNode` diff --git a/doc/user/group/import/index.md b/doc/user/group/import/index.md index 4ec06173e95..463330113c3 100644 --- a/doc/user/group/import/index.md +++ b/doc/user/group/import/index.md @@ -118,9 +118,9 @@ To ensure GitLab maps users and their contributions correctly: - Set up or use your existing [SAML SSO provider](../saml_sso/index.md) and leverage user synchronization of SAML SSO groups supported through [SCIM](../../group/saml_sso/scim_setup.md). You can [bypass the GitLab user account verification with verified email domains](../saml_sso/index.md#bypass-user-email-confirmation-with-verified-domains). - 1. Ensure that users have a public email on the source GitLab instance that matches any confirmed email address on the destination GitLab instance. Most - users receive an email asking them to confirm their email address. - 1. If users already exist on the destination instance and you use [SAML SSO for GitLab.com groups](../../group/saml_sso/index.md), all users must +1. Ensure that users have a public email on the source GitLab instance that matches any confirmed email address on the destination GitLab instance. Most + users receive an email asking them to confirm their email address. +1. If users already exist on the destination instance and you use [SAML SSO for GitLab.com groups](../../group/saml_sso/index.md), all users must [link their SAML identity to their GitLab.com account](../../group/saml_sso/index.md#linking-saml-to-your-existing-gitlabcom-account). ### Connect the source GitLab instance diff --git a/doc/user/project/import/bitbucket.md b/doc/user/project/import/bitbucket.md index 7114974d8db..a5d5f93f9ad 100644 --- a/doc/user/project/import/bitbucket.md +++ b/doc/user/project/import/bitbucket.md @@ -35,6 +35,8 @@ When importing: - [Bitbucket Cloud integration](../../../integration/bitbucket.md) must be enabled. If that integration is not enabled, ask your GitLab administrator to enable it. The Bitbucket Cloud integration is enabled by default on GitLab.com. +- [Bitbucket Cloud import source](../../admin_area/settings/visibility_and_access_controls.md#configure-allowed-import-sources) must be enabled. If not enabled, ask your + GitLab administrator to enable it. The Bitbucket Cloud import source is enabled by default on GitLab.com. - At least the Maintainer role on the destination group to import to. Using the Developer role for this purpose was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/387891) in GitLab 15.8 and will be removed in GitLab 16.0. diff --git a/lib/backup/gitaly_backup.rb b/lib/backup/gitaly_backup.rb index 57dd74c7950..354025ffb85 100644 --- a/lib/backup/gitaly_backup.rb +++ b/lib/backup/gitaly_backup.rb @@ -77,11 +77,7 @@ module Backup # # @see https://gitlab.com/gitlab-org/gitaly/-/blob/master/doc/gitaly-backup.md def schedule_backup_job(repository, always_create:) - connection_params = Gitlab::GitalyClient.connection_data(repository.storage) - json_job = { - address: connection_params['address'], - token: connection_params['token'], storage_name: repository.storage, relative_path: repository.relative_path, gl_project_path: repository.gl_project_path, @@ -91,10 +87,21 @@ module Backup @input_stream.puts(json_job) end + def gitaly_servers + Gitlab.config.repositories.storages.keys.index_with do |storage_name| + Gitlab::GitalyClient.connection_data(storage_name) + end + end + + def gitaly_servers_encoded + Base64.strict_encode64(Gitlab::Json.dump(gitaly_servers)) + end + def build_env { 'SSL_CERT_FILE' => Gitlab::X509::Certificate.default_cert_file, - 'SSL_CERT_DIR' => Gitlab::X509::Certificate.default_cert_dir + 'SSL_CERT_DIR' => Gitlab::X509::Certificate.default_cert_dir, + 'GITALY_SERVERS' => gitaly_servers_encoded }.merge(ENV) end diff --git a/qa/qa/page/merge_request/show.rb b/qa/qa/page/merge_request/show.rb index df0c0ec4202..2a1671ed9d0 100644 --- a/qa/qa/page/merge_request/show.rb +++ b/qa/qa/page/merge_request/show.rb @@ -31,6 +31,7 @@ module QA view 'app/assets/javascripts/diffs/components/tree_list.vue' do element :file_tree_container + element :diff_tree_search end view 'app/assets/javascripts/diffs/components/diff_file_header.vue' do @@ -215,14 +216,25 @@ module QA def has_file?(file_name) open_file_tree + + return true if has_element?(:file_name_content, file_name: file_name) + + # Since the file tree uses virtual scrolling, search for file in case it is outside of viewport + search_file_tree(file_name) has_element?(:file_name_content, file_name: file_name) end def has_no_file?(file_name) - open_file_tree + # Since the file tree uses virtual scrolling, search for file to ensure non-existence + search_file_tree(file_name) has_no_element?(:file_name_content, file_name: file_name) end + def search_file_tree(file_name) + open_file_tree + fill_element(:diff_tree_search, file_name) + end + def open_file_tree click_element(:file_tree_button) unless has_element?(:file_tree_container) end diff --git a/spec/controllers/admin/integrations_controller_spec.rb b/spec/controllers/admin/integrations_controller_spec.rb index e75f27589d7..fed96f6a6c7 100644 --- a/spec/controllers/admin/integrations_controller_spec.rb +++ b/spec/controllers/admin/integrations_controller_spec.rb @@ -29,11 +29,7 @@ RSpec.describe Admin::IntegrationsController do end end - context 'when GitLab.com' do - before do - allow(::Gitlab).to receive(:com?) { true } - end - + context 'when GitLab.com', :saas do it 'returns 404' do get :edit, params: { id: Integration.available_integration_names.sample } diff --git a/spec/experiments/application_experiment_spec.rb b/spec/experiments/application_experiment_spec.rb index 7aca5e492f4..ef8f8cbce3b 100644 --- a/spec/experiments/application_experiment_spec.rb +++ b/spec/experiments/application_experiment_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ApplicationExperiment, :experiment do +RSpec.describe ApplicationExperiment, :experiment, feature_category: :experimentation_conversion do subject(:application_experiment) { described_class.new('namespaced/stub', **context) } let(:context) { {} } @@ -187,13 +187,11 @@ RSpec.describe ApplicationExperiment, :experiment do end with_them do - it "returns the url or nil if invalid" do - allow(Gitlab).to receive(:com?).and_return(true) + it "returns the url or nil if invalid on SaaS", :saas do expect(application_experiment.process_redirect_url(url)).to eq(processed_url) end - it "considers all urls invalid when not on dev or com" do - allow(Gitlab).to receive(:com?).and_return(false) + it "considers all urls invalid when not on SaaS" do expect(application_experiment.process_redirect_url(url)).to be_nil end end diff --git a/spec/features/dashboard/root_explore_spec.rb b/spec/features/dashboard/root_explore_spec.rb index a232ebec68e..b05ca827c5a 100644 --- a/spec/features/dashboard/root_explore_spec.rb +++ b/spec/features/dashboard/root_explore_spec.rb @@ -2,16 +2,12 @@ require 'spec_helper' -RSpec.describe 'Root explore', feature_category: :not_owned do +RSpec.describe 'Root explore', :saas, feature_category: :not_owned do let_it_be(:public_project) { create(:project, :public) } let_it_be(:archived_project) { create(:project, :archived) } let_it_be(:internal_project) { create(:project, :internal) } let_it_be(:private_project) { create(:project, :private) } - before do - allow(Gitlab).to receive(:com?).and_return(true) - end - context 'when logged in' do let_it_be(:user) { create(:user) } diff --git a/spec/features/issues/issue_sidebar_spec.rb b/spec/features/issues/issue_sidebar_spec.rb index 686074f7412..95277caf0f5 100644 --- a/spec/features/issues/issue_sidebar_spec.rb +++ b/spec/features/issues/issue_sidebar_spec.rb @@ -119,8 +119,6 @@ RSpec.describe 'Issue Sidebar', feature_category: :team_planning do page.within '.dropdown-menu-user' do expect(page).to have_link('Invite members') - expect(page).to have_selector('[data-track-action="click_invite_members"]') - expect(page).to have_selector('[data-track-label="edit_assignee"]') click_link 'Invite members' end diff --git a/spec/features/issues/move_spec.rb b/spec/features/issues/move_spec.rb index ea68f2266b3..e2329e5e287 100644 --- a/spec/features/issues/move_spec.rb +++ b/spec/features/issues/move_spec.rb @@ -97,7 +97,7 @@ RSpec.describe 'issue move to another project', feature_category: :team_planning end end - context 'service desk issue moved to a project with service desk disabled', :js do + context 'service desk issue moved to a project with service desk disabled', :saas, :js do let(:project_title) { 'service desk disabled project' } let(:warning_selector) { '.js-alert-moved-from-service-desk-warning' } let(:namespace) { create(:namespace) } @@ -106,7 +106,6 @@ RSpec.describe 'issue move to another project', feature_category: :team_planning let(:service_desk_issue) { create(:issue, project: service_desk_project, author: ::User.support_bot) } before do - allow(Gitlab).to receive(:com?).and_return(true) allow(Gitlab::IncomingEmail).to receive(:enabled?).and_return(true) allow(Gitlab::IncomingEmail).to receive(:supports_wildcard?).and_return(true) diff --git a/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb b/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb index cf5024ad59e..becbf0ccfa7 100644 --- a/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb +++ b/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb @@ -162,8 +162,6 @@ RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_cate page.within '.dropdown-menu-user' do expect(page).to have_link('Invite members') - expect(page).to have_selector('[data-track-action="click_invite_members"]') - expect(page).to have_selector('[data-track-label="edit_assignee"]') click_link 'Invite members' end diff --git a/spec/features/merge_request/user_edits_reviewers_sidebar_spec.rb b/spec/features/merge_request/user_edits_reviewers_sidebar_spec.rb index 26a9b955e2d..52d058aeabc 100644 --- a/spec/features/merge_request/user_edits_reviewers_sidebar_spec.rb +++ b/spec/features/merge_request/user_edits_reviewers_sidebar_spec.rb @@ -26,8 +26,6 @@ RSpec.describe 'Merge request > User edits reviewers sidebar', :js, feature_cate page.within '.dropdown-menu-user' do expect(page).to have_link('Invite Members') - expect(page).to have_selector('[data-track-action="click_invite_members"]') - expect(page).to have_selector('[data-track-label="edit_reviewer"]') end click_link 'Invite Members' diff --git a/spec/features/users/signup_spec.rb b/spec/features/users/signup_spec.rb index 11ff318c346..6333af28f85 100644 --- a/spec/features/users/signup_spec.rb +++ b/spec/features/users/signup_spec.rb @@ -384,7 +384,7 @@ RSpec.describe 'Signup', feature_category: :user_profile do expect(page.body).not_to match(/#{new_user.password}/) end - context 'with invalid email', :saas, :js do + context 'with invalid email', :js do it_behaves_like 'user email validation' do let(:path) { new_user_registration_path } end diff --git a/spec/features/whats_new_spec.rb b/spec/features/whats_new_spec.rb index 6b19ab28b44..3668d90f2e9 100644 --- a/spec/features/whats_new_spec.rb +++ b/spec/features/whats_new_spec.rb @@ -2,13 +2,11 @@ require "spec_helper" -RSpec.describe "renders a `whats new` dropdown item", feature_category: :not_owned do +RSpec.describe "renders a `whats new` dropdown item", feature_category: :onboarding do let_it_be(:user) { create(:user) } context 'when not logged in' do - it 'and on .com it renders' do - allow(Gitlab).to receive(:com?).and_return(true) - + it 'and on SaaS it renders', :saas do visit user_path(user) page.within '.header-help' do diff --git a/spec/frontend/fixtures/startup_css.rb b/spec/frontend/fixtures/startup_css.rb index 2d766086cb7..18a4aa58c00 100644 --- a/spec/frontend/fixtures/startup_css.rb +++ b/spec/frontend/fixtures/startup_css.rb @@ -16,7 +16,6 @@ RSpec.describe 'Startup CSS fixtures', type: :controller do before do # We want vNext badge to be included and com/canary don't remove/hide any other elements. # This is why we're turning com and canary on by default for now. - allow(Gitlab).to receive(:com?).and_return(true) allow(Gitlab).to receive(:canary?).and_return(true) sign_in(user) end @@ -72,11 +71,11 @@ RSpec.describe 'Startup CSS fixtures', type: :controller do end end - describe ProjectsController, '(Startup CSS fixtures)', type: :controller do + describe ProjectsController, '(Startup CSS fixtures)', :saas, type: :controller do it_behaves_like 'startup css project fixtures', 'general' end - describe ProjectsController, '(Startup CSS fixtures)', type: :controller do + describe ProjectsController, '(Startup CSS fixtures)', :saas, type: :controller do before do user.update!(theme_id: 11) end diff --git a/spec/frontend/groups/components/invite_members_banner_spec.js b/spec/frontend/groups/components/invite_members_banner_spec.js index 4a385cb00ee..8975107f422 100644 --- a/spec/frontend/groups/components/invite_members_banner_spec.js +++ b/spec/frontend/groups/components/invite_members_banner_spec.js @@ -59,7 +59,6 @@ describe('InviteMembersBanner', () => { }); const trackCategory = undefined; - const buttonClickEvent = 'invite_members_banner_button_clicked'; it('sends the displayEvent when the banner is displayed', () => { const displayEvent = 'invite_members_banner_displayed'; @@ -80,12 +79,6 @@ describe('InviteMembersBanner', () => { source: 'invite_members_banner', }); }); - - it('sends the buttonClickEvent with correct trackCategory and trackLabel', () => { - expect(trackingSpy).toHaveBeenCalledWith(trackCategory, buttonClickEvent, { - label: provide.trackLabel, - }); - }); }); it('sends the dismissEvent when the banner is dismissed', () => { diff --git a/spec/frontend/invite_members/components/invite_members_trigger_spec.js b/spec/frontend/invite_members/components/invite_members_trigger_spec.js index e5af38d6ed8..c42e497decc 100644 --- a/spec/frontend/invite_members/components/invite_members_trigger_spec.js +++ b/spec/frontend/invite_members/components/invite_members_trigger_spec.js @@ -103,22 +103,6 @@ describe.each(triggerItems)('with triggerElement as %s', (triggerItem) => { }); }); }); - - describe('tracking', () => { - it('does not add tracking attributes', () => { - createComponent(); - - expect(findButton().attributes('data-track-action')).toBeUndefined(); - expect(findButton().attributes('data-track-label')).toBeUndefined(); - }); - - it('adds tracking attributes', () => { - createComponent({ label: '_label_', event: '_event_' }); - - expect(findButton().attributes('data-track-action')).toBe('_event_'); - expect(findButton().attributes('data-track-label')).toBe('_label_'); - }); - }); }); describe('side-nav with icon', () => { diff --git a/spec/frontend/projects/new/components/new_project_url_select_spec.js b/spec/frontend/projects/new/components/new_project_url_select_spec.js index 67532cea61e..0970b51745a 100644 --- a/spec/frontend/projects/new/components/new_project_url_select_spec.js +++ b/spec/frontend/projects/new/components/new_project_url_select_spec.js @@ -3,8 +3,8 @@ import { GlDropdown, GlDropdownItem, GlDropdownSectionHeader, - GlSearchBoxByType, GlTruncate, + GlSearchBoxByType, } from '@gitlab/ui'; import { mount, shallowMount } from '@vue/test-utils'; import Vue, { nextTick } from 'vue'; @@ -12,6 +12,7 @@ import VueApollo from 'vue-apollo'; import createMockApollo from 'helpers/mock_apollo_helper'; import waitForPromises from 'helpers/wait_for_promises'; import { mockTracking, unmockTracking } from 'helpers/tracking_helper'; +import { stubComponent } from 'helpers/stub_component'; import { getIdFromGraphQLId } from '~/graphql_shared/utils'; import eventHub from '~/projects/new/event_hub'; import NewProjectUrlSelect from '~/projects/new/components/new_project_url_select.vue'; @@ -68,6 +69,7 @@ describe('NewProjectUrlSelect component', () => { }; let mockQueryResponse; + let focusInputSpy; const mountComponent = ({ search = '', @@ -78,6 +80,7 @@ describe('NewProjectUrlSelect component', () => { mockQueryResponse = jest.fn().mockResolvedValue({ data: queryResponse }); const requestHandlers = [[searchQuery, mockQueryResponse]]; const apolloProvider = createMockApollo(requestHandlers); + focusInputSpy = jest.fn(); return mountFn(NewProjectUrlSelect, { apolloProvider, @@ -87,13 +90,17 @@ describe('NewProjectUrlSelect component', () => { search, }; }, + stubs: { + GlSearchBoxByType: stubComponent(GlSearchBoxByType, { + methods: { focusInput: focusInputSpy }, + }), + }, }); }; const findButtonLabel = () => wrapper.findComponent(GlButton); const findDropdown = () => wrapper.findComponent(GlDropdown); const findSelectedPath = () => wrapper.findComponent(GlTruncate); - const findInput = () => wrapper.findComponent(GlSearchBoxByType); const findHiddenNamespaceInput = () => wrapper.find(`[name="${defaultProvide.inputName}`); const findHiddenSelectedNamespaceInput = () => @@ -177,13 +184,11 @@ describe('NewProjectUrlSelect component', () => { }); it('focuses on the input when the dropdown is opened', async () => { - wrapper = mountComponent({ mountFn: mount }); - - const spy = jest.spyOn(findInput().vm, 'focusInput'); + wrapper = mountComponent(); await showDropdown(); - expect(spy).toHaveBeenCalledTimes(1); + expect(focusInputSpy).toHaveBeenCalledTimes(1); }); it('renders expected dropdown items', async () => { diff --git a/spec/helpers/application_settings_helper_spec.rb b/spec/helpers/application_settings_helper_spec.rb index 19cb970553b..93db4661c82 100644 --- a/spec/helpers/application_settings_helper_spec.rb +++ b/spec/helpers/application_settings_helper_spec.rb @@ -68,11 +68,7 @@ RSpec.describe ApplicationSettingsHelper do )) end - context 'when GitLab.com' do - before do - allow(Gitlab).to receive(:com?).and_return(true) - end - + context 'when on SaaS', :saas do it 'does not contain :deactivate_dormant_users' do expect(helper.visible_attributes).not_to include(:deactivate_dormant_users) end diff --git a/spec/helpers/ci/pipelines_helper_spec.rb b/spec/helpers/ci/pipelines_helper_spec.rb index 19946afb1a4..535e8f3170e 100644 --- a/spec/helpers/ci/pipelines_helper_spec.rb +++ b/spec/helpers/ci/pipelines_helper_spec.rb @@ -192,11 +192,7 @@ RSpec.describe Ci::PipelinesHelper do end end - describe 'the `ios_runners_available` attribute' do - before do - allow(Gitlab).to receive(:com?).and_return(true) - end - + describe 'the `ios_runners_available` attribute', :saas do subject { data[:ios_runners_available] } context 'when the `ios_specific_templates` experiment variant is control' do diff --git a/spec/initializers/check_forced_decomposition_spec.rb b/spec/initializers/check_forced_decomposition_spec.rb index a216f078932..64cb1184e7a 100644 --- a/spec/initializers/check_forced_decomposition_spec.rb +++ b/spec/initializers/check_forced_decomposition_spec.rb @@ -95,11 +95,7 @@ RSpec.describe 'check_forced_decomposition initializer', feature_category: :pods it { expect { check_forced_decomposition }.to raise_error(/Separate CI database is not ready/) } - context 'for GitLab.com' do - before do - allow(::Gitlab).to receive(:com?).and_return(true) - end - + context 'for SaaS', :saas do it { expect { check_forced_decomposition }.not_to raise_error } end diff --git a/spec/lib/backup/gitaly_backup_spec.rb b/spec/lib/backup/gitaly_backup_spec.rb index 7cc8ce2cbae..ad0e5553fa1 100644 --- a/spec/lib/backup/gitaly_backup_spec.rb +++ b/spec/lib/backup/gitaly_backup_spec.rb @@ -17,7 +17,8 @@ RSpec.describe Backup::GitalyBackup do let(:expected_env) do { 'SSL_CERT_FILE' => Gitlab::X509::Certificate.default_cert_file, - 'SSL_CERT_DIR' => Gitlab::X509::Certificate.default_cert_dir + 'SSL_CERT_DIR' => Gitlab::X509::Certificate.default_cert_dir, + 'GITALY_SERVERS' => anything }.merge(ENV) end @@ -125,12 +126,18 @@ RSpec.describe Backup::GitalyBackup do } end + let(:expected_env) do + ssl_env.merge( + 'GITALY_SERVERS' => anything + ) + end + before do stub_const('ENV', ssl_env) end it 'passes through SSL envs' do - expect(Open3).to receive(:popen2).with(ssl_env, anything, 'create', '-path', anything, '-layout', 'pointer', '-id', backup_id).and_call_original + expect(Open3).to receive(:popen2).with(expected_env, anything, 'create', '-path', anything, '-layout', 'pointer', '-id', backup_id).and_call_original subject.start(:create, destination, backup_id: backup_id) subject.finish! diff --git a/spec/lib/gitlab/content_security_policy/config_loader_spec.rb b/spec/lib/gitlab/content_security_policy/config_loader_spec.rb index f298890623f..b40829d72a0 100644 --- a/spec/lib/gitlab/content_security_policy/config_loader_spec.rb +++ b/spec/lib/gitlab/content_security_policy/config_loader_spec.rb @@ -102,11 +102,7 @@ RSpec.describe Gitlab::ContentSecurityPolicy::ConfigLoader do end describe 'Zuora directives' do - context 'when is Gitlab.com?' do - before do - allow(::Gitlab).to receive(:com?).and_return(true) - end - + context 'when on SaaS', :saas do it 'adds Zuora host to CSP' do expect(directives['frame_src']).to include('https://*.zuora.com/apps/PublicHostedPageLite.do') end diff --git a/spec/lib/gitlab/email/message/build_ios_app_guide_spec.rb b/spec/lib/gitlab/email/message/build_ios_app_guide_spec.rb index 3089f955252..4b77b2f7192 100644 --- a/spec/lib/gitlab/email/message/build_ios_app_guide_spec.rb +++ b/spec/lib/gitlab/email/message/build_ios_app_guide_spec.rb @@ -2,13 +2,9 @@ require 'spec_helper' -RSpec.describe Gitlab::Email::Message::BuildIosAppGuide do +RSpec.describe Gitlab::Email::Message::BuildIosAppGuide, :saas do subject(:message) { described_class.new } - before do - allow(Gitlab).to receive(:com?) { true } - end - it 'contains the correct message', :aggregate_failures do expect(message.subject_line).to eq 'Get set up to build for iOS' expect(message.title).to eq "Building for iOS? We've got you covered." diff --git a/spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb b/spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb index 3c0d83d0f9e..a3c2d1b428e 100644 --- a/spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb +++ b/spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb @@ -27,11 +27,7 @@ RSpec.describe Gitlab::Email::Message::InProductMarketing::Helper do subject(:class_with_helper) { dummy_class_with_helper.new(format) } - context 'gitlab.com' do - before do - allow(Gitlab).to receive(:com?) { true } - end - + context 'for SaaS', :saas do context 'format is HTML' do it 'returns the correct HTML' do message = "If you no longer wish to receive marketing emails from us, " \ diff --git a/spec/lib/gitlab/monitor/demo_projects_spec.rb b/spec/lib/gitlab/monitor/demo_projects_spec.rb index 262c78eb62e..6b0f855e38d 100644 --- a/spec/lib/gitlab/monitor/demo_projects_spec.rb +++ b/spec/lib/gitlab/monitor/demo_projects_spec.rb @@ -6,15 +6,13 @@ RSpec.describe Gitlab::Monitor::DemoProjects do describe '#primary_keys' do subject { described_class.primary_keys } - it 'fetches primary_keys when on gitlab.com' do - allow(Gitlab).to receive(:com?).and_return(true) + it 'fetches primary_keys when on SaaS', :saas do allow(Gitlab).to receive(:staging?).and_return(false) expect(subject).to eq(Gitlab::Monitor::DemoProjects::DOT_COM_IDS) end - it 'fetches primary_keys when on staging' do - allow(Gitlab).to receive(:com?).and_return(true) + it 'fetches primary_keys when on staging', :saas do allow(Gitlab).to receive(:staging?).and_return(true) expect(subject).to eq(Gitlab::Monitor::DemoProjects::STAGING_IDS) diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/count_ci_internal_pipelines_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/count_ci_internal_pipelines_metric_spec.rb index 21d4e7690a1..77c49d448d7 100644 --- a/spec/lib/gitlab/usage/metrics/instrumentations/count_ci_internal_pipelines_metric_spec.rb +++ b/spec/lib/gitlab/usage/metrics/instrumentations/count_ci_internal_pipelines_metric_spec.rb @@ -17,11 +17,7 @@ feature_category: :service_ping do it_behaves_like 'a correct instrumented metric value', { time_frame: '28d', data_source: 'database' } end - context 'on Gitlab.com' do - before do - allow(Gitlab).to receive(:com?).and_return(true) - end - + context 'on SaaS', :saas do let_it_be(:expected_value) { -1 } it_behaves_like 'a correct instrumented metric value', { time_frame: 'all', data_source: 'database' } diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/count_issues_created_manually_from_alerts_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/count_issues_created_manually_from_alerts_metric_spec.rb index 86f54c48666..65e514bf345 100644 --- a/spec/lib/gitlab/usage/metrics/instrumentations/count_issues_created_manually_from_alerts_metric_spec.rb +++ b/spec/lib/gitlab/usage/metrics/instrumentations/count_issues_created_manually_from_alerts_metric_spec.rb @@ -16,11 +16,7 @@ feature_category: :service_ping do it_behaves_like 'a correct instrumented metric value', { time_frame: 'all', data_source: 'database' } - context 'on Gitlab.com' do - before do - allow(Gitlab).to receive(:com?).and_return(true) - end - + context 'on SaaS', :saas do let(:expected_value) { -1 } it_behaves_like 'a correct instrumented metric value', { time_frame: 'all', data_source: 'database' } diff --git a/spec/mailers/emails/in_product_marketing_spec.rb b/spec/mailers/emails/in_product_marketing_spec.rb index 7c21e161ffe..5419c9e6798 100644 --- a/spec/mailers/emails/in_product_marketing_spec.rb +++ b/spec/mailers/emails/in_product_marketing_spec.rb @@ -10,11 +10,7 @@ RSpec.describe Emails::InProductMarketing do let_it_be(:user) { create(:user) } shared_examples 'has custom headers when on gitlab.com' do - context 'when on gitlab.com' do - before do - allow(Gitlab).to receive(:com?).and_return(true) - end - + context 'when on gitlab.com', :saas do it 'has custom headers' do aggregate_failures do expect(subject).to deliver_from(described_class::FROM_ADDRESS) diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb index 492768df14e..02783792f25 100644 --- a/spec/models/ci/build_spec.rb +++ b/spec/models/ci/build_spec.rb @@ -1422,11 +1422,7 @@ RSpec.describe Ci::Build, feature_category: :continuous_integration, factory_def let(:build) { create(:ci_build, trait, pipeline: pipeline) } let(:event) { state } - context "when transitioning to #{params[:state]}" do - before do - allow(Gitlab).to receive(:com?).and_return(true) - end - + context "when transitioning to #{params[:state]}", :saas do it 'increments build_completed_report_type metric' do expect( ::Gitlab::Ci::Artifacts::Metrics diff --git a/spec/models/integrations/jira_spec.rb b/spec/models/integrations/jira_spec.rb index fb7f676e47b..fad8768cba0 100644 --- a/spec/models/integrations/jira_spec.rb +++ b/spec/models/integrations/jira_spec.rb @@ -1093,9 +1093,7 @@ RSpec.describe Integrations::Jira do expect(integration.web_url).to eq('') end - it 'includes Atlassian referrer for gitlab.com' do - allow(Gitlab).to receive(:com?).and_return(true) - + it 'includes Atlassian referrer for SaaS', :saas do expect(integration.web_url).to eq("http://jira.test.com/path?#{described_class::ATLASSIAN_REFERRER_GITLAB_COM.to_query}") allow(Gitlab).to receive(:staging?).and_return(true) diff --git a/spec/requests/groups/email_campaigns_controller_spec.rb b/spec/requests/groups/email_campaigns_controller_spec.rb index 7db5c084793..b6e765eba37 100644 --- a/spec/requests/groups/email_campaigns_controller_spec.rb +++ b/spec/requests/groups/email_campaigns_controller_spec.rb @@ -38,11 +38,7 @@ RSpec.describe Groups::EmailCampaignsController, feature_category: :navigation d expect(subject).to have_gitlab_http_status(:redirect) end - context 'on .com' do - before do - allow(Gitlab).to receive(:com?).and_return(true) - end - + context 'on SaaS', :saas do it 'emits a snowplow event', :snowplow do subject diff --git a/spec/requests/jira_connect/oauth_application_ids_controller_spec.rb b/spec/requests/jira_connect/oauth_application_ids_controller_spec.rb index d111edd06da..2f6113c6dd7 100644 --- a/spec/requests/jira_connect/oauth_application_ids_controller_spec.rb +++ b/spec/requests/jira_connect/oauth_application_ids_controller_spec.rb @@ -38,11 +38,7 @@ RSpec.describe JiraConnect::OauthApplicationIdsController, feature_category: :in end end - context 'on GitLab.com' do - before do - allow(Gitlab).to receive(:com?).and_return(true) - end - + context 'on SaaS', :saas do it 'renders not found' do get '/-/jira_connect/oauth_application_id' diff --git a/spec/services/users/signup_service_spec.rb b/spec/services/users/signup_service_spec.rb index ef532e01d0b..3ae8d481541 100644 --- a/spec/services/users/signup_service_spec.rb +++ b/spec/services/users/signup_service_spec.rb @@ -48,11 +48,7 @@ RSpec.describe Users::SignupService do expect(user.reload.setup_for_company).to be(false) end - context 'when on .com' do - before do - allow(Gitlab).to receive(:com?).and_return(true) - end - + context 'when on SaaS', :saas do it 'returns an error result when setup_for_company is missing' do result = update_user(user, setup_for_company: '') diff --git a/spec/support/shared_examples/features/issuable_invite_members_shared_examples.rb b/spec/support/shared_examples/features/issuable_invite_members_shared_examples.rb index b6f7094e422..13adcfe9191 100644 --- a/spec/support/shared_examples/features/issuable_invite_members_shared_examples.rb +++ b/spec/support/shared_examples/features/issuable_invite_members_shared_examples.rb @@ -17,8 +17,6 @@ RSpec.shared_examples 'issuable invite members' do page.within '.dropdown-menu-user' do expect(page).to have_link('Invite Members') - expect(page).to have_selector('[data-track-action="click_invite_members"]') - expect(page).to have_selector('[data-track-label="edit_assignee"]') end click_link 'Invite Members' diff --git a/spec/support/stub_dot_com_check.rb b/spec/support/stub_dot_com_check.rb new file mode 100644 index 00000000000..178cf2577ef --- /dev/null +++ b/spec/support/stub_dot_com_check.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +RSpec.configure do |config| + config.before(:context, :saas) do + # Ensure Gitlab.com? returns true during context. + # This is needed for let_it_be which is shared across examples, + # therefore the value must be changed in before_all, + # but RSpec prevent stubbing method calls in before_all, + # therefore we have to resort to temporarily swap url value. + @_original_gitlab_url = Gitlab.config.gitlab['url'] + Gitlab.config.gitlab['url'] = Gitlab::Saas.com_url + end + config.after(:context, :saas) do + # Swap back original value + Gitlab.config.gitlab['url'] = @_original_gitlab_url + end +end diff --git a/spec/views/devise/sessions/new.html.haml_spec.rb b/spec/views/devise/sessions/new.html.haml_spec.rb index 798c891e75c..bad01ec2c3d 100644 --- a/spec/views/devise/sessions/new.html.haml_spec.rb +++ b/spec/views/devise/sessions/new.html.haml_spec.rb @@ -3,14 +3,13 @@ require 'spec_helper' RSpec.describe 'devise/sessions/new' do - describe 'marketing text' do + describe 'marketing text', :saas do subject { render(template: 'devise/sessions/new', layout: 'layouts/devise') } before do stub_devise disable_captcha stub_feature_flags(restyle_login_page: false) - allow(Gitlab).to receive(:com?).and_return(true) end it 'when flash is anything it renders marketing text' do diff --git a/spec/views/projects/empty.html.haml_spec.rb b/spec/views/projects/empty.html.haml_spec.rb index a782bab161f..2b19b364365 100644 --- a/spec/views/projects/empty.html.haml_spec.rb +++ b/spec/views/projects/empty.html.haml_spec.rb @@ -73,8 +73,6 @@ RSpec.describe 'projects/empty' do expect(rendered).to have_content('Invite your team') expect(rendered).to have_content('Add members to this project and start collaborating with your team.') expect(rendered).to have_selector('.js-invite-members-trigger') - expect(rendered).to have_selector('[data-label=invite_members_empty_project]') - expect(rendered).to have_selector('[data-event=click_button]') expect(rendered).to have_selector('[data-trigger-source=project-empty-page]') end diff --git a/spec/workers/gitlab_service_ping_worker_spec.rb b/spec/workers/gitlab_service_ping_worker_spec.rb index f17847a7b33..034662864df 100644 --- a/spec/workers/gitlab_service_ping_worker_spec.rb +++ b/spec/workers/gitlab_service_ping_worker_spec.rb @@ -14,15 +14,13 @@ RSpec.describe GitlabServicePingWorker, :clean_gitlab_redis_shared_state do allow(subject).to receive(:sleep) end - it 'does not run for GitLab.com when triggered from cron' do - allow(Gitlab).to receive(:com?).and_return(true) + it 'does not run for SaaS when triggered from cron', :saas do expect(ServicePing::SubmitService).not_to receive(:new) subject.perform end - it 'runs for GitLab.com when triggered manually' do - allow(Gitlab).to receive(:com?).and_return(true) + it 'runs for SaaS when triggered manually', :saas do expect(ServicePing::SubmitService).to receive(:new) subject.perform('triggered_from_cron' => false) diff --git a/spec/workers/users/deactivate_dormant_users_worker_spec.rb b/spec/workers/users/deactivate_dormant_users_worker_spec.rb index a8318de669b..c7fde3376f2 100644 --- a/spec/workers/users/deactivate_dormant_users_worker_spec.rb +++ b/spec/workers/users/deactivate_dormant_users_worker_spec.rb @@ -12,8 +12,7 @@ RSpec.describe Users::DeactivateDormantUsersWorker do subject(:worker) { described_class.new } - it 'does not run for GitLab.com' do - expect(Gitlab).to receive(:com?).and_return(true) + it 'does not run for SaaS', :saas do # Now makes a call to current settings to determine period of dormancy worker.perform diff --git a/workhorse/go.mod b/workhorse/go.mod index cd3e5dbc1e5..02fa22a47d6 100644 --- a/workhorse/go.mod +++ b/workhorse/go.mod @@ -7,7 +7,7 @@ require ( github.com/BurntSushi/toml v1.2.1 github.com/FZambia/sentinel v1.1.1 github.com/alecthomas/chroma/v2 v2.5.0 - github.com/aws/aws-sdk-go v1.44.204 + github.com/aws/aws-sdk-go v1.44.205 github.com/disintegration/imaging v1.6.2 github.com/getsentry/raven-go v0.2.0 github.com/golang-jwt/jwt/v4 v4.5.0 diff --git a/workhorse/go.sum b/workhorse/go.sum index 11a5f2eb694..c266518925e 100644 --- a/workhorse/go.sum +++ b/workhorse/go.sum @@ -544,8 +544,8 @@ github.com/aws/aws-sdk-go v1.43.11/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4 github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.128/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.151/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/aws/aws-sdk-go v1.44.204 h1:7/tPUXfNOHB390A63t6fJIwmlwVQAkAwcbzKsU2/6OQ= -github.com/aws/aws-sdk-go v1.44.204/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.44.205 h1:q23NJXgLPIuBMn4zaluWWz57HPP5z7Ut8ZtK1D3N9bs= +github.com/aws/aws-sdk-go v1.44.205/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.17.1 h1:02c72fDJr87N8RAC2s3Qu0YuvMRZKNZJ9F+lAehCazk= github.com/aws/aws-sdk-go-v2 v1.17.1/go.mod h1:JLnGeGONAyi2lWXI1p0PCIOIy333JMVK1U7Hf0aRFLw= |