diff --git a/packages/feedback/.eslintrc.js b/packages/feedback/.eslintrc.js index 0b547ffc828c..0c83f7d0ff9d 100644 --- a/packages/feedback/.eslintrc.js +++ b/packages/feedback/.eslintrc.js @@ -5,12 +5,4 @@ module.exports = { extends: ['../../.eslintrc.js'], - overrides: [ - { - files: ['jest.setup.ts', 'jest.config.ts'], - parserOptions: { - project: ['tsconfig.test.json'], - }, - }, - ], }; diff --git a/packages/feedback/jest.config.js b/packages/feedback/jest.config.js deleted file mode 100644 index cd02790794a7..000000000000 --- a/packages/feedback/jest.config.js +++ /dev/null @@ -1,6 +0,0 @@ -const baseConfig = require('../../jest/jest.config.js'); - -module.exports = { - ...baseConfig, - testEnvironment: 'jsdom', -}; diff --git a/packages/feedback/package.json b/packages/feedback/package.json index 45eccf3886a7..1a25a8dbcec8 100644 --- a/packages/feedback/package.json +++ b/packages/feedback/package.json @@ -62,8 +62,8 @@ "clean": "rimraf build sentry-internal-feedback-*.tgz", "fix": "eslint . --format stylish --fix", "lint": "eslint . --format stylish", - "test": "jest", - "test:watch": "jest --watch", + "test": "vitest run", + "test:watch": "vitest --watch", "yalc:publish": "yalc publish --push --sig" }, "volta": { diff --git a/packages/feedback/src/core/TestClient.ts b/packages/feedback/src/core/TestClient.ts index 1acfcb87d8e8..6ff745dcb4e4 100644 --- a/packages/feedback/src/core/TestClient.ts +++ b/packages/feedback/src/core/TestClient.ts @@ -14,6 +14,7 @@ export class TestClient extends Client { /** * */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any public eventFromException(exception: any): PromiseLike { return resolvedSyncPromise({ exception: { diff --git a/packages/feedback/src/core/components/Actor.test.ts b/packages/feedback/test/core/components/Actor.test.ts similarity index 83% rename from packages/feedback/src/core/components/Actor.test.ts rename to packages/feedback/test/core/components/Actor.test.ts index 5eee6709a065..06782f10393a 100644 --- a/packages/feedback/src/core/components/Actor.test.ts +++ b/packages/feedback/test/core/components/Actor.test.ts @@ -1,12 +1,17 @@ -import { TRIGGER_LABEL } from '../../constants'; -import { getFeedback } from '../getFeedback'; -import { buildFeedbackIntegration } from '../integration'; +/** + * @vitest-environment jsdom + */ +import { vi, describe, it, expect } from 'vitest'; + +import { TRIGGER_LABEL } from '../../../src/constants'; +import { getFeedback } from '../../../src/core/getFeedback'; +import { buildFeedbackIntegration } from '../../../src/core/integration'; import { mockSdk } from '../mockSdk'; describe('Actor', () => { it('renders the actor button', () => { const feedbackIntegration = buildFeedbackIntegration({ - lazyLoadIntegration: jest.fn(), + lazyLoadIntegration: vi.fn(), }); const configuredIntegration = feedbackIntegration({}); @@ -27,7 +32,7 @@ describe('Actor', () => { it('renders the correct aria label for the button', () => { const feedbackIntegration = buildFeedbackIntegration({ - lazyLoadIntegration: jest.fn(), + lazyLoadIntegration: vi.fn(), }); const configuredIntegration = feedbackIntegration({}); diff --git a/packages/feedback/src/core/getFeedback.test.ts b/packages/feedback/test/core/getFeedback.test.ts similarity index 83% rename from packages/feedback/src/core/getFeedback.test.ts rename to packages/feedback/test/core/getFeedback.test.ts index 35644a992006..d79d2176e1c2 100644 --- a/packages/feedback/src/core/getFeedback.test.ts +++ b/packages/feedback/test/core/getFeedback.test.ts @@ -1,6 +1,8 @@ +import { vi, describe, it, expect } from 'vitest'; + import { getCurrentScope } from '@sentry/core'; -import { getFeedback } from './getFeedback'; -import { buildFeedbackIntegration } from './integration'; +import { getFeedback } from '../../src/core/getFeedback'; +import { buildFeedbackIntegration } from '../../src/core/integration'; import { mockSdk } from './mockSdk'; describe('getFeedback', () => { @@ -26,7 +28,7 @@ describe('getFeedback', () => { it('works with a client with Feedback', () => { const feedbackIntegration = buildFeedbackIntegration({ - lazyLoadIntegration: jest.fn(), + lazyLoadIntegration: vi.fn(), }); const configuredIntegration = feedbackIntegration({}); diff --git a/packages/feedback/src/core/mockSdk.ts b/packages/feedback/test/core/mockSdk.ts similarity index 84% rename from packages/feedback/src/core/mockSdk.ts rename to packages/feedback/test/core/mockSdk.ts index 70acb6e3aa12..0846aa4a7c02 100644 --- a/packages/feedback/src/core/mockSdk.ts +++ b/packages/feedback/test/core/mockSdk.ts @@ -1,7 +1,9 @@ +import { vi } from 'vitest'; + import type { Envelope, Transport, TransportMakeRequestResponse } from '@sentry/core'; -import type { TestClientOptions } from './TestClient'; -import { getDefaultClientOptions, init } from './TestClient'; +import type { TestClientOptions } from '../../src/core/TestClient'; +import { getDefaultClientOptions, init } from '../../src/core/TestClient'; export interface MockSdkParams { sentryOptions?: Partial; @@ -11,7 +13,7 @@ class MockTransport implements Transport { public send: (request: Envelope) => PromiseLike; public constructor() { - this.send = jest.fn(async () => { + this.send = vi.fn(async () => { return { statusCode: 200, }; diff --git a/packages/feedback/src/core/sendFeedback.test.ts b/packages/feedback/test/core/sendFeedback.test.ts similarity index 90% rename from packages/feedback/src/core/sendFeedback.test.ts rename to packages/feedback/test/core/sendFeedback.test.ts index 6f7e9c0050a9..c150c35ab69b 100644 --- a/packages/feedback/src/core/sendFeedback.test.ts +++ b/packages/feedback/test/core/sendFeedback.test.ts @@ -1,3 +1,8 @@ +/** + * @vitest-environment jsdom + */ +import { vi, describe, it, expect } from 'vitest'; + import { addBreadcrumb, getClient, @@ -9,7 +14,7 @@ import { } from '@sentry/core'; import { mockSdk } from './mockSdk'; -import { sendFeedback } from './sendFeedback'; +import { sendFeedback } from '../../src/core/sendFeedback'; import { TextDecoder, TextEncoder } from 'util'; const patchedEncoder = (!global.window.TextEncoder && (global.window.TextEncoder = TextEncoder)) || true; @@ -20,7 +25,7 @@ describe('sendFeedback', () => { beforeEach(() => { getIsolationScope().clear(); getCurrentScope().clear(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); afterAll(() => { @@ -32,7 +37,7 @@ describe('sendFeedback', () => { it('sends feedback with minimal options', async () => { mockSdk(); - const mockTransport = jest.spyOn(getClient()!.getTransport()!, 'send'); + const mockTransport = vi.spyOn(getClient()!.getTransport()!, 'send'); const promise = sendFeedback({ message: 'mi', @@ -67,7 +72,7 @@ describe('sendFeedback', () => { feedback: { message: 'mi', source: 'api', - url: 'http://localhost/', + url: 'http://localhost:3000/', }, }, level: 'info', @@ -83,7 +88,7 @@ describe('sendFeedback', () => { it('sends feedback with full options', async () => { mockSdk(); - const mockTransport = jest.spyOn(getClient()!.getTransport()!, 'send'); + const mockTransport = vi.spyOn(getClient()!.getTransport()!, 'send'); const promise = sendFeedback({ name: 'doe', @@ -142,7 +147,7 @@ describe('sendFeedback', () => { it('applies active span data to feedback', async () => { mockSdk({ sentryOptions: { tracesSampleRate: 1 } }); - const mockTransport = jest.spyOn(getClient()!.getTransport()!, 'send'); + const mockTransport = vi.spyOn(getClient()!.getTransport()!, 'send'); await startSpan({ name: 'test span' }, () => { return sendFeedback({ @@ -181,7 +186,7 @@ describe('sendFeedback', () => { message: 'mi', name: 'doe', source: 'api', - url: 'http://localhost/', + url: 'http://localhost:3000/', }, }, level: 'info', @@ -197,7 +202,7 @@ describe('sendFeedback', () => { it('applies scope data to feedback', async () => { mockSdk({ sentryOptions: { tracesSampleRate: 1 } }); - const mockTransport = jest.spyOn(getClient()!.getTransport()!, 'send'); + const mockTransport = vi.spyOn(getClient()!.getTransport()!, 'send'); await withIsolationScope(isolationScope => { isolationScope.setTag('test-1', 'tag'); @@ -242,7 +247,7 @@ describe('sendFeedback', () => { message: 'mi', name: 'doe', source: 'api', - url: 'http://localhost/', + url: 'http://localhost:3000/', }, }, extra: { @@ -266,7 +271,7 @@ describe('sendFeedback', () => { it('handles 400 transport error', async () => { mockSdk(); - jest.spyOn(getClient()!.getTransport()!, 'send').mockImplementation(() => { + vi.spyOn(getClient()!.getTransport()!, 'send').mockImplementation(() => { return Promise.resolve({ statusCode: 400 }); }); @@ -283,7 +288,7 @@ describe('sendFeedback', () => { it('handles 0 transport error', async () => { mockSdk(); - jest.spyOn(getClient()!.getTransport()!, 'send').mockImplementation(() => { + vi.spyOn(getClient()!.getTransport()!, 'send').mockImplementation(() => { return Promise.resolve({ statusCode: 0 }); }); @@ -300,7 +305,7 @@ describe('sendFeedback', () => { it('handles 200 transport response', async () => { mockSdk(); - jest.spyOn(getClient()!.getTransport()!, 'send').mockImplementation(() => { + vi.spyOn(getClient()!.getTransport()!, 'send').mockImplementation(() => { return Promise.resolve({ statusCode: 200 }); }); @@ -314,10 +319,10 @@ describe('sendFeedback', () => { }); it('handles timeout', async () => { - jest.useFakeTimers(); + vi.useFakeTimers(); mockSdk(); - jest.spyOn(getClient()!.getTransport()!, 'send').mockImplementation(() => { + vi.spyOn(getClient()!.getTransport()!, 'send').mockImplementation(() => { return new Promise(resolve => setTimeout(resolve, 10_000)); }); @@ -327,16 +332,16 @@ describe('sendFeedback', () => { message: 'mi', }); - jest.advanceTimersByTime(5_000); + vi.advanceTimersByTime(5_000); await expect(promise).rejects.toMatch('Unable to determine if Feedback was correctly sent.'); - jest.useRealTimers(); + vi.useRealTimers(); }); it('sends attachments', async () => { mockSdk(); - const mockTransport = jest.spyOn(getClient()!.getTransport()!, 'send'); + const mockTransport = vi.spyOn(getClient()!.getTransport()!, 'send'); const attachment1 = new Uint8Array([1, 2, 3, 4, 5]); const attachment2 = new Uint8Array([6, 7, 8, 9]); @@ -395,7 +400,7 @@ describe('sendFeedback', () => { message: 'mi', name: 'doe', source: 'api', - url: 'http://localhost/', + url: 'http://localhost:3000/', }, }, level: 'info', diff --git a/packages/feedback/tsconfig.json b/packages/feedback/tsconfig.json index c1fc08578508..50734351f40b 100644 --- a/packages/feedback/tsconfig.json +++ b/packages/feedback/tsconfig.json @@ -13,5 +13,5 @@ "react-dom": ["./node_modules/preact/compat/"] } }, - "include": ["src/**/*.ts","src/**/*.tsx"] + "include": ["src/**/*.ts", "src/**/*.tsx"] } diff --git a/packages/feedback/tsconfig.test.json b/packages/feedback/tsconfig.test.json index ad87caa06c48..d4f2aaaf435e 100644 --- a/packages/feedback/tsconfig.test.json +++ b/packages/feedback/tsconfig.test.json @@ -1,10 +1,10 @@ { "extends": "./tsconfig.json", - "include": ["test/**/*.ts", "jest.config.ts", "jest.setup.ts"], + "include": ["test/**/*.ts", "vite.config.ts"], "compilerOptions": { - "types": ["node", "jest"], + "types": ["node"], "esModuleInterop": true, "allowJs": true, "noImplicitAny": true, diff --git a/packages/feedback/vite.config.ts b/packages/feedback/vite.config.ts new file mode 100644 index 000000000000..a5523c61f601 --- /dev/null +++ b/packages/feedback/vite.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'vitest/config'; + +import baseConfig from '../../vite/vite.config'; + +export default defineConfig({ + ...baseConfig, + test: { + ...baseConfig.test, + }, +});