mirror of
https://github.com/Unleash/unleash.git
synced 2024-10-23 20:07:40 +02:00
232 lines
6.3 KiB
TypeScript
232 lines
6.3 KiB
TypeScript
|
import dbInit, { ITestDb } from '../../helpers/database-init';
|
||
|
import { setupAppWithCustomConfig } from '../../helpers/test-helper';
|
||
|
import getLogger from '../../../fixtures/no-logger';
|
||
|
import { IClientMetricsEnv } from '../../../../lib/types/stores/client-metrics-store-v2';
|
||
|
|
||
|
let app;
|
||
|
let db: ITestDb;
|
||
|
|
||
|
beforeAll(async () => {
|
||
|
db = await dbInit('client_metrics_serial', getLogger);
|
||
|
app = await setupAppWithCustomConfig(db.stores, {
|
||
|
experimental: { metricsV2: { enabled: true } },
|
||
|
});
|
||
|
});
|
||
|
|
||
|
afterAll(async () => {
|
||
|
if (db) {
|
||
|
await db.destroy();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
afterEach(async () => {
|
||
|
await db.reset();
|
||
|
await db.stores.clientMetricsStoreV2.deleteAll();
|
||
|
});
|
||
|
|
||
|
test('should return raw metrics, aggregated on key', async () => {
|
||
|
const date = new Date();
|
||
|
const metrics: IClientMetricsEnv[] = [
|
||
|
{
|
||
|
featureName: 'demo',
|
||
|
appName: 'web',
|
||
|
environment: 'default',
|
||
|
timestamp: date,
|
||
|
yes: 2,
|
||
|
no: 2,
|
||
|
},
|
||
|
{
|
||
|
featureName: 't2',
|
||
|
appName: 'web',
|
||
|
environment: 'default',
|
||
|
timestamp: date,
|
||
|
yes: 5,
|
||
|
no: 5,
|
||
|
},
|
||
|
{
|
||
|
featureName: 't2',
|
||
|
appName: 'web',
|
||
|
environment: 'default',
|
||
|
timestamp: date,
|
||
|
yes: 2,
|
||
|
no: 99,
|
||
|
},
|
||
|
{
|
||
|
featureName: 'demo',
|
||
|
appName: 'web',
|
||
|
environment: 'default',
|
||
|
timestamp: date,
|
||
|
yes: 3,
|
||
|
no: 2,
|
||
|
},
|
||
|
{
|
||
|
featureName: 'demo',
|
||
|
appName: 'web',
|
||
|
environment: 'test',
|
||
|
timestamp: date,
|
||
|
yes: 1,
|
||
|
no: 3,
|
||
|
},
|
||
|
];
|
||
|
|
||
|
await db.stores.clientMetricsStoreV2.batchInsertMetrics(metrics);
|
||
|
|
||
|
const { body: demo } = await app.request
|
||
|
.get('/api/admin/client-metrics/features/demo/raw')
|
||
|
.expect('Content-Type', /json/)
|
||
|
.expect(200);
|
||
|
const { body: t2 } = await app.request
|
||
|
.get('/api/admin/client-metrics/features/t2/raw')
|
||
|
.expect('Content-Type', /json/)
|
||
|
.expect(200);
|
||
|
|
||
|
expect(demo.data).toHaveLength(2);
|
||
|
expect(demo.data[0].environment).toBe('default');
|
||
|
expect(demo.data[0].yes).toBe(5);
|
||
|
expect(demo.data[0].no).toBe(4);
|
||
|
expect(demo.data[1].environment).toBe('test');
|
||
|
expect(demo.data[1].yes).toBe(1);
|
||
|
expect(demo.data[1].no).toBe(3);
|
||
|
|
||
|
expect(t2.data).toHaveLength(1);
|
||
|
expect(t2.data[0].environment).toBe('default');
|
||
|
expect(t2.data[0].yes).toBe(7);
|
||
|
expect(t2.data[0].no).toBe(104);
|
||
|
});
|
||
|
|
||
|
test('should return toggle summary', async () => {
|
||
|
const date = new Date();
|
||
|
const metrics: IClientMetricsEnv[] = [
|
||
|
{
|
||
|
featureName: 'demo',
|
||
|
appName: 'web',
|
||
|
environment: 'default',
|
||
|
timestamp: date,
|
||
|
yes: 2,
|
||
|
no: 2,
|
||
|
},
|
||
|
{
|
||
|
featureName: 't2',
|
||
|
appName: 'web',
|
||
|
environment: 'default',
|
||
|
timestamp: date,
|
||
|
yes: 5,
|
||
|
no: 5,
|
||
|
},
|
||
|
{
|
||
|
featureName: 't2',
|
||
|
appName: 'web',
|
||
|
environment: 'default',
|
||
|
timestamp: date,
|
||
|
yes: 2,
|
||
|
no: 99,
|
||
|
},
|
||
|
{
|
||
|
featureName: 'demo',
|
||
|
appName: 'web',
|
||
|
environment: 'default',
|
||
|
timestamp: date,
|
||
|
yes: 3,
|
||
|
no: 2,
|
||
|
},
|
||
|
{
|
||
|
featureName: 'demo',
|
||
|
appName: 'web',
|
||
|
environment: 'test',
|
||
|
timestamp: date,
|
||
|
yes: 1,
|
||
|
no: 3,
|
||
|
},
|
||
|
{
|
||
|
featureName: 'demo',
|
||
|
appName: 'backend-api',
|
||
|
environment: 'test',
|
||
|
timestamp: date,
|
||
|
yes: 1,
|
||
|
no: 3,
|
||
|
},
|
||
|
];
|
||
|
|
||
|
await db.stores.clientMetricsStoreV2.batchInsertMetrics(metrics);
|
||
|
|
||
|
const { body: demo } = await app.request
|
||
|
.get('/api/admin/client-metrics/features/demo')
|
||
|
.expect('Content-Type', /json/)
|
||
|
.expect(200);
|
||
|
|
||
|
expect(demo.featureName).toBe('demo');
|
||
|
expect(demo.lastHourUsage).toHaveLength(2);
|
||
|
expect(demo.lastHourUsage[0].environment).toBe('default');
|
||
|
expect(demo.lastHourUsage[0].yes).toBe(5);
|
||
|
expect(demo.lastHourUsage[0].no).toBe(4);
|
||
|
expect(demo.lastHourUsage[1].environment).toBe('test');
|
||
|
expect(demo.lastHourUsage[1].yes).toBe(2);
|
||
|
expect(demo.lastHourUsage[1].no).toBe(6);
|
||
|
expect(demo.seenApplications).toStrictEqual(['backend-api', 'web']);
|
||
|
});
|
||
|
|
||
|
test('should only include last hour of metrics return toggle summary', async () => {
|
||
|
const date = new Date();
|
||
|
const dateHoneHourAgo = new Date();
|
||
|
dateHoneHourAgo.setHours(-1);
|
||
|
const metrics: IClientMetricsEnv[] = [
|
||
|
{
|
||
|
featureName: 'demo',
|
||
|
appName: 'web',
|
||
|
environment: 'default',
|
||
|
timestamp: date,
|
||
|
yes: 2,
|
||
|
no: 2,
|
||
|
},
|
||
|
{
|
||
|
featureName: 'demo',
|
||
|
appName: 'web',
|
||
|
environment: 'default',
|
||
|
timestamp: date,
|
||
|
yes: 3,
|
||
|
no: 2,
|
||
|
},
|
||
|
{
|
||
|
featureName: 'demo',
|
||
|
appName: 'web',
|
||
|
environment: 'test',
|
||
|
timestamp: date,
|
||
|
yes: 1,
|
||
|
no: 3,
|
||
|
},
|
||
|
{
|
||
|
featureName: 'demo',
|
||
|
appName: 'backend-api',
|
||
|
environment: 'test',
|
||
|
timestamp: date,
|
||
|
yes: 1,
|
||
|
no: 3,
|
||
|
},
|
||
|
{
|
||
|
featureName: 'demo',
|
||
|
appName: 'backend-api',
|
||
|
environment: 'test',
|
||
|
timestamp: dateHoneHourAgo,
|
||
|
yes: 55,
|
||
|
no: 55,
|
||
|
},
|
||
|
];
|
||
|
|
||
|
await db.stores.clientMetricsStoreV2.batchInsertMetrics(metrics);
|
||
|
|
||
|
const { body: demo } = await app.request
|
||
|
.get('/api/admin/client-metrics/features/demo')
|
||
|
.expect('Content-Type', /json/)
|
||
|
.expect(200);
|
||
|
|
||
|
expect(demo.featureName).toBe('demo');
|
||
|
expect(demo.lastHourUsage).toHaveLength(2);
|
||
|
expect(demo.lastHourUsage[0].environment).toBe('default');
|
||
|
expect(demo.lastHourUsage[0].yes).toBe(5);
|
||
|
expect(demo.lastHourUsage[0].no).toBe(4);
|
||
|
expect(demo.lastHourUsage[1].environment).toBe('test');
|
||
|
expect(demo.lastHourUsage[1].yes).toBe(2);
|
||
|
expect(demo.lastHourUsage[1].no).toBe(6);
|
||
|
expect(demo.seenApplications).toStrictEqual(['backend-api', 'web']);
|
||
|
});
|