debian-mirror-gitlab/spec/frontend/lib/utils/ajax_cache_spec.js

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

162 lines
4.5 KiB
JavaScript
Raw Normal View History

2018-03-17 18:26:18 +05:30
import MockAdapter from 'axios-mock-adapter';
2017-08-17 22:00:37 +05:30
import AjaxCache from '~/lib/utils/ajax_cache';
2021-03-11 19:13:27 +05:30
import axios from '~/lib/utils/axios_utils';
2017-08-17 22:00:37 +05:30
describe('AjaxCache', () => {
const dummyEndpoint = '/AjaxCache/dummyEndpoint';
const dummyResponse = {
important: 'dummy data',
};
beforeEach(() => {
2018-12-13 13:39:08 +05:30
AjaxCache.internalStorage = {};
AjaxCache.pendingRequests = {};
2017-08-17 22:00:37 +05:30
});
2017-09-10 17:25:29 +05:30
describe('get', () => {
2017-08-17 22:00:37 +05:30
it('returns undefined if cache is empty', () => {
const data = AjaxCache.get(dummyEndpoint);
expect(data).toBe(undefined);
});
it('returns undefined if cache contains no matching data', () => {
AjaxCache.internalStorage['not matching'] = dummyResponse;
const data = AjaxCache.get(dummyEndpoint);
expect(data).toBe(undefined);
});
it('returns matching data', () => {
AjaxCache.internalStorage[dummyEndpoint] = dummyResponse;
const data = AjaxCache.get(dummyEndpoint);
expect(data).toBe(dummyResponse);
});
});
2017-09-10 17:25:29 +05:30
describe('hasData', () => {
2017-08-17 22:00:37 +05:30
it('returns false if cache is empty', () => {
expect(AjaxCache.hasData(dummyEndpoint)).toBe(false);
});
it('returns false if cache contains no matching data', () => {
AjaxCache.internalStorage['not matching'] = dummyResponse;
expect(AjaxCache.hasData(dummyEndpoint)).toBe(false);
});
it('returns true if data is available', () => {
AjaxCache.internalStorage[dummyEndpoint] = dummyResponse;
expect(AjaxCache.hasData(dummyEndpoint)).toBe(true);
});
});
2017-09-10 17:25:29 +05:30
describe('remove', () => {
2017-08-17 22:00:37 +05:30
it('does nothing if cache is empty', () => {
2017-09-10 17:25:29 +05:30
AjaxCache.remove(dummyEndpoint);
2017-08-17 22:00:37 +05:30
2018-12-13 13:39:08 +05:30
expect(AjaxCache.internalStorage).toEqual({});
2017-08-17 22:00:37 +05:30
});
it('does nothing if cache contains no matching data', () => {
AjaxCache.internalStorage['not matching'] = dummyResponse;
2017-09-10 17:25:29 +05:30
AjaxCache.remove(dummyEndpoint);
2017-08-17 22:00:37 +05:30
expect(AjaxCache.internalStorage['not matching']).toBe(dummyResponse);
});
it('removes matching data', () => {
AjaxCache.internalStorage[dummyEndpoint] = dummyResponse;
2017-09-10 17:25:29 +05:30
AjaxCache.remove(dummyEndpoint);
2017-08-17 22:00:37 +05:30
2018-12-13 13:39:08 +05:30
expect(AjaxCache.internalStorage).toEqual({});
2017-08-17 22:00:37 +05:30
});
});
2017-09-10 17:25:29 +05:30
describe('override', () => {
it('overrides existing cache', () => {
AjaxCache.internalStorage.endpoint = 'existing-endpoint';
AjaxCache.override('endpoint', 'new-endpoint');
expect(AjaxCache.internalStorage.endpoint).toEqual('new-endpoint');
});
});
describe('retrieve', () => {
2018-03-17 18:26:18 +05:30
let mock;
2017-09-10 17:25:29 +05:30
beforeEach(() => {
2018-03-17 18:26:18 +05:30
mock = new MockAdapter(axios);
2019-07-07 11:18:12 +05:30
jest.spyOn(axios, 'get');
2018-03-17 18:26:18 +05:30
});
afterEach(() => {
mock.restore();
2017-09-10 17:25:29 +05:30
});
2019-07-07 11:18:12 +05:30
it('stores and returns data from Ajax call if cache is empty', () => {
2018-03-17 18:26:18 +05:30
mock.onGet(dummyEndpoint).reply(200, dummyResponse);
2017-09-10 17:25:29 +05:30
2021-03-08 18:12:59 +05:30
return AjaxCache.retrieve(dummyEndpoint).then((data) => {
2019-07-07 11:18:12 +05:30
expect(data).toEqual(dummyResponse);
expect(AjaxCache.internalStorage[dummyEndpoint]).toEqual(dummyResponse);
});
2017-08-17 22:00:37 +05:30
});
2019-07-07 11:18:12 +05:30
it('makes no Ajax call if request is pending', () => {
2018-03-17 18:26:18 +05:30
mock.onGet(dummyEndpoint).reply(200, dummyResponse);
2017-09-10 17:25:29 +05:30
2019-07-07 11:18:12 +05:30
return Promise.all([
AjaxCache.retrieve(dummyEndpoint),
AjaxCache.retrieve(dummyEndpoint),
]).then(() => {
expect(axios.get).toHaveBeenCalledTimes(1);
});
2017-09-10 17:25:29 +05:30
});
2019-07-07 11:18:12 +05:30
it('returns undefined if Ajax call fails and cache is empty', () => {
2018-03-17 18:26:18 +05:30
const errorMessage = 'Network Error';
mock.onGet(dummyEndpoint).networkError();
2017-08-17 22:00:37 +05:30
2019-07-07 11:18:12 +05:30
expect.assertions(2);
2021-03-08 18:12:59 +05:30
return AjaxCache.retrieve(dummyEndpoint).catch((error) => {
2019-07-07 11:18:12 +05:30
expect(error.message).toBe(`${dummyEndpoint}: ${errorMessage}`);
expect(error.textStatus).toBe(errorMessage);
});
2017-08-17 22:00:37 +05:30
});
2019-07-07 11:18:12 +05:30
it('makes no Ajax call if matching data exists', () => {
2017-08-17 22:00:37 +05:30
AjaxCache.internalStorage[dummyEndpoint] = dummyResponse;
2019-05-30 16:15:17 +05:30
2021-03-08 18:12:59 +05:30
return AjaxCache.retrieve(dummyEndpoint).then((data) => {
2019-07-07 11:18:12 +05:30
expect(data).toBe(dummyResponse);
expect(axios.get).not.toHaveBeenCalled();
});
2017-08-17 22:00:37 +05:30
});
2017-09-10 17:25:29 +05:30
2019-07-07 11:18:12 +05:30
it('makes Ajax call even if matching data exists when forceRequest parameter is provided', () => {
2017-09-10 17:25:29 +05:30
const oldDummyResponse = {
important: 'old dummy data',
};
AjaxCache.internalStorage[dummyEndpoint] = oldDummyResponse;
2018-03-17 18:26:18 +05:30
mock.onGet(dummyEndpoint).reply(200, dummyResponse);
2017-09-10 17:25:29 +05:30
2019-07-07 11:18:12 +05:30
return Promise.all([
AjaxCache.retrieve(dummyEndpoint),
AjaxCache.retrieve(dummyEndpoint, true),
2021-03-08 18:12:59 +05:30
]).then((data) => {
2019-07-07 11:18:12 +05:30
expect(data).toEqual([oldDummyResponse, dummyResponse]);
});
2017-09-10 17:25:29 +05:30
});
2017-08-17 22:00:37 +05:30
});
});