diff options
Diffstat (limited to 'spec/frontend/runner/components/runner_bulk_delete_spec.js')
-rw-r--r-- | spec/frontend/runner/components/runner_bulk_delete_spec.js | 243 |
1 files changed, 0 insertions, 243 deletions
diff --git a/spec/frontend/runner/components/runner_bulk_delete_spec.js b/spec/frontend/runner/components/runner_bulk_delete_spec.js deleted file mode 100644 index 6df918c684f..00000000000 --- a/spec/frontend/runner/components/runner_bulk_delete_spec.js +++ /dev/null @@ -1,243 +0,0 @@ -import Vue from 'vue'; -import { GlModal, GlSprintf } from '@gitlab/ui'; -import VueApollo from 'vue-apollo'; -import { createAlert } from '~/flash'; -import { createMockDirective, getBinding } from 'helpers/vue_mock_directive'; -import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; -import { s__ } from '~/locale'; -import RunnerBulkDelete from '~/runner/components/runner_bulk_delete.vue'; -import createMockApollo from 'helpers/mock_apollo_helper'; -import BulkRunnerDeleteMutation from '~/runner/graphql/list/bulk_runner_delete.mutation.graphql'; -import { createLocalState } from '~/runner/graphql/list/local_state'; -import waitForPromises from 'helpers/wait_for_promises'; -import { allRunnersData } from '../mock_data'; - -Vue.use(VueApollo); - -jest.mock('~/flash'); - -describe('RunnerBulkDelete', () => { - let wrapper; - let apolloCache; - let mockState; - let mockCheckedRunnerIds; - - const findClearBtn = () => wrapper.findByText(s__('Runners|Clear selection')); - const findDeleteBtn = () => wrapper.findByText(s__('Runners|Delete selected')); - const findModal = () => wrapper.findComponent(GlModal); - - const mockRunners = allRunnersData.data.runners.nodes; - const mockId1 = allRunnersData.data.runners.nodes[0].id; - const mockId2 = allRunnersData.data.runners.nodes[1].id; - - const bulkRunnerDeleteHandler = jest.fn(); - - const createComponent = () => { - const { cacheConfig, localMutations } = mockState; - const apolloProvider = createMockApollo( - [[BulkRunnerDeleteMutation, bulkRunnerDeleteHandler]], - undefined, - cacheConfig, - ); - - wrapper = shallowMountExtended(RunnerBulkDelete, { - apolloProvider, - provide: { - localMutations, - }, - propsData: { - runners: mockRunners, - }, - directives: { - GlTooltip: createMockDirective(), - }, - stubs: { - GlSprintf, - GlModal, - }, - }); - - apolloCache = apolloProvider.defaultClient.cache; - jest.spyOn(apolloCache, 'evict'); - jest.spyOn(apolloCache, 'gc'); - }; - - beforeEach(() => { - mockState = createLocalState(); - - jest - .spyOn(mockState.cacheConfig.typePolicies.Query.fields, 'checkedRunnerIds') - .mockImplementation(() => mockCheckedRunnerIds); - }); - - afterEach(() => { - bulkRunnerDeleteHandler.mockReset(); - wrapper.destroy(); - }); - - describe('When no runners are checked', () => { - beforeEach(async () => { - mockCheckedRunnerIds = []; - - createComponent(); - - await waitForPromises(); - }); - - it('shows no contents', () => { - expect(wrapper.html()).toBe(''); - }); - }); - - describe.each` - count | ids | text - ${1} | ${[mockId1]} | ${'1 runner'} - ${2} | ${[mockId1, mockId2]} | ${'2 runners'} - `('When $count runner(s) are checked', ({ ids, text }) => { - beforeEach(() => { - mockCheckedRunnerIds = ids; - - createComponent(); - - jest.spyOn(mockState.localMutations, 'clearChecked').mockImplementation(() => {}); - }); - - it(`shows "${text}"`, () => { - expect(wrapper.text()).toContain(text); - }); - - it('clears selection', () => { - expect(mockState.localMutations.clearChecked).toHaveBeenCalledTimes(0); - - findClearBtn().vm.$emit('click'); - - expect(mockState.localMutations.clearChecked).toHaveBeenCalledTimes(1); - }); - - it('shows confirmation modal', () => { - const modalId = getBinding(findDeleteBtn().element, 'gl-modal'); - - expect(findModal().props('modal-id')).toBe(modalId); - expect(findModal().text()).toContain(text); - }); - }); - - describe('when runners are deleted', () => { - let evt; - let mockHideModal; - - beforeEach(() => { - mockCheckedRunnerIds = [mockId1, mockId2]; - - createComponent(); - - jest.spyOn(mockState.localMutations, 'clearChecked').mockImplementation(() => {}); - mockHideModal = jest.spyOn(findModal().vm, 'hide'); - }); - - describe('when deletion is successful', () => { - beforeEach(() => { - bulkRunnerDeleteHandler.mockResolvedValue({ - data: { - bulkRunnerDelete: { deletedIds: mockCheckedRunnerIds, errors: [] }, - }, - }); - - evt = { - preventDefault: jest.fn(), - }; - findModal().vm.$emit('primary', evt); - }); - - it('has loading state', async () => { - expect(findModal().props('actionPrimary').attributes.loading).toBe(true); - expect(findModal().props('actionCancel').attributes.loading).toBe(true); - - await waitForPromises(); - - expect(findModal().props('actionPrimary').attributes.loading).toBe(false); - expect(findModal().props('actionCancel').attributes.loading).toBe(false); - }); - - it('modal is not prevented from closing', () => { - expect(evt.preventDefault).toHaveBeenCalledTimes(1); - }); - - it('mutation is called', async () => { - expect(bulkRunnerDeleteHandler).toHaveBeenCalledWith({ - input: { ids: mockCheckedRunnerIds }, - }); - }); - - it('user interface is updated', async () => { - const { evict, gc } = apolloCache; - - expect(evict).toHaveBeenCalledTimes(mockCheckedRunnerIds.length); - expect(evict).toHaveBeenCalledWith({ - id: expect.stringContaining(mockCheckedRunnerIds[0]), - }); - expect(evict).toHaveBeenCalledWith({ - id: expect.stringContaining(mockCheckedRunnerIds[1]), - }); - - expect(gc).toHaveBeenCalledTimes(1); - }); - - it('modal is hidden', () => { - expect(mockHideModal).toHaveBeenCalledTimes(1); - }); - }); - - describe('when deletion fails', () => { - beforeEach(() => { - bulkRunnerDeleteHandler.mockRejectedValue(new Error('error!')); - - evt = { - preventDefault: jest.fn(), - }; - findModal().vm.$emit('primary', evt); - }); - - it('has loading state', async () => { - expect(findModal().props('actionPrimary').attributes.loading).toBe(true); - expect(findModal().props('actionCancel').attributes.loading).toBe(true); - - await waitForPromises(); - - expect(findModal().props('actionPrimary').attributes.loading).toBe(false); - expect(findModal().props('actionCancel').attributes.loading).toBe(false); - }); - - it('modal is not prevented from closing', () => { - expect(evt.preventDefault).toHaveBeenCalledTimes(1); - }); - - it('mutation is called', () => { - expect(bulkRunnerDeleteHandler).toHaveBeenCalledWith({ - input: { ids: mockCheckedRunnerIds }, - }); - }); - - it('user interface is not updated', async () => { - await waitForPromises(); - - const { evict, gc } = apolloCache; - - expect(evict).not.toHaveBeenCalled(); - expect(gc).not.toHaveBeenCalled(); - expect(mockState.localMutations.clearChecked).not.toHaveBeenCalled(); - }); - - it('alert is called', async () => { - await waitForPromises(); - - expect(createAlert).toHaveBeenCalled(); - expect(createAlert).toHaveBeenCalledWith({ - message: expect.any(String), - captureError: true, - error: expect.any(Error), - }); - }); - }); - }); -}); |