gitlab-org--gitlab-foss/spec/javascripts/lib/utils/users_cache_spec.js

139 lines
3.7 KiB
JavaScript
Raw Normal View History

2017-05-16 10:56:28 +00:00
import Api from '~/api';
import UsersCache from '~/lib/utils/users_cache';
describe('UsersCache', () => {
const dummyUsername = 'win';
const dummyUser = 'has a farm';
beforeEach(() => {
2018-10-17 07:13:26 +00:00
UsersCache.internalStorage = {};
2017-05-16 10:56:28 +00:00
});
describe('get', () => {
it('returns undefined for empty cache', () => {
2018-10-17 07:13:26 +00:00
expect(UsersCache.internalStorage).toEqual({});
2017-05-16 10:56:28 +00:00
const user = UsersCache.get(dummyUsername);
expect(user).toBe(undefined);
});
it('returns undefined for missing user', () => {
UsersCache.internalStorage['no body'] = 'no data';
const user = UsersCache.get(dummyUsername);
expect(user).toBe(undefined);
});
it('returns matching user', () => {
UsersCache.internalStorage[dummyUsername] = dummyUser;
const user = UsersCache.get(dummyUsername);
expect(user).toBe(dummyUser);
});
});
describe('hasData', () => {
it('returns false for empty cache', () => {
2018-10-17 07:13:26 +00:00
expect(UsersCache.internalStorage).toEqual({});
2017-05-16 10:56:28 +00:00
expect(UsersCache.hasData(dummyUsername)).toBe(false);
});
it('returns false for missing user', () => {
UsersCache.internalStorage['no body'] = 'no data';
expect(UsersCache.hasData(dummyUsername)).toBe(false);
});
it('returns true for matching user', () => {
UsersCache.internalStorage[dummyUsername] = dummyUser;
expect(UsersCache.hasData(dummyUsername)).toBe(true);
});
});
describe('remove', () => {
it('does nothing if cache is empty', () => {
2018-10-17 07:13:26 +00:00
expect(UsersCache.internalStorage).toEqual({});
2017-05-16 10:56:28 +00:00
UsersCache.remove(dummyUsername);
2018-10-17 07:13:26 +00:00
expect(UsersCache.internalStorage).toEqual({});
2017-05-16 10:56:28 +00:00
});
it('does nothing if cache contains no matching data', () => {
UsersCache.internalStorage['no body'] = 'no data';
UsersCache.remove(dummyUsername);
expect(UsersCache.internalStorage['no body']).toBe('no data');
});
it('removes matching data', () => {
UsersCache.internalStorage[dummyUsername] = dummyUser;
UsersCache.remove(dummyUsername);
2018-10-17 07:13:26 +00:00
expect(UsersCache.internalStorage).toEqual({});
2017-05-16 10:56:28 +00:00
});
});
describe('retrieve', () => {
let apiSpy;
beforeEach(() => {
spyOn(Api, 'users').and.callFake((query, options) => apiSpy(query, options));
});
2018-10-17 07:13:26 +00:00
it('stores and returns data from API call if cache is empty', done => {
2017-05-16 10:56:28 +00:00
apiSpy = (query, options) => {
expect(query).toBe('');
expect(options).toEqual({ username: dummyUsername });
2018-01-26 08:49:12 +00:00
return Promise.resolve({
data: [dummyUser],
});
2017-05-16 10:56:28 +00:00
};
UsersCache.retrieve(dummyUsername)
2018-10-17 07:13:26 +00:00
.then(user => {
expect(user).toBe(dummyUser);
expect(UsersCache.internalStorage[dummyUsername]).toBe(dummyUser);
})
.then(done)
.catch(done.fail);
2017-05-16 10:56:28 +00:00
});
2018-10-17 07:13:26 +00:00
it('returns undefined if Ajax call fails and cache is empty', done => {
2017-05-16 10:56:28 +00:00
const dummyError = new Error('server exploded');
apiSpy = (query, options) => {
expect(query).toBe('');
expect(options).toEqual({ username: dummyUsername });
return Promise.reject(dummyError);
};
UsersCache.retrieve(dummyUsername)
2018-10-17 07:13:26 +00:00
.then(user => fail(`Received unexpected user: ${JSON.stringify(user)}`))
.catch(error => {
expect(error).toBe(dummyError);
})
.then(done)
.catch(done.fail);
2017-05-16 10:56:28 +00:00
});
2018-10-17 07:13:26 +00:00
it('makes no Ajax call if matching data exists', done => {
2017-05-16 10:56:28 +00:00
UsersCache.internalStorage[dummyUsername] = dummyUser;
apiSpy = () => fail(new Error('expected no Ajax call!'));
UsersCache.retrieve(dummyUsername)
2018-10-17 07:13:26 +00:00
.then(user => {
expect(user).toBe(dummyUser);
})
.then(done)
.catch(done.fail);
2017-05-16 10:56:28 +00:00
});
});
});