-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test(browser): Switch from jest to vitest (#13092)
Before: `Time: 10.517 s` After: `Duration 3.65s (transform 2.76s, setup 7ms, collect 15.44s, tests 1.36s, environment 4.96s, prepare 3.63s)` We also change the folder structure of the browser unit tests, because we've removed the in-package integration tests. This change also removes `environment: 'jsdom'` from the central config in favour of explicitly adding jsdom environment via the `@vitest-environment` pragma to the specific test file that needs it. This should means that our tests are not polluted with jsdom globals, and that future writers have to explicitly opt-in to the behaviour.
- Loading branch information
1 parent
6285808
commit 21b0dae
Showing
36 changed files
with
303 additions
and
226 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletion
2
...est/unit/helper/browser-client-options.ts → ...ser/test/helper/browser-client-options.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
6 changes: 4 additions & 2 deletions
6
...r/test/unit/index.bundle.feedback.test.ts → ...rowser/test/index.bundle.feedback.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
6 changes: 4 additions & 2 deletions
6
...ser/test/unit/index.bundle.replay.test.ts → .../browser/test/index.bundle.replay.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
4 changes: 3 additions & 1 deletion
4
...es/browser/test/unit/index.bundle.test.ts → packages/browser/test/index.bundle.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
6 changes: 4 additions & 2 deletions
6
...ex.bundle.tracing.replay.feedback.test.ts → ...ex.bundle.tracing.replay.feedback.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
6 changes: 4 additions & 2 deletions
6
.../unit/index.bundle.tracing.replay.test.ts → .../test/index.bundle.tracing.replay.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
6 changes: 4 additions & 2 deletions
6
...er/test/unit/index.bundle.tracing.test.ts → ...browser/test/index.bundle.tracing.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,10 @@ | ||
/** | ||
* @vitest-environment jsdom | ||
*/ | ||
|
||
import type { Mock } from 'vitest'; | ||
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; | ||
|
||
import { | ||
SDK_VERSION, | ||
getGlobalScope, | ||
|
@@ -8,7 +15,7 @@ import { | |
} from '@sentry/core'; | ||
import * as utils from '@sentry/utils'; | ||
|
||
import { setCurrentClient } from '../../src'; | ||
import { setCurrentClient } from '../src'; | ||
import { | ||
BrowserClient, | ||
Scope, | ||
|
@@ -22,7 +29,7 @@ import { | |
getCurrentScope, | ||
init, | ||
showReportDialog, | ||
} from '../../src'; | ||
} from '../src'; | ||
import { getDefaultBrowserClientOptions } from './helper/browser-client-options'; | ||
import { makeSimpleTransport } from './mocks/simpletransport'; | ||
|
||
|
@@ -31,16 +38,15 @@ const dsn = 'https://[email protected]/4291'; | |
// eslint-disable-next-line no-var | ||
declare var global: any; | ||
|
||
jest.mock('@sentry/core', () => { | ||
const original = jest.requireActual('@sentry/core'); | ||
vi.mock('@sentry/core', async requireActual => { | ||
return { | ||
...original, | ||
getReportDialogEndpoint: jest.fn(), | ||
...((await requireActual()) as any), | ||
getReportDialogEndpoint: vi.fn(), | ||
}; | ||
}); | ||
|
||
describe('SentryBrowser', () => { | ||
const beforeSend = jest.fn(event => event); | ||
const beforeSend = vi.fn(event => event); | ||
|
||
beforeEach(() => { | ||
getGlobalScope().clear(); | ||
|
@@ -84,7 +90,7 @@ describe('SentryBrowser', () => { | |
|
||
describe('showReportDialog', () => { | ||
beforeEach(() => { | ||
(getReportDialogEndpoint as jest.Mock).mockReset(); | ||
(getReportDialogEndpoint as Mock).mockReset(); | ||
}); | ||
|
||
describe('user', () => { | ||
|
@@ -145,14 +151,14 @@ describe('SentryBrowser', () => { | |
}); | ||
|
||
describe('onClose', () => { | ||
const dummyErrorHandler = jest.fn(); | ||
const dummyErrorHandler = vi.fn(); | ||
beforeEach(() => { | ||
// this prevents jest-environment-jsdom from failing the test | ||
// this prevents vi-environment-jsdom from failing the test | ||
// when an error in `onClose` is thrown | ||
// it does not prevent errors thrown directly inside the test, | ||
// so we don't have to worry about tests passing that should | ||
// otherwise fail | ||
// see: https://github.com/jestjs/jest/blob/main/packages/jest-environment-jsdom/src/index.ts#L95-L115 | ||
// see: https://github.com/vijs/vi/blob/main/packages/vi-environment-jsdom/src/index.ts#L95-L115 | ||
WINDOW.addEventListener('error', dummyErrorHandler); | ||
}); | ||
|
||
|
@@ -166,7 +172,7 @@ describe('SentryBrowser', () => { | |
}; | ||
|
||
it('should call `onClose` when receiving `__sentry_reportdialog_closed__` MessageEvent', async () => { | ||
const onClose = jest.fn(); | ||
const onClose = vi.fn(); | ||
|
||
showReportDialog({ onClose }); | ||
|
||
|
@@ -179,7 +185,7 @@ describe('SentryBrowser', () => { | |
}); | ||
|
||
it('should call `onClose` only once even if it throws', async () => { | ||
const onClose = jest.fn(() => { | ||
const onClose = vi.fn(() => { | ||
throw new Error(); | ||
}); | ||
|
||
|
@@ -194,7 +200,7 @@ describe('SentryBrowser', () => { | |
}); | ||
|
||
it('should not call `onClose` for other MessageEvents', async () => { | ||
const onClose = jest.fn(); | ||
const onClose = vi.fn(); | ||
|
||
showReportDialog({ onClose }); | ||
|
||
|
@@ -236,49 +242,52 @@ describe('SentryBrowser', () => { | |
expect(event.exception.values[0]?.stacktrace.frames).not.toHaveLength(0); | ||
}); | ||
|
||
it('should capture a message', done => { | ||
const options = getDefaultBrowserClientOptions({ | ||
beforeSend: event => { | ||
expect(event.message).toBe('test'); | ||
expect(event.exception).toBeUndefined(); | ||
done(); | ||
return event; | ||
}, | ||
dsn, | ||
}); | ||
setCurrentClient(new BrowserClient(options)); | ||
captureMessage('test'); | ||
}); | ||
|
||
it('should capture an event', done => { | ||
const options = getDefaultBrowserClientOptions({ | ||
beforeSend: event => { | ||
expect(event.message).toBe('event'); | ||
expect(event.exception).toBeUndefined(); | ||
done(); | ||
return event; | ||
}, | ||
dsn, | ||
}); | ||
setCurrentClient(new BrowserClient(options)); | ||
captureEvent({ message: 'event' }); | ||
}); | ||
|
||
it('should set `platform` on events', done => { | ||
const options = getDefaultBrowserClientOptions({ | ||
beforeSend: event => { | ||
expect(event.platform).toBe('javascript'); | ||
done(); | ||
return event; | ||
}, | ||
dsn, | ||
}); | ||
setCurrentClient(new BrowserClient(options)); | ||
captureEvent({ message: 'event' }); | ||
}); | ||
it('should capture a message', () => | ||
new Promise<void>(resolve => { | ||
const options = getDefaultBrowserClientOptions({ | ||
beforeSend: event => { | ||
expect(event.message).toBe('test'); | ||
expect(event.exception).toBeUndefined(); | ||
resolve(); | ||
return event; | ||
}, | ||
dsn, | ||
}); | ||
setCurrentClient(new BrowserClient(options)); | ||
captureMessage('test'); | ||
})); | ||
|
||
it('should capture an event', () => | ||
new Promise<void>(resolve => { | ||
const options = getDefaultBrowserClientOptions({ | ||
beforeSend: event => { | ||
expect(event.message).toBe('event'); | ||
expect(event.exception).toBeUndefined(); | ||
resolve(); | ||
return event; | ||
}, | ||
dsn, | ||
}); | ||
setCurrentClient(new BrowserClient(options)); | ||
captureEvent({ message: 'event' }); | ||
})); | ||
|
||
it('should set `platform` on events', () => | ||
new Promise<void>(resolve => { | ||
const options = getDefaultBrowserClientOptions({ | ||
beforeSend: event => { | ||
expect(event.platform).toBe('javascript'); | ||
resolve(); | ||
return event; | ||
}, | ||
dsn, | ||
}); | ||
setCurrentClient(new BrowserClient(options)); | ||
captureEvent({ message: 'event' }); | ||
})); | ||
|
||
it('should not dedupe an event on bound client', async () => { | ||
const localBeforeSend = jest.fn(); | ||
const localBeforeSend = vi.fn(); | ||
const options = getDefaultBrowserClientOptions({ | ||
beforeSend: localBeforeSend, | ||
dsn, | ||
|
@@ -295,7 +304,7 @@ describe('SentryBrowser', () => { | |
}); | ||
|
||
it('should use inboundfilter rules of bound client', async () => { | ||
const localBeforeSend = jest.fn(); | ||
const localBeforeSend = vi.fn(); | ||
const options = getDefaultBrowserClientOptions({ | ||
beforeSend: localBeforeSend, | ||
dsn, | ||
|
@@ -374,7 +383,7 @@ describe('SentryBrowser initialization', () => { | |
}); | ||
|
||
it('uses SDK source from global for package name', () => { | ||
const spy = jest.spyOn(utils, 'getSDKSource').mockReturnValue('cdn'); | ||
const spy = vi.spyOn(utils, 'getSDKSource').mockReturnValue('cdn'); | ||
init({ dsn }); | ||
|
||
const sdkData = getClient()?.getOptions()._metadata?.sdk || {}; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
4 changes: 3 additions & 1 deletion
4
...st/unit/integrations/contextlines.test.ts → ...er/test/integrations/contextlines.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.