70 lines
2.3 KiB
TypeScript
70 lines
2.3 KiB
TypeScript
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
|
|
type Scope = { setTag: ReturnType<typeof vi.fn> };
|
|
|
|
afterEach(() => {
|
|
vi.resetModules();
|
|
vi.restoreAllMocks();
|
|
vi.unmock('@/config');
|
|
vi.unmock('@/utils/helpers');
|
|
vi.unmock('@/utils/logger');
|
|
vi.unmock('@sentry/node');
|
|
});
|
|
|
|
describe('sentry middleware', () => {
|
|
const loadMiddleware = async () => {
|
|
const scope: Scope = { setTag: vi.fn() };
|
|
const sentry = {
|
|
init: vi.fn(),
|
|
getCurrentScope: vi.fn(() => scope),
|
|
withScope: vi.fn((cb: (scope: Scope) => void) => cb(scope)),
|
|
captureException: vi.fn(),
|
|
};
|
|
const logger = {
|
|
info: vi.fn(),
|
|
};
|
|
const getRouteNameFromPath = vi.fn((path: string) => `route:${path}`);
|
|
|
|
vi.doMock('@sentry/node', () => sentry);
|
|
vi.doMock('@/utils/logger', () => ({
|
|
default: logger,
|
|
}));
|
|
vi.doMock('@/utils/helpers', () => ({
|
|
getRouteNameFromPath,
|
|
}));
|
|
vi.doMock('@/config', () => ({
|
|
config: {
|
|
sentry: {
|
|
dsn: 'https://sentry.example/123',
|
|
},
|
|
errorTrackingRouteTimeout: 50,
|
|
nodeName: 'node-a',
|
|
},
|
|
}));
|
|
|
|
const { default: middleware } = await import('@/middleware/sentry');
|
|
|
|
return { middleware, sentry, logger, scope, getRouteNameFromPath };
|
|
};
|
|
|
|
it('initializes sentry and captures slow routes', async () => {
|
|
const { middleware, sentry, logger, scope, getRouteNameFromPath } = await loadMiddleware();
|
|
|
|
expect(sentry.init).toHaveBeenCalledWith({
|
|
dsn: 'https://sentry.example/123',
|
|
});
|
|
expect(sentry.getCurrentScope).toHaveBeenCalledTimes(1);
|
|
expect(scope.setTag).toHaveBeenCalledWith('node_name', 'node-a');
|
|
expect(logger.info).toHaveBeenCalledWith('Sentry inited.');
|
|
|
|
const nowSpy = vi.spyOn(Date, 'now');
|
|
nowSpy.mockReturnValueOnce(0).mockReturnValueOnce(100);
|
|
|
|
await middleware({ req: { path: '/test/slow' } } as any, async () => {});
|
|
|
|
expect(getRouteNameFromPath).toHaveBeenCalledWith('/test/slow');
|
|
expect(scope.setTag).toHaveBeenCalledWith('name', 'route:/test/slow');
|
|
expect(sentry.captureException).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|