@@ -7110,27 +7110,67 @@ describe('logout with revokeRefreshToken option', () => {
71107110 expect ( mockStateStore . delete ) . toHaveBeenCalled ( ) ;
71117111 } ) ;
71127112
7113- test ( 'should revoke using session domain in resolver mode when called via logout()' , async ( ) => {
7114- const sessionDomain = 'session.local' ;
7115- const resolverDomain = 'resolver.local' ;
7116- const sessionRevocationEndpoint = `https://${ sessionDomain } /oauth/revoke` ;
7113+ test ( 'should revoke and delete session in resolver mode when session domain matches resolved domain' , async ( ) => {
7114+ const matchedDomain = 'matched.local' ;
7115+ const revocationEndpointMatched = `https://${ matchedDomain } /oauth/revoke` ;
71177116
7118- let sessionRevokeCalled = false ;
7117+ let revokeCalled = false ;
71197118 server . use (
7120- http . get ( `https://${ sessionDomain } /.well-known/openid-configuration` , ( ) =>
7119+ http . get ( `https://${ matchedDomain } /.well-known/openid-configuration` , ( ) =>
71217120 HttpResponse . json ( {
7122- issuer : `https://${ sessionDomain } /` ,
7123- authorization_endpoint : `https://${ sessionDomain } /authorize` ,
7124- token_endpoint : `https://${ sessionDomain } /token` ,
7125- end_session_endpoint : `https://${ sessionDomain } /logout` ,
7126- revocation_endpoint : sessionRevocationEndpoint ,
7127- jwks_uri : `https://${ sessionDomain } /.well-known/jwks.json` ,
7121+ issuer : `https://${ matchedDomain } /` ,
7122+ authorization_endpoint : `https://${ matchedDomain } /authorize` ,
7123+ token_endpoint : `https://${ matchedDomain } /token` ,
7124+ end_session_endpoint : `https://${ matchedDomain } /logout` ,
7125+ revocation_endpoint : revocationEndpointMatched ,
7126+ jwks_uri : `https://${ matchedDomain } /.well-known/jwks.json` ,
71287127 } )
71297128 ) ,
7130- http . post ( sessionRevocationEndpoint , ( ) => {
7131- sessionRevokeCalled = true ;
7129+ http . post ( revocationEndpointMatched , ( ) => {
7130+ revokeCalled = true ;
71327131 return new HttpResponse ( null , { status : 200 } ) ;
7133- } ) ,
7132+ } )
7133+ ) ;
7134+
7135+ const mockStateStore = {
7136+ get : vi . fn ( ) ,
7137+ set : vi . fn ( ) ,
7138+ delete : vi . fn ( ) ,
7139+ deleteByLogoutToken : vi . fn ( ) ,
7140+ } ;
7141+
7142+ const stateData : StateData = {
7143+ user : { sub : '<sub>' } ,
7144+ idToken : '<id_token>' ,
7145+ refreshToken : '<refresh_token>' ,
7146+ tokenSets : [ ] ,
7147+ domain : matchedDomain ,
7148+ internal : { sid : '<sid>' , createdAt : Date . now ( ) } ,
7149+ } ;
7150+
7151+ mockStateStore . get . mockResolvedValue ( stateData ) ;
7152+
7153+ const serverClient = new ServerClient ( {
7154+ domain : vi . fn ( ) . mockResolvedValue ( matchedDomain ) ,
7155+ clientId : '<client_id>' ,
7156+ clientSecret : '<client_secret>' ,
7157+ discoveryCache : { ttl : 0 } ,
7158+ transactionStore : { get : vi . fn ( ) , set : vi . fn ( ) , delete : vi . fn ( ) } ,
7159+ stateStore : mockStateStore ,
7160+ } ) ;
7161+
7162+ const url = await serverClient . logout ( { returnTo : '/after-logout' , revokeRefreshToken : true } ) ;
7163+
7164+ expect ( revokeCalled ) . toBe ( true ) ;
7165+ expect ( mockStateStore . delete ) . toHaveBeenCalled ( ) ;
7166+ expect ( url ) . toBeDefined ( ) ;
7167+ } ) ;
7168+
7169+ test ( 'should skip revocation and session deletion in resolver mode when session domain does not match resolved domain' , async ( ) => {
7170+ const sessionDomain = 'session.local' ;
7171+ const resolverDomain = 'resolver.local' ;
7172+
7173+ server . use (
71347174 http . get ( `https://${ resolverDomain } /.well-known/openid-configuration` , ( ) =>
71357175 HttpResponse . json ( {
71367176 issuer : `https://${ resolverDomain } /` ,
@@ -7143,8 +7183,6 @@ describe('logout with revokeRefreshToken option', () => {
71437183 )
71447184 ) ;
71457185
7146- const domainResolver = vi . fn ( ) . mockResolvedValue ( resolverDomain ) ;
7147-
71487186 const mockStateStore = {
71497187 get : vi . fn ( ) ,
71507188 set : vi . fn ( ) ,
@@ -7164,7 +7202,7 @@ describe('logout with revokeRefreshToken option', () => {
71647202 mockStateStore . get . mockResolvedValue ( stateData ) ;
71657203
71667204 const serverClient = new ServerClient ( {
7167- domain : domainResolver ,
7205+ domain : vi . fn ( ) . mockResolvedValue ( resolverDomain ) ,
71687206 clientId : '<client_id>' ,
71697207 clientSecret : '<client_secret>' ,
71707208 discoveryCache : { ttl : 0 } ,
@@ -7174,7 +7212,7 @@ describe('logout with revokeRefreshToken option', () => {
71747212
71757213 const url = await serverClient . logout ( { returnTo : '/after-logout' , revokeRefreshToken : true } ) ;
71767214
7177- expect ( sessionRevokeCalled ) . toBe ( true ) ;
7215+ expect ( mockStateStore . delete ) . not . toHaveBeenCalled ( ) ;
71787216 expect ( url ) . toBeDefined ( ) ;
71797217 } ) ;
71807218} ) ;
0 commit comments