2021-06-24 19:22:12 +02:00
|
|
|
import EventEmitter from 'events';
|
2016-11-28 17:11:11 +01:00
|
|
|
|
2021-06-24 19:22:12 +02:00
|
|
|
import { ClientMetricsStore } from './client-metrics-store';
|
|
|
|
import getLogger from '../../test/fixtures/no-logger';
|
2016-11-28 17:11:11 +01:00
|
|
|
|
2017-06-28 10:17:14 +02:00
|
|
|
function getMockDb() {
|
2016-12-04 14:09:37 +01:00
|
|
|
const list = [
|
|
|
|
{ id: 4, metrics: { appName: 'test' } },
|
|
|
|
{ id: 3, metrics: { appName: 'test' } },
|
|
|
|
{ id: 2, metrics: { appName: 'test' } },
|
|
|
|
];
|
2016-11-28 17:11:11 +01:00
|
|
|
return {
|
2017-06-28 10:17:14 +02:00
|
|
|
getMetricsLastHour() {
|
2016-12-04 14:09:37 +01:00
|
|
|
return Promise.resolve([{ id: 1, metrics: { appName: 'test' } }]);
|
2016-11-28 17:11:11 +01:00
|
|
|
},
|
|
|
|
|
2017-06-28 10:17:14 +02:00
|
|
|
getNewMetrics() {
|
2016-11-28 17:11:11 +01:00
|
|
|
return Promise.resolve([list.pop() || { id: 0 }]);
|
2016-12-04 14:09:37 +01:00
|
|
|
},
|
2020-12-16 14:49:11 +01:00
|
|
|
destroy() {
|
|
|
|
// noop
|
|
|
|
},
|
2016-11-28 17:11:11 +01:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2021-05-28 11:10:24 +02:00
|
|
|
test('should call database on startup', done => {
|
|
|
|
jest.useFakeTimers('modern');
|
2016-11-28 17:11:11 +01:00
|
|
|
const mock = getMockDb();
|
2019-08-04 11:10:51 +02:00
|
|
|
const ee = new EventEmitter();
|
2021-06-24 19:22:12 +02:00
|
|
|
const store = new ClientMetricsStore(mock as any, ee, getLogger);
|
2016-12-04 14:09:37 +01:00
|
|
|
|
2021-05-28 11:10:24 +02:00
|
|
|
jest.runAllTicks();
|
|
|
|
|
|
|
|
expect.assertions(2);
|
2016-11-28 17:11:11 +01:00
|
|
|
|
2017-06-28 10:17:14 +02:00
|
|
|
store.on('metrics', metrics => {
|
2021-05-28 11:10:24 +02:00
|
|
|
expect(store.highestIdSeen).toBe(1);
|
|
|
|
expect(metrics.appName).toBe('test');
|
2016-11-28 17:11:11 +01:00
|
|
|
store.destroy();
|
2016-12-04 14:09:37 +01:00
|
|
|
|
2021-05-28 11:10:24 +02:00
|
|
|
done();
|
2016-11-28 17:11:11 +01:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2021-05-28 11:10:24 +02:00
|
|
|
test('should start poller even if initial database fetch fails', done => {
|
|
|
|
jest.useFakeTimers('modern');
|
2021-01-06 13:25:25 +01:00
|
|
|
getLogger.setMuteError(true);
|
2019-03-07 21:31:15 +01:00
|
|
|
const mock = getMockDb();
|
2020-04-14 22:29:11 +02:00
|
|
|
mock.getMetricsLastHour = () => Promise.reject(new Error('oops'));
|
2019-08-04 11:10:51 +02:00
|
|
|
const ee = new EventEmitter();
|
2021-06-24 19:22:12 +02:00
|
|
|
const store = new ClientMetricsStore(mock as any, ee, getLogger, 100);
|
2021-05-28 11:10:24 +02:00
|
|
|
jest.runAllTicks();
|
2019-03-07 21:31:15 +01:00
|
|
|
|
|
|
|
const metrics = [];
|
|
|
|
store.on('metrics', m => metrics.push(m));
|
|
|
|
|
|
|
|
store.on('ready', () => {
|
2021-05-28 11:10:24 +02:00
|
|
|
jest.useFakeTimers('modern');
|
|
|
|
expect(metrics).toHaveLength(0);
|
|
|
|
jest.advanceTimersByTime(300);
|
|
|
|
jest.useRealTimers();
|
2019-03-07 21:31:15 +01:00
|
|
|
process.nextTick(() => {
|
2021-05-28 11:10:24 +02:00
|
|
|
expect(metrics).toHaveLength(3);
|
|
|
|
expect(store.highestIdSeen).toBe(4);
|
2019-03-07 21:31:15 +01:00
|
|
|
store.destroy();
|
2021-05-28 11:10:24 +02:00
|
|
|
done();
|
2019-03-07 21:31:15 +01:00
|
|
|
});
|
|
|
|
});
|
2021-01-06 13:25:25 +01:00
|
|
|
getLogger.setMuteError(false);
|
2019-03-07 21:31:15 +01:00
|
|
|
});
|
|
|
|
|
2021-05-28 11:10:24 +02:00
|
|
|
test('should poll for updates', done => {
|
|
|
|
jest.useFakeTimers('modern');
|
2016-11-28 17:11:11 +01:00
|
|
|
const mock = getMockDb();
|
2019-08-04 11:10:51 +02:00
|
|
|
const ee = new EventEmitter();
|
2021-06-24 19:22:12 +02:00
|
|
|
const store = new ClientMetricsStore(mock as any, ee, getLogger, 100);
|
2021-05-28 11:10:24 +02:00
|
|
|
jest.runAllTicks();
|
2016-11-28 17:11:11 +01:00
|
|
|
|
|
|
|
const metrics = [];
|
2017-06-28 10:17:14 +02:00
|
|
|
store.on('metrics', m => metrics.push(m));
|
2016-11-28 17:11:11 +01:00
|
|
|
|
2021-05-28 11:10:24 +02:00
|
|
|
expect(metrics).toHaveLength(0);
|
2016-11-28 17:11:11 +01:00
|
|
|
|
|
|
|
store.on('ready', () => {
|
2021-05-28 11:10:24 +02:00
|
|
|
jest.useFakeTimers('modern');
|
|
|
|
expect(metrics).toHaveLength(1);
|
|
|
|
jest.advanceTimersByTime(300);
|
|
|
|
jest.useRealTimers();
|
2016-11-28 17:11:11 +01:00
|
|
|
process.nextTick(() => {
|
2021-05-28 11:10:24 +02:00
|
|
|
expect(metrics).toHaveLength(4);
|
|
|
|
expect(store.highestIdSeen).toBe(4);
|
2016-11-28 17:11:11 +01:00
|
|
|
store.destroy();
|
2021-05-28 11:10:24 +02:00
|
|
|
done();
|
2016-11-28 17:11:11 +01:00
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|