diff options
Diffstat (limited to 'spec/frontend/packages_and_registries/package_registry/components/functional/delete_package_spec.js')
-rw-r--r-- | spec/frontend/packages_and_registries/package_registry/components/functional/delete_package_spec.js | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/spec/frontend/packages_and_registries/package_registry/components/functional/delete_package_spec.js b/spec/frontend/packages_and_registries/package_registry/components/functional/delete_package_spec.js new file mode 100644 index 00000000000..5de30829fa5 --- /dev/null +++ b/spec/frontend/packages_and_registries/package_registry/components/functional/delete_package_spec.js @@ -0,0 +1,160 @@ +import { createLocalVue } from '@vue/test-utils'; +import VueApollo from 'vue-apollo'; +import waitForPromises from 'helpers/wait_for_promises'; +import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; +import createMockApollo from 'helpers/mock_apollo_helper'; +import createFlash from '~/flash'; +import DeletePackage from '~/packages_and_registries/package_registry/components/functional/delete_package.vue'; + +import destroyPackageMutation from '~/packages_and_registries/package_registry/graphql/mutations/destroy_package.mutation.graphql'; +import getPackagesQuery from '~/packages_and_registries/package_registry/graphql/queries/get_packages.query.graphql'; +import { + packageDestroyMutation, + packageDestroyMutationError, + packagesListQuery, +} from '../../mock_data'; + +jest.mock('~/flash'); + +const localVue = createLocalVue(); + +describe('DeletePackage', () => { + let wrapper; + let apolloProvider; + let resolver; + let mutationResolver; + + const eventPayload = { id: '1' }; + + function createComponent(propsData = {}) { + localVue.use(VueApollo); + + const requestHandlers = [ + [getPackagesQuery, resolver], + [destroyPackageMutation, mutationResolver], + ]; + apolloProvider = createMockApollo(requestHandlers); + + wrapper = shallowMountExtended(DeletePackage, { + propsData, + localVue, + apolloProvider, + scopedSlots: { + default(props) { + return this.$createElement('button', { + attrs: { + 'data-testid': 'trigger-button', + }, + on: { + click: props.deletePackage, + }, + }); + }, + }, + }); + } + + const findButton = () => wrapper.findByTestId('trigger-button'); + + const clickOnButtonAndWait = (payload) => { + findButton().trigger('click', payload); + return waitForPromises(); + }; + + beforeEach(() => { + resolver = jest.fn().mockResolvedValue(packagesListQuery()); + mutationResolver = jest.fn().mockResolvedValue(packageDestroyMutation()); + }); + + afterEach(() => { + wrapper.destroy(); + }); + + it('binds deletePackage method to the default slot', () => { + createComponent(); + + findButton().trigger('click'); + + expect(wrapper.emitted('start')).toEqual([[]]); + }); + + it('calls apollo mutation', async () => { + createComponent(); + + await clickOnButtonAndWait(eventPayload); + + expect(mutationResolver).toHaveBeenCalledWith(eventPayload); + }); + + it('passes refetchQueries to apollo mutate', async () => { + const variables = { isGroupPage: true }; + createComponent({ + refetchQueries: [{ query: getPackagesQuery, variables }], + }); + + await clickOnButtonAndWait(eventPayload); + + expect(mutationResolver).toHaveBeenCalledWith(eventPayload); + expect(resolver).toHaveBeenCalledWith(variables); + }); + + describe('on mutation success', () => { + it('emits end event', async () => { + createComponent(); + + await clickOnButtonAndWait(eventPayload); + + expect(wrapper.emitted('end')).toEqual([[]]); + }); + + it('does not call createFlash', async () => { + createComponent(); + + await clickOnButtonAndWait(eventPayload); + + expect(createFlash).not.toHaveBeenCalled(); + }); + + it('calls createFlash with the success message when showSuccessAlert is true', async () => { + createComponent({ showSuccessAlert: true }); + + await clickOnButtonAndWait(eventPayload); + + expect(createFlash).toHaveBeenCalledWith({ + message: DeletePackage.i18n.successMessage, + type: 'success', + }); + }); + }); + + describe.each` + errorType | mutationResolverResponse + ${'connectionError'} | ${jest.fn().mockRejectedValue()} + ${'localError'} | ${jest.fn().mockResolvedValue(packageDestroyMutationError())} + `('on mutation $errorType', ({ mutationResolverResponse }) => { + beforeEach(() => { + mutationResolver = mutationResolverResponse; + }); + + it('emits end event', async () => { + createComponent(); + + await clickOnButtonAndWait(eventPayload); + + expect(wrapper.emitted('end')).toEqual([[]]); + }); + + it('calls createFlash with the error message', async () => { + createComponent({ showSuccessAlert: true }); + + await clickOnButtonAndWait(eventPayload); + + expect(createFlash).toHaveBeenCalledWith({ + message: DeletePackage.i18n.errorMessage, + type: 'warning', + captureError: true, + error: expect.any(Error), + }); + }); + }); +}); |