diff --git a/test/mercure/mercureInfo.test.js b/test/mercure/mercureInfo.test.js new file mode 100644 index 00000000..908480ee --- /dev/null +++ b/test/mercure/mercureInfo.test.js @@ -0,0 +1,70 @@ +import reducer, { + GET_MERCURE_INFO_START, + GET_MERCURE_INFO_ERROR, + GET_MERCURE_INFO, + loadMercureInfo, +} from '../../src/mercure/reducers/mercureInfo.js'; + +describe('mercureInfoReducer', () => { + const mercureInfo = { + mercureHubUrl: 'http://example.com/.well-known/mercure', + token: 'abc.123.def', + }; + + describe('reducer', () => { + it('returns loading on GET_MERCURE_INFO_START', () => { + expect(reducer({}, { type: GET_MERCURE_INFO_START })).toEqual({ + loading: true, + error: false, + }); + }); + + it('returns error on GET_MERCURE_INFO_ERROR', () => { + expect(reducer({}, { type: GET_MERCURE_INFO_ERROR })).toEqual({ + loading: false, + error: true, + }); + }); + + it('returns mercure info on GET_MERCURE_INFO', () => { + expect(reducer({}, { type: GET_MERCURE_INFO, ...mercureInfo })).toEqual({ + ...mercureInfo, + loading: false, + error: false, + }); + }); + }); + + describe('loadMercureInfo', () => { + const createApiClientMock = (result) => ({ + mercureInfo: jest.fn(() => result), + }); + const dispatch = jest.fn(); + const getState = () => ({}); + + afterEach(jest.resetAllMocks); + + it('calls API on success', async () => { + const apiClientMock = createApiClientMock(Promise.resolve(mercureInfo)); + + await loadMercureInfo(() => apiClientMock)()(dispatch, getState()); + + expect(apiClientMock.mercureInfo).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledTimes(2); + expect(dispatch).toHaveBeenNthCalledWith(1, { type: GET_MERCURE_INFO_START }); + expect(dispatch).toHaveBeenNthCalledWith(2, { type: GET_MERCURE_INFO, ...mercureInfo }); + }); + + it('throws error on failure', async () => { + const error = 'Error'; + const apiClientMock = createApiClientMock(Promise.reject(error)); + + await loadMercureInfo(() => apiClientMock)()(dispatch, getState()); + + expect(apiClientMock.mercureInfo).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledTimes(2); + expect(dispatch).toHaveBeenNthCalledWith(1, { type: GET_MERCURE_INFO_START }); + expect(dispatch).toHaveBeenNthCalledWith(2, { type: GET_MERCURE_INFO_ERROR }); + }); + }); +}); diff --git a/test/short-urls/reducers/shortUrlCreation.test.js b/test/short-urls/reducers/shortUrlCreation.test.js index d373f972..0ebacbe5 100644 --- a/test/short-urls/reducers/shortUrlCreation.test.js +++ b/test/short-urls/reducers/shortUrlCreation.test.js @@ -52,7 +52,7 @@ describe('shortUrlCreationReducer', () => { const dispatch = jest.fn(); const getState = () => ({}); - afterEach(() => dispatch.mockReset()); + afterEach(jest.resetAllMocks); it('calls API on success', async () => { const result = 'foo'; diff --git a/test/short-urls/reducers/shortUrlsList.test.js b/test/short-urls/reducers/shortUrlsList.test.js index 00a4e6d8..c8e725c2 100644 --- a/test/short-urls/reducers/shortUrlsList.test.js +++ b/test/short-urls/reducers/shortUrlsList.test.js @@ -7,6 +7,7 @@ import reducer, { import { SHORT_URL_TAGS_EDITED } from '../../../src/short-urls/reducers/shortUrlTags'; import { SHORT_URL_DELETED } from '../../../src/short-urls/reducers/shortUrlDeletion'; import { SHORT_URL_META_EDITED } from '../../../src/short-urls/reducers/shortUrlMeta'; +import { CREATE_SHORT_URL_VISIT } from '../../../src/visits/reducers/shortUrlVisits'; describe('shortUrlsListReducer', () => { describe('reducer', () => { @@ -31,7 +32,7 @@ describe('shortUrlsListReducer', () => { error: true, })); - it('Updates tags on matching URL on SHORT_URL_TAGS_EDITED', () => { + it('updates tags on matching URL on SHORT_URL_TAGS_EDITED', () => { const shortCode = 'abc123'; const tags = [ 'foo', 'bar', 'baz' ]; const state = { @@ -55,7 +56,7 @@ describe('shortUrlsListReducer', () => { }); }); - it('Updates meta on matching URL on SHORT_URL_META_EDITED', () => { + it('updates meta on matching URL on SHORT_URL_META_EDITED', () => { const shortCode = 'abc123'; const domain = 'example.com'; const meta = { @@ -83,7 +84,7 @@ describe('shortUrlsListReducer', () => { }); }); - it('Removes matching URL on SHORT_URL_DELETED', () => { + it('removes matching URL on SHORT_URL_DELETED', () => { const shortCode = 'abc123'; const state = { shortUrls: { @@ -101,6 +102,33 @@ describe('shortUrlsListReducer', () => { }, }); }); + + it('updates visits count on CREATE_SHORT_URL_VISIT', () => { + const shortCode = 'abc123'; + const shortUrl = { + shortCode, + visitsCount: 11, + }; + const state = { + shortUrls: { + data: [ + { shortCode, domain: 'example.com', visitsCount: 5 }, + { shortCode, visitsCount: 10 }, + { shortCode: 'foo', visitsCount: 8 }, + ], + }, + }; + + expect(reducer(state, { type: CREATE_SHORT_URL_VISIT, shortUrl })).toEqual({ + shortUrls: { + data: [ + { shortCode, domain: 'example.com', visitsCount: 5 }, + { shortCode, visitsCount: 11 }, + { shortCode: 'foo', visitsCount: 8 }, + ], + }, + }); + }); }); describe('listShortUrls', () => { diff --git a/test/visits/reducers/shortUrlVisits.test.js b/test/visits/reducers/shortUrlVisits.test.js index 82fdeede..5e2544f9 100644 --- a/test/visits/reducers/shortUrlVisits.test.js +++ b/test/visits/reducers/shortUrlVisits.test.js @@ -1,11 +1,13 @@ import reducer, { getShortUrlVisits, cancelGetShortUrlVisits, + createNewVisit, GET_SHORT_URL_VISITS_START, GET_SHORT_URL_VISITS_ERROR, GET_SHORT_URL_VISITS, GET_SHORT_URL_VISITS_LARGE, GET_SHORT_URL_VISITS_CANCEL, + CREATE_SHORT_URL_VISIT, } from '../../../src/visits/reducers/shortUrlVisits'; describe('shortUrlVisitsReducer', () => { @@ -48,6 +50,23 @@ describe('shortUrlVisitsReducer', () => { expect(error).toEqual(false); expect(visits).toEqual(actionVisits); }); + + it.each([ + [{ shortCode: 'abc123' }, [{}, {}, {}]], + [{ shortCode: 'def456' }, [{}, {}]], + ])('appends a new visit on CREATE_SHORT_URL_VISIT', (state, expectedVisits) => { + const shortUrl = { + shortCode: 'abc123', + }; + const prevState = { + ...state, + visits: [{}, {}], + }; + + const { visits } = reducer(prevState, { type: CREATE_SHORT_URL_VISIT, shortUrl, visit: {} }); + + expect(visits).toEqual(expectedVisits); + }); }); describe('getShortUrlVisits', () => { @@ -119,4 +138,11 @@ describe('shortUrlVisitsReducer', () => { it('just returns the action with proper type', () => expect(cancelGetShortUrlVisits()).toEqual({ type: GET_SHORT_URL_VISITS_CANCEL })); }); + + describe('createNewVisit', () => { + it('just returns the action with proper type', () => + expect(createNewVisit({ shortUrl: {}, visit: {} })).toEqual( + { type: CREATE_SHORT_URL_VISIT, shortUrl: {}, visit: {} } + )); + }); });