11import { describe , it , expect } from 'vitest' ;
2- import { auth } from './auth.js' ;
2+ import { auth } from '../../src/client /auth.js' ;
33import {
44 ClientCredentialsProvider ,
55 PrivateKeyJwtProvider ,
66 StaticPrivateKeyJwtProvider ,
77 createPrivateKeyJwtAuth
8- } from './auth-extensions.js' ;
9- import type { FetchLike } from '../shared/transport .js' ;
8+ } from '../../src/client /auth-extensions.js' ;
9+ import { createMockOAuthFetch } from '../helpers/oauth .js' ;
1010
1111const RESOURCE_SERVER_URL = 'https://resource.example.com/' ;
1212const AUTH_SERVER_URL = 'https://auth.example.com' ;
1313
14- function createMockFetch ( onTokenRequest ?: ( url : URL , init : RequestInit | undefined ) => void | Promise < void > ) : FetchLike {
15- return async ( input : string | URL , init ?: RequestInit ) : Promise < Response > => {
16- const url = input instanceof URL ? input : new URL ( input ) ;
17-
18- // Protected resource metadata discovery
19- if ( url . origin === RESOURCE_SERVER_URL . slice ( 0 , - 1 ) && url . pathname === '/.well-known/oauth-protected-resource' ) {
20- return new Response (
21- JSON . stringify ( {
22- resource : RESOURCE_SERVER_URL ,
23- authorization_servers : [ AUTH_SERVER_URL ]
24- } ) ,
25- {
26- status : 200 ,
27- headers : { 'Content-Type' : 'application/json' }
28- }
29- ) ;
30- }
31-
32- // Authorization server metadata discovery
33- if ( url . origin === AUTH_SERVER_URL && url . pathname === '/.well-known/oauth-authorization-server' ) {
34- return new Response (
35- JSON . stringify ( {
36- issuer : AUTH_SERVER_URL ,
37- authorization_endpoint : `${ AUTH_SERVER_URL } /authorize` ,
38- token_endpoint : `${ AUTH_SERVER_URL } /token` ,
39- response_types_supported : [ 'code' ] ,
40- token_endpoint_auth_methods_supported : [ 'client_secret_basic' , 'private_key_jwt' ]
41- } ) ,
42- {
43- status : 200 ,
44- headers : { 'Content-Type' : 'application/json' }
45- }
46- ) ;
47- }
48-
49- // Token endpoint
50- if ( url . origin === AUTH_SERVER_URL && url . pathname === '/token' ) {
51- if ( onTokenRequest ) {
52- await onTokenRequest ( url , init ) ;
53- }
54-
55- return new Response (
56- JSON . stringify ( {
57- access_token : 'test-access-token' ,
58- token_type : 'Bearer'
59- } ) ,
60- {
61- status : 200 ,
62- headers : { 'Content-Type' : 'application/json' }
63- }
64- ) ;
65- }
66-
67- throw new Error ( `Unexpected URL in mock fetch: ${ url . toString ( ) } ` ) ;
68- } ;
69- }
70-
7114describe ( 'auth-extensions providers (end-to-end with auth())' , ( ) => {
7215 it ( 'authenticates using ClientCredentialsProvider with client_secret_basic' , async ( ) => {
7316 const provider = new ClientCredentialsProvider ( {
@@ -76,19 +19,23 @@ describe('auth-extensions providers (end-to-end with auth())', () => {
7619 clientName : 'test-client'
7720 } ) ;
7821
79- const fetchMock = createMockFetch ( async ( _url , init ) => {
80- const params = init ?. body as URLSearchParams ;
81- expect ( params ) . toBeInstanceOf ( URLSearchParams ) ;
82- expect ( params . get ( 'grant_type' ) ) . toBe ( 'client_credentials' ) ;
83- expect ( params . get ( 'resource' ) ) . toBe ( RESOURCE_SERVER_URL ) ;
84- expect ( params . get ( 'client_assertion' ) ) . toBeNull ( ) ;
85-
86- const headers = new Headers ( init ?. headers ) ;
87- const authHeader = headers . get ( 'Authorization' ) ;
88- expect ( authHeader ) . toBeTruthy ( ) ;
89-
90- const expectedCredentials = Buffer . from ( 'my-client:my-secret' ) . toString ( 'base64' ) ;
91- expect ( authHeader ) . toBe ( `Basic ${ expectedCredentials } ` ) ;
22+ const fetchMock = createMockOAuthFetch ( {
23+ resourceServerUrl : RESOURCE_SERVER_URL ,
24+ authServerUrl : AUTH_SERVER_URL ,
25+ onTokenRequest : async ( _url , init ) => {
26+ const params = init ?. body as URLSearchParams ;
27+ expect ( params ) . toBeInstanceOf ( URLSearchParams ) ;
28+ expect ( params . get ( 'grant_type' ) ) . toBe ( 'client_credentials' ) ;
29+ expect ( params . get ( 'resource' ) ) . toBe ( RESOURCE_SERVER_URL ) ;
30+ expect ( params . get ( 'client_assertion' ) ) . toBeNull ( ) ;
31+
32+ const headers = new Headers ( init ?. headers ) ;
33+ const authHeader = headers . get ( 'Authorization' ) ;
34+ expect ( authHeader ) . toBeTruthy ( ) ;
35+
36+ const expectedCredentials = Buffer . from ( 'my-client:my-secret' ) . toString ( 'base64' ) ;
37+ expect ( authHeader ) . toBe ( `Basic ${ expectedCredentials } ` ) ;
38+ }
9239 } ) ;
9340
9441 const result = await auth ( provider , {
@@ -112,21 +59,25 @@ describe('auth-extensions providers (end-to-end with auth())', () => {
11259
11360 let assertionFromRequest : string | null = null ;
11461
115- const fetchMock = createMockFetch ( async ( _url , init ) => {
116- const params = init ?. body as URLSearchParams ;
117- expect ( params ) . toBeInstanceOf ( URLSearchParams ) ;
118- expect ( params . get ( 'grant_type' ) ) . toBe ( 'client_credentials' ) ;
119- expect ( params . get ( 'resource' ) ) . toBe ( RESOURCE_SERVER_URL ) ;
62+ const fetchMock = createMockOAuthFetch ( {
63+ resourceServerUrl : RESOURCE_SERVER_URL ,
64+ authServerUrl : AUTH_SERVER_URL ,
65+ onTokenRequest : async ( _url , init ) => {
66+ const params = init ?. body as URLSearchParams ;
67+ expect ( params ) . toBeInstanceOf ( URLSearchParams ) ;
68+ expect ( params . get ( 'grant_type' ) ) . toBe ( 'client_credentials' ) ;
69+ expect ( params . get ( 'resource' ) ) . toBe ( RESOURCE_SERVER_URL ) ;
12070
121- assertionFromRequest = params . get ( 'client_assertion' ) ;
122- expect ( assertionFromRequest ) . toBeTruthy ( ) ;
123- expect ( params . get ( 'client_assertion_type' ) ) . toBe ( 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer' ) ;
71+ assertionFromRequest = params . get ( 'client_assertion' ) ;
72+ expect ( assertionFromRequest ) . toBeTruthy ( ) ;
73+ expect ( params . get ( 'client_assertion_type' ) ) . toBe ( 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer' ) ;
12474
125- const parts = assertionFromRequest ! . split ( '.' ) ;
126- expect ( parts ) . toHaveLength ( 3 ) ;
75+ const parts = assertionFromRequest ! . split ( '.' ) ;
76+ expect ( parts ) . toHaveLength ( 3 ) ;
12777
128- const headers = new Headers ( init ?. headers ) ;
129- expect ( headers . get ( 'Authorization' ) ) . toBeNull ( ) ;
78+ const headers = new Headers ( init ?. headers ) ;
79+ expect ( headers . get ( 'Authorization' ) ) . toBeNull ( ) ;
80+ }
13081 } ) ;
13182
13283 const result = await auth ( provider , {
@@ -149,7 +100,10 @@ describe('auth-extensions providers (end-to-end with auth())', () => {
149100 clientName : 'private-key-jwt-client'
150101 } ) ;
151102
152- const fetchMock = createMockFetch ( ) ;
103+ const fetchMock = createMockOAuthFetch ( {
104+ resourceServerUrl : RESOURCE_SERVER_URL ,
105+ authServerUrl : AUTH_SERVER_URL
106+ } ) ;
153107
154108 await expect (
155109 auth ( provider , {
@@ -168,17 +122,21 @@ describe('auth-extensions providers (end-to-end with auth())', () => {
168122 clientName : 'static-private-key-jwt-client'
169123 } ) ;
170124
171- const fetchMock = createMockFetch ( async ( _url , init ) => {
172- const params = init ?. body as URLSearchParams ;
173- expect ( params ) . toBeInstanceOf ( URLSearchParams ) ;
174- expect ( params . get ( 'grant_type' ) ) . toBe ( 'client_credentials' ) ;
175- expect ( params . get ( 'resource' ) ) . toBe ( RESOURCE_SERVER_URL ) ;
125+ const fetchMock = createMockOAuthFetch ( {
126+ resourceServerUrl : RESOURCE_SERVER_URL ,
127+ authServerUrl : AUTH_SERVER_URL ,
128+ onTokenRequest : async ( _url , init ) => {
129+ const params = init ?. body as URLSearchParams ;
130+ expect ( params ) . toBeInstanceOf ( URLSearchParams ) ;
131+ expect ( params . get ( 'grant_type' ) ) . toBe ( 'client_credentials' ) ;
132+ expect ( params . get ( 'resource' ) ) . toBe ( RESOURCE_SERVER_URL ) ;
176133
177- expect ( params . get ( 'client_assertion' ) ) . toBe ( staticAssertion ) ;
178- expect ( params . get ( 'client_assertion_type' ) ) . toBe ( 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer' ) ;
134+ expect ( params . get ( 'client_assertion' ) ) . toBe ( staticAssertion ) ;
135+ expect ( params . get ( 'client_assertion_type' ) ) . toBe ( 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer' ) ;
179136
180- const headers = new Headers ( init ?. headers ) ;
181- expect ( headers . get ( 'Authorization' ) ) . toBeNull ( ) ;
137+ const headers = new Headers ( init ?. headers ) ;
138+ expect ( headers . get ( 'Authorization' ) ) . toBeNull ( ) ;
139+ }
182140 } ) ;
183141
184142 const result = await auth ( provider , {
0 commit comments