idp-flow.test.ts41 lines · main
| 1 | import { describe, expect, test } from 'bun:test'; |
| 2 | |
| 3 | import { createHash } from 'node:crypto'; |
| 4 | |
| 5 | /** |
| 6 | * Pure helpers / discovery shape — no DB. |
| 7 | */ |
| 8 | describe('briven-engine OIDC IdP (pure)', () => { |
| 9 | test('PKCE S256 is sha256 base64url of verifier', () => { |
| 10 | const verifier = 'dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk'; |
| 11 | const challenge = createHash('sha256').update(verifier).digest('base64url'); |
| 12 | // Known vector from RFC 7636 appendix B |
| 13 | expect(challenge).toBe('E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM'); |
| 14 | }); |
| 15 | |
| 16 | test('discovery document has required OIDC fields', async () => { |
| 17 | process.env.BRIVEN_BETTER_AUTH_SECRET = |
| 18 | process.env.BRIVEN_BETTER_AUTH_SECRET ?? 'a'.repeat(32); |
| 19 | process.env.BRIVEN_API_ORIGIN = |
| 20 | process.env.BRIVEN_API_ORIGIN ?? 'https://api.briven.tech'; |
| 21 | process.env.BRIVEN_WEB_ORIGIN = |
| 22 | process.env.BRIVEN_WEB_ORIGIN ?? 'https://briven.tech'; |
| 23 | process.env.BRIVEN_DATABASE_URL = |
| 24 | process.env.BRIVEN_DATABASE_URL ?? 'postgres://test:test@127.0.0.1:5/test'; |
| 25 | |
| 26 | const { discoveryDocument, oidcIssuer } = await import('./idp-flow.js'); |
| 27 | const doc = discoveryDocument(); |
| 28 | expect(doc.issuer).toBe(oidcIssuer()); |
| 29 | expect(String(doc.authorization_endpoint)).toContain('/authorize'); |
| 30 | expect(String(doc.token_endpoint)).toContain('/token'); |
| 31 | expect(String(doc.userinfo_endpoint)).toContain('/userinfo'); |
| 32 | expect(String(doc.jwks_uri)).toContain('/jwks.json'); |
| 33 | expect(String(doc.revocation_endpoint)).toContain('/revoke'); |
| 34 | expect(String(doc.introspection_endpoint)).toContain('/introspect'); |
| 35 | expect(String(doc.end_session_endpoint)).toContain('/end_session'); |
| 36 | expect(doc.response_types_supported).toEqual(['code']); |
| 37 | expect(doc.grant_types_supported).toContain('authorization_code'); |
| 38 | expect(doc.grant_types_supported).toContain('refresh_token'); |
| 39 | expect(doc.code_challenge_methods_supported).toContain('S256'); |
| 40 | }); |
| 41 | }); |