diff options
Diffstat (limited to 'spec')
149 files changed, 678 insertions, 373 deletions
diff --git a/spec/features/search/user_uses_header_search_field_spec.rb b/spec/features/search/user_uses_header_search_field_spec.rb index 127176da3fb..71d0f8d6d7f 100644 --- a/spec/features/search/user_uses_header_search_field_spec.rb +++ b/spec/features/search/user_uses_header_search_field_spec.rb @@ -38,7 +38,7 @@ RSpec.describe 'User uses header search field', :js, :disable_rate_limiter, feat end it 'renders breadcrumbs' do - page.within('.breadcrumbs-links') do + page.within('.breadcrumbs') do expect(page).to have_content('Search') end end diff --git a/spec/fixtures/structure.sql b/spec/fixtures/structure.sql index 800c33bb9b9..6312545c593 100644 --- a/spec/fixtures/structure.sql +++ b/spec/fixtures/structure.sql @@ -13,12 +13,81 @@ CREATE INDEX index_users_on_public_email_excluding_null_and_empty ON users USING ALTER TABLE ONLY bulk_import_configurations ADD CONSTRAINT fk_rails_536b96bff1 FOREIGN KEY (bulk_import_id) REFERENCES bulk_imports(id) ON DELETE CASCADE; +CREATE TABLE test_table ( + id bigint NOT NULL, + integer_column integer, + integer_with_default_column integer DEFAULT 1, + smallint_column smallint, + smallint_with_default_column smallint DEFAULT 0 NOT NULL, + numeric_column numeric NOT NULL, + numeric_with_default_column numeric DEFAULT 1.0 NOT NULL, + boolean_colum boolean, + boolean_with_default_colum boolean DEFAULT true NOT NULL, + double_precision_column double precision, + double_precision_with_default_column double precision DEFAULT 1.0, + varying_column character varying, + varying_with_default_column character varying DEFAULT 'DEFAULT'::character varying NOT NULL, + varying_with_limit_column character varying(255), + varying_with_limit_and_default_column character varying(255) DEFAULT 'DEFAULT'::character varying, + text_column text NOT NULL, + text_with_default_column text DEFAULT ''::text NOT NULL, + array_column character varying(255)[] NOT NULL, + array_with_default_column character varying(255)[] DEFAULT '{one,two}'::character varying[] NOT NULL, + jsonb_column jsonb, + jsonb_with_default_column jsonb DEFAULT '[]'::jsonb NOT NULL, + timestampz_column timestamp with time zone, + timestampz_with_default_column timestamp with time zone DEFAULT now(), + timestamp_column timestamp(6) without time zone NOT NULL, + timestamp_with_default_column timestamp(6) without time zone DEFAULT '2022-01-23 00:00:00+00'::timestamp without time zone NOT NULL, + date_column date, + date_with_default_column date DEFAULT '2023-04-05', + inet_column inet NOT NULL, + inet_with_default_column inet DEFAULT '0.0.0.0'::inet NOT NULL, + macaddr_column macaddr, + macaddr_with_default_column macaddr DEFAULT '00-00-00-00-00-000'::macaddr NOT NULL, + uuid_column uuid NOT NULL, + uuid_with_default_column uuid DEFAULT '00000000-0000-0000-0000-000000000000'::uuid NOT NULL, + bytea_column bytea, + bytea_with_default_column bytea DEFAULT '\xDEADBEEF'::bytea, + unmapped_column_type anyarray +); + CREATE TABLE ci_project_mirrors ( id bigint NOT NULL, project_id integer NOT NULL, namespace_id integer NOT NULL ); +CREATE TABLE wrong_table ( + id bigint NOT NULL, + description character varying(255) NOT NULL +); + +CREATE TABLE extra_table_columns ( + id bigint NOT NULL, + name character varying(255) NOT NULL +); + +CREATE TABLE missing_table ( + id bigint NOT NULL, + description text NOT NULL +); + +CREATE TABLE missing_table_columns ( + id bigint NOT NULL, + email character varying(255) NOT NULL +); + +CREATE TABLE operations_user_lists ( + id bigint NOT NULL, + project_id bigint NOT NULL, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone NOT NULL, + iid integer NOT NULL, + name character varying(255) NOT NULL, + user_xids text DEFAULT ''::text NOT NULL +); + CREATE TRIGGER trigger AFTER INSERT ON public.t1 FOR EACH ROW EXECUTE FUNCTION t1(); CREATE TRIGGER wrong_trigger BEFORE UPDATE ON public.t2 FOR EACH ROW EXECUTE FUNCTION my_function(); diff --git a/spec/frontend/access_tokens/index_spec.js b/spec/frontend/access_tokens/index_spec.js index 1157e44f41a..c1158e0d124 100644 --- a/spec/frontend/access_tokens/index_spec.js +++ b/spec/frontend/access_tokens/index_spec.js @@ -112,7 +112,7 @@ describe('access tokens', () => { ); }); - it('mounts component and sets `inputAttrs` prop', async () => { + it('mounts component and sets `inputAttrs` prop', () => { wrapper = createWrapper(initExpiresAtField()); const component = wrapper.findComponent(ExpiresAtField); diff --git a/spec/frontend/admin/abuse_reports/components/abuse_report_actions_spec.js b/spec/frontend/admin/abuse_reports/components/abuse_report_actions_spec.js index b9db78a0452..e72d0c24d5e 100644 --- a/spec/frontend/admin/abuse_reports/components/abuse_report_actions_spec.js +++ b/spec/frontend/admin/abuse_reports/components/abuse_report_actions_spec.js @@ -136,13 +136,13 @@ describe('AbuseReportActions', () => { await axios.waitForAll(); }); - it('updates the block button correctly', async () => { + it('updates the block button correctly', () => { const button = findBlockUserButton(); expect(button.text()).toBe(blockButtonText); expect(button.attributes('disabled')).toBe(blockButtonDisabled); }); - it('displays the returned message', async () => { + it('displays the returned message', () => { expect(createAlert).toHaveBeenCalledWith(createAlertArgs); }); }, diff --git a/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js b/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js index e0075aa71d9..b8575d8ab26 100644 --- a/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js +++ b/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js @@ -97,7 +97,7 @@ describe('AlertsSettingsForm', () => { expect(findFormFields().at(0).isVisible()).toBe(true); }); - it('disables the dropdown and shows help text when multi integrations are not supported', async () => { + it('disables the dropdown and shows help text when multi integrations are not supported', () => { createComponent({ props: { canAddIntegration: false } }); expect(findSelect().attributes('disabled')).toBe('disabled'); expect(findMultiSupportText().exists()).toBe(true); diff --git a/spec/frontend/alerts_settings/components/alerts_settings_wrapper_spec.js b/spec/frontend/alerts_settings/components/alerts_settings_wrapper_spec.js index 67d8619f157..8c5df06042c 100644 --- a/spec/frontend/alerts_settings/components/alerts_settings_wrapper_spec.js +++ b/spec/frontend/alerts_settings/components/alerts_settings_wrapper_spec.js @@ -429,7 +429,7 @@ describe('AlertsSettingsWrapper', () => { }); describe('Test alert', () => { - it('makes `updateTestAlert` service call', async () => { + it('makes `updateTestAlert` service call', () => { jest.spyOn(alertsUpdateService, 'updateTestAlert').mockResolvedValueOnce(); const testPayload = '{"title":"test"}'; findAlertsSettingsForm().vm.$emit('test-alert-payload', testPayload); diff --git a/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js b/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js index ade8a61fdce..33801fb8552 100644 --- a/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js +++ b/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js @@ -206,11 +206,11 @@ describe('ProjectsDropdownFilter component', () => { findSearchBoxByType().vm.$emit('input', 'this is a very long search string'); }); - it('renders the highlighted items', async () => { + it('renders the highlighted items', () => { expect(findUnhighlightedItems().findAll('li').length).toBe(1); }); - it('hides the unhighlighted items that do not match the string', async () => { + it('hides the unhighlighted items that do not match the string', () => { expect(findUnhighlightedItems().findAll('li').length).toBe(1); expect(findUnhighlightedItems().text()).toContain('No matching results'); }); diff --git a/spec/frontend/artifacts_settings/components/keep_latest_artifact_checkbox_spec.js b/spec/frontend/artifacts_settings/components/keep_latest_artifact_checkbox_spec.js index 13f17b5e87d..50ac7be9ae3 100644 --- a/spec/frontend/artifacts_settings/components/keep_latest_artifact_checkbox_spec.js +++ b/spec/frontend/artifacts_settings/components/keep_latest_artifact_checkbox_spec.js @@ -108,11 +108,11 @@ describe('Keep latest artifact checkbox', () => { await waitForPromises(); }); - it('sets correct setting value in checkbox with query result', async () => { + it('sets correct setting value in checkbox with query result', () => { expect(wrapper.element).toMatchSnapshot(); }); - it('checkbox is enabled when application setting is enabled', async () => { + it('checkbox is enabled when application setting is enabled', () => { expect(findCheckbox().attributes('disabled')).toBeUndefined(); }); }); diff --git a/spec/frontend/authentication/webauthn/components/registration_spec.js b/spec/frontend/authentication/webauthn/components/registration_spec.js index 1221626db7d..e4ca1ac8c38 100644 --- a/spec/frontend/authentication/webauthn/components/registration_spec.js +++ b/spec/frontend/authentication/webauthn/components/registration_spec.js @@ -211,7 +211,7 @@ describe('Registration', () => { }); describe(`when ${STATE_ERROR} state`, () => { - it('shows an initial error message and a retry button', async () => { + it('shows an initial error message and a retry button', () => { const myError = 'my error'; createComponent({ initialError: myError }); diff --git a/spec/frontend/batch_comments/components/review_bar_spec.js b/spec/frontend/batch_comments/components/review_bar_spec.js index 923e86a7e64..ea4b015ea39 100644 --- a/spec/frontend/batch_comments/components/review_bar_spec.js +++ b/spec/frontend/batch_comments/components/review_bar_spec.js @@ -20,7 +20,7 @@ describe('Batch comments review bar component', () => { document.body.className = ''; }); - it('adds review-bar-visible class to body when review bar is mounted', async () => { + it('adds review-bar-visible class to body when review bar is mounted', () => { expect(document.body.classList.contains(REVIEW_BAR_VISIBLE_CLASS_NAME)).toBe(false); createComponent(); @@ -28,7 +28,7 @@ describe('Batch comments review bar component', () => { expect(document.body.classList.contains(REVIEW_BAR_VISIBLE_CLASS_NAME)).toBe(true); }); - it('removes review-bar-visible class to body when review bar is destroyed', async () => { + it('removes review-bar-visible class to body when review bar is destroyed', () => { createComponent(); wrapper.destroy(); diff --git a/spec/frontend/blob/components/blob_edit_header_spec.js b/spec/frontend/blob/components/blob_edit_header_spec.js index 32a5624d032..b0ce5f40d95 100644 --- a/spec/frontend/blob/components/blob_edit_header_spec.js +++ b/spec/frontend/blob/components/blob_edit_header_spec.js @@ -38,7 +38,7 @@ describe('Blob Header Editing', () => { }); describe('functionality', () => { - it('emits input event when the blob name is changed', async () => { + it('emits input event when the blob name is changed', () => { const inputComponent = findFormInput(); const newValue = 'bar.txt'; diff --git a/spec/frontend/blob/file_template_selector_spec.js b/spec/frontend/blob/file_template_selector_spec.js index 65444e86efd..123475f8d62 100644 --- a/spec/frontend/blob/file_template_selector_spec.js +++ b/spec/frontend/blob/file_template_selector_spec.js @@ -53,7 +53,7 @@ describe('FileTemplateSelector', () => { expect(subject.wrapper.classList.contains('hidden')).toBe(false); }); - it('sets the focus on the dropdown', async () => { + it('sets the focus on the dropdown', () => { subject.show(); jest.spyOn(subject.dropdown, 'focus'); jest.runAllTimers(); diff --git a/spec/frontend/boards/board_card_inner_spec.js b/spec/frontend/boards/board_card_inner_spec.js index a612e863d46..a925f752f5e 100644 --- a/spec/frontend/boards/board_card_inner_spec.js +++ b/spec/frontend/boards/board_card_inner_spec.js @@ -168,7 +168,7 @@ describe('Board card component', () => { }); describe('blocked', () => { - it('renders blocked icon if issue is blocked', async () => { + it('renders blocked icon if issue is blocked', () => { createWrapper({ props: { item: { @@ -487,7 +487,7 @@ describe('Board card component', () => { }); describe('loading', () => { - it('renders loading icon', async () => { + it('renders loading icon', () => { createWrapper({ props: { item: { diff --git a/spec/frontend/boards/components/board_card_spec.js b/spec/frontend/boards/components/board_card_spec.js index 91e9b6f8cfa..897219303b5 100644 --- a/spec/frontend/boards/components/board_card_spec.js +++ b/spec/frontend/boards/components/board_card_spec.js @@ -106,7 +106,7 @@ describe('Board card', () => { }); }); - it('should not highlight the card by default', async () => { + it('should not highlight the card by default', () => { createStore(); mountComponent(); @@ -114,7 +114,7 @@ describe('Board card', () => { expect(wrapper.classes()).not.toContain('multi-select'); }); - it('should highlight the card with a correct style when selected', async () => { + it('should highlight the card with a correct style when selected', () => { createStore({ initialState: { activeId: mockIssue.id, @@ -126,7 +126,7 @@ describe('Board card', () => { expect(wrapper.classes()).not.toContain('multi-select'); }); - it('should highlight the card with a correct style when multi-selected', async () => { + it('should highlight the card with a correct style when multi-selected', () => { createStore({ initialState: { activeId: inactiveId, diff --git a/spec/frontend/boards/components/board_column_spec.js b/spec/frontend/boards/components/board_column_spec.js index 011665eee68..5717031be20 100644 --- a/spec/frontend/boards/components/board_column_spec.js +++ b/spec/frontend/boards/components/board_column_spec.js @@ -81,7 +81,7 @@ describe('Board Column Component', () => { }); describe('on mount', () => { - beforeEach(async () => { + beforeEach(() => { initStore(); jest.spyOn(store, 'dispatch').mockImplementation(); }); diff --git a/spec/frontend/boards/components/board_content_sidebar_spec.js b/spec/frontend/boards/components/board_content_sidebar_spec.js index 558a0a3b933..9be2696de56 100644 --- a/spec/frontend/boards/components/board_content_sidebar_spec.js +++ b/spec/frontend/boards/components/board_content_sidebar_spec.js @@ -162,7 +162,7 @@ describe('BoardContentSidebar', () => { createComponent(); }); - it('calls toggleBoardItem with correct parameters', async () => { + it('calls toggleBoardItem with correct parameters', () => { wrapper.findComponent(GlDrawer).vm.$emit('close'); expect(toggleBoardItem).toHaveBeenCalledTimes(1); diff --git a/spec/frontend/boards/components/board_filtered_search_spec.js b/spec/frontend/boards/components/board_filtered_search_spec.js index d8bc7f95f18..64111cfb01a 100644 --- a/spec/frontend/boards/components/board_filtered_search_spec.js +++ b/spec/frontend/boards/components/board_filtered_search_spec.js @@ -123,7 +123,7 @@ describe('BoardFilteredSearch', () => { jest.spyOn(wrapper.vm, 'performSearch').mockImplementation(); }); - it('sets the url params to the correct results', async () => { + it('sets the url params to the correct results', () => { const mockFilters = [ { type: TOKEN_TYPE_AUTHOR, value: { data: 'root', operator: '=' } }, { type: TOKEN_TYPE_ASSIGNEE, value: { data: 'root', operator: '=' } }, diff --git a/spec/frontend/boards/components/board_form_spec.js b/spec/frontend/boards/components/board_form_spec.js index 62db59f8f57..f340dfab359 100644 --- a/spec/frontend/boards/components/board_form_spec.js +++ b/spec/frontend/boards/components/board_form_spec.js @@ -115,7 +115,7 @@ describe('BoardForm', () => { expect(findForm().exists()).toBe(true); }); - it('focuses an input field', async () => { + it('focuses an input field', () => { expect(document.activeElement).toBe(wrapper.vm.$refs.name); }); }); diff --git a/spec/frontend/boards/components/board_list_header_spec.js b/spec/frontend/boards/components/board_list_header_spec.js index 466321cf1cc..0f91d2315cf 100644 --- a/spec/frontend/boards/components/board_list_header_spec.js +++ b/spec/frontend/boards/components/board_list_header_spec.js @@ -147,7 +147,7 @@ describe('Board List Header Component', () => { }); describe('expanding / collapsing the column', () => { - it('should display collapse icon when column is expanded', async () => { + it('should display collapse icon when column is expanded', () => { createComponent(); const icon = findCaret(); @@ -155,7 +155,7 @@ describe('Board List Header Component', () => { expect(icon.props('icon')).toBe('chevron-lg-down'); }); - it('should display expand icon when column is collapsed', async () => { + it('should display expand icon when column is collapsed', () => { createComponent({ collapsed: true }); const icon = findCaret(); diff --git a/spec/frontend/boards/components/boards_selector_spec.js b/spec/frontend/boards/components/boards_selector_spec.js index aa146eb4609..13c017706ef 100644 --- a/spec/frontend/boards/components/boards_selector_spec.js +++ b/spec/frontend/boards/components/boards_selector_spec.js @@ -250,7 +250,7 @@ describe('BoardsSelector', () => { describe('dropdown visibility', () => { describe('when multipleIssueBoardsAvailable is enabled', () => { - it('show dropdown', async () => { + it('show dropdown', () => { createStore(); createComponent({ provide: { multipleIssueBoardsAvailable: true } }); expect(findDropdown().exists()).toBe(true); @@ -258,7 +258,7 @@ describe('BoardsSelector', () => { }); describe('when multipleIssueBoardsAvailable is disabled but it hasMissingBoards', () => { - it('show dropdown', async () => { + it('show dropdown', () => { createStore(); createComponent({ provide: { multipleIssueBoardsAvailable: false, hasMissingBoards: true }, @@ -268,7 +268,7 @@ describe('BoardsSelector', () => { }); describe("when multipleIssueBoardsAvailable is disabled and it dosn't hasMissingBoards", () => { - it('hide dropdown', async () => { + it('hide dropdown', () => { createStore(); createComponent({ provide: { multipleIssueBoardsAvailable: false, hasMissingBoards: false }, diff --git a/spec/frontend/boards/components/sidebar/board_sidebar_title_spec.js b/spec/frontend/boards/components/sidebar/board_sidebar_title_spec.js index 296f25d96c4..b71d6b7e138 100644 --- a/spec/frontend/boards/components/sidebar/board_sidebar_title_spec.js +++ b/spec/frontend/boards/components/sidebar/board_sidebar_title_spec.js @@ -146,7 +146,7 @@ describe('BoardSidebarTitle', () => { createWrapper(); }); - it('sets title, expands item and shows alert', async () => { + it('sets title, expands item and shows alert', () => { expect(wrapper.vm.title).toBe(TEST_TITLE); expect(findCollapsed().isVisible()).toBe(false); expect(findAlert().exists()).toBe(true); diff --git a/spec/frontend/boards/stores/actions_spec.js b/spec/frontend/boards/stores/actions_spec.js index f430062bb73..b8d3be28ca6 100644 --- a/spec/frontend/boards/stores/actions_spec.js +++ b/spec/frontend/boards/stores/actions_spec.js @@ -401,7 +401,7 @@ describe('fetchMilestones', () => { }, ); - it('sets milestonesLoading to true', async () => { + it('sets milestonesLoading to true', () => { jest.spyOn(gqlClient, 'query').mockResolvedValue(queryResponse); const store = createStore(); diff --git a/spec/frontend/branches/components/delete_branch_modal_spec.js b/spec/frontend/branches/components/delete_branch_modal_spec.js index 404431ea5d8..7851d86466f 100644 --- a/spec/frontend/branches/components/delete_branch_modal_spec.js +++ b/spec/frontend/branches/components/delete_branch_modal_spec.js @@ -94,7 +94,7 @@ describe('Delete branch modal', () => { expect(submitSpy).toHaveBeenCalled(); }); - it('calls show on the modal when a `openModal` event is received through the event hub', async () => { + it('calls show on the modal when a `openModal` event is received through the event hub', () => { expect(showMock).not.toHaveBeenCalled(); emitOpenModal(); diff --git a/spec/frontend/captcha/captcha_modal_spec.js b/spec/frontend/captcha/captcha_modal_spec.js index 6d6d8043797..4bbed8ab3bb 100644 --- a/spec/frontend/captcha/captcha_modal_spec.js +++ b/spec/frontend/captcha/captcha_modal_spec.js @@ -61,12 +61,12 @@ describe('Captcha Modal', () => { describe('functionality', () => { describe('when modal is shown', () => { describe('when initRecaptchaScript promise resolves successfully', () => { - beforeEach(async () => { + beforeEach(() => { createComponent({ props: { needsCaptchaResponse: true } }); findGlModal().vm.$emit('shown'); }); - it('shows modal', async () => { + it('shows modal', () => { expect(showSpy).toHaveBeenCalled(); }); @@ -90,7 +90,7 @@ describe('Captcha Modal', () => { expect(wrapper.emitted('receivedCaptchaResponse')).toEqual([[captchaResponse]]); }); - it('hides modal with null trigger', async () => { + it('hides modal with null trigger', () => { // Assert that hide is called with zero args, so that we don't trigger the logic // for hiding the modal via cancel, esc, headerclose, etc, without a captcha response expect(hideSpy).toHaveBeenCalledWith(); diff --git a/spec/frontend/captcha/init_recaptcha_script_spec.js b/spec/frontend/captcha/init_recaptcha_script_spec.js index 78480821d95..3e2d7ba00ee 100644 --- a/spec/frontend/captcha/init_recaptcha_script_spec.js +++ b/spec/frontend/captcha/init_recaptcha_script_spec.js @@ -50,7 +50,7 @@ describe('initRecaptchaScript', () => { await expect(result).resolves.toBe(window.grecaptcha); }); - it('sets window[RECAPTCHA_ONLOAD_CALLBACK_NAME] to undefined', async () => { + it('sets window[RECAPTCHA_ONLOAD_CALLBACK_NAME] to undefined', () => { expect(getScriptOnload()).toBeUndefined(); }); }); diff --git a/spec/frontend/ci/ci_variable_list/components/ci_environments_dropdown_spec.js b/spec/frontend/ci/ci_variable_list/components/ci_environments_dropdown_spec.js index 193f7babdb7..1937e3b34b7 100644 --- a/spec/frontend/ci/ci_variable_list/components/ci_environments_dropdown_spec.js +++ b/spec/frontend/ci/ci_variable_list/components/ci_environments_dropdown_spec.js @@ -140,7 +140,7 @@ describe('Ci environments dropdown', () => { expect(wrapper.emitted('search-environment-scope')[1]).toEqual([currentEnv]); }); - it('renders loading icon while search query is loading', async () => { + it('renders loading icon while search query is loading', () => { createComponent({ enableFeatureFlag: true, props: { areEnvironmentsLoading: true } }); expect(findListbox().props('searching')).toBe(true); diff --git a/spec/frontend/ci/ci_variable_list/components/ci_variable_shared_spec.js b/spec/frontend/ci/ci_variable_list/components/ci_variable_shared_spec.js index c7bcace3883..06b3ec4aab8 100644 --- a/spec/frontend/ci/ci_variable_list/components/ci_variable_shared_spec.js +++ b/spec/frontend/ci/ci_variable_list/components/ci_variable_shared_spec.js @@ -260,7 +260,7 @@ describe('Ci Variable Shared Component', () => { }); }); - it('initial query is called with the correct variables', async () => { + it('initial query is called with the correct variables', () => { expect(mockEnvironments).toHaveBeenCalledWith({ fullPath: '/namespace/project/' }); }); diff --git a/spec/frontend/clusters/agents/components/create_token_modal_spec.js b/spec/frontend/clusters/agents/components/create_token_modal_spec.js index ff698952c6b..42e6a70ee26 100644 --- a/spec/frontend/clusters/agents/components/create_token_modal_spec.js +++ b/spec/frontend/clusters/agents/components/create_token_modal_spec.js @@ -213,7 +213,7 @@ describe('CreateTokenModal', () => { await mockCreatedResponse(createAgentTokenErrorResponse); }); - it('displays the error message', async () => { + it('displays the error message', () => { expect(findAlert().text()).toBe( createAgentTokenErrorResponse.data.clusterAgentTokenCreate.errors[0], ); diff --git a/spec/frontend/clusters_list/components/install_agent_modal_spec.js b/spec/frontend/clusters_list/components/install_agent_modal_spec.js index 3156eaaecfc..f9009696c7b 100644 --- a/spec/frontend/clusters_list/components/install_agent_modal_spec.js +++ b/spec/frontend/clusters_list/components/install_agent_modal_spec.js @@ -256,7 +256,7 @@ describe('InstallAgentModal', () => { return mockSelectedAgentResponse(); }); - it('displays the error message', async () => { + it('displays the error message', () => { expect(findAlert().text()).toBe( createAgentTokenErrorResponse.data.clusterAgentTokenCreate.errors[0], ); diff --git a/spec/frontend/comment_templates/components/list_item_spec.js b/spec/frontend/comment_templates/components/list_item_spec.js index 921ef181723..925d78da4ad 100644 --- a/spec/frontend/comment_templates/components/list_item_spec.js +++ b/spec/frontend/comment_templates/components/list_item_spec.js @@ -39,7 +39,7 @@ describe('Comment templates list item component', () => { const findDropdownItems = () => wrapper.findAllComponents(GlDisclosureDropdownItem); const findModal = () => wrapper.findComponent(GlModal); - it('renders list item', async () => { + it('renders list item', () => { wrapper = createComponent({ template: { name: 'test', content: '/assign_reviewer' } }); expect(wrapper.element).toMatchSnapshot(); diff --git a/spec/frontend/commit/commit_box_pipeline_mini_graph_spec.js b/spec/frontend/commit/commit_box_pipeline_mini_graph_spec.js index 64623968aa0..cc251104811 100644 --- a/spec/frontend/commit/commit_box_pipeline_mini_graph_spec.js +++ b/spec/frontend/commit/commit_box_pipeline_mini_graph_spec.js @@ -83,7 +83,7 @@ describe('Commit box pipeline mini graph', () => { await createComponent(); }); - it('should not display loading state after the query is resolved', async () => { + it('should not display loading state after the query is resolved', () => { expect(findLoadingIcon().exists()).toBe(false); expect(findPipelineMiniGraph().exists()).toBe(true); }); diff --git a/spec/frontend/commit/components/commit_box_pipeline_status_spec.js b/spec/frontend/commit/components/commit_box_pipeline_status_spec.js index 9c7a41b3506..5df35cc6dda 100644 --- a/spec/frontend/commit/components/commit_box_pipeline_status_spec.js +++ b/spec/frontend/commit/components/commit_box_pipeline_status_spec.js @@ -70,7 +70,7 @@ describe('Commit box pipeline status', () => { await waitForPromises(); }); - it('should display pipeline status after the query is resolved successfully', async () => { + it('should display pipeline status after the query is resolved successfully', () => { expect(findStatusIcon().exists()).toBe(true); expect(findLoadingIcon().exists()).toBe(false); diff --git a/spec/frontend/content_editor/components/bubble_menus/code_block_bubble_menu_spec.js b/spec/frontend/content_editor/components/bubble_menus/code_block_bubble_menu_spec.js index 085a6d3a28d..2a6ab75227c 100644 --- a/spec/frontend/content_editor/components/bubble_menus/code_block_bubble_menu_spec.js +++ b/spec/frontend/content_editor/components/bubble_menus/code_block_bubble_menu_spec.js @@ -59,7 +59,7 @@ describe('content_editor/components/bubble_menus/code_block_bubble_menu', () => checked: x.props('isChecked'), })); - beforeEach(async () => { + beforeEach(() => { buildEditor(); buildWrapper(); }); @@ -133,7 +133,7 @@ describe('content_editor/components/bubble_menus/code_block_bubble_menu', () => }); describe('preview button', () => { - it('does not appear for a regular code block', async () => { + it('does not appear for a regular code block', () => { tiptapEditor.commands.insertContent('<pre lang="javascript">var a = 2;</pre>'); expect(wrapper.findByTestId('preview-diagram').exists()).toBe(false); @@ -269,7 +269,7 @@ describe('content_editor/components/bubble_menus/code_block_bubble_menu', () => await emitEditorEvent({ event: 'transaction', tiptapEditor }); }); - it('hides the custom language input form and shows dropdown items', async () => { + it('hides the custom language input form and shows dropdown items', () => { expect(wrapper.findComponent(GlDropdownItem).exists()).toBe(true); expect(wrapper.findComponent(GlSearchBoxByType).exists()).toBe(true); expect(wrapper.findComponent(GlDropdownForm).exists()).toBe(false); diff --git a/spec/frontend/content_editor/components/bubble_menus/link_bubble_menu_spec.js b/spec/frontend/content_editor/components/bubble_menus/link_bubble_menu_spec.js index eb5a3b61591..05ee8b99380 100644 --- a/spec/frontend/content_editor/components/bubble_menus/link_bubble_menu_spec.js +++ b/spec/frontend/content_editor/components/bubble_menus/link_bubble_menu_spec.js @@ -59,7 +59,7 @@ describe('content_editor/components/bubble_menus/link_bubble_menu', () => { expect(wrapper.findByTestId('remove-link').exists()).toBe(exist); }; - beforeEach(async () => { + beforeEach(() => { buildEditor(); tiptapEditor @@ -195,7 +195,7 @@ describe('content_editor/components/bubble_menus/link_bubble_menu', () => { await buildWrapperAndDisplayMenu(); }); - it('directly opens the edit form for a placeholder link', async () => { + it('directly opens the edit form for a placeholder link', () => { expectLinkButtonsToExist(false); expect(wrapper.findComponent(GlForm).exists()).toBe(true); @@ -226,7 +226,7 @@ describe('content_editor/components/bubble_menus/link_bubble_menu', () => { linkTitleInput = wrapper.findByTestId('link-title'); }); - it('hides the link and copy/edit/remove link buttons', async () => { + it('hides the link and copy/edit/remove link buttons', () => { expectLinkButtonsToExist(false); }); @@ -254,7 +254,7 @@ describe('content_editor/components/bubble_menus/link_bubble_menu', () => { await wrapper.findComponent(GlForm).vm.$emit('submit', createFakeEvent()); }); - it('updates prosemirror doc with new link', async () => { + it('updates prosemirror doc with new link', () => { expect(tiptapEditor.getHTML()).toBe( '<p>Download <a target="_blank" rel="noopener noreferrer nofollow" href="https://google.com" title="Search Google">PDF File</a></p>', ); diff --git a/spec/frontend/content_editor/components/bubble_menus/media_bubble_menu_spec.js b/spec/frontend/content_editor/components/bubble_menus/media_bubble_menu_spec.js index c918f068c07..e02b36fb8e9 100644 --- a/spec/frontend/content_editor/components/bubble_menus/media_bubble_menu_spec.js +++ b/spec/frontend/content_editor/components/bubble_menus/media_bubble_menu_spec.js @@ -100,11 +100,11 @@ describe.each` bubbleMenu = wrapper.findComponent(BubbleMenu); }); - it('renders bubble menu component', async () => { + it('renders bubble menu component', () => { expect(bubbleMenu.classes()).toEqual(['gl-shadow', 'gl-rounded-base', 'gl-bg-white']); }); - it('shows a clickable link to the image', async () => { + it('shows a clickable link to the image', () => { const link = wrapper.findComponent(GlLink); expect(link.attributes()).toEqual( expect.objectContaining({ @@ -202,7 +202,7 @@ describe.each` mediaAltInput = wrapper.findByTestId('media-alt'); }); - it('hides the link and copy/edit/remove link buttons', async () => { + it('hides the link and copy/edit/remove link buttons', () => { expectLinkButtonsToExist(false); }); @@ -225,7 +225,7 @@ describe.each` await wrapper.findComponent(GlForm).vm.$emit('submit', createFakeEvent()); }); - it(`updates prosemirror doc with new src to the ${mediaType}`, async () => { + it(`updates prosemirror doc with new src to the ${mediaType}`, () => { expect(tiptapEditor.getHTML()).toBe(mediaOutputHTML); }); diff --git a/spec/frontend/content_editor/components/content_editor_alert_spec.js b/spec/frontend/content_editor/components/content_editor_alert_spec.js index e62e2331d25..e6873e2cf96 100644 --- a/spec/frontend/content_editor/components/content_editor_alert_spec.js +++ b/spec/frontend/content_editor/components/content_editor_alert_spec.js @@ -14,7 +14,7 @@ describe('content_editor/components/content_editor_alert', () => { const findErrorAlert = () => wrapper.findComponent(GlAlert); - const createWrapper = async () => { + const createWrapper = () => { tiptapEditor = createTestEditor(); eventHub = eventHubFactory(); diff --git a/spec/frontend/content_editor/components/toolbar_more_dropdown_spec.js b/spec/frontend/content_editor/components/toolbar_more_dropdown_spec.js index 5af4784f358..78b02744d51 100644 --- a/spec/frontend/content_editor/components/toolbar_more_dropdown_spec.js +++ b/spec/frontend/content_editor/components/toolbar_more_dropdown_spec.js @@ -53,7 +53,7 @@ describe('content_editor/components/toolbar_more_dropdown', () => { let commands; let btn; - beforeEach(async () => { + beforeEach(() => { buildWrapper(); commands = mockChainedCommands(tiptapEditor, [command, 'focus', 'run']); diff --git a/spec/frontend/content_editor/components/wrappers/code_block_spec.js b/spec/frontend/content_editor/components/wrappers/code_block_spec.js index 057e50cd0e2..cbeea90dcb4 100644 --- a/spec/frontend/content_editor/components/wrappers/code_block_spec.js +++ b/spec/frontend/content_editor/components/wrappers/code_block_spec.js @@ -26,7 +26,7 @@ describe('content/components/wrappers/code_block', () => { eventHub = eventHubFactory(); }; - const createWrapper = async (nodeAttrs = { language }) => { + const createWrapper = (nodeAttrs = { language }) => { updateAttributesFn = jest.fn(); wrapper = mountExtended(CodeBlockWrapper, { @@ -97,7 +97,7 @@ describe('content/components/wrappers/code_block', () => { jest.spyOn(tiptapEditor, 'isActive').mockReturnValue(true); }); - it('does not render a preview if showPreview: false', async () => { + it('does not render a preview if showPreview: false', () => { createWrapper({ language: 'plantuml', isDiagram: true, showPreview: false }); expect(wrapper.findComponent({ ref: 'diagramContainer' }).exists()).toBe(false); diff --git a/spec/frontend/content_editor/components/wrappers/details_spec.js b/spec/frontend/content_editor/components/wrappers/details_spec.js index 232c1e9aede..e35b04636f7 100644 --- a/spec/frontend/content_editor/components/wrappers/details_spec.js +++ b/spec/frontend/content_editor/components/wrappers/details_spec.js @@ -5,7 +5,7 @@ import DetailsWrapper from '~/content_editor/components/wrappers/details.vue'; describe('content/components/wrappers/details', () => { let wrapper; - const createWrapper = async () => { + const createWrapper = () => { wrapper = shallowMountExtended(DetailsWrapper, { propsData: { node: {}, diff --git a/spec/frontend/content_editor/components/wrappers/footnote_definition_spec.js b/spec/frontend/content_editor/components/wrappers/footnote_definition_spec.js index 91c6799478e..b5b118a2d9a 100644 --- a/spec/frontend/content_editor/components/wrappers/footnote_definition_spec.js +++ b/spec/frontend/content_editor/components/wrappers/footnote_definition_spec.js @@ -4,7 +4,7 @@ import FootnoteDefinitionWrapper from '~/content_editor/components/wrappers/foot describe('content/components/wrappers/footnote_definition', () => { let wrapper; - const createWrapper = async (node = {}) => { + const createWrapper = (node = {}) => { wrapper = shallowMountExtended(FootnoteDefinitionWrapper, { propsData: { node, diff --git a/spec/frontend/content_editor/components/wrappers/reference_label_spec.js b/spec/frontend/content_editor/components/wrappers/reference_label_spec.js index ac3b0730223..f57caee911b 100644 --- a/spec/frontend/content_editor/components/wrappers/reference_label_spec.js +++ b/spec/frontend/content_editor/components/wrappers/reference_label_spec.js @@ -5,7 +5,7 @@ import ReferenceLabelWrapper from '~/content_editor/components/wrappers/referenc describe('content/components/wrappers/reference_label', () => { let wrapper; - const createWrapper = async (node = {}) => { + const createWrapper = (node = {}) => { wrapper = shallowMountExtended(ReferenceLabelWrapper, { propsData: { node }, }); diff --git a/spec/frontend/content_editor/components/wrappers/reference_spec.js b/spec/frontend/content_editor/components/wrappers/reference_spec.js index a9d9a934af2..828b92a6b1e 100644 --- a/spec/frontend/content_editor/components/wrappers/reference_spec.js +++ b/spec/frontend/content_editor/components/wrappers/reference_spec.js @@ -5,7 +5,7 @@ import ReferenceWrapper from '~/content_editor/components/wrappers/reference.vue describe('content/components/wrappers/reference', () => { let wrapper; - const createWrapper = async (node = {}) => { + const createWrapper = (node = {}) => { wrapper = shallowMountExtended(ReferenceWrapper, { propsData: { node }, }); diff --git a/spec/frontend/content_editor/components/wrappers/table_cell_base_spec.js b/spec/frontend/content_editor/components/wrappers/table_cell_base_spec.js index d8f34565705..71ffbd3f93c 100644 --- a/spec/frontend/content_editor/components/wrappers/table_cell_base_spec.js +++ b/spec/frontend/content_editor/components/wrappers/table_cell_base_spec.js @@ -13,7 +13,7 @@ describe('content/components/wrappers/table_cell_base', () => { let editor; let node; - const createWrapper = async (propsData = { cellType: 'td' }) => { + const createWrapper = (propsData = { cellType: 'td' }) => { wrapper = shallowMountExtended(TableCellBaseWrapper, { propsData: { editor, @@ -118,7 +118,7 @@ describe('content/components/wrappers/table_cell_base', () => { }, ); - it('does not allow deleting rows and columns', async () => { + it('does not allow deleting rows and columns', () => { expect(findDropdownItemWithLabelExists('Delete row')).toBe(false); expect(findDropdownItemWithLabelExists('Delete column')).toBe(false); }); @@ -173,7 +173,7 @@ describe('content/components/wrappers/table_cell_base', () => { await nextTick(); }); - it('does not allow adding a row before the header', async () => { + it('does not allow adding a row before the header', () => { expect(findDropdownItemWithLabelExists('Insert row before')).toBe(false); }); diff --git a/spec/frontend/content_editor/components/wrappers/table_cell_body_spec.js b/spec/frontend/content_editor/components/wrappers/table_cell_body_spec.js index 506f442bcc7..4c91573e0c7 100644 --- a/spec/frontend/content_editor/components/wrappers/table_cell_body_spec.js +++ b/spec/frontend/content_editor/components/wrappers/table_cell_body_spec.js @@ -8,7 +8,7 @@ describe('content/components/wrappers/table_cell_body', () => { let editor; let node; - const createWrapper = async () => { + const createWrapper = () => { wrapper = shallowMount(TableCellBodyWrapper, { propsData: { editor, diff --git a/spec/frontend/content_editor/components/wrappers/table_cell_header_spec.js b/spec/frontend/content_editor/components/wrappers/table_cell_header_spec.js index bebe7fb4124..689a8bc32bb 100644 --- a/spec/frontend/content_editor/components/wrappers/table_cell_header_spec.js +++ b/spec/frontend/content_editor/components/wrappers/table_cell_header_spec.js @@ -8,7 +8,7 @@ describe('content/components/wrappers/table_cell_header', () => { let editor; let node; - const createWrapper = async () => { + const createWrapper = () => { wrapper = shallowMount(TableCellHeaderWrapper, { propsData: { editor, diff --git a/spec/frontend/content_editor/components/wrappers/table_of_contents_spec.js b/spec/frontend/content_editor/components/wrappers/table_of_contents_spec.js index 4d5911dda0c..037da7678bb 100644 --- a/spec/frontend/content_editor/components/wrappers/table_of_contents_spec.js +++ b/spec/frontend/content_editor/components/wrappers/table_of_contents_spec.js @@ -20,7 +20,7 @@ describe('content/components/wrappers/table_of_contents', () => { eventHub = eventHubFactory(); }; - const createWrapper = async () => { + const createWrapper = () => { wrapper = mountExtended(TableOfContentsWrapper, { propsData: { editor: tiptapEditor, diff --git a/spec/frontend/content_editor/markdown_snapshot_spec.js b/spec/frontend/content_editor/markdown_snapshot_spec.js index fd64003420e..49b466fd7f5 100644 --- a/spec/frontend/content_editor/markdown_snapshot_spec.js +++ b/spec/frontend/content_editor/markdown_snapshot_spec.js @@ -42,7 +42,7 @@ describe('markdown example snapshots in ContentEditor', () => { const expectedProseMirrorJsonExamples = loadExamples(prosemirrorJsonYml); const exampleNames = Object.keys(markdownExamples); - beforeAll(async () => { + beforeAll(() => { return renderHtmlAndJsonForAllExamples(markdownExamples).then((examples) => { actualHtmlAndJsonExamples = examples; }); @@ -60,7 +60,7 @@ describe('markdown example snapshots in ContentEditor', () => { if (skipRunningSnapshotWysiwygHtmlTests) { it.todo(`${exampleNamePrefix} HTML: ${skipRunningSnapshotWysiwygHtmlTests}`); } else { - it(`${exampleNamePrefix} HTML`, async () => { + it(`${exampleNamePrefix} HTML`, () => { const expectedHtml = expectedHtmlExamples[name].wysiwyg; const { html: actualHtml } = actualHtmlAndJsonExamples[name]; @@ -78,7 +78,7 @@ describe('markdown example snapshots in ContentEditor', () => { if (skipRunningSnapshotProsemirrorJsonTests) { it.todo(`${exampleNamePrefix} ProseMirror JSON: ${skipRunningSnapshotProsemirrorJsonTests}`); } else { - it(`${exampleNamePrefix} ProseMirror JSON`, async () => { + it(`${exampleNamePrefix} ProseMirror JSON`, () => { const expectedJson = expectedProseMirrorJsonExamples[name]; const { json: actualJson } = actualHtmlAndJsonExamples[name]; diff --git a/spec/frontend/content_editor/services/content_editor_spec.js b/spec/frontend/content_editor/services/content_editor_spec.js index 6175cbdd3d4..5dfe9c06923 100644 --- a/spec/frontend/content_editor/services/content_editor_spec.js +++ b/spec/frontend/content_editor/services/content_editor_spec.js @@ -64,13 +64,13 @@ describe('content_editor/services/content_editor', () => { }); describe('editable', () => { - it('returns true when tiptapEditor is editable', async () => { + it('returns true when tiptapEditor is editable', () => { contentEditor.setEditable(true); expect(contentEditor.editable).toBe(true); }); - it('returns false when tiptapEditor is readonly', async () => { + it('returns false when tiptapEditor is readonly', () => { contentEditor.setEditable(false); expect(contentEditor.editable).toBe(false); diff --git a/spec/frontend/content_editor/services/create_content_editor_spec.js b/spec/frontend/content_editor/services/create_content_editor_spec.js index 00cc628ca72..53cd51b8c5f 100644 --- a/spec/frontend/content_editor/services/create_content_editor_spec.js +++ b/spec/frontend/content_editor/services/create_content_editor_spec.js @@ -53,7 +53,7 @@ describe('content_editor/services/create_content_editor', () => { }); }); - it('allows providing external content editor extensions', async () => { + it('allows providing external content editor extensions', () => { const labelReference = 'this is a ~group::editor'; const { tiptapExtension, serializer } = createTestContentEditorExtension(); diff --git a/spec/frontend/content_editor/services/gl_api_markdown_deserializer_spec.js b/spec/frontend/content_editor/services/gl_api_markdown_deserializer_spec.js index 8ee37282ee9..a9960918e62 100644 --- a/spec/frontend/content_editor/services/gl_api_markdown_deserializer_spec.js +++ b/spec/frontend/content_editor/services/gl_api_markdown_deserializer_spec.js @@ -43,7 +43,7 @@ describe('content_editor/services/gl_api_markdown_deserializer', () => { }); }); - it('transforms HTML returned by render function to a ProseMirror document', async () => { + it('transforms HTML returned by render function to a ProseMirror document', () => { const document = doc(p(bold(text)), comment(' some comment ')); expect(result.document.toJSON()).toEqual(document.toJSON()); diff --git a/spec/frontend/content_editor/services/track_input_rules_and_shortcuts_spec.js b/spec/frontend/content_editor/services/track_input_rules_and_shortcuts_spec.js index 8c1a3831a74..1459988cf8f 100644 --- a/spec/frontend/content_editor/services/track_input_rules_and_shortcuts_spec.js +++ b/spec/frontend/content_editor/services/track_input_rules_and_shortcuts_spec.js @@ -43,7 +43,7 @@ describe('content_editor/services/track_input_rules_and_shortcuts', () => { }); describe('when creating a heading using an keyboard shortcut', () => { - it('sends a tracking event indicating that a heading was created using an input rule', async () => { + it('sends a tracking event indicating that a heading was created using an input rule', () => { const shortcuts = Heading.parent.config.addKeyboardShortcuts.call(Heading); const [firstShortcut] = Object.keys(shortcuts); const nodeName = Heading.name; @@ -68,7 +68,7 @@ describe('content_editor/services/track_input_rules_and_shortcuts', () => { }); describe('when creating a heading using an input rule', () => { - it('sends a tracking event indicating that a heading was created using an input rule', async () => { + it('sends a tracking event indicating that a heading was created using an input rule', () => { const nodeName = Heading.name; triggerNodeInputRule({ tiptapEditor: editor, inputRuleText: '## ' }); expect(trackingSpy).toHaveBeenCalledWith(undefined, INPUT_RULE_TRACKING_ACTION, { diff --git a/spec/frontend/custom_metrics/components/custom_metrics_form_fields_spec.js b/spec/frontend/custom_metrics/components/custom_metrics_form_fields_spec.js index 12fef9d5ddf..d3cdd0d16ef 100644 --- a/spec/frontend/custom_metrics/components/custom_metrics_form_fields_spec.js +++ b/spec/frontend/custom_metrics/components/custom_metrics_form_fields_spec.js @@ -173,7 +173,7 @@ describe('custom metrics form fields component', () => { return axios.waitForAll(); }); - it('shows invalid query message', async () => { + it('shows invalid query message', () => { expect(wrapper.text()).toContain(errorMessage); }); }); diff --git a/spec/frontend/design_management/components/design_notes/design_discussion_spec.js b/spec/frontend/design_management/components/design_notes/design_discussion_spec.js index 56bf0fa60a7..a6ab147884f 100644 --- a/spec/frontend/design_management/components/design_notes/design_discussion_spec.js +++ b/spec/frontend/design_management/components/design_notes/design_discussion_spec.js @@ -381,7 +381,7 @@ describe('Design discussions component', () => { }); }); - it('should open confirmation modal when the note emits `delete-note` event', async () => { + it('should open confirmation modal when the note emits `delete-note` event', () => { createComponent(); findDesignNotes().at(0).vm.$emit('delete-note', { id: '1' }); diff --git a/spec/frontend/design_management/components/design_notes/design_note_spec.js b/spec/frontend/design_management/components/design_notes/design_note_spec.js index 82848bd1a19..6f5b282fa3b 100644 --- a/spec/frontend/design_management/components/design_notes/design_note_spec.js +++ b/spec/frontend/design_management/components/design_notes/design_note_spec.js @@ -189,7 +189,7 @@ describe('Design note component', () => { }); }); - it('should emit `delete-note` event with proper payload when delete note button is clicked', async () => { + it('should emit `delete-note` event with proper payload when delete note button is clicked', () => { const payload = { ...note, userPermissions: { diff --git a/spec/frontend/design_management/components/design_notes/design_reply_form_spec.js b/spec/frontend/design_management/components/design_notes/design_reply_form_spec.js index db1cfb4f504..d82b6c5fec0 100644 --- a/spec/frontend/design_management/components/design_notes/design_reply_form_spec.js +++ b/spec/frontend/design_management/components/design_notes/design_reply_form_spec.js @@ -260,7 +260,7 @@ describe('Design reply form component', () => { ${false} | ${false} | ${UPDATE_NOTE_ERROR} `( 'return proper error message on error in case of isDiscussion is $isDiscussion and isNewComment is $isNewComment', - async ({ isDiscussion, isNewComment, errorMessage }) => { + ({ isDiscussion, isNewComment, errorMessage }) => { createComponent({ props: { isDiscussion, isNewComment } }); expect(wrapper.vm.getErrorMessage()).toBe(errorMessage); diff --git a/spec/frontend/design_management/components/design_scaler_spec.js b/spec/frontend/design_management/components/design_scaler_spec.js index 62a26a8f5dd..b29448b4471 100644 --- a/spec/frontend/design_management/components/design_scaler_spec.js +++ b/spec/frontend/design_management/components/design_scaler_spec.js @@ -36,7 +36,7 @@ describe('Design management design scaler component', () => { expect(wrapper.emitted('scale')[1]).toEqual([1]); }); - it('emits @scale event when "decrement" button clicked', async () => { + it('emits @scale event when "decrement" button clicked', () => { getDecreaseScaleButton().vm.$emit('click'); expect(wrapper.emitted('scale')[1]).toEqual([1.4]); }); diff --git a/spec/frontend/design_management/components/design_todo_button_spec.js b/spec/frontend/design_management/components/design_todo_button_spec.js index f713203c0ee..698535d8937 100644 --- a/spec/frontend/design_management/components/design_todo_button_spec.js +++ b/spec/frontend/design_management/components/design_todo_button_spec.js @@ -81,7 +81,7 @@ describe('Design management design todo button', () => { await nextTick(); }); - it('calls `$apollo.mutate` with the `todoMarkDone` mutation and variables containing `id`', async () => { + it('calls `$apollo.mutate` with the `todoMarkDone` mutation and variables containing `id`', () => { const todoMarkDoneMutationVariables = { mutation: todoMarkDoneMutation, update: expect.anything(), @@ -127,7 +127,7 @@ describe('Design management design todo button', () => { await nextTick(); }); - it('calls `$apollo.mutate` with the `createDesignTodoMutation` mutation and variables containing `issuable_id`, `issue_id`, & `projectPath`', async () => { + it('calls `$apollo.mutate` with the `createDesignTodoMutation` mutation and variables containing `issuable_id`, `issue_id`, & `projectPath`', () => { const createDesignTodoMutationVariables = { mutation: createDesignTodoMutation, update: expect.anything(), diff --git a/spec/frontend/design_management/pages/design/index_spec.js b/spec/frontend/design_management/pages/design/index_spec.js index 6cec4036d40..fcb03ea3700 100644 --- a/spec/frontend/design_management/pages/design/index_spec.js +++ b/spec/frontend/design_management/pages/design/index_spec.js @@ -153,7 +153,7 @@ describe('Design management design index page', () => { }); describe('when navigating away from component', () => { - it('removes fullscreen layout class', async () => { + it('removes fullscreen layout class', () => { jest.spyOn(utils, 'getPageLayoutElement').mockReturnValue(mockPageLayoutElement); createComponent({ loading: true }); diff --git a/spec/frontend/design_management/pages/index_spec.js b/spec/frontend/design_management/pages/index_spec.js index 9b6ed37f92d..23c6cb944bc 100644 --- a/spec/frontend/design_management/pages/index_spec.js +++ b/spec/frontend/design_management/pages/index_spec.js @@ -719,7 +719,7 @@ describe('Design management index page', () => { expect(mockMutate).not.toHaveBeenCalled(); }); - it('removes onPaste listener after mouseleave event', async () => { + it('removes onPaste listener after mouseleave event', () => { findDesignsWrapper().trigger('mouseleave'); document.dispatchEvent(event); diff --git a/spec/frontend/diffs/components/app_spec.js b/spec/frontend/diffs/components/app_spec.js index ab01c3e528e..f24ce8ba4ce 100644 --- a/spec/frontend/diffs/components/app_spec.js +++ b/spec/frontend/diffs/components/app_spec.js @@ -175,7 +175,7 @@ describe('diffs/components/app', () => { }); describe('codequality diff', () => { - it('does not fetch code quality data on FOSS', async () => { + it('does not fetch code quality data on FOSS', () => { createComponent(); jest.spyOn(wrapper.vm, 'fetchCodequality'); wrapper.vm.fetchData(false); diff --git a/spec/frontend/diffs/components/diff_file_spec.js b/spec/frontend/diffs/components/diff_file_spec.js index 93698396450..79cd2508757 100644 --- a/spec/frontend/diffs/components/diff_file_spec.js +++ b/spec/frontend/diffs/components/diff_file_spec.js @@ -306,7 +306,7 @@ describe('DiffFile', () => { markFileToBeRendered(store); }); - it('should have the file content', async () => { + it('should have the file content', () => { expect(wrapper.findComponent(DiffContentComponent).exists()).toBe(true); }); @@ -316,7 +316,7 @@ describe('DiffFile', () => { }); describe('toggle', () => { - it('should update store state', async () => { + it('should update store state', () => { jest.spyOn(wrapper.vm.$store, 'dispatch').mockImplementation(() => {}); toggleFile(wrapper); diff --git a/spec/frontend/drawio/drawio_editor_spec.js b/spec/frontend/drawio/drawio_editor_spec.js index 5ef26c04204..d7d75922e1e 100644 --- a/spec/frontend/drawio/drawio_editor_spec.js +++ b/spec/frontend/drawio/drawio_editor_spec.js @@ -108,7 +108,7 @@ describe('drawio/drawio_editor', () => { await waitForDrawioIFrameMessage(); }); - it('sends configure action to the draw.io iframe', async () => { + it('sends configure action to the draw.io iframe', () => { expectDrawioIframeMessage({ expectation: { action: 'configure', @@ -121,7 +121,7 @@ describe('drawio/drawio_editor', () => { }); }); - it('does not remove the iframe after the load error timeouts run', async () => { + it('does not remove the iframe after the load error timeouts run', () => { jest.runAllTimers(); expect(findDrawioIframe()).not.toBe(null); @@ -227,7 +227,7 @@ describe('drawio/drawio_editor', () => { postMessageToParentWindow({ event: 'init' }); }); - it('displays an error alert indicating that the image is not a diagram', async () => { + it('displays an error alert indicating that the image is not a diagram', () => { expect(createAlert).toHaveBeenCalledWith({ message: errorMessage, error: expect.any(Error), @@ -248,7 +248,7 @@ describe('drawio/drawio_editor', () => { postMessageToParentWindow({ event: 'init' }); }); - it('displays an error alert indicating the failure', async () => { + it('displays an error alert indicating the failure', () => { expect(createAlert).toHaveBeenCalledWith({ message: 'Cannot load the diagram into the diagrams.net editor', error: expect.any(Error), diff --git a/spec/frontend/editor/components/source_editor_toolbar_button_spec.js b/spec/frontend/editor/components/source_editor_toolbar_button_spec.js index a94ebdfd827..b5944a52af7 100644 --- a/spec/frontend/editor/components/source_editor_toolbar_button_spec.js +++ b/spec/frontend/editor/components/source_editor_toolbar_button_spec.js @@ -36,14 +36,14 @@ describe('Source Editor Toolbar button', () => { expect(findButton().exists()).toBe(false); }); - it('renders a default button without props', async () => { + it('renders a default button without props', () => { createComponent(); const btn = findButton(); expect(btn.exists()).toBe(true); expect(btn.props()).toMatchObject(defaultProps); }); - it('renders a button based on the props passed', async () => { + it('renders a button based on the props passed', () => { createComponent({ button: customProps, }); diff --git a/spec/frontend/emoji/awards_app/store/actions_spec.js b/spec/frontend/emoji/awards_app/store/actions_spec.js index 3e9b49707ed..65f2e813f19 100644 --- a/spec/frontend/emoji/awards_app/store/actions_spec.js +++ b/spec/frontend/emoji/awards_app/store/actions_spec.js @@ -119,7 +119,7 @@ describe('Awards app actions', () => { mock.onPost(`${relativeRootUrl || ''}/awards`).reply(HTTP_STATUS_OK, { id: 1 }); }); - it('adds an optimistic award, removes it, and then commits ADD_NEW_AWARD', async () => { + it('adds an optimistic award, removes it, and then commits ADD_NEW_AWARD', () => { testAction(actions.toggleAward, null, { path: '/awards', awards: [] }, [ makeOptimisticAddMutation(), makeOptimisticRemoveMutation(), @@ -156,7 +156,7 @@ describe('Awards app actions', () => { mock.onDelete(`${relativeRootUrl || ''}/awards/1`).reply(HTTP_STATUS_OK); }); - it('commits REMOVE_AWARD', async () => { + it('commits REMOVE_AWARD', () => { testAction( actions.toggleAward, 'thumbsup', diff --git a/spec/frontend/environments/environment_details/page_spec.js b/spec/frontend/environments/environment_details/page_spec.js index 0e1d7221a7d..d94faf4addb 100644 --- a/spec/frontend/environments/environment_details/page_spec.js +++ b/spec/frontend/environments/environment_details/page_spec.js @@ -65,7 +65,7 @@ describe('~/environments/environment_details/page.vue', () => { wrapper = createWrapper(); await waitForPromises(); }); - it('should render a table when query is loaded', async () => { + it('should render a table when query is loaded', () => { expect(wrapper.findComponent(GlLoadingIcon).exists()).not.toBe(true); expect(wrapper.findComponent(GlTableLite).exists()).toBe(true); }); @@ -77,7 +77,7 @@ describe('~/environments/environment_details/page.vue', () => { await waitForPromises(); }); - it('should render empty state component', async () => { + it('should render empty state component', () => { expect(wrapper.findComponent(GlTableLite).exists()).toBe(false); expect(wrapper.findComponent(EmptyState).exists()).toBe(true); }); diff --git a/spec/frontend/environments/environment_folder_spec.js b/spec/frontend/environments/environment_folder_spec.js index 279ff32a13d..4716f807657 100644 --- a/spec/frontend/environments/environment_folder_spec.js +++ b/spec/frontend/environments/environment_folder_spec.js @@ -38,7 +38,7 @@ describe('~/environments/components/environments_folder.vue', () => { provide: { helpPagePath: '/help', projectId: '1' }, }); - beforeEach(async () => { + beforeEach(() => { environmentFolderMock = jest.fn(); [nestedEnvironment] = resolvedEnvironmentsApp.environments; environmentFolderMock.mockReturnValue(resolvedFolder); diff --git a/spec/frontend/environments/environment_stop_spec.js b/spec/frontend/environments/environment_stop_spec.js index 851e24c22cc..3e27b8822e1 100644 --- a/spec/frontend/environments/environment_stop_spec.js +++ b/spec/frontend/environments/environment_stop_spec.js @@ -73,7 +73,7 @@ describe('Stop Component', () => { }); }); - it('should show a loading icon if the environment is currently stopping', async () => { + it('should show a loading icon if the environment is currently stopping', () => { expect(findButton().props('loading')).toBe(true); }); }); diff --git a/spec/frontend/environments/environments_app_spec.js b/spec/frontend/environments/environments_app_spec.js index a843f801da5..6f2ee6f06cd 100644 --- a/spec/frontend/environments/environments_app_spec.js +++ b/spec/frontend/environments/environments_app_spec.js @@ -422,7 +422,7 @@ describe('~/environments/components/environments_app.vue', () => { ); }); - it('should sync search term from query params on load', async () => { + it('should sync search term from query params on load', () => { expect(searchBox.element.value).toBe('prod'); }); }); diff --git a/spec/frontend/environments/stop_stale_environments_modal_spec.js b/spec/frontend/environments/stop_stale_environments_modal_spec.js index ddf6670db12..3d28ceba318 100644 --- a/spec/frontend/environments/stop_stale_environments_modal_spec.js +++ b/spec/frontend/environments/stop_stale_environments_modal_spec.js @@ -40,12 +40,12 @@ describe('~/environments/components/stop_stale_environments_modal.vue', () => { jest.resetAllMocks(); }); - it('sets the correct min and max dates', async () => { + it('sets the correct min and max dates', () => { expect(before.props().minDate.toISOString()).toBe(TEN_YEARS_AGO.toISOString()); expect(before.props().maxDate.toISOString()).toBe(ONE_WEEK_AGO.toISOString()); }); - it('requests cleanup when submit is clicked', async () => { + it('requests cleanup when submit is clicked', () => { mock.onPost().replyOnce(HTTP_STATUS_OK); wrapper.findComponent(GlModal).vm.$emit('primary'); const url = STOP_STALE_ENVIRONMENTS_PATH.replace(':id', 1).replace(':version', 'v4'); diff --git a/spec/frontend/feature_flags/components/configure_feature_flags_modal_spec.js b/spec/frontend/feature_flags/components/configure_feature_flags_modal_spec.js index b06e0340991..a12c25c6897 100644 --- a/spec/frontend/feature_flags/components/configure_feature_flags_modal_spec.js +++ b/spec/frontend/feature_flags/components/configure_feature_flags_modal_spec.js @@ -128,11 +128,11 @@ describe('Configure Feature Flags Modal', () => { expect(findSecondaryAction()).toBe(null); }); - it('should not display regenerating instance ID', async () => { + it('should not display regenerating instance ID', () => { expect(findDangerGlAlert().exists()).toBe(false); }); - it('should disable the project name input', async () => { + it('should disable the project name input', () => { expect(findProjectNameInput().exists()).toBe(false); }); }); @@ -142,7 +142,7 @@ describe('Configure Feature Flags Modal', () => { factory({ hasRotateError: true }); }); - it('should display an error', async () => { + it('should display an error', () => { expect(wrapper.findByTestId('rotate-error').exists()).toBe(true); expect(wrapper.find('[name="warning"]').exists()).toBe(true); }); @@ -151,7 +151,7 @@ describe('Configure Feature Flags Modal', () => { describe('is rotating', () => { beforeEach(factory.bind(null, { isRotating: true })); - it('should disable the project name input', async () => { + it('should disable the project name input', () => { expect(findProjectNameInput().attributes('disabled')).toBe('true'); }); }); diff --git a/spec/frontend/feature_flags/components/feature_flags_spec.js b/spec/frontend/feature_flags/components/feature_flags_spec.js index 23e86d0eb2f..8492fe7bdde 100644 --- a/spec/frontend/feature_flags/components/feature_flags_spec.js +++ b/spec/frontend/feature_flags/components/feature_flags_spec.js @@ -94,7 +94,7 @@ describe('Feature flags', () => { await limitAlert().vm.$emit('dismiss'); }); - it('hides the alert', async () => { + it('hides the alert', () => { expect(limitAlert().exists()).toBe(false); }); @@ -176,7 +176,7 @@ describe('Feature flags', () => { emptyState = wrapper.findComponent(GlEmptyState); }); - it('should render the empty state', async () => { + it('should render the empty state', () => { expect(emptyState.exists()).toBe(true); }); diff --git a/spec/frontend/frequent_items/components/frequent_items_list_spec.js b/spec/frontend/frequent_items/components/frequent_items_list_spec.js index 87f8e131b77..dd6dd80af4f 100644 --- a/spec/frontend/frequent_items/components/frequent_items_list_spec.js +++ b/spec/frontend/frequent_items/components/frequent_items_list_spec.js @@ -48,7 +48,7 @@ describe('FrequentItemsListComponent', () => { }); describe('fetched item messages', () => { - it('should show default empty list message', async () => { + it('should show default empty list message', () => { createComponent({ items: [], }); diff --git a/spec/frontend/groups/components/groups_spec.js b/spec/frontend/groups/components/groups_spec.js index 9ee785d688a..c04eaa501ba 100644 --- a/spec/frontend/groups/components/groups_spec.js +++ b/spec/frontend/groups/components/groups_spec.js @@ -32,7 +32,7 @@ describe('GroupsComponent', () => { const findPaginationLinks = () => wrapper.findComponent(PaginationLinks); - beforeEach(async () => { + beforeEach(() => { Vue.component('GroupFolder', GroupFolderComponent); Vue.component('GroupItem', GroupItemComponent); }); diff --git a/spec/frontend/helpers/init_simple_app_helper_spec.js b/spec/frontend/helpers/init_simple_app_helper_spec.js index 8dd3745e0ac..7938e3851d0 100644 --- a/spec/frontend/helpers/init_simple_app_helper_spec.js +++ b/spec/frontend/helpers/init_simple_app_helper_spec.js @@ -38,19 +38,19 @@ describe('helpers/init_simple_app_helper/initSimpleApp', () => { resetHTMLFixture(); }); - it('mounts the component if the selector exists', async () => { + it('mounts the component if the selector exists', () => { initMock('<div id="mount-here"></div>'); expect(findMock().exists()).toBe(true); }); - it('does not mount the component if selector does not exist', async () => { + it('does not mount the component if selector does not exist', () => { initMock('<div id="do-not-mount-here"></div>'); expect(didCreateApp()).toBe(false); }); - it('passes the prop to the component if the prop exists', async () => { + it('passes the prop to the component if the prop exists', () => { initMock(`<div id="mount-here" data-view-model={"someKey":"thing","count":123}></div>`); expect(findMock().props()).toEqual({ diff --git a/spec/frontend/ide/components/activity_bar_spec.js b/spec/frontend/ide/components/activity_bar_spec.js index 49b39ea5ddc..95582aca8fd 100644 --- a/spec/frontend/ide/components/activity_bar_spec.js +++ b/spec/frontend/ide/components/activity_bar_spec.js @@ -50,13 +50,13 @@ describe('IDE ActivityBar component', () => { expect(button.classes('active')).toBe(true); }); - it.each(MODES_WITHOUT_EDIT)('is correctly set after clicking %s mode button', async (mode) => { + it.each(MODES_WITHOUT_EDIT)('is correctly set after clicking %s mode button', (mode) => { mountComponent(); testSettingActiveItem(mode); }); - it('is correctly set after clicking edit mode button', async () => { + it('is correctly set after clicking edit mode button', () => { // The default currentActivityView is leftSidebarViews.edit.name, // so for the 'edit' mode, we pass a different currentActivityView. mountComponent({ currentActivityView: leftSidebarViews.review.name }); diff --git a/spec/frontend/ide/components/commit_sidebar/form_spec.js b/spec/frontend/ide/components/commit_sidebar/form_spec.js index ba30073dff2..04dd81d9fda 100644 --- a/spec/frontend/ide/components/commit_sidebar/form_spec.js +++ b/spec/frontend/ide/components/commit_sidebar/form_spec.js @@ -89,7 +89,7 @@ describe('IDE commit form', () => { ${'when user cannot push'} | ${['test']} | ${{ pushCode: false }} | ${goToEditView} | ${findBeginCommitButtonData} | ${true} | ${MSG_CANNOT_PUSH_CODE} ${'when user cannot push'} | ${['test']} | ${{ pushCode: false }} | ${goToCommitView} | ${findCommitButtonData} | ${true} | ${MSG_CANNOT_PUSH_CODE} `('$desc', ({ stagedFiles, userPermissions, viewFn, buttonFn, disabled, tooltip }) => { - beforeEach(async () => { + beforeEach(() => { store.state.stagedFiles = stagedFiles; store.state.projects.abcproject.userPermissions = userPermissions; diff --git a/spec/frontend/ide/components/commit_sidebar/list_spec.js b/spec/frontend/ide/components/commit_sidebar/list_spec.js index 6b9ba939a87..c0b0cb0b732 100644 --- a/spec/frontend/ide/components/commit_sidebar/list_spec.js +++ b/spec/frontend/ide/components/commit_sidebar/list_spec.js @@ -20,7 +20,7 @@ describe('Multi-file editor commit sidebar list', () => { }); describe('with a list of files', () => { - beforeEach(async () => { + beforeEach(() => { const f = file('file name'); f.changed = true; wrapper = mountComponent({ fileList: [f] }); diff --git a/spec/frontend/ide/components/ide_review_spec.js b/spec/frontend/ide/components/ide_review_spec.js index e6fd018969f..7ae8cfac935 100644 --- a/spec/frontend/ide/components/ide_review_spec.js +++ b/spec/frontend/ide/components/ide_review_spec.js @@ -63,7 +63,7 @@ describe('IDE review mode', () => { await wrapper.vm.reactivate(); }); - it('updates viewer to "mrdiff"', async () => { + it('updates viewer to "mrdiff"', () => { expect(store.state.viewer).toBe('mrdiff'); }); }); diff --git a/spec/frontend/ide/components/ide_spec.js b/spec/frontend/ide/components/ide_spec.js index ad4484587d3..f2a684ab65e 100644 --- a/spec/frontend/ide/components/ide_spec.js +++ b/spec/frontend/ide/components/ide_spec.js @@ -64,7 +64,7 @@ describe('WebIDE', () => { }); }); - it('renders "New file" button in empty repo', async () => { + it('renders "New file" button in empty repo', () => { expect(wrapper.find('[title="New file"]').exists()).toBe(true); }); }); diff --git a/spec/frontend/ide/components/repo_editor_spec.js b/spec/frontend/ide/components/repo_editor_spec.js index 9253bfc7e71..6747ec97050 100644 --- a/spec/frontend/ide/components/repo_editor_spec.js +++ b/spec/frontend/ide/components/repo_editor_spec.js @@ -293,7 +293,7 @@ describe('RepoEditor', () => { }); describe('when file changes to non-markdown file', () => { - beforeEach(async () => { + beforeEach(() => { wrapper.setProps({ file: dummyFile.empty }); }); @@ -601,7 +601,7 @@ describe('RepoEditor', () => { const f = createRemoteFile('newFile'); Vue.set(vm.$store.state.entries, f.path, f); - jest.spyOn(service, 'getRawFileData').mockImplementation(async () => { + jest.spyOn(service, 'getRawFileData').mockImplementation(() => { expect(vm.file.loading).toBe(true); // switching from edit to diff mode usually triggers editor initialization @@ -609,7 +609,7 @@ describe('RepoEditor', () => { jest.runOnlyPendingTimers(); - return 'rawFileData123\n'; + return Promise.resolve('rawFileData123\n'); }); wrapper.setProps({ @@ -630,18 +630,18 @@ describe('RepoEditor', () => { jest .spyOn(service, 'getRawFileData') - .mockImplementation(async () => { + .mockImplementation(() => { // opening fileB while the content of fileA is still being fetched wrapper.setProps({ file: fileB, }); - return aContent; + return Promise.resolve(aContent); }) - .mockImplementationOnce(async () => { + .mockImplementationOnce(() => { // we delay returning fileB content // to make sure the editor doesn't initialize prematurely jest.advanceTimersByTime(30); - return bContent; + return Promise.resolve(bContent); }); wrapper.setProps({ diff --git a/spec/frontend/ide/components/shared/commit_message_field_spec.js b/spec/frontend/ide/components/shared/commit_message_field_spec.js index 186b1997497..ccf544b27b7 100644 --- a/spec/frontend/ide/components/shared/commit_message_field_spec.js +++ b/spec/frontend/ide/components/shared/commit_message_field_spec.js @@ -50,7 +50,7 @@ describe('CommitMessageField', () => { await nextTick(); }); - it('is added on textarea focus', async () => { + it('is added on textarea focus', () => { expect(wrapper.attributes('class')).toEqual( expect.stringContaining('gl-outline-none! gl-focus-ring-border-1-gray-900!'), ); diff --git a/spec/frontend/import_entities/import_groups/components/import_actions_cell_spec.js b/spec/frontend/import_entities/import_groups/components/import_actions_cell_spec.js index 1a52485f779..4c13ec555c2 100644 --- a/spec/frontend/import_entities/import_groups/components/import_actions_cell_spec.js +++ b/spec/frontend/import_entities/import_groups/components/import_actions_cell_spec.js @@ -94,14 +94,14 @@ describe('import actions cell', () => { ); }); - it('request migrate projects by default', async () => { + it('request migrate projects by default', () => { const dropdown = wrapper.findComponent(GlDropdown); dropdown.vm.$emit('click'); expect(wrapper.emitted('import-group')[0]).toStrictEqual([{ migrateProjects: true }]); }); - it('request not to migrate projects via dropdown option', async () => { + it('request not to migrate projects via dropdown option', () => { const dropdown = wrapper.findComponent(GlDropdown); dropdown.findComponent(GlDropdownItem).vm.$emit('click'); diff --git a/spec/frontend/import_entities/import_groups/components/import_table_spec.js b/spec/frontend/import_entities/import_groups/components/import_table_spec.js index 205218fdabd..b1aa94cf418 100644 --- a/spec/frontend/import_entities/import_groups/components/import_table_spec.js +++ b/spec/frontend/import_entities/import_groups/components/import_table_spec.js @@ -687,7 +687,7 @@ describe('import table', () => { return waitForPromises(); }); - it('renders import all dropdown', async () => { + it('renders import all dropdown', () => { expect(findImportSelectedDropdown().exists()).toBe(true); }); diff --git a/spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js b/spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js index 83566469176..540c42a2854 100644 --- a/spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js +++ b/spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js @@ -48,7 +48,7 @@ describe('Bulk import resolvers', () => { }; let results; - beforeEach(async () => { + beforeEach(() => { axiosMockAdapter = new MockAdapter(axios); client = createClient(); diff --git a/spec/frontend/incidents/components/incidents_list_spec.js b/spec/frontend/incidents/components/incidents_list_spec.js index e8d222dc2e9..6e64eeaf295 100644 --- a/spec/frontend/incidents/components/incidents_list_spec.js +++ b/spec/frontend/incidents/components/incidents_list_spec.js @@ -212,7 +212,7 @@ describe('Incidents List', () => { }); }); - it('contains a link to the incident details page', async () => { + it('contains a link to the incident details page', () => { findTableRows().at(0).trigger('click'); expect(visitUrl).toHaveBeenCalledWith( joinPaths(`/project/issues/incident`, mockIncidents[0].iid), diff --git a/spec/frontend/integrations/edit/components/integration_form_spec.js b/spec/frontend/integrations/edit/components/integration_form_spec.js index 58fb456eb53..5aa3ee35379 100644 --- a/spec/frontend/integrations/edit/components/integration_form_spec.js +++ b/spec/frontend/integrations/edit/components/integration_form_spec.js @@ -495,7 +495,7 @@ describe('IntegrationForm', () => { expect(refreshCurrentPage).toHaveBeenCalledTimes(1); }); - it('resets `isResetting`', async () => { + it('resets `isResetting`', () => { expect(findFormActions().props('isResetting')).toBe(false); }); }); diff --git a/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js b/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js index 90ee69ef2dc..82f70b8ede1 100644 --- a/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js +++ b/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js @@ -37,8 +37,7 @@ describe('JiraIssuesFields', () => { const findProjectKey = () => wrapper.findComponent(GlFormInput); const findProjectKeyFormGroup = () => wrapper.findByTestId('project-key-form-group'); const findJiraForVulnerabilities = () => wrapper.findByTestId('jira-for-vulnerabilities'); - const setEnableCheckbox = async (isEnabled = true) => - findEnableCheckbox().vm.$emit('input', isEnabled); + const setEnableCheckbox = (isEnabled = true) => findEnableCheckbox().vm.$emit('input', isEnabled); const assertProjectKeyState = (expectedStateValue) => { expect(findProjectKey().attributes('state')).toBe(expectedStateValue); @@ -178,7 +177,7 @@ describe('JiraIssuesFields', () => { }); describe('with no project key', () => { - it('sets Project Key `state` attribute to `undefined`', async () => { + it('sets Project Key `state` attribute to `undefined`', () => { assertProjectKeyState(undefined); }); }); diff --git a/spec/frontend/invite_members/components/invite_members_modal_spec.js b/spec/frontend/invite_members/components/invite_members_modal_spec.js index c80a6b30fb2..4585a6616e1 100644 --- a/spec/frontend/invite_members/components/invite_members_modal_spec.js +++ b/spec/frontend/invite_members/components/invite_members_modal_spec.js @@ -452,7 +452,7 @@ describe('InviteMembersModal', () => { const expectedSyntaxError = 'email contains an invalid email address'; describe('when no invites have been entered in the form and then some are entered', () => { - beforeEach(async () => { + beforeEach(() => { createInviteMembersToGroupWrapper(); }); diff --git a/spec/frontend/issuable/popover/components/mr_popover_spec.js b/spec/frontend/issuable/popover/components/mr_popover_spec.js index d9e113eeaae..5b29ecfc0ba 100644 --- a/spec/frontend/issuable/popover/components/mr_popover_spec.js +++ b/spec/frontend/issuable/popover/components/mr_popover_spec.js @@ -95,7 +95,7 @@ describe('MR Popover', () => { expect(wrapper.text()).toContain('foo/bar!1'); }); - it('shows CI Icon if there is pipeline data', async () => { + it('shows CI Icon if there is pipeline data', () => { expect(wrapper.findComponent(CiIcon).exists()).toBe(true); }); }); @@ -108,7 +108,7 @@ describe('MR Popover', () => { return waitForPromises(); }); - it('does not show CI icon if there is no pipeline data', async () => { + it('does not show CI icon if there is no pipeline data', () => { expect(wrapper.findComponent(CiIcon).exists()).toBe(false); }); }); diff --git a/spec/frontend/issuable/related_issues/components/add_issuable_form_spec.js b/spec/frontend/issuable/related_issues/components/add_issuable_form_spec.js index f8e47bc0a4b..f90b9117688 100644 --- a/spec/frontend/issuable/related_issues/components/add_issuable_form_spec.js +++ b/spec/frontend/issuable/related_issues/components/add_issuable_form_spec.js @@ -230,7 +230,7 @@ describe('AddIssuableForm', () => { ]); }); - it('emits an event with a "is_blocked_by" link type when the "is blocked by" radio input selected', async () => { + it('emits an event with a "is_blocked_by" link type when the "is blocked by" radio input selected', () => { findRadioGroup().vm.$emit('input', linkedIssueTypesMap.IS_BLOCKED_BY); findAddIssuableForm().trigger('submit'); diff --git a/spec/frontend/issues/list/components/issues_list_app_spec.js b/spec/frontend/issues/list/components/issues_list_app_spec.js index b28a08e2fce..15dde76f49b 100644 --- a/spec/frontend/issues/list/components/issues_list_app_spec.js +++ b/spec/frontend/issues/list/components/issues_list_app_spec.js @@ -201,7 +201,7 @@ describe('CE IssuesListApp component', () => { return waitForPromises(); }); - it('renders', async () => { + it('renders', () => { expect(findIssuableList().props()).toMatchObject({ namespace: defaultProvide.fullPath, recentSearchesStorageKey: 'issues', @@ -803,7 +803,7 @@ describe('CE IssuesListApp component', () => { describe('when "sort" event is emitted by IssuableList', () => { it.each(Object.keys(urlSortParams))( 'updates to the new sort when payload is `%s`', - async (sortKey) => { + (sortKey) => { // Ensure initial sort key is different so we can trigger an update when emitting a sort key wrapper = sortKey === CREATED_DESC diff --git a/spec/frontend/issues/show/components/app_spec.js b/spec/frontend/issues/show/components/app_spec.js index 554662c611d..a4ee9a62926 100644 --- a/spec/frontend/issues/show/components/app_spec.js +++ b/spec/frontend/issues/show/components/app_spec.js @@ -331,7 +331,7 @@ describe('Issuable output', () => { }); describe('when title is not in view', () => { - beforeEach(async () => { + beforeEach(() => { wrapper.findComponent(GlIntersectionObserver).vm.$emit('disappear'); }); diff --git a/spec/frontend/issues/show/components/description_spec.js b/spec/frontend/issues/show/components/description_spec.js index 56057e9819f..c6869573b2e 100644 --- a/spec/frontend/issues/show/components/description_spec.js +++ b/spec/frontend/issues/show/components/description_spec.js @@ -162,7 +162,7 @@ describe('Description component', () => { expect(TaskList).toHaveBeenCalled(); }); - it('does not re-init the TaskList when canUpdate is false', async () => { + it('does not re-init the TaskList when canUpdate is false', () => { createComponent({ props: { issuableType: 'issuableType', diff --git a/spec/frontend/issues/show/components/header_actions_spec.js b/spec/frontend/issues/show/components/header_actions_spec.js index 58ec7387851..db3435855f6 100644 --- a/spec/frontend/issues/show/components/header_actions_spec.js +++ b/spec/frontend/issues/show/components/header_actions_spec.js @@ -440,7 +440,7 @@ describe('HeaderActions component', () => { wrapper = mountComponent({ props: { isIssueAuthor: false } }); }); - it("doesn't render", async () => { + it("doesn't render", () => { expect(findAbuseCategorySelector().exists()).toEqual(false); }); diff --git a/spec/frontend/issues/show/components/incidents/incident_tabs_spec.js b/spec/frontend/issues/show/components/incidents/incident_tabs_spec.js index 0f4fb02a40b..5a49b29c458 100644 --- a/spec/frontend/issues/show/components/incidents/incident_tabs_spec.js +++ b/spec/frontend/issues/show/components/incidents/incident_tabs_spec.js @@ -163,7 +163,7 @@ describe('Incident Tabs component', () => { mountComponent({ mount: mountExtended }); }); - it('shows only the summary tab by default', async () => { + it('shows only the summary tab by default', () => { expect(findActiveTabs()).toHaveLength(1); expect(findActiveTabs().at(0).text()).toBe(incidentTabsI18n.summaryTitle); }); diff --git a/spec/frontend/issues/show/components/incidents/timeline_events_form_spec.js b/spec/frontend/issues/show/components/incidents/timeline_events_form_spec.js index 500d0b0909e..9c4662ce38f 100644 --- a/spec/frontend/issues/show/components/incidents/timeline_events_form_spec.js +++ b/spec/frontend/issues/show/components/incidents/timeline_events_form_spec.js @@ -245,7 +245,7 @@ describe('Timeline events form', () => { expect(findMinuteInput().element.value).toBe('0'); }); - it('should disable the save buttons when event content does not exist', async () => { + it('should disable the save buttons when event content does not exist', () => { expect(findSubmitButton().props('disabled')).toBe(true); expect(findSubmitAndAddButton().props('disabled')).toBe(true); }); diff --git a/spec/frontend/issues/show/components/locked_warning_spec.js b/spec/frontend/issues/show/components/locked_warning_spec.js index f8a8c999632..2e786b665d0 100644 --- a/spec/frontend/issues/show/components/locked_warning_spec.js +++ b/spec/frontend/issues/show/components/locked_warning_spec.js @@ -35,11 +35,11 @@ describe('LockedWarning component', () => { expect(alert.props('dismissible')).toBe(false); }); - it(`displays correct message`, async () => { + it(`displays correct message`, () => { expect(alert.text()).toMatchInterpolatedText(sprintf(i18n.alertMessage, { issuableType })); }); - it(`displays a link with correct text`, async () => { + it(`displays a link with correct text`, () => { expect(link.exists()).toBe(true); expect(link.text()).toBe(`the ${issuableType}`); }); diff --git a/spec/frontend/read_more_spec.js b/spec/frontend/read_more_spec.js index 9eddc50d50a..e45405088b1 100644 --- a/spec/frontend/read_more_spec.js +++ b/spec/frontend/read_more_spec.js @@ -42,7 +42,7 @@ describe('Read more click-to-expand functionality', () => { nestedElement.click(); }); - it('removes the trigger element', async () => { + it('removes the trigger element', () => { expect(findTrigger()).toBe(null); }); }); diff --git a/spec/frontend/releases/components/app_index_spec.js b/spec/frontend/releases/components/app_index_spec.js index 7a0e9fb7326..2aa36056735 100644 --- a/spec/frontend/releases/components/app_index_spec.js +++ b/spec/frontend/releases/components/app_index_spec.js @@ -412,7 +412,7 @@ describe('app_index.vue', () => { await createComponent(); }); - it('shows a toast', async () => { + it('shows a toast', () => { expect(toast).toHaveBeenCalledWith( sprintf(__('Release %{release} has been successfully deleted.'), { release, @@ -420,7 +420,7 @@ describe('app_index.vue', () => { ); }); - it('clears session storage', async () => { + it('clears session storage', () => { expect(window.sessionStorage.getItem(key)).toBe(null); }); }); diff --git a/spec/frontend/releases/components/tag_field_new_spec.js b/spec/frontend/releases/components/tag_field_new_spec.js index 2508495429c..56e3af753f4 100644 --- a/spec/frontend/releases/components/tag_field_new_spec.js +++ b/spec/frontend/releases/components/tag_field_new_spec.js @@ -106,7 +106,7 @@ describe('releases/components/tag_field_new', () => { }); describe('when the user selects a new tag name', () => { - beforeEach(async () => { + beforeEach(() => { findCreateNewTagOption().vm.$emit('click'); }); @@ -122,7 +122,7 @@ describe('releases/components/tag_field_new', () => { describe('when the user selects an existing tag name', () => { const updatedTagName = 'updated-tag-name'; - beforeEach(async () => { + beforeEach(() => { findTagNameDropdown().vm.$emit('input', updatedTagName); }); @@ -147,7 +147,7 @@ describe('releases/components/tag_field_new', () => { describe('"Create tag" option', () => { describe('when the search query exactly matches one of the search results', () => { - beforeEach(async () => { + beforeEach(() => { createComponent(mount, { searchQuery: TEST_TAG_NAME }); }); @@ -157,7 +157,7 @@ describe('releases/components/tag_field_new', () => { }); describe('when the search query does not exactly match one of the search results', () => { - beforeEach(async () => { + beforeEach(() => { createComponent(mount, { searchQuery: NONEXISTENT_TAG_NAME }); }); @@ -234,7 +234,7 @@ describe('releases/components/tag_field_new', () => { }); describe('when the user selects a git ref', () => { - it("updates the store's createFrom property", async () => { + it("updates the store's createFrom property", () => { const updatedCreateFrom = 'update-create-from'; findCreateFromDropdown().vm.$emit('input', updatedCreateFrom); diff --git a/spec/frontend/repository/components/delete_blob_modal_spec.js b/spec/frontend/repository/components/delete_blob_modal_spec.js index 9ca45bfb655..90f2150222c 100644 --- a/spec/frontend/repository/components/delete_blob_modal_spec.js +++ b/spec/frontend/repository/components/delete_blob_modal_spec.js @@ -182,13 +182,13 @@ describe('DeleteBlobModal', () => { await fillForm({ targetText: '', commitText: '' }); }); - it('disables submit button', async () => { + it('disables submit button', () => { expect(findModal().props('actionPrimary').attributes).toEqual( expect.objectContaining({ disabled: true }), ); }); - it('does not submit form', async () => { + it('does not submit form', () => { findModal().vm.$emit('primary', { preventDefault: () => {} }); expect(submitSpy).not.toHaveBeenCalled(); }); @@ -202,13 +202,13 @@ describe('DeleteBlobModal', () => { }); }); - it('enables submit button', async () => { + it('enables submit button', () => { expect(findModal().props('actionPrimary').attributes).toEqual( expect.objectContaining({ disabled: false }), ); }); - it('submits form', async () => { + it('submits form', () => { findModal().vm.$emit('primary', { preventDefault: () => {} }); expect(submitSpy).toHaveBeenCalled(); }); diff --git a/spec/frontend/repository/components/fork_info_spec.js b/spec/frontend/repository/components/fork_info_spec.js index 75310ba8ca4..cbde60152e3 100644 --- a/spec/frontend/repository/components/fork_info_spec.js +++ b/spec/frontend/repository/components/fork_info_spec.js @@ -101,7 +101,7 @@ describe('ForkInfo component', () => { mockResolvedForkDetailsQuery(); }); - it('displays a skeleton while loading data', async () => { + it('displays a skeleton while loading data', () => { createComponent(); expect(findSkeleton().exists()).toBe(true); }); @@ -191,11 +191,11 @@ describe('ForkInfo component', () => { await createComponent({}, { ahead: 0, behind: 0, isSyncing: false, hasConflicts: false }); }); - it('renders up to date message when fork is up to date', async () => { + it('renders up to date message when fork is up to date', () => { expect(findDivergenceMessage().text()).toBe(i18n.upToDate); }); - it('does not render Update Fork button', async () => { + it('does not render Update Fork button', () => { expect(findUpdateForkButton().exists()).toBe(false); }); }); @@ -206,10 +206,24 @@ describe('ForkInfo component', () => { await createComponent({}, null); }); - it('renders limited visibility messsage when forkDetails are empty', async () => { + it('renders limited visibility messsage when forkDetails are empty', () => { expect(findDivergenceMessage().text()).toBe(i18n.limitedVisibility); }); + it('does not render Update Fork button', () => { + expect(findUpdateForkButton().exists()).toBe(false); + }); + }); + + describe('User cannot sync the branch', () => { + beforeEach(async () => { + mockResolvedForkDetailsQuery({ ahead: 0, behind: 7, isSyncing: false, hasConflicts: false }); + await createComponent( + { canSyncBranch: false }, + { ahead: 0, behind: 7, isSyncing: false, hasConflicts: false }, + ); + }); + it('does not render Update Fork button', async () => { expect(findUpdateForkButton().exists()).toBe(false); }); diff --git a/spec/frontend/repository/components/last_commit_spec.js b/spec/frontend/repository/components/last_commit_spec.js index 5e43462d241..c207d32d61d 100644 --- a/spec/frontend/repository/components/last_commit_spec.js +++ b/spec/frontend/repository/components/last_commit_spec.js @@ -101,7 +101,7 @@ const createCommitData = ({ }; }; -const createComponent = async (data = {}) => { +const createComponent = (data = {}) => { Vue.use(VueApollo); const currentPath = 'path'; diff --git a/spec/frontend/repository/components/new_directory_modal_spec.js b/spec/frontend/repository/components/new_directory_modal_spec.js index c920159375f..55a24089d48 100644 --- a/spec/frontend/repository/components/new_directory_modal_spec.js +++ b/spec/frontend/repository/components/new_directory_modal_spec.js @@ -124,7 +124,7 @@ describe('NewDirectoryModal', () => { }); describe('form submission', () => { - beforeEach(async () => { + beforeEach(() => { mock = new MockAdapter(axios); }); diff --git a/spec/frontend/repository/components/preview/index_spec.js b/spec/frontend/repository/components/preview/index_spec.js index 8a88c5b9c61..316ddfb5731 100644 --- a/spec/frontend/repository/components/preview/index_spec.js +++ b/spec/frontend/repository/components/preview/index_spec.js @@ -54,7 +54,7 @@ describe('Repository file preview component', () => { expect(handleLocationHash).toHaveBeenCalled(); }); - it('renders loading icon', async () => { + it('renders loading icon', () => { expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(true); }); }); diff --git a/spec/frontend/repository/components/table/row_spec.js b/spec/frontend/repository/components/table/row_spec.js index 055616d6e8e..949c06affcf 100644 --- a/spec/frontend/repository/components/table/row_spec.js +++ b/spec/frontend/repository/components/table/row_spec.js @@ -250,7 +250,7 @@ describe('Repository table row component', () => { afterAll(() => jest.useRealTimers()); - it('emits a `row-appear` event', async () => { + it('emits a `row-appear` event', () => { const setTimeoutSpy = jest.spyOn(global, 'setTimeout'); findIntersectionObserver().vm.$emit('appear'); diff --git a/spec/frontend/repository/components/tree_content_spec.js b/spec/frontend/repository/components/tree_content_spec.js index 9597d8a7b77..5b874656d39 100644 --- a/spec/frontend/repository/components/tree_content_spec.js +++ b/spec/frontend/repository/components/tree_content_spec.js @@ -99,7 +99,7 @@ describe('Repository table component', () => { describe('FileTable showMore', () => { describe('when is present', () => { - beforeEach(async () => { + beforeEach(() => { factory('/'); }); diff --git a/spec/frontend/repository/mock_data.js b/spec/frontend/repository/mock_data.js index c7cc2820588..a6480b79d0f 100644 --- a/spec/frontend/repository/mock_data.js +++ b/spec/frontend/repository/mock_data.js @@ -123,6 +123,7 @@ export const propsForkInfo = { selectedBranch: 'main', sourceName: 'gitLab', sourcePath: 'gitlab-org/gitlab', + canSyncBranch: true, aheadComparePath: '/nataliia/myGitLab/-/compare/main...ref?from_project_id=1', behindComparePath: 'gitlab-org/gitlab/-/compare/ref...main?from_project_id=2', createMrPath: 'path/to/new/mr', diff --git a/spec/frontend/scripts/frontend/po_to_json_spec.js b/spec/frontend/scripts/frontend/po_to_json_spec.js index fbaad328e61..858e3c9d3c7 100644 --- a/spec/frontend/scripts/frontend/po_to_json_spec.js +++ b/spec/frontend/scripts/frontend/po_to_json_spec.js @@ -32,11 +32,11 @@ describe('PoToJson', () => { }); describe('#main', () => { - it('throws without arguments', async () => { + it('throws without arguments', () => { return expect(main()).rejects.toThrow(/doesn't seem to be a folder/); }); - it('throws if outputDir does not exist', async () => { + it('throws if outputDir does not exist', () => { return expect( main({ localeRoot: LOCALE_DIR, @@ -45,7 +45,7 @@ describe('PoToJson', () => { ).rejects.toThrow(/doesn't seem to be a folder/); }); - it('throws if localeRoot does not exist', async () => { + it('throws if localeRoot does not exist', () => { return expect( main({ localeRoot: 'i-do-not-exist', diff --git a/spec/frontend/search/sidebar/components/checkbox_filter_spec.js b/spec/frontend/search/sidebar/components/checkbox_filter_spec.js index 7af588f059f..3907e199cae 100644 --- a/spec/frontend/search/sidebar/components/checkbox_filter_spec.js +++ b/spec/frontend/search/sidebar/components/checkbox_filter_spec.js @@ -89,7 +89,7 @@ describe('CheckboxFilter', () => { describe('actions', () => { const checkedLanguageName = MOCK_LANGUAGE_AGGREGATIONS_BUCKETS[0].key; - beforeEach(async () => { + beforeEach(() => { defaultProps.filtersData = convertFiltersData(MOCK_LANGUAGE_AGGREGATIONS_BUCKETS.slice(0, 3)); CheckboxFilter.computed.selectedFilter.get = jest.fn(() => checkedLanguageName); diff --git a/spec/frontend/search/topbar/components/searchable_dropdown_spec.js b/spec/frontend/search/topbar/components/searchable_dropdown_spec.js index 5e5f46ff34e..f7d847674eb 100644 --- a/spec/frontend/search/topbar/components/searchable_dropdown_spec.js +++ b/spec/frontend/search/topbar/components/searchable_dropdown_spec.js @@ -189,7 +189,7 @@ describe('Global Search Searchable Dropdown', () => { findGlDropdown().vm.$emit('show'); }); - it('$emits @search and @first-open on the first open', async () => { + it('$emits @search and @first-open on the first open', () => { expect(wrapper.emitted('search')[0]).toStrictEqual(['']); expect(wrapper.emitted('first-open')[0]).toStrictEqual([]); }); diff --git a/spec/frontend/security_configuration/components/app_spec.js b/spec/frontend/security_configuration/components/app_spec.js index ae5316eb12f..ec47cda1cb2 100644 --- a/spec/frontend/security_configuration/components/app_spec.js +++ b/spec/frontend/security_configuration/components/app_spec.js @@ -422,7 +422,7 @@ describe('App component', () => { describe('Vulnerability management', () => { const props = { securityTrainingEnabled: true }; - beforeEach(async () => { + beforeEach(() => { createComponent({ ...props, }); diff --git a/spec/frontend/security_configuration/components/training_provider_list_spec.js b/spec/frontend/security_configuration/components/training_provider_list_spec.js index 1f8f306c931..d35fc00057a 100644 --- a/spec/frontend/security_configuration/components/training_provider_list_spec.js +++ b/spec/frontend/security_configuration/components/training_provider_list_spec.js @@ -253,7 +253,7 @@ describe('TrainingProviderList component', () => { expect(findLogos().at(provider).attributes('role')).toBe('presentation'); }); - it.each(providerIndexArray)('renders the svg content for provider %s', async (provider) => { + it.each(providerIndexArray)('renders the svg content for provider %s', (provider) => { expect(findLogos().at(provider).html()).toContain( TEMP_PROVIDER_LOGOS[testProviderName[provider]].svg, ); diff --git a/spec/frontend/sentry/sentry_browser_wrapper_spec.js b/spec/frontend/sentry/sentry_browser_wrapper_spec.js index f4d646bab78..55354eceb8d 100644 --- a/spec/frontend/sentry/sentry_browser_wrapper_spec.js +++ b/spec/frontend/sentry/sentry_browser_wrapper_spec.js @@ -25,7 +25,7 @@ describe('SentryBrowserWrapper', () => { let mockCaptureMessage; let mockWithScope; - beforeEach(async () => { + beforeEach(() => { mockCaptureException = jest.fn(); mockCaptureMessage = jest.fn(); mockWithScope = jest.fn(); diff --git a/spec/frontend/sidebar/components/date/sidebar_date_widget_spec.js b/spec/frontend/sidebar/components/date/sidebar_date_widget_spec.js index 7ef26256894..8f82a2d1258 100644 --- a/spec/frontend/sidebar/components/date/sidebar_date_widget_spec.js +++ b/spec/frontend/sidebar/components/date/sidebar_date_widget_spec.js @@ -138,7 +138,7 @@ describe('Sidebar date Widget', () => { }); }); - it('renders GlDatePicker', async () => { + it('renders GlDatePicker', () => { expect(findDatePicker().exists()).toBe(true); }); }); @@ -171,7 +171,7 @@ describe('Sidebar date Widget', () => { }, ); - it('does not render SidebarInheritDate when canInherit is true and date is loading', async () => { + it('does not render SidebarInheritDate when canInherit is true and date is loading', () => { createComponent({ canInherit: true }); expect(wrapper.findComponent(SidebarInheritDate).exists()).toBe(false); diff --git a/spec/frontend/sidebar/components/labels/labels_select_widget/dropdown_contents_labels_view_spec.js b/spec/frontend/sidebar/components/labels/labels_select_widget/dropdown_contents_labels_view_spec.js index c351a60735b..1abc708b72f 100644 --- a/spec/frontend/sidebar/components/labels/labels_select_widget/dropdown_contents_labels_view_spec.js +++ b/spec/frontend/sidebar/components/labels/labels_select_widget/dropdown_contents_labels_view_spec.js @@ -96,11 +96,11 @@ describe('DropdownContentsLabelsView', () => { await waitForPromises(); }); - it('does not render loading icon', async () => { + it('does not render loading icon', () => { expect(findLoadingIcon().exists()).toBe(false); }); - it('renders labels list', async () => { + it('renders labels list', () => { expect(findLabelsList().exists()).toBe(true); expect(findLabels()).toHaveLength(2); }); diff --git a/spec/frontend/sidebar/components/labels/labels_select_widget/dropdown_header_spec.js b/spec/frontend/sidebar/components/labels/labels_select_widget/dropdown_header_spec.js index 824f91812fb..4861d2ca55e 100644 --- a/spec/frontend/sidebar/components/labels/labels_select_widget/dropdown_header_spec.js +++ b/spec/frontend/sidebar/components/labels/labels_select_widget/dropdown_header_spec.js @@ -45,7 +45,7 @@ describe('DropdownHeader', () => { expect(findGoBackButton().exists()).toBe(true); }); - it('does not render search input field', async () => { + it('does not render search input field', () => { expect(findSearchInput().exists()).toBe(false); }); }); @@ -81,7 +81,7 @@ describe('DropdownHeader', () => { expect(findSearchInput().exists()).toBe(true); }); - it('does not render title', async () => { + it('does not render title', () => { expect(findDropdownTitle().exists()).toBe(false); }); }); diff --git a/spec/frontend/sidebar/components/labels/labels_select_widget/labels_select_root_spec.js b/spec/frontend/sidebar/components/labels/labels_select_widget/labels_select_root_spec.js index 3101fd90f2e..b0a080ba1ef 100644 --- a/spec/frontend/sidebar/components/labels/labels_select_widget/labels_select_root_spec.js +++ b/spec/frontend/sidebar/components/labels/labels_select_widget/labels_select_root_spec.js @@ -199,7 +199,7 @@ describe('LabelsSelectRoot', () => { }); }); - it('emits `updateSelectedLabels` event on dropdown contents `setLabels` event if iid is not set', async () => { + it('emits `updateSelectedLabels` event on dropdown contents `setLabels` event if iid is not set', () => { const label = { id: 'gid://gitlab/ProjectLabel/1' }; createComponent({ config: { ...mockConfig, iid: undefined } }); diff --git a/spec/frontend/sidebar/components/move/issuable_move_dropdown_spec.js b/spec/frontend/sidebar/components/move/issuable_move_dropdown_spec.js index e247f5d27fa..7c168a0ac41 100644 --- a/spec/frontend/sidebar/components/move/issuable_move_dropdown_spec.js +++ b/spec/frontend/sidebar/components/move/issuable_move_dropdown_spec.js @@ -328,7 +328,7 @@ describe('IssuableMoveDropdown', () => { expect(axios.get).toHaveBeenCalled(); }); - it('gl-dropdown component prevents dropdown body from closing on `hide` event when `projectItemClick` prop is true', async () => { + it('gl-dropdown component prevents dropdown body from closing on `hide` event when `projectItemClick` prop is true', () => { // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details // eslint-disable-next-line no-restricted-syntax wrapper.setData({ @@ -341,7 +341,7 @@ describe('IssuableMoveDropdown', () => { expect(wrapper.vm.projectItemClick).toBe(false); }); - it('gl-dropdown component emits `dropdown-close` event on component from `hide` event', async () => { + it('gl-dropdown component emits `dropdown-close` event on component from `hide` event', () => { findDropdownEl().vm.$emit('hide'); expect(wrapper.emitted('dropdown-close')).toHaveLength(1); diff --git a/spec/frontend/sidebar/components/move/move_issues_button_spec.js b/spec/frontend/sidebar/components/move/move_issues_button_spec.js index 662a39c829d..2c7982a4b7f 100644 --- a/spec/frontend/sidebar/components/move/move_issues_button_spec.js +++ b/spec/frontend/sidebar/components/move/move_issues_button_spec.js @@ -346,7 +346,7 @@ describe('MoveIssuesButton', () => { expect(issuableEventHub.$emit).not.toHaveBeenCalled(); }); - it('emits `issuables:bulkMoveStarted` when issues are moving', async () => { + it('emits `issuables:bulkMoveStarted` when issues are moving', () => { createComponent({ selectedIssuables: selectedIssuesMocks.issuesTasksAndTestCases }); emitMoveIssuablesEvent(); diff --git a/spec/frontend/sidebar/components/severity/sidebar_severity_widget_spec.js b/spec/frontend/sidebar/components/severity/sidebar_severity_widget_spec.js index 13b3c5eef05..bee90d2b2b6 100644 --- a/spec/frontend/sidebar/components/severity/sidebar_severity_widget_spec.js +++ b/spec/frontend/sidebar/components/severity/sidebar_severity_widget_spec.js @@ -81,7 +81,7 @@ describe('SidebarSeverityWidget', () => { }); describe('Update severity', () => { - it('calls mutate with `updateIssuableSeverity`', async () => { + it('calls mutate with `updateIssuableSeverity`', () => { const mutationMock = jest.fn().mockResolvedValue({ data: { issueSetSeverity: { issue: { severity } } }, }); diff --git a/spec/frontend/sidebar/components/time_tracking/time_tracker_spec.js b/spec/frontend/sidebar/components/time_tracking/time_tracker_spec.js index 91c013596d7..e23d24f9629 100644 --- a/spec/frontend/sidebar/components/time_tracking/time_tracker_spec.js +++ b/spec/frontend/sidebar/components/time_tracking/time_tracker_spec.js @@ -144,7 +144,7 @@ describe('Issuable Time Tracker', () => { }); describe('Comparison pane when limitToHours is true', () => { - beforeEach(async () => { + beforeEach(() => { wrapper = mountComponent({ props: { limitToHours: true, diff --git a/spec/frontend/sidebar/components/toggle/toggle_sidebar_spec.js b/spec/frontend/sidebar/components/toggle/toggle_sidebar_spec.js index 0370d5e337d..8e34a612705 100644 --- a/spec/frontend/sidebar/components/toggle/toggle_sidebar_spec.js +++ b/spec/frontend/sidebar/components/toggle/toggle_sidebar_spec.js @@ -25,7 +25,7 @@ describe('ToggleSidebar', () => { expect(findGlButton().props('icon')).toBe('chevron-double-lg-left'); }); - it('should render the "chevron-double-lg-right" icon when expanded', async () => { + it('should render the "chevron-double-lg-right" icon when expanded', () => { createComponent({ props: { collapsed: false } }); expect(findGlButton().props('icon')).toBe('chevron-double-lg-right'); diff --git a/spec/frontend/snippets/components/edit_spec.js b/spec/frontend/snippets/components/edit_spec.js index 0d0e78e9179..957cfc0bc22 100644 --- a/spec/frontend/snippets/components/edit_spec.js +++ b/spec/frontend/snippets/components/edit_spec.js @@ -256,7 +256,7 @@ describe('Snippet Edit app', () => { VISIBILITY_LEVEL_PRIVATE_STRING, VISIBILITY_LEVEL_INTERNAL_STRING, VISIBILITY_LEVEL_PUBLIC_STRING, - ])('marks %s visibility by default', async (visibility) => { + ])('marks %s visibility by default', (visibility) => { createComponent({ props: { snippetGid: '' }, selectedLevel: visibility, diff --git a/spec/frontend/snippets/components/snippet_header_spec.js b/spec/frontend/snippets/components/snippet_header_spec.js index 994cf65c1f5..4bf64bfd3cd 100644 --- a/spec/frontend/snippets/components/snippet_header_spec.js +++ b/spec/frontend/snippets/components/snippet_header_spec.js @@ -256,7 +256,7 @@ describe('Snippet header component', () => { }); describe('submit snippet as spam', () => { - beforeEach(async () => { + beforeEach(() => { createComponent(); }); diff --git a/spec/frontend/super_sidebar/components/user_bar_spec.js b/spec/frontend/super_sidebar/components/user_bar_spec.js index f62104f4622..6da49b45829 100644 --- a/spec/frontend/super_sidebar/components/user_bar_spec.js +++ b/spec/frontend/super_sidebar/components/user_bar_spec.js @@ -138,7 +138,7 @@ describe('UserBar component', () => { expect(tooltip.value).toBe(`Search GitLab <kbd>/</kbd>`); }); - it('should render search modal', async () => { + it('should render search modal', () => { expect(findSearchModal().exists()).toBe(true); }); }); diff --git a/spec/frontend/surveys/merge_request_performance/app_spec.js b/spec/frontend/surveys/merge_request_performance/app_spec.js index af91d8aeb6b..d03451c71a8 100644 --- a/spec/frontend/surveys/merge_request_performance/app_spec.js +++ b/spec/frontend/surveys/merge_request_performance/app_spec.js @@ -56,17 +56,17 @@ describe('MergeRequestExperienceSurveyApp', () => { createWrapper(); }); - it('shows survey', async () => { + it('shows survey', () => { expect(wrapper.html()).toContain('Overall, how satisfied are you with merge requests?'); expect(wrapper.findComponent(SatisfactionRate).exists()).toBe(true); expect(wrapper.emitted().close).toBe(undefined); }); - it('tracks render once', async () => { + it('tracks render once', () => { expect(trackingSpy).toHaveBeenCalledWith(...createRenderTrackedArguments()); }); - it("doesn't track subsequent renders", async () => { + it("doesn't track subsequent renders", () => { createWrapper(); expect(trackingSpy).toHaveBeenCalledWith(...createRenderTrackedArguments()); expect(trackingSpy).toHaveBeenCalledTimes(1); @@ -77,15 +77,15 @@ describe('MergeRequestExperienceSurveyApp', () => { findCloseButton().vm.$emit('click'); }); - it('triggers user callout on close', async () => { + it('triggers user callout on close', () => { expect(dismiss).toHaveBeenCalledTimes(1); }); - it('emits close event on close button click', async () => { + it('emits close event on close button click', () => { expect(wrapper.emitted()).toMatchObject({ close: [[]] }); }); - it('tracks dismissal', async () => { + it('tracks dismissal', () => { expect(trackingSpy).toHaveBeenCalledWith(undefined, 'survey:mr_experience', { label: 'dismiss', extra: { @@ -94,7 +94,7 @@ describe('MergeRequestExperienceSurveyApp', () => { }); }); - it('tracks subsequent renders', async () => { + it('tracks subsequent renders', () => { createWrapper(); expect(trackingSpy.mock.calls).toEqual([ createRenderTrackedArguments(), @@ -110,7 +110,7 @@ describe('MergeRequestExperienceSurveyApp', () => { ); }); - it('dismisses user callout on survey rate', async () => { + it('dismisses user callout on survey rate', () => { const rate = wrapper.findComponent(SatisfactionRate); expect(dismiss).not.toHaveBeenCalled(); rate.vm.$emit('rate', 5); @@ -126,7 +126,7 @@ describe('MergeRequestExperienceSurveyApp', () => { ); }); - it('tracks survey rates', async () => { + it('tracks survey rates', () => { const rate = wrapper.findComponent(SatisfactionRate); rate.vm.$emit('rate', 5); expect(trackingSpy).toHaveBeenCalledWith(undefined, 'survey:mr_experience', { @@ -146,7 +146,7 @@ describe('MergeRequestExperienceSurveyApp', () => { }); }); - it('shows legal note', async () => { + it('shows legal note', () => { expect(wrapper.text()).toContain( 'By continuing, you acknowledge that responses will be used to improve GitLab and in accordance with the GitLab Privacy Policy.', ); @@ -179,11 +179,11 @@ describe('MergeRequestExperienceSurveyApp', () => { createWrapper({ shouldShowCallout: false }); }); - it('emits close event', async () => { + it('emits close event', () => { expect(wrapper.emitted()).toMatchObject({ close: [[]] }); }); - it("doesn't track anything", async () => { + it("doesn't track anything", () => { expect(trackingSpy).toHaveBeenCalledTimes(0); }); }); @@ -195,12 +195,12 @@ describe('MergeRequestExperienceSurveyApp', () => { document.dispatchEvent(event); }); - it('emits close event', async () => { + it('emits close event', () => { expect(wrapper.emitted()).toMatchObject({ close: [[]] }); expect(dismiss).toHaveBeenCalledTimes(1); }); - it('tracks dismissal', async () => { + it('tracks dismissal', () => { expect(trackingSpy).toHaveBeenCalledWith(undefined, 'survey:mr_experience', { label: 'dismiss', extra: { diff --git a/spec/frontend/terraform/components/states_table_actions_spec.js b/spec/frontend/terraform/components/states_table_actions_spec.js index 31a644b39b4..ed85825c13a 100644 --- a/spec/frontend/terraform/components/states_table_actions_spec.js +++ b/spec/frontend/terraform/components/states_table_actions_spec.js @@ -143,7 +143,7 @@ describe('StatesTableActions', () => { return waitForPromises(); }); - it('opens the modal', async () => { + it('opens the modal', () => { expect(findCopyModal().exists()).toBe(true); expect(findCopyModal().isVisible()).toBe(true); }); diff --git a/spec/frontend/test_setup.js b/spec/frontend/test_setup.js index 03ce96bce5f..d3d3e5c8c72 100644 --- a/spec/frontend/test_setup.js +++ b/spec/frontend/test_setup.js @@ -22,5 +22,5 @@ afterEach(() => afterEach(async () => { const dbs = await indexedDB.databases(); - await Promise.all(dbs.map(async (db) => indexedDB.deleteDatabase(db.name))); + await Promise.all(dbs.map((db) => indexedDB.deleteDatabase(db.name))); }); diff --git a/spec/frontend/toggles/index_spec.js b/spec/frontend/toggles/index_spec.js index 89e35991914..cccdf17a787 100644 --- a/spec/frontend/toggles/index_spec.js +++ b/spec/frontend/toggles/index_spec.js @@ -52,7 +52,7 @@ describe('toggles/index.js', () => { initToggleWithOptions(); }); - it('attaches a GlToggle to the element', async () => { + it('attaches a GlToggle to the element', () => { expect(toggleWrapper).not.toBe(null); expect(toggleWrapper.querySelector(TOGGLE_LABEL_CLASS).textContent).toBe(toggleLabel); }); diff --git a/spec/frontend/user_lists/components/edit_user_list_spec.js b/spec/frontend/user_lists/components/edit_user_list_spec.js index 5f067d9de3c..b5eb6313bed 100644 --- a/spec/frontend/user_lists/components/edit_user_list_spec.js +++ b/spec/frontend/user_lists/components/edit_user_list_spec.js @@ -67,7 +67,7 @@ describe('user_lists/components/edit_user_list', () => { expect(alert.text()).toContain(message); }); - it('should not be dismissible', async () => { + it('should not be dismissible', () => { expect(alert.props('dismissible')).toBe(false); }); diff --git a/spec/frontend/user_lists/components/user_lists_spec.js b/spec/frontend/user_lists/components/user_lists_spec.js index 603289ac11e..2da2eb0dd5f 100644 --- a/spec/frontend/user_lists/components/user_lists_spec.js +++ b/spec/frontend/user_lists/components/user_lists_spec.js @@ -82,7 +82,7 @@ describe('~/user_lists/components/user_lists.vue', () => { emptyState = wrapper.findComponent(GlEmptyState); }); - it('should render the empty state', async () => { + it('should render the empty state', () => { expect(emptyState.exists()).toBe(true); }); diff --git a/spec/frontend/user_popovers_spec.js b/spec/frontend/user_popovers_spec.js index 3808cc8b0fc..7fc1bcbc936 100644 --- a/spec/frontend/user_popovers_spec.js +++ b/spec/frontend/user_popovers_spec.js @@ -97,7 +97,7 @@ describe('User Popovers', () => { expect(findPopovers().length).toBe(linksWithUsers.length); }); - it('for elements added after initial load', async () => { + it('for elements added after initial load', () => { const addedLinks = [createUserLink(), createUserLink()]; addedLinks.forEach((link) => { document.body.appendChild(link); @@ -113,7 +113,7 @@ describe('User Popovers', () => { }); }); - it('does not initialize the popovers for group references', async () => { + it('does not initialize the popovers for group references', () => { const [groupLink] = Array.from(document.querySelectorAll('.js-user-link[data-group]')); triggerEvent('mouseover', groupLink); @@ -122,7 +122,7 @@ describe('User Popovers', () => { expect(findPopovers().length).toBe(0); }); - it('does not initialize the popovers for @all references', async () => { + it('does not initialize the popovers for @all references', () => { const [projectLink] = Array.from(document.querySelectorAll('.js-user-link[data-project]')); triggerEvent('mouseover', projectLink); @@ -131,7 +131,7 @@ describe('User Popovers', () => { expect(findPopovers().length).toBe(0); }); - it('does not initialize the user popovers twice for the same element', async () => { + it('does not initialize the user popovers twice for the same element', () => { const [firstUserLink] = findFixtureLinks(); triggerEvent('mouseover', firstUserLink); jest.runOnlyPendingTimers(); diff --git a/spec/frontend/vue_shared/components/dropdown_keyboard_navigation_spec.js b/spec/frontend/vue_shared/components/dropdown_keyboard_navigation_spec.js index ef42c17984a..b33a07b6af4 100644 --- a/spec/frontend/vue_shared/components/dropdown_keyboard_navigation_spec.js +++ b/spec/frontend/vue_shared/components/dropdown_keyboard_navigation_spec.js @@ -100,6 +100,25 @@ describe('DropdownKeyboardNavigation', () => { describe.each` keyboardAction | direction | index | max | min + ${helpers.arrowDown} | ${1} | ${10} | ${10} | ${0} + ${helpers.arrowUp} | ${-1} | ${0} | ${10} | ${0} + `( + 'moving out of bounds with cycle enabled', + ({ keyboardAction, direction, index, max, min }) => { + beforeEach(() => { + createComponent({ index, max, min, enableCycle: true }); + keyboardAction(); + }); + + it(`in ${direction} direction does $emit correct @change event`, () => { + // The first @change`call happens on created() so we test that we only have 1 call + expect(wrapper.emitted('change')[1]).toStrictEqual([direction === 1 ? min : max]); + }); + }, + ); + + describe.each` + keyboardAction | direction | index | max | min ${helpers.arrowDown} | ${1} | ${0} | ${10} | ${0} ${helpers.arrowUp} | ${-1} | ${10} | ${10} | ${0} `('moving in bounds', ({ keyboardAction, direction, index, max, min }) => { diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb index 9d28147bd74..7cf2de820fc 100644 --- a/spec/helpers/projects_helper_spec.rb +++ b/spec/helpers/projects_helper_spec.rb @@ -1364,6 +1364,7 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do allow(helper).to receive(:visible_fork_source).with(project).and_return(source_project) allow(helper).to receive(:can_user_create_mr_in_fork).with(source_project).and_return(false) + allow(helper).to receive(:current_user).and_return(user) ahead_path = "/#{project.full_path}/-/compare/#{source_project.default_branch}...ref?from_project_id=#{source_project.id}" @@ -1376,6 +1377,7 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do selected_branch: 'ref', source_name: source_project.full_name, source_path: project_path(source_project), + can_sync_branch: 'false', ahead_compare_path: ahead_path, behind_compare_path: behind_path, source_default_branch: source_project.default_branch, diff --git a/spec/lib/gitlab/database/schema_validation/database_spec.rb b/spec/lib/gitlab/database/schema_validation/database_spec.rb index eadaf683a29..8fd98382625 100644 --- a/spec/lib/gitlab/database/schema_validation/database_spec.rb +++ b/spec/lib/gitlab/database/schema_validation/database_spec.rb @@ -2,109 +2,90 @@ require 'spec_helper' -RSpec.describe Gitlab::Database::SchemaValidation::Database, feature_category: :database do +RSpec.shared_examples 'database schema assertions for' do |fetch_by_name_method, exists_method, all_objects_method| subject(:database) { described_class.new(connection) } let(:database_model) { Gitlab::Database.database_base_models['main'] } let(:connection) { database_model.connection } - context 'when having indexes' do - let(:schema_object) { Gitlab::Database::SchemaValidation::SchemaObjects::Index } - let(:results) do - [['index', 'CREATE UNIQUE INDEX "index" ON public.achievements USING btree (namespace_id, lower(name))']] - end + before do + allow(connection).to receive(:select_rows).and_return(results) + allow(connection).to receive(:exec_query).and_return(results) + end - before do - allow(connection).to receive(:select_rows).and_return(results) + describe "##{fetch_by_name_method}" do + it 'returns nil when schema object does not exists' do + expect(database.public_send(fetch_by_name_method, 'invalid-object-name')).to be_nil end - describe '#fetch_index_by_name' do - context 'when index does not exist' do - it 'returns nil' do - index = database.fetch_index_by_name('non_existing_index') - - expect(index).to be_nil - end - end - - it 'returns index by name' do - index = database.fetch_index_by_name('index') - - expect(index.name).to eq('index') - end + it 'returns the schema object by name' do + expect(database.public_send(fetch_by_name_method, valid_schema_object_name).name).to eq(valid_schema_object_name) end + end - describe '#index_exists?' do - context 'when index exists' do - it 'returns true' do - index_exists = database.index_exists?('index') + describe "##{exists_method}" do + it 'returns true when schema object exists' do + expect(database.public_send(exists_method, valid_schema_object_name)).to be_truthy + end - expect(index_exists).to be_truthy - end - end + it 'returns false when schema object does not exists' do + expect(database.public_send(exists_method, 'invalid-object')).to be_falsey + end + end - context 'when index does not exist' do - it 'returns false' do - index_exists = database.index_exists?('non_existing_index') + describe "##{all_objects_method}" do + it 'returns all the schema objects' do + schema_objects = database.public_send(all_objects_method) - expect(index_exists).to be_falsey - end - end + expect(schema_objects).to all(be_a(schema_object)) + expect(schema_objects.map(&:name)).to eq([valid_schema_object_name]) end + end +end - describe '#indexes' do - it 'returns indexes' do - indexes = database.indexes - - expect(indexes).to all(be_a(schema_object)) - expect(indexes.map(&:name)).to eq(['index']) - end +RSpec.describe Gitlab::Database::SchemaValidation::Database, feature_category: :database do + context 'when having indexes' do + let(:schema_object) { Gitlab::Database::SchemaValidation::SchemaObjects::Index } + let(:valid_schema_object_name) { 'index' } + let(:results) do + [['index', 'CREATE UNIQUE INDEX "index" ON public.achievements USING btree (namespace_id, lower(name))']] end + + include_examples 'database schema assertions for', 'fetch_index_by_name', 'index_exists?', 'indexes' end context 'when having triggers' do let(:schema_object) { Gitlab::Database::SchemaValidation::SchemaObjects::Trigger } + let(:valid_schema_object_name) { 'my_trigger' } let(:results) do - { 'my_trigger' => 'CREATE TRIGGER my_trigger BEFORE INSERT ON todos FOR EACH ROW EXECUTE FUNCTION trigger()' } + [['my_trigger', 'CREATE TRIGGER my_trigger BEFORE INSERT ON todos FOR EACH ROW EXECUTE FUNCTION trigger()']] end - before do - allow(database).to receive(:fetch_triggers).and_return(results) - end - - describe '#fetch_trigger_by_name' do - context 'when trigger does not exist' do - it 'returns nil' do - expect(database.fetch_trigger_by_name('non_existing_trigger')).to be_nil - end - end - - it 'returns trigger by name' do - expect(database.fetch_trigger_by_name('my_trigger').name).to eq('my_trigger') - end - end + include_examples 'database schema assertions for', 'fetch_trigger_by_name', 'trigger_exists?', 'triggers' + end - describe '#trigger_exists?' do - context 'when trigger exists' do - it 'returns true' do - expect(database.trigger_exists?('my_trigger')).to be_truthy - end - end - - context 'when trigger does not exist' do - it 'returns false' do - expect(database.trigger_exists?('non_existing_trigger')).to be_falsey - end - end + context 'when having tables' do + let(:schema_object) { Gitlab::Database::SchemaValidation::SchemaObjects::Table } + let(:valid_schema_object_name) { 'my_table' } + let(:results) do + [ + { + 'table_name' => 'my_table', + 'column_name' => 'id', + 'not_null' => true, + 'data_type' => 'bigint', + 'column_default' => "nextval('audit_events_id_seq'::regclass)" + }, + { + 'table_name' => 'my_table', + 'column_name' => 'details', + 'not_null' => false, + 'data_type' => 'text', + 'column_default' => nil + } + ] end - describe '#triggers' do - it 'returns triggers' do - triggers = database.triggers - - expect(triggers).to all(be_a(schema_object)) - expect(triggers.map(&:name)).to eq(['my_trigger']) - end - end + include_examples 'database schema assertions for', 'fetch_table_by_name', 'table_exists?', 'tables' end end diff --git a/spec/lib/gitlab/database/schema_validation/schema_objects/table_spec.rb b/spec/lib/gitlab/database/schema_validation/schema_objects/table_spec.rb new file mode 100644 index 00000000000..7df37763643 --- /dev/null +++ b/spec/lib/gitlab/database/schema_validation/schema_objects/table_spec.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::Database::SchemaValidation::SchemaObjects::Table, feature_category: :database do + subject(:table) { described_class.new(name) } + + let(:name) { 'my_table' } + + describe '#name' do + it { expect(table.name).to eq('my_table') } + end + + describe '#table_name' do + it { expect(table.table_name).to eq('my_table') } + end +end diff --git a/spec/lib/gitlab/database/schema_validation/structure_sql_spec.rb b/spec/lib/gitlab/database/schema_validation/structure_sql_spec.rb index cc0bd4125ef..b0c056ff5db 100644 --- a/spec/lib/gitlab/database/schema_validation/structure_sql_spec.rb +++ b/spec/lib/gitlab/database/schema_validation/structure_sql_spec.rb @@ -2,81 +2,65 @@ require 'spec_helper' -RSpec.describe Gitlab::Database::SchemaValidation::StructureSql, feature_category: :database do - let(:structure_file_path) { Rails.root.join('spec/fixtures/structure.sql') } - let(:schema_name) { 'public' } - +RSpec.shared_examples 'structure sql schema assertions for' do |object_exists_method, all_objects_method| subject(:structure_sql) { described_class.new(structure_file_path, schema_name) } - context 'when having indexes' do - describe '#index_exists?' do - subject(:index_exists) { structure_sql.index_exists?(index_name) } + let(:structure_file_path) { Rails.root.join('spec/fixtures/structure.sql') } + let(:schema_name) { 'public' } - context 'when the index does not exist' do - let(:index_name) { 'non-existent-index' } + describe "##{object_exists_method}" do + it 'returns true when schema object exists' do + expect(structure_sql.public_send(object_exists_method, valid_schema_object_name)).to be_truthy + end - it 'returns false' do - expect(index_exists).to be_falsey - end - end + it 'returns false when schema object does not exists' do + expect(structure_sql.public_send(object_exists_method, 'invalid-object-name')).to be_falsey + end + end - context 'when the index exists' do - let(:index_name) { 'index' } + describe "##{all_objects_method}" do + it 'returns all the schema objects' do + schema_objects = structure_sql.public_send(all_objects_method) - it 'returns true' do - expect(index_exists).to be_truthy - end - end + expect(schema_objects).to all(be_a(schema_object)) + expect(schema_objects.map(&:name)).to eq(expected_objects) end + end +end - describe '#indexes' do - it 'returns indexes' do - indexes = structure_sql.indexes +RSpec.describe Gitlab::Database::SchemaValidation::StructureSql, feature_category: :database do + let(:structure_file_path) { Rails.root.join('spec/fixtures/structure.sql') } + let(:schema_name) { 'public' } - expected_indexes = %w[ - missing_index - wrong_index - index - index_namespaces_public_groups_name_id - index_on_deploy_keys_id_and_type_and_public - index_users_on_public_email_excluding_null_and_empty - ] + subject(:structure_sql) { described_class.new(structure_file_path, schema_name) } - expect(indexes).to all(be_a(Gitlab::Database::SchemaValidation::SchemaObjects::Index)) - expect(indexes.map(&:name)).to eq(expected_indexes) - end + context 'when having indexes' do + let(:schema_object) { Gitlab::Database::SchemaValidation::SchemaObjects::Index } + let(:valid_schema_object_name) { 'index' } + let(:expected_objects) do + %w[missing_index wrong_index index index_namespaces_public_groups_name_id + index_on_deploy_keys_id_and_type_and_public index_users_on_public_email_excluding_null_and_empty] end + + include_examples 'structure sql schema assertions for', 'index_exists?', 'indexes' end context 'when having triggers' do - describe '#trigger_exists?' do - subject(:trigger_exists) { structure_sql.trigger_exists?(name) } + let(:schema_object) { Gitlab::Database::SchemaValidation::SchemaObjects::Trigger } + let(:valid_schema_object_name) { 'trigger' } + let(:expected_objects) { %w[trigger wrong_trigger missing_trigger_1 projects_loose_fk_trigger] } - context 'when the trigger does not exist' do - let(:name) { 'non-existent-trigger' } - - it 'returns false' do - expect(trigger_exists).to be_falsey - end - end - - context 'when the trigger exists' do - let(:name) { 'trigger' } + include_examples 'structure sql schema assertions for', 'trigger_exists?', 'triggers' + end - it 'returns true' do - expect(trigger_exists).to be_truthy - end - end + context 'when having tables' do + let(:schema_object) { Gitlab::Database::SchemaValidation::SchemaObjects::Table } + let(:valid_schema_object_name) { 'test_table' } + let(:expected_objects) do + %w[test_table ci_project_mirrors wrong_table extra_table_columns missing_table missing_table_columns + operations_user_lists] end - describe '#triggers' do - it 'returns triggers' do - triggers = structure_sql.triggers - expected_triggers = %w[trigger wrong_trigger missing_trigger_1 projects_loose_fk_trigger] - - expect(triggers).to all(be_a(Gitlab::Database::SchemaValidation::SchemaObjects::Trigger)) - expect(triggers.map(&:name)).to eq(expected_triggers) - end - end + include_examples 'structure sql schema assertions for', 'table_exists?', 'tables' end end diff --git a/spec/lib/gitlab/database/schema_validation/validators/base_validator_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/base_validator_spec.rb index 2f38c25cf68..1ee69edda62 100644 --- a/spec/lib/gitlab/database/schema_validation/validators/base_validator_spec.rb +++ b/spec/lib/gitlab/database/schema_validation/validators/base_validator_spec.rb @@ -8,8 +8,10 @@ RSpec.describe Gitlab::Database::SchemaValidation::Validators::BaseValidator, fe it 'returns an array of all validators' do expect(all_validators).to eq([ + Gitlab::Database::SchemaValidation::Validators::ExtraTables, Gitlab::Database::SchemaValidation::Validators::ExtraIndexes, Gitlab::Database::SchemaValidation::Validators::ExtraTriggers, + Gitlab::Database::SchemaValidation::Validators::MissingTables, Gitlab::Database::SchemaValidation::Validators::MissingIndexes, Gitlab::Database::SchemaValidation::Validators::MissingTriggers, Gitlab::Database::SchemaValidation::Validators::DifferentDefinitionIndexes, diff --git a/spec/lib/gitlab/database/schema_validation/validators/extra_tables_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/extra_tables_spec.rb new file mode 100644 index 00000000000..edaf79e3c93 --- /dev/null +++ b/spec/lib/gitlab/database/schema_validation/validators/extra_tables_spec.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::Database::SchemaValidation::Validators::ExtraTables, feature_category: :database do + include_examples 'table validators', described_class, ['extra_table'] +end diff --git a/spec/lib/gitlab/database/schema_validation/validators/missing_tables_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/missing_tables_spec.rb new file mode 100644 index 00000000000..7c80923e860 --- /dev/null +++ b/spec/lib/gitlab/database/schema_validation/validators/missing_tables_spec.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::Database::SchemaValidation::Validators::MissingTables, feature_category: :database do + missing_tables = %w[ci_project_mirrors missing_table operations_user_lists test_table] + + include_examples 'table validators', described_class, missing_tables +end diff --git a/spec/lib/gitlab/email/hook/silent_mode_interceptor_spec.rb b/spec/lib/gitlab/email/hook/silent_mode_interceptor_spec.rb new file mode 100644 index 00000000000..cc371643bee --- /dev/null +++ b/spec/lib/gitlab/email/hook/silent_mode_interceptor_spec.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::Email::Hook::SilentModeInterceptor, :mailer, feature_category: :geo_replication do + let_it_be(:user) { create(:user) } + + before do + Mail.register_interceptor(described_class) + end + + after do + Mail.unregister_interceptor(described_class) + end + + context 'when silent mode is enabled' do + it 'prevents mail delivery' do + stub_application_setting(silent_mode_enabled: true) + + deliver_mails(user) + + should_not_email_anyone + end + + it 'logs the suppression' do + stub_application_setting(silent_mode_enabled: true) + + expect(Gitlab::AppJsonLogger).to receive(:info).with( + message: 'SilentModeInterceptor prevented sending mail', + mail_subject: 'Two-factor authentication disabled', + silent_mode_enabled: true + ) + expect(Gitlab::AppJsonLogger).to receive(:info).with( + message: 'SilentModeInterceptor prevented sending mail', + mail_subject: 'Welcome to GitLab!', + silent_mode_enabled: true + ) + + deliver_mails(user) + end + end + + context 'when silent mode is disabled' do + it 'does not prevent mail delivery' do + stub_application_setting(silent_mode_enabled: false) + + deliver_mails(user) + + should_email(user, times: 2) + end + + it 'debug logs the no-op' do + stub_application_setting(silent_mode_enabled: false) + + expect(Gitlab::AppJsonLogger).to receive(:debug).with( + message: 'SilentModeInterceptor did nothing', + mail_subject: 'Two-factor authentication disabled', + silent_mode_enabled: false + ) + expect(Gitlab::AppJsonLogger).to receive(:debug).with( + message: 'SilentModeInterceptor did nothing', + mail_subject: 'Welcome to GitLab!', + silent_mode_enabled: false + ) + + deliver_mails(user) + end + end + + def deliver_mails(user) + Notify.disabled_two_factor_email(user).deliver_now + DeviseMailer.user_admin_approval(user).deliver_now + end +end diff --git a/spec/lib/gitlab/error_tracking_spec.rb b/spec/lib/gitlab/error_tracking_spec.rb index 0f056ee9eac..79016335a40 100644 --- a/spec/lib/gitlab/error_tracking_spec.rb +++ b/spec/lib/gitlab/error_tracking_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' require 'raven/transports/dummy' require 'sentry/transport/dummy_transport' -RSpec.describe Gitlab::ErrorTracking do +RSpec.describe Gitlab::ErrorTracking, feature_category: :shared do let(:exception) { RuntimeError.new('boom') } let(:issue_url) { 'http://gitlab.com/gitlab-org/gitlab-foss/issues/1' } let(:extra) { { issue_url: issue_url, some_other_info: 'info' } } @@ -58,7 +58,7 @@ RSpec.describe Gitlab::ErrorTracking do stub_feature_flags(enable_new_sentry_integration: true) stub_sentry_settings - allow(described_class).to receive(:sentry_configurable?) { true } + allow(described_class).to receive(:sentry_configurable?).and_return(true) allow(Labkit::Correlation::CorrelationId).to receive(:current_id).and_return('cid') allow(I18n).to receive(:locale).and_return('en') @@ -82,7 +82,7 @@ RSpec.describe Gitlab::ErrorTracking do describe '.track_and_raise_for_dev_exception' do context 'when exceptions for dev should be raised' do before do - expect(described_class).to receive(:should_raise_for_dev?).and_return(true) + allow(described_class).to receive(:should_raise_for_dev?).and_return(true) end it 'raises the exception' do @@ -101,7 +101,7 @@ RSpec.describe Gitlab::ErrorTracking do context 'when exceptions for dev should not be raised' do before do - expect(described_class).to receive(:should_raise_for_dev?).and_return(false) + allow(described_class).to receive(:should_raise_for_dev?).and_return(false) end it 'logs the exception with all attributes passed' do @@ -219,7 +219,7 @@ RSpec.describe Gitlab::ErrorTracking do end end - context 'the exception implements :sentry_extra_data' do + context 'when the exception implements :sentry_extra_data' do let(:extra_info) { { event: 'explosion', size: :massive } } before do @@ -239,7 +239,7 @@ RSpec.describe Gitlab::ErrorTracking do end end - context 'the exception implements :sentry_extra_data, which returns nil' do + context 'when the exception implements :sentry_extra_data, which returns nil' do let(:extra) { { issue_url: issue_url } } before do @@ -260,7 +260,7 @@ RSpec.describe Gitlab::ErrorTracking do end end - context 'event processors' do + describe 'event processors' do subject(:track_exception) { described_class.track_exception(exception, extra) } before do @@ -269,7 +269,16 @@ RSpec.describe Gitlab::ErrorTracking do allow(Gitlab::ErrorTracking::Logger).to receive(:error) end - context 'custom GitLab context when using Raven.capture_exception directly' do + # This is a workaround for restoring Raven's user context below. + # Raven.user_context(&block) does not restore the user context correctly. + around do |example| + previous_user_context = Raven.context.user.dup + example.run + ensure + Raven.context.user = previous_user_context + end + + context 'with custom GitLab context when using Raven.capture_exception directly' do subject(:track_exception) { Raven.capture_exception(exception) } it 'merges a default set of tags into the existing tags' do @@ -289,7 +298,7 @@ RSpec.describe Gitlab::ErrorTracking do end end - context 'custom GitLab context when using Sentry.capture_exception directly' do + context 'with custom GitLab context when using Sentry.capture_exception directly' do subject(:track_exception) { Sentry.capture_exception(exception) } it 'merges a default set of tags into the existing tags' do @@ -401,15 +410,17 @@ RSpec.describe Gitlab::ErrorTracking do end ['Gitlab::SidekiqMiddleware::RetryError', 'SubclassRetryError'].each do |ex| - let(:exception) { ex.constantize.new } + context "with #{ex} exception" do + let(:exception) { ex.constantize.new } - it "does not report #{ex} exception to Sentry" do - expect(Gitlab::ErrorTracking::Logger).to receive(:error) + it "does not report exception to Sentry" do + expect(Gitlab::ErrorTracking::Logger).to receive(:error) - track_exception + track_exception - expect(Raven.client.transport.events).to eq([]) - expect(Sentry.get_current_client.transport.events).to eq([]) + expect(Raven.client.transport.events).to eq([]) + expect(Sentry.get_current_client.transport.events).to eq([]) + end end end end @@ -491,7 +502,7 @@ RSpec.describe Gitlab::ErrorTracking do end end - context 'Sentry performance monitoring' do + describe 'Sentry performance monitoring' do context 'when ENABLE_SENTRY_PERFORMANCE_MONITORING env is disabled' do before do stub_env('ENABLE_SENTRY_PERFORMANCE_MONITORING', false) diff --git a/spec/models/application_setting_spec.rb b/spec/models/application_setting_spec.rb index 9130e8a741c..16a1ce9ccaa 100644 --- a/spec/models/application_setting_spec.rb +++ b/spec/models/application_setting_spec.rb @@ -274,6 +274,9 @@ RSpec.describe ApplicationSetting, feature_category: :shared, type: :model do it { is_expected.to allow_value(nil).for(:database_apdex_settings) } it { is_expected.to allow_value(valid_database_apdex_settings).for(:database_apdex_settings) } + it { is_expected.to allow_value([true, false]).for(:silent_mode_enabled) } + it { is_expected.not_to allow_value(nil).for(:silent_mode_enabled) } + context 'when deactivate_dormant_users is enabled' do before do stub_application_setting(deactivate_dormant_users: true) diff --git a/spec/models/ci/build_report_result_spec.rb b/spec/models/ci/build_report_result_spec.rb index 90b23d3e824..90426f60c73 100644 --- a/spec/models/ci/build_report_result_spec.rb +++ b/spec/models/ci/build_report_result_spec.rb @@ -33,6 +33,19 @@ RSpec.describe Ci::BuildReportResult do expect(build_report_result.errors.full_messages).to eq(["Data must be a valid json schema"]) end end + + context 'when data tests is invalid' do + it 'returns errors' do + build_report_result.data = { + 'tests' => { + 'invalid' => 'invalid' + } + } + + expect(build_report_result).to be_invalid + expect(build_report_result.errors.full_messages).to eq(["Data must be a valid json schema"]) + end + end end describe '#tests_name' do diff --git a/spec/requests/api/graphql/mutations/projects/sync_fork_spec.rb b/spec/requests/api/graphql/mutations/projects/sync_fork_spec.rb index a77c026dd06..21977b1653e 100644 --- a/spec/requests/api/graphql/mutations/projects/sync_fork_spec.rb +++ b/spec/requests/api/graphql/mutations/projects/sync_fork_spec.rb @@ -50,6 +50,20 @@ RSpec.describe "Sync project fork", feature_category: :source_code_management do end end + context 'when the branch is protected', :use_clean_rails_redis_caching do + let_it_be(:protected_branch) do + create(:protected_branch, :no_one_can_push, :no_one_can_merge, project: project, name: target_branch) + end + + it_behaves_like 'a mutation that returns a top-level access error' + + it 'does not call the sync service' do + expect(::Projects::Forks::SyncWorker).not_to receive(:perform_async) + + post_graphql_mutation(mutation, current_user: current_user) + end + end + context 'when the user does not have permission' do let_it_be(:current_user) { create(:user) } diff --git a/spec/requests/api/settings_spec.rb b/spec/requests/api/settings_spec.rb index e91d777bfb0..e161cc7e03f 100644 --- a/spec/requests/api/settings_spec.rb +++ b/spec/requests/api/settings_spec.rb @@ -68,6 +68,7 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu expect(json_response['user_defaults_to_private_profile']).to eq(false) expect(json_response['default_syntax_highlighting_theme']).to eq(1) expect(json_response['projects_api_rate_limit_unauthenticated']).to eq(400) + expect(json_response['silent_mode_enabled']).to be(false) end end @@ -173,7 +174,8 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu allow_runner_registration_token: true, user_defaults_to_private_profile: true, default_syntax_highlighting_theme: 2, - projects_api_rate_limit_unauthenticated: 100 + projects_api_rate_limit_unauthenticated: 100, + silent_mode_enabled: true } expect(response).to have_gitlab_http_status(:ok) @@ -243,6 +245,7 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu expect(json_response['user_defaults_to_private_profile']).to be(true) expect(json_response['default_syntax_highlighting_theme']).to eq(2) expect(json_response['projects_api_rate_limit_unauthenticated']).to be(100) + expect(json_response['silent_mode_enabled']).to be(true) end end diff --git a/spec/support/rspec_order_todo.yml b/spec/support/rspec_order_todo.yml index 393f084ee97..a767ae69653 100644 --- a/spec/support/rspec_order_todo.yml +++ b/spec/support/rspec_order_todo.yml @@ -6430,7 +6430,6 @@ - './spec/lib/gitlab/error_tracking/processor/sanitize_error_message_processor_spec.rb' - './spec/lib/gitlab/error_tracking/processor/sanitizer_processor_spec.rb' - './spec/lib/gitlab/error_tracking/processor/sidekiq_processor_spec.rb' -- './spec/lib/gitlab/error_tracking_spec.rb' - './spec/lib/gitlab/error_tracking/stack_trace_highlight_decorator_spec.rb' - './spec/lib/gitlab/etag_caching/middleware_spec.rb' - './spec/lib/gitlab/etag_caching/router/graphql_spec.rb' diff --git a/spec/support/shared_examples/lib/gitlab/database/table_validators_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/database/table_validators_shared_examples.rb new file mode 100644 index 00000000000..96e58294675 --- /dev/null +++ b/spec/support/shared_examples/lib/gitlab/database/table_validators_shared_examples.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.shared_examples "table validators" do |validator, expected_result| + subject(:result) { validator.new(structure_file, database).execute } + + let(:structure_file_path) { Rails.root.join('spec/fixtures/structure.sql') } + let(:inconsistency_type) { validator.name.demodulize.underscore } + let(:database_model) { Gitlab::Database.database_base_models['main'] } + let(:connection) { database_model.connection } + let(:schema) { connection.current_schema } + let(:database) { Gitlab::Database::SchemaValidation::Database.new(connection) } + let(:structure_file) { Gitlab::Database::SchemaValidation::StructureSql.new(structure_file_path, schema) } + let(:database_tables) do + [ + { + 'table_name' => 'wrong_table', + 'column_name' => 'id', + 'not_null' => true, + 'data_type' => 'integer', + 'column_default' => "nextval('audit_events_id_seq'::regclass)" + }, + { + 'table_name' => 'wrong_table', + 'column_name' => 'description', + 'not_null' => true, + 'data_type' => 'character varying', + 'column_default' => nil + }, + { + 'table_name' => 'extra_table', + 'column_name' => 'id', + 'not_null' => true, + 'data_type' => 'integer', + 'column_default' => "nextval('audit_events_id_seq'::regclass)" + }, + { + 'table_name' => 'extra_table', + 'column_name' => 'email', + 'not_null' => true, + 'data_type' => 'character varying', + 'column_default' => nil + }, + { + 'table_name' => 'extra_table_columns', + 'column_name' => 'id', + 'not_null' => true, + 'data_type' => 'bigint', + 'column_default' => "nextval('audit_events_id_seq'::regclass)" + }, + { + 'table_name' => 'extra_table_columns', + 'column_name' => 'name', + 'not_null' => true, + 'data_type' => 'character varying(255)', + 'column_default' => nil + }, + { + 'table_name' => 'extra_table_columns', + 'column_name' => 'extra_column', + 'not_null' => true, + 'data_type' => 'character varying(255)', + 'column_default' => nil + }, + { + 'table_name' => 'missing_table_columns', + 'column_name' => 'id', + 'not_null' => true, + 'data_type' => 'bigint', + 'column_default' => 'NOT NULL' + } + ] + end + + before do + allow(connection).to receive(:exec_query).and_return(database_tables) + end + + it 'returns table inconsistencies' do + expect(result.map(&:object_name)).to match_array(expected_result) + expect(result.map(&:type)).to all(eql inconsistency_type) + end +end |