mirror of
https://github.com/grafana/grafana.git
synced 2025-01-09 15:43:23 -06:00
80 lines
2.5 KiB
TypeScript
80 lines
2.5 KiB
TypeScript
import { of } from 'rxjs';
|
|
|
|
import Api from './api';
|
|
import { backendSrv } from 'app/core/services/backend_srv'; // will use the version in __mocks__
|
|
import { createFetchResponse } from 'test/helpers/createFetchResponse';
|
|
|
|
jest.mock('@grafana/runtime', () => ({
|
|
...((jest.requireActual('@grafana/runtime') as unknown) as object),
|
|
getBackendSrv: () => backendSrv,
|
|
}));
|
|
|
|
const response = [
|
|
{ label: 'test1', value: 'test1' },
|
|
{ label: 'test2', value: 'test2' },
|
|
];
|
|
|
|
type Args = { path?: string; options?: any; response?: any; cache?: any };
|
|
|
|
async function getTestContext({ path = 'some-resource', options = {}, response = {}, cache }: Args = {}) {
|
|
jest.clearAllMocks();
|
|
|
|
const fetchMock = jest.spyOn(backendSrv, 'fetch');
|
|
|
|
fetchMock.mockImplementation((options: any) => {
|
|
const data = { [options.url.match(/([^\/]*)\/*$/)![1].split('?')[0]]: response };
|
|
return of(createFetchResponse(data));
|
|
});
|
|
|
|
const api = new Api('/cloudmonitoring/');
|
|
|
|
if (cache) {
|
|
api.cache[path] = cache;
|
|
}
|
|
|
|
const res = await api.get(path, options);
|
|
|
|
return { res, api, fetchMock };
|
|
}
|
|
|
|
describe('api', () => {
|
|
describe('when resource was cached', () => {
|
|
test.each(['some-resource', 'some-resource?some=param', 'test/some-resource?param'])(
|
|
'should return cached value and not load from source',
|
|
async (path) => {
|
|
const { res, api, fetchMock } = await getTestContext({ path, cache: response });
|
|
|
|
expect(res).toEqual(response);
|
|
expect(api.cache[path]).toEqual(response);
|
|
expect(fetchMock).not.toHaveBeenCalled();
|
|
}
|
|
);
|
|
});
|
|
|
|
describe('when resource was not cached', () => {
|
|
test.each(['some-resource', 'some-resource?some=param', 'test/some-resource?param'])(
|
|
'should return from source and not from cache',
|
|
async (path) => {
|
|
const { res, api, fetchMock } = await getTestContext({ path, response });
|
|
|
|
expect(res).toEqual(response);
|
|
expect(api.cache[path]).toEqual(response);
|
|
expect(fetchMock).toHaveBeenCalled();
|
|
}
|
|
);
|
|
});
|
|
|
|
describe('when cache should be bypassed', () => {
|
|
test.each(['some-resource', 'some-resource?some=param', 'test/some-resource?param'])(
|
|
'should return from source and not from cache',
|
|
async (path) => {
|
|
const options = { useCache: false };
|
|
const { res, fetchMock } = await getTestContext({ path, response, cache: response, options });
|
|
|
|
expect(res).toEqual(response);
|
|
expect(fetchMock).toHaveBeenCalled();
|
|
}
|
|
);
|
|
});
|
|
});
|