Skip to content

Commit 5042806

Browse files
author
John Doe
committed
refactor: wip
1 parent e13b59e commit 5042806

File tree

4 files changed

+103
-48
lines changed

4 files changed

+103
-48
lines changed

testing/test-setup-config/src/lib/vitest-setup-files.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ const UNIT_TEST_SETUP_FILES = [
2727
'../../testing/test-setup/src/lib/performance.setup-file.ts',
2828
'../../testing/test-setup/src/lib/portal-client.mock.ts',
2929
'../../testing/test-setup/src/lib/process.setup-file.ts',
30-
'../../testing/test-setup/src/lib/clock.setup-file.ts',
3130
...CUSTOM_MATCHERS,
3231
] as const;
3332

testing/test-setup/src/lib/clock.setup-file.ts

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 101 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,109 @@
1-
import { vi } from 'vitest';
1+
import type { PerformanceEntry } from 'node:perf_hooks';
2+
import { type MockInstance, afterEach, beforeEach, vi } from 'vitest';
23
import { MockPerformanceObserver } from '@code-pushup/test-utils';
34

5+
const MOCK_DATE_NOW_MS = 1_000_000;
6+
const MOCK_TIME_ORIGIN = 500_000;
7+
8+
const dateNow = MOCK_DATE_NOW_MS;
9+
const performanceTimeOrigin = MOCK_TIME_ORIGIN;
10+
11+
/* eslint-disable functional/no-let */
12+
let dateNowSpy: MockInstance<[], number> | undefined;
13+
/* eslint-enable functional/no-let */
14+
15+
const clearPerformanceEntries = (
16+
entryType: 'mark' | 'measure',
17+
name?: string,
18+
) => {
19+
if (name) {
20+
const index = MockPerformanceObserver.globalEntries.findIndex(
21+
entry => entry.entryType === entryType && entry.name === name,
22+
);
23+
if (index > -1) MockPerformanceObserver.globalEntries.splice(index, 1);
24+
} else {
25+
MockPerformanceObserver.globalEntries =
26+
MockPerformanceObserver.globalEntries.filter(
27+
entry => entry.entryType !== entryType,
28+
);
29+
}
30+
};
31+
432
vi.mock('node:perf_hooks', () => ({
533
performance: {
6-
getEntriesByType: vi.fn((type: string) => {
7-
const entries =
8-
MockPerformanceObserver.lastInstance()?.bufferedEntries || [];
9-
return entries.filter(entry => entry.entryType === type);
34+
getEntries: vi.fn(() => MockPerformanceObserver.globalEntries.slice()),
35+
getEntriesByType: vi.fn((type: string) =>
36+
MockPerformanceObserver.globalEntries.filter(
37+
entry => entry.entryType === type,
38+
),
39+
),
40+
getEntriesByName: vi.fn((name: string, type?: string) =>
41+
MockPerformanceObserver.globalEntries.filter(
42+
entry =>
43+
entry.name === name &&
44+
(type === undefined || entry.entryType === type),
45+
),
46+
),
47+
mark: vi.fn((name: string) => {
48+
const entry: PerformanceEntry = {
49+
name,
50+
entryType: 'mark',
51+
startTime: performance.now(),
52+
duration: 0,
53+
} as PerformanceEntry;
54+
MockPerformanceObserver.globalEntries.push(entry);
55+
}),
56+
measure: vi.fn((name: string, startMark?: string, endMark?: string) => {
57+
const startEntry = startMark
58+
? MockPerformanceObserver.globalEntries.find(
59+
entry => entry.name === startMark && entry.entryType === 'mark',
60+
)
61+
: undefined;
62+
const endEntry = endMark
63+
? MockPerformanceObserver.globalEntries.find(
64+
entry => entry.name === endMark && entry.entryType === 'mark',
65+
)
66+
: undefined;
67+
68+
const startTime = startEntry ? startEntry.startTime : performance.now();
69+
const endTime = endEntry ? endEntry.startTime : performance.now();
70+
71+
const entry: PerformanceEntry = {
72+
name,
73+
entryType: 'measure',
74+
startTime,
75+
duration: endTime - startTime,
76+
} as PerformanceEntry;
77+
MockPerformanceObserver.globalEntries.push(entry);
1078
}),
11-
clearMarks: vi.fn(),
12-
clearMeasures: vi.fn(),
79+
clearMarks: vi.fn((name?: string) => clearPerformanceEntries('mark', name)),
80+
clearMeasures: vi.fn((name?: string) =>
81+
clearPerformanceEntries('measure', name),
82+
),
83+
now: vi.fn(() => Date.now()),
1384
},
1485
PerformanceObserver: MockPerformanceObserver,
1586
}));
87+
88+
beforeEach(() => {
89+
// Mock browser timing APIs
90+
dateNowSpy = vi.spyOn(Date, 'now').mockReturnValue(dateNow);
91+
92+
// Mock global performance.timeOrigin for browser API
93+
vi.stubGlobal('performance', {
94+
timeOrigin: performanceTimeOrigin,
95+
now: vi.fn(() => dateNow - performanceTimeOrigin),
96+
});
97+
98+
// Clear performance observer entries for clean test state
99+
MockPerformanceObserver.globalEntries = [];
100+
});
101+
102+
afterEach(() => {
103+
vi.unstubAllGlobals();
104+
105+
if (dateNowSpy) {
106+
dateNowSpy.mockRestore();
107+
dateNowSpy = undefined;
108+
}
109+
});

testing/test-utils/src/lib/utils/performance-observer.mock.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ type EntryLike = Pick<
55

66
export class MockPerformanceObserver {
77
static instances: MockPerformanceObserver[] = [];
8+
static globalEntries: PerformanceEntry[] = [];
89

910
static lastInstance(): MockPerformanceObserver | undefined {
1011
return this.instances.at(-1);
1112
}
1213

1314
buffered = false;
1415
private observing = false;
15-
bufferedEntries: PerformanceEntry[] = [];
1616

1717
constructor(cb: PerformanceObserverCallback) {
1818
MockPerformanceObserver.instances.push(this);
@@ -25,7 +25,6 @@ export class MockPerformanceObserver {
2525

2626
disconnect() {
2727
this.observing = false;
28-
this.bufferedEntries = [];
2928
const index = MockPerformanceObserver.instances.indexOf(this);
3029
if (index > -1) {
3130
MockPerformanceObserver.instances.splice(index, 1);
@@ -37,7 +36,7 @@ export class MockPerformanceObserver {
3736
if (!this.observing) return;
3837

3938
const perfEntries = entries as unknown as PerformanceEntry[];
40-
this.bufferedEntries.push(...perfEntries);
39+
MockPerformanceObserver.globalEntries.push(...perfEntries);
4140

4241
// For unit tests, don't call the callback automatically to avoid complex interactions
4342
// Just buffer the entries so takeRecords() can return them

0 commit comments

Comments
 (0)