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

View file

@ -1,4 +1,4 @@
import { authScenariosList } from './index'; import { authScenariosList, backcompatScenariosList } from './index';
import { import {
runClientAgainstScenario, runClientAgainstScenario,
InlineClientRunner 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', () => { describe('Negative tests', () => {
test('bad client requests root PRM location', async () => { test('bad client requests root PRM location', async () => {
const runner = new InlineClientRunner(badPrmClient); const runner = new InlineClientRunner(badPrmClient);

View file

@ -28,8 +28,6 @@ import { PreRegistrationScenario } from './pre-registration';
export const authScenariosList: Scenario[] = [ export const authScenariosList: Scenario[] = [
...metadataScenarios, ...metadataScenarios,
new AuthBasicCIMDScenario(), new AuthBasicCIMDScenario(),
new Auth20250326OAuthMetadataBackcompatScenario(),
new Auth20250326OEndpointFallbackScenario(),
new ScopeFromWwwAuthenticateScenario(), new ScopeFromWwwAuthenticateScenario(),
new ScopeFromScopesSupportedScenario(), new ScopeFromScopesSupportedScenario(),
new ScopeOmittedWhenUndefinedScenario(), new ScopeOmittedWhenUndefinedScenario(),
@ -42,6 +40,12 @@ export const authScenariosList: Scenario[] = [
new PreRegistrationScenario() 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) // Extension scenarios (optional for tier 1 - protocol extensions)
export const extensionScenariosList: Scenario[] = [ export const extensionScenariosList: Scenario[] = [
new ClientCredentialsJwtScenario(), new ClientCredentialsJwtScenario(),

View file

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