@@ -492,15 +492,49 @@ describe('GoTrueClient', () => {
492
492
expect ( error ?. message ) . toContain ( 'Unable to validate email address: invalid format' )
493
493
} )
494
494
495
- test ( 'resend() with email' , async ( ) => {
496
- const { email } = mockUserCredentials ( )
497
-
498
- const { error } = await auth . resend ( {
499
- email,
500
- type : 'signup' ,
501
- options : { emailRedirectTo : email } ,
502
- } )
495
+ test . each ( [
496
+ {
497
+ name : 'resend with email with options' ,
498
+ params : {
499
+ email : mockUserCredentials ( ) . email ,
500
+ type : 'signup' as const ,
501
+ options : { emailRedirectTo : mockUserCredentials ( ) . email } ,
502
+ } ,
503
+ } ,
504
+ {
505
+ name : 'resend with email with empty options' ,
506
+ params : {
507
+ email : mockUserCredentials ( ) . email ,
508
+ type : 'signup' as const ,
509
+ options : { } ,
510
+ } ,
511
+ } ,
512
+ ] ) ( '$name' , async ( { params } ) => {
513
+ const { error } = await auth . resend ( params )
514
+ expect ( error ) . toBeNull ( )
515
+ } )
503
516
517
+ test . each ( [
518
+ {
519
+ name : 'resend with phone with options' ,
520
+ params : {
521
+ phone : mockUserCredentials ( ) . phone ,
522
+ type : 'phone_change' as const ,
523
+ options : {
524
+ captchaToken : 'some_token' ,
525
+ } ,
526
+ } ,
527
+ } ,
528
+ {
529
+ name : 'resend with phone with empty options' ,
530
+ params : {
531
+ phone : mockUserCredentials ( ) . phone ,
532
+ type : 'phone_change' as const ,
533
+ options : { } ,
534
+ } ,
535
+ } ,
536
+ ] ) ( '$name' , async ( { params } ) => {
537
+ const { error } = await phoneClient . resend ( params )
504
538
expect ( error ) . toBeNull ( )
505
539
} )
506
540
@@ -540,6 +574,40 @@ describe('GoTrueClient', () => {
540
574
expect ( data . session ) . toBeNull ( )
541
575
} )
542
576
577
+ test . each ( [
578
+ {
579
+ name : 'signInWithOtp for email with empty options' ,
580
+ testFn : async ( ) => {
581
+ const { email } = mockUserCredentials ( )
582
+ const { data, error } = await auth . signInWithOtp ( {
583
+ email,
584
+ options : { } ,
585
+ } )
586
+ expect ( error ) . toBeNull ( )
587
+ expect ( data . user ) . toBeNull ( )
588
+ expect ( data . session ) . toBeNull ( )
589
+ } ,
590
+ } ,
591
+ {
592
+ name : 'verifyOTP fails with empty options' ,
593
+ testFn : async ( ) => {
594
+ const { phone } = mockUserCredentials ( )
595
+
596
+ const { error } = await phoneClient . verifyOtp ( {
597
+ phone,
598
+ type : 'phone_change' ,
599
+ token : '123456' ,
600
+ options : { } ,
601
+ } )
602
+
603
+ expect ( error ) . not . toBeNull ( )
604
+ expect ( error ?. message ) . toContain ( 'Token has expired or is invalid' )
605
+ } ,
606
+ } ,
607
+ ] ) ( '$name' , async ( { testFn } ) => {
608
+ await testFn ( )
609
+ } )
610
+
543
611
test ( 'signInWithOtp() pkce flow fails with invalid sms provider' , async ( ) => {
544
612
const { phone } = mockUserCredentials ( )
545
613
@@ -634,19 +702,7 @@ describe('GoTrueClient', () => {
634
702
}
635
703
} )
636
704
637
- test ( 'resend() with phone' , async ( ) => {
638
- const { phone } = mockUserCredentials ( )
639
-
640
- const { error } = await phoneClient . resend ( {
641
- phone,
642
- type : 'phone_change' ,
643
- options : {
644
- captchaToken : 'some_token' ,
645
- } ,
646
- } )
647
705
648
- expect ( error ) . toBeNull ( )
649
- } )
650
706
651
707
test ( 'verifyOTP() fails with invalid token' , async ( ) => {
652
708
const { phone } = mockUserCredentials ( )
@@ -664,6 +720,8 @@ describe('GoTrueClient', () => {
664
720
expect ( error ) . not . toBeNull ( )
665
721
expect ( error ?. message ) . toContain ( 'Token has expired or is invalid' )
666
722
} )
723
+
724
+
667
725
} )
668
726
669
727
test ( 'signUp() the same user twice should not share email already registered message' , async ( ) => {
@@ -1266,13 +1324,13 @@ describe('MFA', () => {
1266
1324
test ( 'challenge should create MFA challenge' , async ( ) => {
1267
1325
const { factorId } = await setupUserWithMFAAndTOTP ( )
1268
1326
1269
- const { data : challengeData , error : challengeError } = await authWithSession . mfa . challenge ( {
1327
+ const { data, error : challengeError } = await authWithSession . mfa . challenge ( {
1270
1328
factorId,
1271
1329
} )
1272
1330
1273
1331
expect ( challengeError ) . toBeNull ( )
1274
- expect ( challengeData ! . id ) . not . toBeNull ( )
1275
- expect ( challengeData ! . expires_at ) . not . toBeNull ( )
1332
+ expect ( data ! . id ) . not . toBeNull ( )
1333
+ expect ( data ! . expires_at ) . not . toBeNull ( )
1276
1334
} )
1277
1335
1278
1336
test ( 'verify should verify MFA challenge' , async ( ) => {
@@ -2324,8 +2382,8 @@ describe('Storage adapter edge cases', () => {
2324
2382
getItem : async ( ) => {
2325
2383
throw new Error ( 'getItem failed message' )
2326
2384
} ,
2327
- setItem : async ( ) => { } ,
2328
- removeItem : async ( ) => { } ,
2385
+ setItem : async ( ) => { } ,
2386
+ removeItem : async ( ) => { } ,
2329
2387
}
2330
2388
const client = getClientWithSpecificStorage ( brokenStorage )
2331
2389
await expect ( client . getSession ( ) ) . rejects . toThrow ( 'getItem failed message' )
@@ -2337,7 +2395,7 @@ describe('Storage adapter edge cases', () => {
2337
2395
setItem : async ( ) => {
2338
2396
throw new Error ( 'setItem failed message' )
2339
2397
} ,
2340
- removeItem : async ( ) => { } ,
2398
+ removeItem : async ( ) => { } ,
2341
2399
}
2342
2400
const client = getClientWithSpecificStorage ( brokenStorage )
2343
2401
const session = {
@@ -2358,7 +2416,7 @@ describe('Storage adapter edge cases', () => {
2358
2416
test ( 'should handle storage removeItem failure in _removeSession' , async ( ) => {
2359
2417
const brokenStorage = {
2360
2418
getItem : async ( ) => '{}' ,
2361
- setItem : async ( ) => { } ,
2419
+ setItem : async ( ) => { } ,
2362
2420
removeItem : async ( ) => {
2363
2421
throw new Error ( 'removeItem failed message' )
2364
2422
} ,
@@ -2371,8 +2429,8 @@ describe('Storage adapter edge cases', () => {
2371
2429
test ( 'should handle invalid JSON in storage' , async ( ) => {
2372
2430
const invalidStorage = {
2373
2431
getItem : async ( ) => 'invalid-json' ,
2374
- setItem : async ( ) => { } ,
2375
- removeItem : async ( ) => { } ,
2432
+ setItem : async ( ) => { } ,
2433
+ removeItem : async ( ) => { } ,
2376
2434
}
2377
2435
const client = getClientWithSpecificStorage ( invalidStorage )
2378
2436
const { data, error } = await client . getSession ( )
@@ -2383,8 +2441,8 @@ describe('Storage adapter edge cases', () => {
2383
2441
test ( 'should handle null storage value' , async ( ) => {
2384
2442
const nullStorage = {
2385
2443
getItem : async ( ) => null ,
2386
- setItem : async ( ) => { } ,
2387
- removeItem : async ( ) => { } ,
2444
+ setItem : async ( ) => { } ,
2445
+ removeItem : async ( ) => { } ,
2388
2446
}
2389
2447
const client = getClientWithSpecificStorage ( nullStorage )
2390
2448
const { data, error } = await client . getSession ( )
@@ -2395,8 +2453,8 @@ describe('Storage adapter edge cases', () => {
2395
2453
test ( 'should handle empty storage value' , async ( ) => {
2396
2454
const emptyStorage = {
2397
2455
getItem : async ( ) => '' ,
2398
- setItem : async ( ) => { } ,
2399
- removeItem : async ( ) => { } ,
2456
+ setItem : async ( ) => { } ,
2457
+ removeItem : async ( ) => { } ,
2400
2458
}
2401
2459
const client = getClientWithSpecificStorage ( emptyStorage )
2402
2460
const { data, error } = await client . getSession ( )
@@ -2407,8 +2465,8 @@ describe('Storage adapter edge cases', () => {
2407
2465
test ( 'should handle malformed session data' , async ( ) => {
2408
2466
const malformedStorage = {
2409
2467
getItem : async ( ) => JSON . stringify ( { access_token : 'test' } ) , // Missing required fields
2410
- setItem : async ( ) => { } ,
2411
- removeItem : async ( ) => { } ,
2468
+ setItem : async ( ) => { } ,
2469
+ removeItem : async ( ) => { } ,
2412
2470
}
2413
2471
const client = getClientWithSpecificStorage ( malformedStorage )
2414
2472
const { data, error } = await client . getSession ( )
@@ -2427,8 +2485,8 @@ describe('Storage adapter edge cases', () => {
2427
2485
token_type : 'bearer' ,
2428
2486
user : null ,
2429
2487
} ) ,
2430
- setItem : async ( ) => { } ,
2431
- removeItem : async ( ) => { } ,
2488
+ setItem : async ( ) => { } ,
2489
+ removeItem : async ( ) => { } ,
2432
2490
}
2433
2491
const client = getClientWithSpecificStorage ( expiredStorage )
2434
2492
// @ts -expect-error private method
@@ -2488,13 +2546,42 @@ describe('SSO Authentication', () => {
2488
2546
providerId : 'valid-provider-id' ,
2489
2547
options : {
2490
2548
redirectTo : 'http://localhost:3000/callback' ,
2549
+ captchaToken : 'some-token' ,
2491
2550
} ,
2492
2551
} )
2493
2552
2494
2553
expect ( error ) . not . toBeNull ( )
2495
2554
expect ( error ?. message ) . toContain ( 'SAML 2.0 is disabled' )
2496
2555
expect ( data ) . toBeNull ( )
2497
2556
} )
2557
+
2558
+ test . each ( [
2559
+ {
2560
+ name : 'with empty options' ,
2561
+ params : {
2562
+ providerId : 'valid-provider-id' ,
2563
+ domain : 'valid-domain' ,
2564
+ options : { } ,
2565
+ } ,
2566
+ } ,
2567
+ {
2568
+ name : 'without params' ,
2569
+ params : { } as any ,
2570
+ } ,
2571
+ {
2572
+ name : 'with minimal params' ,
2573
+ params : {
2574
+ providerId : 'test-provider' ,
2575
+ domain : 'test-domain' ,
2576
+ } ,
2577
+ } ,
2578
+ ] ) ( 'signInWithSSO $name' , async ( { params } ) => {
2579
+ const { data, error } = await pkceClient . signInWithSSO ( params )
2580
+
2581
+ expect ( error ) . not . toBeNull ( )
2582
+ expect ( error ?. message ) . toContain ( 'SAML 2.0 is disabled' )
2583
+ expect ( data ) . toBeNull ( )
2584
+ } )
2498
2585
} )
2499
2586
2500
2587
describe ( 'Lock functionality' , ( ) => {
0 commit comments