-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
Copy pathmockRrweb.ts
62 lines (48 loc) · 1.69 KB
/
mockRrweb.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import { vi } from 'vitest';
import type { Mock, MockedFunction } from 'vitest';
import { record } from '@sentry-internal/rrweb';
import type { RecordingEvent, ReplayEventWithTime } from '../../src/types';
import { ReplayEventTypeFullSnapshot, ReplayEventTypeIncrementalSnapshot } from '../../src/types';
vi.mock('@sentry-internal/rrweb', async () => {
const mockRecordFn: Mock & Partial<RecordAdditionalProperties> = vi.fn(({ emit }) => {
mockRecordFn._emitter = emit;
emit(createCheckoutPayload());
return function stop() {
mockRecordFn._emitter = vi.fn();
};
});
mockRecordFn.takeFullSnapshot = vi.fn((isCheckout: boolean) => {
if (!mockRecordFn._emitter) {
return;
}
mockRecordFn._emitter(createCheckoutPayload(isCheckout), isCheckout);
});
const ActualRrweb = await vi.importActual('@sentry-internal/rrweb');
mockRecordFn.mirror = ActualRrweb.record.mirror;
return {
...ActualRrweb,
record: mockRecordFn,
};
});
type RecordAdditionalProperties = {
takeFullSnapshot: Mock;
// Below are not mocked
addCustomEvent: () => void;
freezePage: () => void;
mirror: unknown;
// Custom property to fire events in tests, does not exist in rrweb.record
_emitter: (event: RecordingEvent, ...args: any[]) => void;
};
export type RecordMock = MockedFunction<typeof record> & RecordAdditionalProperties;
function createCheckoutPayload(isCheckout: boolean = true): ReplayEventWithTime {
return {
data: { isCheckout },
timestamp: Date.now(),
type: isCheckout ? ReplayEventTypeFullSnapshot : ReplayEventTypeIncrementalSnapshot,
};
}
export function mockRrweb(): { record: RecordMock } {
return {
record: record as RecordMock,
};
}