11import {
2- Auth0Client ,
2+ Auth0Client , ConnectAccountRedirectResult ,
33 GetTokenSilentlyVerboseResponse ,
4+ ResponseType
45} from '@auth0/auth0-spa-js' ;
56import '@testing-library/jest-dom' ;
67import { act , render , renderHook , screen , waitFor } from '@testing-library/react' ;
@@ -192,6 +193,7 @@ describe('Auth0Provider', () => {
192193 ) ;
193194 clientMock . handleRedirectCallback . mockResolvedValueOnce ( {
194195 appState : undefined ,
196+ response_type : ResponseType . Code
195197 } ) ;
196198 const wrapper = createWrapper ( ) ;
197199 renderHook ( ( ) => useContext ( Auth0Context ) , {
@@ -214,6 +216,7 @@ describe('Auth0Provider', () => {
214216 ) ;
215217 clientMock . handleRedirectCallback . mockResolvedValueOnce ( {
216218 appState : { returnTo : '/foo' } ,
219+ response_type : ResponseType . Code
217220 } ) ;
218221 const wrapper = createWrapper ( ) ;
219222 renderHook ( ( ) => useContext ( Auth0Context ) , {
@@ -257,6 +260,7 @@ describe('Auth0Provider', () => {
257260 clientMock . getUser . mockResolvedValue ( user ) ;
258261 clientMock . handleRedirectCallback . mockResolvedValue ( {
259262 appState : { foo : 'bar' } ,
263+ response_type : ResponseType . Code
260264 } ) ;
261265 const onRedirectCallback = jest . fn ( ) ;
262266 const wrapper = createWrapper ( {
@@ -266,7 +270,43 @@ describe('Auth0Provider', () => {
266270 wrapper,
267271 } ) ;
268272 await waitFor ( ( ) => {
269- expect ( onRedirectCallback ) . toHaveBeenCalledWith ( { foo : 'bar' } , user ) ;
273+ expect ( onRedirectCallback ) . toHaveBeenCalledWith ( { foo : 'bar' , response_type : ResponseType . Code } , user ) ;
274+ } ) ;
275+ } ) ;
276+
277+ it ( 'should handle connect account redirect and call a custom handler' , async ( ) => {
278+ window . history . pushState (
279+ { } ,
280+ document . title ,
281+ '/?connect_code=__test_code__&state=__test_state__'
282+ ) ;
283+ const user = { name : '__test_user__' } ;
284+ const connectedAccount = {
285+ id : 'abc123' ,
286+ connection : 'google-oauth2' ,
287+ access_type : 'offline' as ConnectAccountRedirectResult [ 'access_type' ] ,
288+ created_at : '2024-01-01T00:00:00.000Z' ,
289+ expires_at : '2024-01-02T00:00:00.000Z' ,
290+ }
291+ clientMock . getUser . mockResolvedValue ( user ) ;
292+ clientMock . handleRedirectCallback . mockResolvedValue ( {
293+ appState : { foo : 'bar' } ,
294+ response_type : ResponseType . ConnectCode ,
295+ ...connectedAccount ,
296+ } ) ;
297+ const onRedirectCallback = jest . fn ( ) ;
298+ const wrapper = createWrapper ( {
299+ onRedirectCallback,
300+ } ) ;
301+ renderHook ( ( ) => useContext ( Auth0Context ) , {
302+ wrapper,
303+ } ) ;
304+ await waitFor ( ( ) => {
305+ expect ( onRedirectCallback ) . toHaveBeenCalledWith ( {
306+ foo : 'bar' ,
307+ response_type : ResponseType . ConnectCode ,
308+ connectedAccount
309+ } , user ) ;
270310 } ) ;
271311 } ) ;
272312
@@ -412,6 +452,35 @@ describe('Auth0Provider', () => {
412452 expect ( warn ) . toHaveBeenCalled ( ) ;
413453 } ) ;
414454
455+ it ( 'should provide a connectAccountWithRedirect method' , async ( ) => {
456+ const wrapper = createWrapper ( ) ;
457+ const { result } = renderHook (
458+ ( ) => useContext ( Auth0Context ) ,
459+ { wrapper }
460+ ) ;
461+ await waitFor ( ( ) => {
462+ expect ( result . current . connectAccountWithRedirect ) . toBeInstanceOf ( Function ) ;
463+ } ) ;
464+ await result . current . connectAccountWithRedirect ( {
465+ connection : 'google-apps'
466+ } ) ;
467+ expect ( clientMock . connectAccountWithRedirect ) . toHaveBeenCalledWith ( {
468+ connection : 'google-apps' ,
469+ } ) ;
470+ } ) ;
471+
472+ it ( 'should handle errors from connectAccountWithRedirect' , async ( ) => {
473+ const wrapper = createWrapper ( ) ;
474+ const { result } = renderHook (
475+ ( ) => useContext ( Auth0Context ) ,
476+ { wrapper }
477+ ) ;
478+ clientMock . connectAccountWithRedirect . mockRejectedValue ( new Error ( '__test_error__' ) ) ;
479+ await act ( async ( ) => {
480+ await expect ( result . current . connectAccountWithRedirect ) . rejects . toThrow ( '__test_error__' ) ;
481+ } ) ;
482+ } ) ;
483+
415484 it ( 'should provide a logout method' , async ( ) => {
416485 const user = { name : '__test_user__' } ;
417486 clientMock . getUser . mockResolvedValue ( user ) ;
@@ -814,6 +883,7 @@ describe('Auth0Provider', () => {
814883 it ( 'should provide a handleRedirectCallback method' , async ( ) => {
815884 clientMock . handleRedirectCallback . mockResolvedValue ( {
816885 appState : { redirectUri : '/' } ,
886+ response_type : ResponseType . Code
817887 } ) ;
818888 const wrapper = createWrapper ( ) ;
819889 const { result } = renderHook (
@@ -827,6 +897,7 @@ describe('Auth0Provider', () => {
827897 appState : {
828898 redirectUri : '/' ,
829899 } ,
900+ response_type : ResponseType . Code
830901 } ) ;
831902 } ) ;
832903 expect ( clientMock . handleRedirectCallback ) . toHaveBeenCalled ( ) ;
@@ -926,6 +997,7 @@ describe('Auth0Provider', () => {
926997 appState : {
927998 redirectUri : '/' ,
928999 } ,
1000+ response_type : ResponseType . Code
9291001 } ) ;
9301002 clientMock . getUser . mockResolvedValue ( undefined ) ;
9311003 const wrapper = createWrapper ( ) ;
@@ -938,6 +1010,7 @@ describe('Auth0Provider', () => {
9381010 appState : {
9391011 redirectUri : '/' ,
9401012 } ,
1013+ response_type : ResponseType . Code
9411014 } ) ;
9421015 } ) ;
9431016
@@ -1012,6 +1085,7 @@ describe('Auth0Provider', () => {
10121085 ) ;
10131086 clientMock . handleRedirectCallback . mockResolvedValue ( {
10141087 appState : undefined ,
1088+ response_type : ResponseType . Code
10151089 } ) ;
10161090 render (
10171091 < StrictMode >
0 commit comments