diff --git a/packages/feedback/.eslintrc.js b/packages/feedback/.eslintrc.js index 4e18ad1c84bb..0c83f7d0ff9d 100644 --- a/packages/feedback/.eslintrc.js +++ b/packages/feedback/.eslintrc.js @@ -5,11 +5,4 @@ module.exports = { extends: ['../../.eslintrc.js'], - overrides: [ - { - parserOptions: { - project: ['tsconfig.test.json'], - }, - }, - ], }; 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"] }