'use strict'; const { test } = require('ava'); const ClientMetricStore = require('./client-metrics-store'); const sinon = require('sinon'); function getMockDb () { const list = [{ id: 4, metrics: {appName: 'test'} }, { id: 3, metrics: {appName: 'test'} }, { id: 2, metrics: {appName: 'test'} }]; return { getMetricsLastHour () { return Promise.resolve([{ id: 1, metrics: {appName: 'test'} }]); }, getNewMetrics (v) { return Promise.resolve([list.pop() || { id: 0 }]); } }; } test.cb('should call database on startup', (t) => { const mock = getMockDb(); const store = new ClientMetricStore(mock); t.plan(2); store.on('metrics', (metrics) => { t.true(store.highestIdSeen === 1); t.true(metrics.appName === 'test'); store.destroy(); t.end(); }); }); test.cb('should poll for updates', (t) => { const clock = sinon.useFakeTimers(); const mock = getMockDb(); const store = new ClientMetricStore(mock, 100); const metrics = []; store.on('metrics', (m) => metrics.push(m)); t.true(metrics.length === 0); store.on('ready', () => { t.true(metrics.length === 1); clock.tick(300); process.nextTick(() => { t.true(metrics.length === 4); t.true(store.highestIdSeen === 4); store.destroy(); clock.restore(); t.end(); }); }); });