69 lines
2.3 KiB
TypeScript
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 } });
|
|
});
|
|
});
|