Files
umami/src/queries/sql/performance/getPerformance.test.ts
T

69 lines
2.3 KiB
TypeScript

import { beforeEach, describe, expect, test, vi } from 'vitest';
import { getPerformance } from './getPerformance';
import { getPerformanceChart } from './getPerformanceChart';
import { getPerformanceStats } from './getPerformanceStats';
const mocks = vi.hoisted(() => ({
backend: 'prisma',
rawQuery: vi.fn(),
parseFilters: vi.fn(() => ({
queryParams: {},
filterQuery: 'and filtered',
cohortQuery: '',
joinSessionQuery: '',
})),
}));
vi.mock('@/lib/db', () => ({
PRISMA: 'prisma',
CLICKHOUSE: 'clickhouse',
runQuery: (queries: any) => queries[mocks.backend](),
}));
vi.mock('@/lib/prisma', () => ({
default: {
rawQuery: mocks.rawQuery,
parseFilters: mocks.parseFilters,
getDateSQL: () => 'bucket',
},
}));
vi.mock('@/lib/clickhouse', () => ({
default: {
rawQuery: mocks.rawQuery,
parseFilters: mocks.parseFilters,
getDateSQL: () => 'bucket',
},
}));
const parameters = {
startDate: new Date(1000),
endDate: new Date(2000),
unit: 'day',
timezone: 'UTC',
metric: 'inp',
};
describe.each(['prisma', 'clickhouse'])('%s performance datasets', backend => {
beforeEach(() => {
mocks.backend = backend;
mocks.rawQuery.mockReset().mockResolvedValue([]);
});
test('chart executes only the selected metric time series', async () => {
expect(await getPerformanceChart('website', parameters, {})).toEqual({ chart: [] });
expect(mocks.rawQuery).toHaveBeenCalledTimes(1);
const sql = mocks.rawQuery.mock.calls[0][0];
expect(sql).toContain('inp');
expect(sql).toContain('group by t');
expect(sql).not.toContain('lcp_p50');
expect(sql).toContain('and filtered');
});
test('stats executes only the summary and preserves empty-result defaults', async () => {
const stats = await getPerformanceStats('website', parameters, {});
expect(stats.count).toBe(0);
expect(stats.lcp).toEqual({ p50: 0, p75: 0, p95: 0 });
expect(mocks.rawQuery).toHaveBeenCalledTimes(1);
expect(mocks.rawQuery.mock.calls[0][0]).not.toContain('group by t');
});
test('legacy composition preserves the chart and summary shape', async () => {
const result = await getPerformance('website', parameters, {});
expect(mocks.rawQuery).toHaveBeenCalledTimes(2);
expect(result).toMatchObject({ chart: [], summary: { count: 0 } });
});
});