From b2bc63c463d5e79f916dbf39d7df468ddf00549b Mon Sep 17 00:00:00 2001 From: a-malik-gh Date: Sun, 29 Mar 2026 23:52:17 +0000 Subject: [PATCH] feat: add advanced pattern matching tests for conditional middleware - Add comprehensive test coverage for exact string patterns with onlyFor() - Add tests for non-matching patterns across all types (exact, regex, glob) - Add tests for mixed pattern types in single call - Add cross-functional tests for nested glob patterns - Add character class pattern tests - Verify asymmetric behavior between unless() and onlyFor() Closes #468 Closes #469 Closes #470 Closes #471 --- .../tests/unit/conditional.middleware.spec.ts | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/middleware/tests/unit/conditional.middleware.spec.ts b/middleware/tests/unit/conditional.middleware.spec.ts index 73491936..aa8d713f 100644 --- a/middleware/tests/unit/conditional.middleware.spec.ts +++ b/middleware/tests/unit/conditional.middleware.spec.ts @@ -85,4 +85,110 @@ describe('onlyFor()', () => { wrapped(mockReq('/admin/users') as Request, mockRes() as Response, next); expect(middleware).toHaveBeenCalledTimes(1); }); + + it('supports exact string patterns', () => { + const wrapped = onlyFor(middleware as unknown as MiddlewareFn, ['/api/users']); + wrapped(mockReq('/api/users') as Request, mockRes() as Response, next); + expect(middleware).toHaveBeenCalledTimes(1); + }); + + it('does not run middleware for non-matching exact string', () => { + const wrapped = onlyFor(middleware as unknown as MiddlewareFn, ['/api/users']); + wrapped(mockReq('/api/posts') as Request, mockRes() as Response, next); + expect(middleware).not.toHaveBeenCalled(); + expect(next).toHaveBeenCalledTimes(1); + }); + + it('does not run middleware when glob pattern does not match', () => { + const wrapped = onlyFor(middleware as unknown as MiddlewareFn, ['/api/**']); + wrapped(mockReq('/admin/dashboard') as Request, mockRes() as Response, next); + expect(middleware).not.toHaveBeenCalled(); + expect(next).toHaveBeenCalledTimes(1); + }); + + it('does not run middleware when regex pattern does not match', () => { + const wrapped = onlyFor(middleware as unknown as MiddlewareFn, [/^\/admin/]); + wrapped(mockReq('/user/profile') as Request, mockRes() as Response, next); + expect(middleware).not.toHaveBeenCalled(); + expect(next).toHaveBeenCalledTimes(1); + }); + + it('handles multiple patterns with mixed types', () => { + const wrapped = onlyFor(middleware as unknown as MiddlewareFn, [ + '/health', + /^\/api\/v1/, + '/admin/**', + ]); + wrapped(mockReq('/health') as Request, mockRes() as Response, next); + expect(middleware).toHaveBeenCalledTimes(1); + + middleware.mockClear(); + next.mockClear(); + + wrapped(mockReq('/api/v1/users') as Request, mockRes() as Response, next); + expect(middleware).toHaveBeenCalledTimes(1); + + middleware.mockClear(); + next.mockClear(); + + wrapped(mockReq('/admin/settings/general') as Request, mockRes() as Response, next); + expect(middleware).toHaveBeenCalledTimes(1); + + middleware.mockClear(); + next.mockClear(); + + wrapped(mockReq('/public/assets') as Request, mockRes() as Response, next); + expect(middleware).not.toHaveBeenCalled(); + expect(next).toHaveBeenCalledTimes(1); + }); +}); + +describe('Pattern Matching - Cross-Functional Tests', () => { + let middleware: jest.Mock; + let next: jest.Mock; + + beforeEach(() => { + middleware = jest.fn((_req, _res, n) => n()); + next = jest.fn(); + }); + + it('both unless() and onlyFor() handle nested paths with glob patterns', () => { + const unlessWrapped = unless(middleware as unknown as MiddlewareFn, ['/api/**/internal']); + const onlyForWrapped = onlyFor(middleware as unknown as MiddlewareFn, ['/api/**/internal']); + + // unless should skip for nested paths matching the pattern + unlessWrapped(mockReq('/api/v1/internal') as Request, mockRes() as Response, next); + expect(middleware).not.toHaveBeenCalled(); + + middleware.mockClear(); + next.mockClear(); + + // onlyFor should run for matching nested paths + onlyForWrapped(mockReq('/api/v1/internal') as Request, mockRes() as Response, next); + expect(middleware).toHaveBeenCalledTimes(1); + }); + + it('both unless() and onlyFor() handle complex patterns correctly', () => { + const patterns = ['/api/v[12]/**', /^\/admin/, '/health']; + const unlessWrapped = unless(middleware as unknown as MiddlewareFn, patterns); + const onlyForWrapped = onlyFor(middleware as unknown as MiddlewareFn, patterns); + + // Test with glob v1 + unlessWrapped(mockReq('/api/v1/users') as Request, mockRes() as Response, next); + expect(middleware).not.toHaveBeenCalled(); + + middleware.mockClear(); + next.mockClear(); + + // Test with glob v2 + unlessWrapped(mockReq('/api/v2/posts') as Request, mockRes() as Response, next); + expect(middleware).not.toHaveBeenCalled(); + + middleware.mockClear(); + next.mockClear(); + + // Test onlyFor with regex + onlyForWrapped(mockReq('/admin/dashboard') as Request, mockRes() as Response, next); + expect(middleware).toHaveBeenCalledTimes(1); + }); });