UNPKG

@esmx/core

Version:

A high-performance microfrontend framework supporting Vue, React, Preact, Solid, and Svelte with SSR and Module Federation capabilities.

169 lines (147 loc) 4.78 kB
import type { IncomingMessage, ServerResponse } from 'node:http'; import { assert, test } from 'vitest'; import { isImmutableFile, mergeMiddlewares } from './middleware'; test('should identify immutable files with .final. extension', () => { assert.equal(isImmutableFile('script.final.js'), true); assert.equal(isImmutableFile('style.final.css'), true); assert.equal(isImmutableFile('app.final.mjs'), true); assert.equal(isImmutableFile('chunk.final.123abc.js'), false); }); test('should return false for non-immutable files', () => { assert.equal(isImmutableFile('script.js'), false); assert.equal(isImmutableFile('style.css'), false); assert.equal(isImmutableFile('app.mjs'), false); assert.equal(isImmutableFile('.final'), false); assert.equal(isImmutableFile('final.js'), false); assert.equal(isImmutableFile('test.finally.js'), false); }); test('should handle paths with directories', () => { assert.equal(isImmutableFile('/dist/js/main.final.js'), true); assert.equal(isImmutableFile('src/components/index.final.mjs'), true); assert.equal(isImmutableFile('src/styles/main.final.css'), true); }); test('middleware chain should execute in order', () => { const executed: string[] = []; const middleware1 = ( _req: IncomingMessage, _res: ServerResponse, next: Function ) => { executed.push('middleware1'); next(); }; const middleware2 = ( _req: IncomingMessage, _res: ServerResponse, next: Function ) => { executed.push('middleware2'); next(); }; const middleware3 = ( _req: IncomingMessage, _res: ServerResponse, next: Function ) => { executed.push('middleware3'); next(); }; const merged = mergeMiddlewares([middleware1, middleware2, middleware3]); merged({} as IncomingMessage, {} as ServerResponse, () => { executed.push('final'); }); assert.deepEqual(executed, [ 'middleware1', 'middleware2', 'middleware3', 'final' ]); }); test('middleware chain should stop if next is not called', () => { const executed: string[] = []; const middleware1 = ( _req: IncomingMessage, _res: ServerResponse, next: Function ) => { executed.push('middleware1'); next(); }; const middleware2 = ( _req: IncomingMessage, _res: ServerResponse, _next: Function ) => { executed.push('middleware2'); // 不调用 next }; const middleware3 = ( _req: IncomingMessage, _res: ServerResponse, next: Function ) => { executed.push('middleware3'); next(); }; const merged = mergeMiddlewares([middleware1, middleware2, middleware3]); merged({} as IncomingMessage, {} as ServerResponse, () => { executed.push('final'); }); assert.deepEqual(executed, ['middleware1', 'middleware2']); }); test('empty middleware array should call final next', () => { const executed: string[] = []; const merged = mergeMiddlewares([]); merged({} as IncomingMessage, {} as ServerResponse, () => { executed.push('final'); }); assert.deepEqual(executed, ['final']); }); test('middleware should receive correct request and response objects', () => { const req = { url: '/test' } as IncomingMessage; const res = { statusCode: 200 } as ServerResponse; let passedReq: IncomingMessage | undefined; let passedRes: ServerResponse | undefined; const middleware = ( req: IncomingMessage, res: ServerResponse, next: Function ) => { passedReq = req; passedRes = res; next(); }; const merged = mergeMiddlewares([middleware]); merged(req, res, () => {}); assert.equal(passedReq, req); assert.equal(passedRes, res); }); // Test error handling in middleware chain test('should handle errors in middleware chain', () => { const executed: string[] = []; const errorMiddleware = ( _req: IncomingMessage, _res: ServerResponse, _next: Function ) => { executed.push('error'); throw new Error('Test error'); }; const nextMiddleware = ( _req: IncomingMessage, _res: ServerResponse, next: Function ) => { executed.push('next'); next(); }; const merged = mergeMiddlewares([errorMiddleware, nextMiddleware]); try { merged({} as IncomingMessage, {} as ServerResponse, () => { executed.push('final'); }); } catch (err) { executed.push('caught'); } assert.deepEqual(executed, ['error', 'caught']); });