'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() { 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(); }); }); });