diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-03-01 06:12:27 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-03-01 06:12:27 +0300 |
commit | b0ad241fbbdf6a9d4ccb6f44f2c233d542b3b08d (patch) | |
tree | 05d1c9682c9dfdbe2ecd480e441c192dc07e50f1 /spec/frontend | |
parent | d40f85a4030015db726d2e1bea1f2ab1e16d1eb1 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/frontend')
3 files changed, 116 insertions, 14 deletions
diff --git a/spec/frontend/clusters_list/components/clusters_spec.js b/spec/frontend/clusters_list/components/clusters_spec.js index 20dbff9df15..207bfddcb4f 100644 --- a/spec/frontend/clusters_list/components/clusters_spec.js +++ b/spec/frontend/clusters_list/components/clusters_spec.js @@ -75,7 +75,6 @@ describe('Clusters', () => { }); afterEach(() => { - wrapper.destroy(); mock.restore(); captureException.mockRestore(); }); @@ -271,9 +270,7 @@ describe('Clusters', () => { describe('when updating currentPage', () => { beforeEach(() => { mockPollingApi(HTTP_STATUS_OK, apiData, paginationHeader(totalSecondPage, perPage, 2)); - // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details - // eslint-disable-next-line no-restricted-syntax - wrapper.setData({ currentPage: 2 }); + findPaginatedButtons().vm.$emit('input', 2); return axios.waitForAll(); }); diff --git a/spec/frontend/pipelines/graph/job_item_spec.js b/spec/frontend/pipelines/graph/job_item_spec.js index 3224c87ab6b..5cc2c76f3dd 100644 --- a/spec/frontend/pipelines/graph/job_item_spec.js +++ b/spec/frontend/pipelines/graph/job_item_spec.js @@ -1,10 +1,11 @@ import MockAdapter from 'axios-mock-adapter'; -import { mount } from '@vue/test-utils'; -import { nextTick } from 'vue'; -import { GlBadge, GlModal } from '@gitlab/ui'; +import { shallowMount, mount } from '@vue/test-utils'; +import Vue, { nextTick } from 'vue'; +import { GlBadge, GlModal, GlToast } from '@gitlab/ui'; import JobItem from '~/pipelines/components/graph/job_item.vue'; import axios from '~/lib/utils/axios_utils'; import { useLocalStorageSpy } from 'helpers/local_storage_helper'; +import ActionComponent from '~/pipelines/components/jobs_shared/action_component.vue'; import { extendedWrapper } from 'helpers/vue_test_utils_helper'; import { @@ -19,12 +20,14 @@ import { describe('pipeline graph job item', () => { useLocalStorageSpy(); + Vue.use(GlToast); let wrapper; let mockAxios; const findJobWithoutLink = () => wrapper.findByTestId('job-without-link'); const findJobWithLink = () => wrapper.findByTestId('job-with-link'); + const findActionVueComponent = () => wrapper.findComponent(ActionComponent); const findActionComponent = () => wrapper.findByTestId('ci-action-component'); const findBadge = () => wrapper.findComponent(GlBadge); const findJobLink = () => wrapper.findByTestId('job-with-link'); @@ -41,9 +44,9 @@ describe('pipeline graph job item', () => { job: mockJob, }; - const createWrapper = ({ props, data } = {}) => { + const createWrapper = ({ props, data, mountFn = mount, mocks = {} } = {}) => { wrapper = extendedWrapper( - mount(JobItem, { + mountFn(JobItem, { data() { return { ...data, @@ -53,6 +56,9 @@ describe('pipeline graph job item', () => { ...defaultProps, ...props, }, + mocks: { + ...mocks, + }, }), ); }; @@ -238,6 +244,37 @@ describe('pipeline graph job item', () => { }); }); + describe('when retrying', () => { + const mockToastShow = jest.fn(); + + beforeEach(async () => { + createWrapper({ + mountFn: shallowMount, + data: { + currentSkipModalValue: true, + }, + props: { + skipRetryModal: true, + job: triggerJobWithRetryAction, + }, + mocks: { + $toast: { + show: mockToastShow, + }, + }, + }); + + jest.spyOn(wrapper.vm.$toast, 'show'); + + await findActionVueComponent().vm.$emit('pipelineActionRequestComplete'); + await nextTick(); + }); + + it('shows a toast message that the downstream is being created', () => { + expect(mockToastShow).toHaveBeenCalledTimes(1); + }); + }); + describe('highlighting', () => { it.each` job | jobName | expanded | link diff --git a/spec/frontend/vue_merge_request_widget/components/mr_widget_rebase_spec.js b/spec/frontend/vue_merge_request_widget/components/mr_widget_rebase_spec.js index ec047fe0714..f284ec98a73 100644 --- a/spec/frontend/vue_merge_request_widget/components/mr_widget_rebase_spec.js +++ b/spec/frontend/vue_merge_request_widget/components/mr_widget_rebase_spec.js @@ -1,3 +1,4 @@ +import { GlModal } from '@gitlab/ui'; import { mount } from '@vue/test-utils'; import { nextTick } from 'vue'; import WidgetRebase from '~/vue_merge_request_widget/components/states/mr_widget_rebase.vue'; @@ -8,8 +9,11 @@ jest.mock('~/vue_shared/plugins/global_toast'); let wrapper; -function createWrapper(propsData) { +function createWrapper(propsData, provideData) { wrapper = mount(WidgetRebase, { + provide: { + ...provideData, + }, propsData, data() { return { @@ -19,6 +23,7 @@ function createWrapper(propsData) { userPermissions: { pushToSourceBranch: propsData.mr.canPushToSourceBranch, }, + pipelines: propsData.mr.pipelines, }, }; }, @@ -37,11 +42,8 @@ describe('Merge request widget rebase component', () => { const findRebaseMessageText = () => findRebaseMessage().text(); const findStandardRebaseButton = () => wrapper.find('[data-testid="standard-rebase-button"]'); const findRebaseWithoutCiButton = () => wrapper.find('[data-testid="rebase-without-ci-button"]'); + const findModal = () => wrapper.findComponent(GlModal); - afterEach(() => { - wrapper.destroy(); - wrapper = null; - }); describe('while rebasing', () => { it('should show progress message', () => { createWrapper({ @@ -199,6 +201,72 @@ describe('Merge request widget rebase component', () => { expect(rebaseMock).toHaveBeenCalledWith({ skipCi: true }); }); }); + + describe('security modal', () => { + it('displays modal and rebases after confirming', () => { + createWrapper( + { + mr: { + rebaseInProgress: false, + canPushToSourceBranch: true, + sourceProjectFullPath: 'user/forked', + targetProjectFullPath: 'root/original', + pipelines: { + nodes: [ + { + id: '1', + project: { + id: '2', + fullPath: 'user/forked', + }, + }, + ], + }, + }, + service: { + rebase: rebaseMock, + poll: pollMock, + }, + }, + { canCreatePipelineInTargetProject: true }, + ); + + findModal().vm.show = jest.fn(); + + findStandardRebaseButton().vm.$emit('click'); + + expect(findModal().vm.show).toHaveBeenCalled(); + + findModal().vm.$emit('primary'); + + expect(rebaseMock).toHaveBeenCalled(); + }); + + it('does not display modal', () => { + createWrapper( + { + mr: { + rebaseInProgress: false, + canPushToSourceBranch: true, + sourceProjectFullPath: 'user/forked', + targetProjectFullPath: 'root/original', + }, + service: { + rebase: rebaseMock, + poll: pollMock, + }, + }, + { canCreatePipelineInTargetProject: false }, + ); + + findModal().vm.show = jest.fn(); + + findStandardRebaseButton().vm.$emit('click'); + + expect(findModal().vm.show).not.toHaveBeenCalled(); + expect(rebaseMock).toHaveBeenCalled(); + }); + }); }); describe('without permissions', () => { |