@@ -349,35 +349,62 @@ describe('FirebaseTokenGenerator', () => {
349349 } ) . to . throw ( FirebaseAuthError ) . with . property ( 'code' , 'auth/argument-error' ) ;
350350 } ) ;
351351
352+ it ( 'should throw given a non-object options' , ( ) => {
353+ const invalidOptions : any [ ] = [ NaN , [ ] , true , false , '' , 'a' , 0 , 1 , Infinity , _ . noop ] ;
354+ invalidOptions . forEach ( ( opts ) => {
355+ expect ( ( ) => {
356+ tokenGenerator . createCustomToken ( mocks . uid , opts ) ;
357+ } ) . to . throw ( FirebaseAuthError ) . with . property ( 'code' , 'auth/argument-error' ) ;
358+ } ) ;
359+ } ) ;
360+
352361 it ( 'should throw given a non-object developer claims' , ( ) => {
353362 const invalidDeveloperClaims : any [ ] = [ null , NaN , [ ] , true , false , '' , 'a' , 0 , 1 , Infinity , _ . noop ] ;
354363 invalidDeveloperClaims . forEach ( ( invalidDevClaims ) => {
355364 expect ( ( ) => {
356- tokenGenerator . createCustomToken ( mocks . uid , invalidDevClaims ) ;
365+ tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : invalidDevClaims } ) ;
357366 } ) . to . throw ( FirebaseAuthError ) . with . property ( 'code' , 'auth/argument-error' ) ;
358367 } ) ;
359368 } ) ;
360369
361370 BLACKLISTED_CLAIMS . forEach ( ( blacklistedClaim ) => {
362371 it ( 'should throw given a developer claims object with a blacklisted claim: ' + blacklistedClaim , ( ) => {
363- const blacklistedDeveloperClaims : { [ key : string ] : any } = _ . clone ( mocks . developerClaims ) ;
372+ const blacklistedDeveloperClaims : { [ key : string ] : any } = _ . clone ( mocks . developerClaims ) ;
364373 blacklistedDeveloperClaims [ blacklistedClaim ] = true ;
365374 expect ( ( ) => {
366- tokenGenerator . createCustomToken ( mocks . uid , blacklistedDeveloperClaims ) ;
375+ tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : blacklistedDeveloperClaims } ) ;
367376 } ) . to . throw ( FirebaseAuthError , blacklistedClaim ) . with . property ( 'code' , 'auth/argument-error' ) ;
368377 } ) ;
369378 } ) ;
370379
380+ it ( 'should throw given an invalid expiresIn' , ( ) => {
381+ const invalidExpiresIns : any [ ] = [ null , NaN , Infinity , _ . noop , 0 , 999 , 3600001 ] ;
382+ invalidExpiresIns . forEach ( ( invalidExpiresIn ) => {
383+ expect ( ( ) => {
384+ tokenGenerator . createCustomToken ( mocks . uid , { expiresIn : invalidExpiresIn } ) ;
385+ } ) . to . throw ( FirebaseAuthError ) . with . property ( 'code' , 'auth/argument-error' ) ;
386+ } ) ;
387+ } ) ;
388+
371389 it ( 'should be fulfilled given a valid uid and no developer claims' , ( ) => {
372390 return tokenGenerator . createCustomToken ( mocks . uid ) ;
373391 } ) ;
374392
375393 it ( 'should be fulfilled given a valid uid and empty object developer claims' , ( ) => {
376- return tokenGenerator . createCustomToken ( mocks . uid , { } ) ;
394+ return tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : { } } ) ;
377395 } ) ;
378396
379397 it ( 'should be fulfilled given a valid uid and valid developer claims' , ( ) => {
380- return tokenGenerator . createCustomToken ( mocks . uid , mocks . developerClaims ) ;
398+ return tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : mocks . developerClaims } ) ;
399+ } ) ;
400+
401+ it ( 'should be fulfilled given a valid uid, empty object developer claims and valid expiresIn' , ( ) => {
402+ return tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : { } , expiresIn : 1000 } ) ;
403+ } ) ;
404+
405+ it ( 'should be fulfilled given a valid uid, valid developer claims and valid expiresIn' , ( ) => {
406+ return tokenGenerator
407+ . createCustomToken ( mocks . uid , { developerClaims : mocks . developerClaims , expiresIn : 3600000 } ) ;
381408 } ) ;
382409
383410 it ( 'should be fulfilled with a Firebase Custom JWT' , ( ) => {
@@ -412,7 +439,7 @@ describe('FirebaseTokenGenerator', () => {
412439 it ( 'should be fulfilled with a JWT with the developer claims in its decoded payload' , ( ) => {
413440 clock = sinon . useFakeTimers ( 1000 ) ;
414441
415- return tokenGenerator . createCustomToken ( mocks . uid , mocks . developerClaims )
442+ return tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : mocks . developerClaims } )
416443 . then ( ( token ) => {
417444 const decoded = jwt . decode ( token ) ;
418445
@@ -438,6 +465,32 @@ describe('FirebaseTokenGenerator', () => {
438465 } ) ;
439466 } ) ;
440467
468+ it ( 'should be fulfilled with a JWT with the expiresIn in its exp payload' , ( ) => {
469+ clock = sinon . useFakeTimers ( 2000 ) ;
470+ const expiresIn = 300900
471+
472+ return tokenGenerator . createCustomToken ( mocks . uid , { expiresIn } )
473+ . then ( ( token ) => {
474+ const decoded = jwt . decode ( token ) ;
475+
476+ const expected : { [ key : string ] : any } = {
477+ uid : mocks . uid ,
478+ iat : 2 ,
479+ exp : 302 ,
480+ aud : FIREBASE_AUDIENCE ,
481+ iss : mocks . certificateObject . client_email ,
482+ sub : mocks . certificateObject . client_email ,
483+ } ;
484+
485+ if ( tokenGenerator . tenantId ) {
486+ // eslint-disable-next-line @typescript-eslint/camelcase
487+ expected . tenant_id = tokenGenerator . tenantId ;
488+ }
489+
490+ expect ( decoded ) . to . deep . equal ( expected ) ;
491+ } ) ;
492+ } ) ;
493+
441494 it ( 'should be fulfilled with a JWT with the correct header' , ( ) => {
442495 clock = sinon . useFakeTimers ( 1000 ) ;
443496
@@ -495,7 +548,7 @@ describe('FirebaseTokenGenerator', () => {
495548 foo : 'bar' ,
496549 } ;
497550 const clonedClaims = _ . clone ( originalClaims ) ;
498- return tokenGenerator . createCustomToken ( mocks . uid , clonedClaims )
551+ return tokenGenerator . createCustomToken ( mocks . uid , { developerClaims : clonedClaims } )
499552 . then ( ( ) => {
500553 expect ( originalClaims ) . to . deep . equal ( clonedClaims ) ;
501554 } ) ;
0 commit comments