feat: move march back-compat auth tests to optional backcompat suite (#127)

Move auth/2025-03-26-oauth-metadata-backcompat and
auth/2025-03-26-oauth-endpoint-fallback out of the required
authScenariosList into a new backcompatScenariosList.

These test backward compatibility with the old 2025-03-26 auth spec
(no PRM, OAuth metadata at server root) which is not part of the
current spec requirements.

- Add new 'backcompat' client suite
- Back-compat scenarios remain in the 'all' suite
- Removed from 'core' and 'auth' suites
- Add separate test describe block for back-compat scenarios

Closes #126
This commit is contained in:
Paul Carleton 2026-01-29 18:14:49 +00:00 • committed by GitHub
commit df87099431
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 35 additions and 7 deletions

View file

@ -18,7 +18,8 @@ import {
listAuthScenarios,
listMetadataScenarios,
listCoreScenarios,
listExtensionScenarios
listExtensionScenarios,
listBackcompatScenarios
} from './scenarios';
import { ConformanceCheck } from './types';
import { ClientOptionsSchema, ServerOptionsSchema } from './schemas';
@ -69,6 +70,7 @@ program
all: listScenarios,
core: listCoreScenarios,
extensions: listExtensionScenarios,
backcompat: listBackcompatScenarios,
auth: listAuthScenarios,
metadata: listMetadataScenarios,
'sep-835': () =>
@ -182,7 +184,7 @@ program
console.error('\nAvailable client scenarios:');
listScenarios().forEach((s) => console.error(` - ${s}`));
console.error(
'\nAvailable suites: all, core, extensions, auth, metadata, sep-835'
'\nAvailable suites: all, core, extensions, backcompat, auth, metadata, sep-835'
);
process.exit(1);
}

View file

@ -1,4 +1,4 @@
import { authScenariosList } from './index';
import { authScenariosList, backcompatScenariosList } from './index';
import {
runClientAgainstScenario,
InlineClientRunner
@ -48,6 +48,19 @@ describe('Client Auth Scenarios', () => {
}
});
describe('Client Back-compat Scenarios', () => {
for (const scenario of backcompatScenariosList) {
test(`${scenario.name} passes`, async () => {
const clientFn = getHandler(scenario.name);
if (!clientFn) {
throw new Error(`No handler registered for scenario: ${scenario.name}`);
}
const runner = new InlineClientRunner(clientFn);
await runClientAgainstScenario(runner, scenario.name);
});
}
});
describe('Negative tests', () => {
test('bad client requests root PRM location', async () => {
const runner = new InlineClientRunner(badPrmClient);

View file

@ -28,8 +28,6 @@ import { PreRegistrationScenario } from './pre-registration';
export const authScenariosList: Scenario[] = [
...metadataScenarios,
new AuthBasicCIMDScenario(),
new Auth20250326OAuthMetadataBackcompatScenario(),
new Auth20250326OEndpointFallbackScenario(),
new ScopeFromWwwAuthenticateScenario(),
new ScopeFromScopesSupportedScenario(),
new ScopeOmittedWhenUndefinedScenario(),
@ -42,6 +40,12 @@ export const authScenariosList: Scenario[] = [
new PreRegistrationScenario()
];
// Back-compat scenarios (optional - backward compatibility with older spec versions)
export const backcompatScenariosList: Scenario[] = [
new Auth20250326OAuthMetadataBackcompatScenario(),
new Auth20250326OEndpointFallbackScenario()
];
// Extension scenarios (optional for tier 1 - protocol extensions)
export const extensionScenariosList: Scenario[] = [
new ClientCredentialsJwtScenario(),

View file

@ -53,7 +53,11 @@ import {
import { DNSRebindingProtectionScenario } from './server/dns-rebinding';
import { authScenariosList, extensionScenariosList } from './client/auth/index';
import {
authScenariosList,
backcompatScenariosList,
extensionScenariosList
} from './client/auth/index';
import { listMetadataScenarios } from './client/auth/discovery-metadata';
// Pending client scenarios (not yet fully tested/implemented)
@ -137,13 +141,14 @@ export const clientScenarios = new Map<string, ClientScenario>(
allClientScenariosList.map((scenario) => [scenario.name, scenario])
);
// All client test scenarios (core + extensions)
// All client test scenarios (core + backcompat + extensions)
const scenariosList: Scenario[] = [
new InitializeScenario(),
new ToolsCallScenario(),
new ElicitationClientDefaultsScenario(),
new SSERetryScenario(),
...authScenariosList,
...backcompatScenariosList,
...extensionScenariosList
];
@ -201,4 +206,8 @@ export function listExtensionScenarios(): string[] {
return extensionScenariosList.map((scenario) => scenario.name);
}
export function listBackcompatScenarios(): string[] {
return backcompatScenariosList.map((scenario) => scenario.name);
}
export { listMetadataScenarios };