- Remove msw-setup.ts from global vitest setupFiles - Create separate integration-specific MSW setup - Add vitest.config.integration.ts for integration tests - Update package.json to use integration config for integration tests - Update CI workflow to run unit and integration tests separately - Add aggressive cleanup in integration MSW setup for CI environment This prevents MSW from being initialized for unit tests where it's not needed, which was causing tests to hang in CI after all tests completed.
96 lines
2.8 KiB
TypeScript
96 lines
2.8 KiB
TypeScript
import { beforeAll, afterAll, afterEach } from 'vitest';
|
|
import { setupServer } from 'msw/node';
|
|
import { handlers as defaultHandlers } from '../../mocks/n8n-api/handlers';
|
|
|
|
// Create the MSW server instance with default handlers
|
|
export const server = setupServer(...defaultHandlers);
|
|
|
|
// Enable request logging in development/debugging
|
|
if (process.env.MSW_DEBUG === 'true' || process.env.TEST_DEBUG === 'true') {
|
|
server.events.on('request:start', ({ request }) => {
|
|
console.log('[MSW] %s %s', request.method, request.url);
|
|
});
|
|
|
|
server.events.on('request:match', ({ request }) => {
|
|
console.log('[MSW] Request matched:', request.method, request.url);
|
|
});
|
|
|
|
server.events.on('request:unhandled', ({ request }) => {
|
|
console.warn('[MSW] Unhandled request:', request.method, request.url);
|
|
});
|
|
|
|
server.events.on('response:mocked', ({ request, response }) => {
|
|
console.log('[MSW] Mocked response for %s %s: %d',
|
|
request.method,
|
|
request.url,
|
|
response.status
|
|
);
|
|
});
|
|
}
|
|
|
|
// Start server before all tests
|
|
beforeAll(() => {
|
|
server.listen({
|
|
onUnhandledRequest: process.env.CI === 'true' ? 'error' : 'warn',
|
|
});
|
|
});
|
|
|
|
// Reset handlers after each test (important for test isolation)
|
|
afterEach(() => {
|
|
server.resetHandlers();
|
|
});
|
|
|
|
// Clean up after all tests
|
|
afterAll(() => {
|
|
// Remove all event listeners to prevent memory leaks
|
|
server.events.removeAllListeners();
|
|
|
|
// Close the server
|
|
server.close();
|
|
|
|
// In CI, force exit after a short delay to ensure cleanup
|
|
if (process.env.CI === 'true') {
|
|
setTimeout(() => {
|
|
process.exit(0);
|
|
}, 100);
|
|
}
|
|
});
|
|
|
|
// Export the server and utility functions for use in integration tests
|
|
export { server as integrationServer };
|
|
export { http, HttpResponse } from 'msw';
|
|
|
|
/**
|
|
* Utility function to add temporary handlers for specific tests
|
|
* @param handlers Array of MSW request handlers
|
|
*/
|
|
export function useHandlers(...handlers: any[]) {
|
|
server.use(...handlers);
|
|
}
|
|
|
|
/**
|
|
* Utility to wait for a specific request to be made
|
|
* Useful for testing async operations
|
|
*/
|
|
export function waitForRequest(method: string, url: string | RegExp, timeout = 5000): Promise<Request> {
|
|
return new Promise((resolve, reject) => {
|
|
let timeoutId: NodeJS.Timeout;
|
|
|
|
const handler = ({ request }: { request: Request }) => {
|
|
if (request.method === method &&
|
|
(typeof url === 'string' ? request.url === url : url.test(request.url))) {
|
|
clearTimeout(timeoutId);
|
|
server.events.removeListener('request:match', handler);
|
|
resolve(request);
|
|
}
|
|
};
|
|
|
|
// Set timeout
|
|
timeoutId = setTimeout(() => {
|
|
server.events.removeListener('request:match', handler);
|
|
reject(new Error(`Timeout waiting for ${method} request to ${url}`));
|
|
}, timeout);
|
|
|
|
server.events.on('request:match', handler);
|
|
});
|
|
} |