Skip to content

Commit e9f657b

Browse files
committed
rework auth scenario listing
1 parent 2c6efa2 commit e9f657b

File tree

3 files changed

+86
-16
lines changed

3 files changed

+86
-16
lines changed

src/scenarios/client/auth/basic-metadata.ts

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { createServer } from './helpers/createServer.js';
55
import { ServerLifecycle } from './helpers/serverLifecycle.js';
66

77
export class AuthBasicMetadataVar1Scenario implements Scenario {
8-
// TODO: name should match what we put in the scenario map
98
name = 'auth/basic-metadata-var1';
109
description =
1110
'Tests Basic OAuth flow with DCR, PRM at root location, OAuth metadata at OpenID discovery path, and no scopes required';
@@ -151,3 +150,65 @@ export class AuthBasicMetadataVar2Scenario implements Scenario {
151150
return this.checks;
152151
}
153152
}
153+
154+
export class AuthBasicMetadataVar3Scenario implements Scenario {
155+
name = 'auth/basic-metadata-var3';
156+
description =
157+
'Tests Basic OAuth flow with DCR, PRM at custom location listed in WWW-Authenticate header, OAuth metadata is at nested OpenID discovery path, and no scopes required';
158+
private authServer = new ServerLifecycle();
159+
private server = new ServerLifecycle();
160+
private checks: ConformanceCheck[] = [];
161+
162+
async start(): Promise<ScenarioUrls> {
163+
this.checks = [];
164+
165+
const authApp = createAuthServer(this.checks, this.authServer.getUrl, {
166+
metadataPath: '/tenant1/.well-known/openid-configuration',
167+
isOpenIdConfiguration: true,
168+
routePrefix: '/tenant1'
169+
});
170+
await this.authServer.start(authApp);
171+
172+
const app = createServer(
173+
this.checks,
174+
this.server.getUrl,
175+
this.authServer.getUrl,
176+
{
177+
// This is a custom path, so unable to get via probing, it's only available
178+
// via following the `resource_metadata_url` in the WWW-Authenticate header.
179+
prmPath: '/.well-known/oauth-protected-resource'
180+
}
181+
);
182+
await this.server.start(app);
183+
184+
return { serverUrl: `${this.server.getUrl()}/mcp` };
185+
}
186+
187+
async stop() {
188+
await this.authServer.stop();
189+
await this.server.stop();
190+
}
191+
192+
getChecks(): ConformanceCheck[] {
193+
const expectedSlugs = [
194+
'authorization-server-metadata',
195+
'client-registration',
196+
'authorization-request',
197+
'token-request'
198+
];
199+
200+
for (const slug of expectedSlugs) {
201+
if (!this.checks.find((c) => c.id === slug)) {
202+
this.checks.push({
203+
id: slug,
204+
name: `Expected Check Missing: ${slug}`,
205+
description: `Expected Check Missing: ${slug}`,
206+
status: 'FAILURE',
207+
timestamp: new Date().toISOString()
208+
});
209+
}
210+
}
211+
212+
return this.checks;
213+
}
214+
}

src/scenarios/client/auth/index.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Scenario } from '../../../types';
2+
import { AuthBasicDCRScenario } from './basic-dcr.js';
3+
import {
4+
AuthBasicMetadataVar1Scenario,
5+
AuthBasicMetadataVar2Scenario,
6+
AuthBasicMetadataVar3Scenario
7+
} from './basic-metadata.js';
8+
import {
9+
Auth20250326OAuthMetadataBackcompatScenario,
10+
Auth20250326OEndpointFallbackScenario
11+
} from './march-spec-backcompat.js';
12+
13+
export const authScenariosList: Scenario[] = [
14+
new AuthBasicDCRScenario(),
15+
new AuthBasicMetadataVar1Scenario(),
16+
new AuthBasicMetadataVar2Scenario(),
17+
new AuthBasicMetadataVar3Scenario(),
18+
new Auth20250326OAuthMetadataBackcompatScenario(),
19+
new Auth20250326OEndpointFallbackScenario()
20+
];

src/scenarios/index.ts

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,6 @@
11
import { Scenario, ClientScenario } from '../types.js';
22
import { InitializeScenario } from './client/initialize.js';
33
import { ToolsCallScenario } from './client/tools_call.js';
4-
import { AuthBasicDCRScenario } from './client/auth/basic-dcr.js';
5-
import {
6-
AuthBasicMetadataVar1Scenario,
7-
AuthBasicMetadataVar2Scenario
8-
} from './client/auth/basic-metadata.js';
9-
import {
10-
Auth20250326OAuthMetadataBackcompatScenario,
11-
Auth20250326OEndpointFallbackScenario
12-
} from './client/auth/march-spec-backcompat.js';
134
import { ElicitationClientDefaultsScenario } from './client/elicitation-defaults.js';
145

156
// Import all new server test scenarios
@@ -54,6 +45,8 @@ import {
5445
PromptsGetWithImageScenario
5546
} from './server/prompts.js';
5647

48+
import { authScenariosList } from './client/auth/index.js';
49+
5750
// Pending client scenarios (not yet fully tested/implemented)
5851
const pendingClientScenariosList: ClientScenario[] = [
5952
// Elicitation scenarios (SEP-1330)
@@ -122,12 +115,8 @@ export const clientScenarios = new Map<string, ClientScenario>(
122115
const scenariosList: Scenario[] = [
123116
new InitializeScenario(),
124117
new ToolsCallScenario(),
125-
new AuthBasicDCRScenario(),
126-
new AuthBasicMetadataVar1Scenario(),
127-
new AuthBasicMetadataVar2Scenario(),
128-
new Auth20250326OAuthMetadataBackcompatScenario(),
129-
new Auth20250326OEndpointFallbackScenario(),
130-
new ElicitationClientDefaultsScenario()
118+
new ElicitationClientDefaultsScenario(),
119+
...authScenariosList
131120
];
132121

133122
// Scenarios map - built from list

0 commit comments

Comments
 (0)