From 07e8ce9cd1bb044f686e8adfcf921fafd68001a6 Mon Sep 17 00:00:00 2001 From: Justin Spahr-Summers Date: Tue, 18 Feb 2025 13:12:50 +0000 Subject: [PATCH] Fix router test after `metadata` key removed --- src/server/auth/router.test.ts | 66 +++++++++++++--------------------- 1 file changed, 24 insertions(+), 42 deletions(-) diff --git a/src/server/auth/router.test.ts b/src/server/auth/router.test.ts index 7e070a00..901ac9ca 100644 --- a/src/server/auth/router.test.ts +++ b/src/server/auth/router.test.ts @@ -18,7 +18,7 @@ describe('MCP Auth Router', () => { } return undefined; }, - + async registerClient(client: OAuthClientInformationFull): Promise { return client; } @@ -114,71 +114,59 @@ describe('MCP Auth Router', () => { it('throws error for non-HTTPS issuer URL', () => { const options: AuthRouterOptions = { provider: mockProvider, - metadata: { - issuerUrl: new URL('http://auth.example.com') - } + issuerUrl: new URL('http://auth.example.com') }; - + expect(() => mcpAuthRouter(options)).toThrow('Issuer URL must be HTTPS'); }); it('allows localhost HTTP for development', () => { const options: AuthRouterOptions = { provider: mockProvider, - metadata: { - issuerUrl: new URL('http://localhost:3000') - } + issuerUrl: new URL('http://localhost:3000') }; - + expect(() => mcpAuthRouter(options)).not.toThrow(); }); it('throws error for issuer URL with fragment', () => { const options: AuthRouterOptions = { provider: mockProvider, - metadata: { - issuerUrl: new URL('https://auth.example.com#fragment') - } + issuerUrl: new URL('https://auth.example.com#fragment') }; - + expect(() => mcpAuthRouter(options)).toThrow('Issuer URL must not have a fragment'); }); it('throws error for issuer URL with query string', () => { const options: AuthRouterOptions = { provider: mockProvider, - metadata: { - issuerUrl: new URL('https://auth.example.com?param=value') - } + issuerUrl: new URL('https://auth.example.com?param=value') }; - + expect(() => mcpAuthRouter(options)).toThrow('Issuer URL must not have a query string'); }); it('successfully creates router with valid options', () => { const options: AuthRouterOptions = { provider: mockProvider, - metadata: { - issuerUrl: new URL('https://auth.example.com') - } + issuerUrl: new URL('https://auth.example.com') }; - + expect(() => mcpAuthRouter(options)).not.toThrow(); }); }); describe('Metadata endpoint', () => { let app: express.Express; - + beforeEach(() => { // Setup full-featured router app = express(); const options: AuthRouterOptions = { provider: mockProvider, - metadata: { - issuerUrl: new URL('https://auth.example.com'), - serviceDocumentationUrl: new URL('https://docs.example.com') - } + issuerUrl: new URL('https://auth.example.com'), + serviceDocumentationUrl: new URL('https://docs.example.com') }; app.use(mcpAuthRouter(options)); }); @@ -188,21 +176,21 @@ describe('MCP Auth Router', () => { .get('/.well-known/oauth-authorization-server'); expect(response.status).toBe(200); - + // Verify essential fields expect(response.body.issuer).toBe('https://auth.example.com/'); expect(response.body.authorization_endpoint).toBe('https://auth.example.com/authorize'); expect(response.body.token_endpoint).toBe('https://auth.example.com/token'); expect(response.body.registration_endpoint).toBe('https://auth.example.com/register'); expect(response.body.revocation_endpoint).toBe('https://auth.example.com/revoke'); - + // Verify supported features expect(response.body.response_types_supported).toEqual(['code']); expect(response.body.grant_types_supported).toEqual(['authorization_code', 'refresh_token']); expect(response.body.code_challenge_methods_supported).toEqual(['S256']); expect(response.body.token_endpoint_auth_methods_supported).toEqual(['client_secret_post']); expect(response.body.revocation_endpoint_auth_methods_supported).toEqual(['client_secret_post']); - + // Verify optional fields expect(response.body.service_documentation).toBe('https://docs.example.com/'); }); @@ -212,9 +200,7 @@ describe('MCP Auth Router', () => { const minimalApp = express(); const options: AuthRouterOptions = { provider: mockProviderMinimal, - metadata: { - issuerUrl: new URL('https://auth.example.com') - } + issuerUrl: new URL('https://auth.example.com') }; minimalApp.use(mcpAuthRouter(options)); @@ -222,12 +208,12 @@ describe('MCP Auth Router', () => { .get('/.well-known/oauth-authorization-server'); expect(response.status).toBe(200); - + // Verify essential endpoints expect(response.body.issuer).toBe('https://auth.example.com/'); expect(response.body.authorization_endpoint).toBe('https://auth.example.com/authorize'); expect(response.body.token_endpoint).toBe('https://auth.example.com/token'); - + // Verify missing optional endpoints expect(response.body.registration_endpoint).toBeUndefined(); expect(response.body.revocation_endpoint).toBeUndefined(); @@ -238,15 +224,13 @@ describe('MCP Auth Router', () => { describe('Endpoint routing', () => { let app: express.Express; - + beforeEach(() => { // Setup full-featured router app = express(); const options: AuthRouterOptions = { provider: mockProvider, - metadata: { - issuerUrl: new URL('https://auth.example.com') - } + issuerUrl: new URL('https://auth.example.com') }; app.use(mcpAuthRouter(options)); }); @@ -271,7 +255,7 @@ describe('MCP Auth Router', () => { jest.mock('pkce-challenge', () => ({ verifyChallenge: jest.fn().mockResolvedValue(true) })); - + const response = await supertest(app) .post('/token') .type('form') @@ -320,9 +304,7 @@ describe('MCP Auth Router', () => { const minimalApp = express(); const options: AuthRouterOptions = { provider: mockProviderMinimal, - metadata: { - issuerUrl: new URL('https://auth.example.com') - } + issuerUrl: new URL('https://auth.example.com') }; minimalApp.use(mcpAuthRouter(options));