-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
Copy pathclient.test.ts
120 lines (94 loc) · 3.98 KB
/
client.test.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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/**
* @vitest-environment jsdom
*/
import * as sentryCore from '@sentry/core';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { BrowserClient } from '../src/client';
import { WINDOW } from '../src/helpers';
import { getDefaultBrowserClientOptions } from './helper/browser-client-options';
vi.mock('@sentry/core', async requireActual => {
return {
...((await requireActual()) as any),
_INTERNAL_flushLogsBuffer: vi.fn(),
};
});
describe('BrowserClient', () => {
let client: BrowserClient;
const DEFAULT_FLUSH_INTERVAL = 5000;
afterEach(() => {
vi.useRealTimers();
vi.clearAllMocks();
});
it('does not flush logs when logs are disabled', () => {
client = new BrowserClient(
getDefaultBrowserClientOptions({
_experiments: { enableLogs: false },
sendClientReports: true,
}),
);
// Add some logs
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 1' }, client);
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 2' }, client);
// Simulate visibility change to hidden
if (WINDOW.document) {
Object.defineProperty(WINDOW.document, 'visibilityState', { value: 'hidden' });
WINDOW.document.dispatchEvent(new Event('visibilitychange'));
}
expect(sentryCore._INTERNAL_flushLogsBuffer).not.toHaveBeenCalled();
});
describe('log flushing', () => {
beforeEach(() => {
vi.useFakeTimers();
client = new BrowserClient(
getDefaultBrowserClientOptions({
_experiments: { enableLogs: true },
sendClientReports: true,
}),
);
});
it('flushes logs when page visibility changes to hidden', () => {
const flushOutcomesSpy = vi.spyOn(client as any, '_flushOutcomes');
// Add some logs
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 1' }, client);
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 2' }, client);
// Simulate visibility change to hidden
if (WINDOW.document) {
Object.defineProperty(WINDOW.document, 'visibilityState', { value: 'hidden' });
WINDOW.document.dispatchEvent(new Event('visibilitychange'));
}
expect(flushOutcomesSpy).toHaveBeenCalled();
expect(sentryCore._INTERNAL_flushLogsBuffer).toHaveBeenCalledWith(client);
});
it('flushes logs on flush event', () => {
// Add some logs
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 1' }, client);
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 2' }, client);
// Trigger flush event
client.emit('flush');
expect(sentryCore._INTERNAL_flushLogsBuffer).toHaveBeenCalledWith(client);
});
it('flushes logs after idle timeout', () => {
// Add a log which will trigger afterCaptureLog event
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log' }, client);
// Fast forward the idle timeout
vi.advanceTimersByTime(DEFAULT_FLUSH_INTERVAL);
expect(sentryCore._INTERNAL_flushLogsBuffer).toHaveBeenCalledWith(client);
});
it('resets idle timeout when new logs are captured', () => {
// Add initial log
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 1' }, client);
// Fast forward part of the idle timeout
vi.advanceTimersByTime(DEFAULT_FLUSH_INTERVAL / 2);
// Add another log which should reset the timeout
sentryCore._INTERNAL_captureLog({ level: 'info', message: 'test log 2' }, client);
// Fast forward the remaining time
vi.advanceTimersByTime(DEFAULT_FLUSH_INTERVAL / 2);
// Should not have flushed yet since timeout was reset
expect(sentryCore._INTERNAL_flushLogsBuffer).not.toHaveBeenCalled();
// Fast forward the full timeout
vi.advanceTimersByTime(DEFAULT_FLUSH_INTERVAL);
// Now should have flushed both logs
expect(sentryCore._INTERNAL_flushLogsBuffer).toHaveBeenCalledWith(client);
});
});
});