From 19337d6c05870ffdd743fe8b99de7e9ba3b0c6d7 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Mon, 30 Mar 2020 21:26:30 +0200 Subject: [PATCH] Added tests for elements regarding short URL edition --- .../helpers/EditShortUrlModal.test.js | 79 +++++++++++++++++++ .../reducers/shortUrlEdition.test.js | 74 +++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 test/short-urls/helpers/EditShortUrlModal.test.js create mode 100644 test/short-urls/reducers/shortUrlEdition.test.js diff --git a/test/short-urls/helpers/EditShortUrlModal.test.js b/test/short-urls/helpers/EditShortUrlModal.test.js new file mode 100644 index 00000000..976cde14 --- /dev/null +++ b/test/short-urls/helpers/EditShortUrlModal.test.js @@ -0,0 +1,79 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import { FormGroup, Modal, ModalHeader } from 'reactstrap'; +import EditShortUrlModal from '../../../src/short-urls/helpers/EditShortUrlModal'; + +describe('', () => { + let wrapper; + const editShortUrl = jest.fn(() => Promise.resolve()); + const toggle = jest.fn(); + const createWrapper = (shortUrl, shortUrlEdition) => { + wrapper = shallow( + + ); + + return wrapper; + }; + + afterEach(() => { + wrapper && wrapper.unmount(); + jest.clearAllMocks(); + }); + + it.each([ + [ false, 0 ], + [ true, 1 ], + ])('properly renders form with expected components', (error, expectedErrorLength) => { + const wrapper = createWrapper({}, { saving: false, error }); + const errorElement = wrapper.find('.bg-danger'); + const form = wrapper.find('form'); + const formGroup = form.find(FormGroup); + + expect(form).toHaveLength(1); + expect(formGroup).toHaveLength(1); + expect(errorElement).toHaveLength(expectedErrorLength); + }); + + it.each([ + [ true, 'Saving...', 'something', true ], + [ true, 'Saving...', undefined, true ], + [ false, 'Save', 'something', false ], + [ false, 'Save', undefined, true ], + ])('renders submit button on expected state', (saving, expectedText, longUrl, expectedDisabled) => { + const wrapper = createWrapper({ longUrl }, { saving, error: false }); + const button = wrapper.find('[color="primary"]'); + + expect(button.prop('disabled')).toEqual(expectedDisabled); + expect(button.html()).toContain(expectedText); + }); + + it('saves data when form is submit', () => { + const preventDefault = jest.fn(); + const wrapper = createWrapper({}, { saving: false, error: false }); + const form = wrapper.find('form'); + + form.simulate('submit', { preventDefault }); + + expect(preventDefault).toHaveBeenCalled(); + expect(editShortUrl).toHaveBeenCalled(); + }); + + it.each([ + [ '[color="link"]', 'onClick' ], + [ Modal, 'toggle' ], + [ ModalHeader, 'toggle' ], + ])('toggles modal with different mechanisms', (componentToFind, propToCall) => { + const wrapper = createWrapper({}, { saving: false, error: false }); + const component = wrapper.find(componentToFind); + + component.prop(propToCall)(); + + expect(toggle).toHaveBeenCalled(); + }); +}); diff --git a/test/short-urls/reducers/shortUrlEdition.test.js b/test/short-urls/reducers/shortUrlEdition.test.js new file mode 100644 index 00000000..a64f5492 --- /dev/null +++ b/test/short-urls/reducers/shortUrlEdition.test.js @@ -0,0 +1,74 @@ +import reducer, { + EDIT_SHORT_URL_START, + EDIT_SHORT_URL_ERROR, + SHORT_URL_EDITED, + editShortUrl, +} from '../../../src/short-urls/reducers/shortUrlEdition'; + +describe('shortUrlEditionReducer', () => { + const longUrl = 'https://shlink.io'; + const shortCode = 'abc123'; + + describe('reducer', () => { + it('returns loading on EDIT_SHORT_URL_START', () => { + expect(reducer({}, { type: EDIT_SHORT_URL_START })).toEqual({ + saving: true, + error: false, + }); + }); + + it('returns error on EDIT_SHORT_URL_ERROR', () => { + expect(reducer({}, { type: EDIT_SHORT_URL_ERROR })).toEqual({ + saving: false, + error: true, + }); + }); + + it('returns provided tags and shortCode on SHORT_URL_EDITED', () => { + expect(reducer({}, { type: SHORT_URL_EDITED, longUrl, shortCode })).toEqual({ + longUrl, + shortCode, + saving: false, + error: false, + }); + }); + }); + + describe('editShortUrl', () => { + const updateShortUrlMeta = jest.fn().mockResolvedValue({}); + const buildShlinkApiClient = jest.fn().mockReturnValue({ updateShortUrlMeta }); + const dispatch = jest.fn(); + + afterEach(jest.clearAllMocks); + + it.each([[ undefined ], [ null ], [ 'example.com' ]])('dispatches long URL on success', async (domain) => { + await editShortUrl(buildShlinkApiClient)(shortCode, domain, longUrl)(dispatch); + + expect(buildShlinkApiClient).toHaveBeenCalledTimes(1); + expect(updateShortUrlMeta).toHaveBeenCalledTimes(1); + expect(updateShortUrlMeta).toHaveBeenCalledWith(shortCode, domain, { longUrl }); + expect(dispatch).toHaveBeenCalledTimes(2); + expect(dispatch).toHaveBeenNthCalledWith(1, { type: EDIT_SHORT_URL_START }); + expect(dispatch).toHaveBeenNthCalledWith(2, { type: SHORT_URL_EDITED, longUrl, shortCode, domain }); + }); + + it('dispatches error on failure', async () => { + const error = new Error(); + + updateShortUrlMeta.mockRejectedValue(error); + + try { + await editShortUrl(buildShlinkApiClient)(shortCode, undefined, longUrl)(dispatch); + } catch (e) { + expect(e).toBe(error); + } + + expect(buildShlinkApiClient).toHaveBeenCalledTimes(1); + expect(updateShortUrlMeta).toHaveBeenCalledTimes(1); + expect(updateShortUrlMeta).toHaveBeenCalledWith(shortCode, undefined, { longUrl }); + expect(dispatch).toHaveBeenCalledTimes(2); + expect(dispatch).toHaveBeenNthCalledWith(1, { type: EDIT_SHORT_URL_START }); + expect(dispatch).toHaveBeenNthCalledWith(2, { type: EDIT_SHORT_URL_ERROR }); + }); + }); +});