@@ -13,6 +13,11 @@ var mocks = {
1313 }
1414 } ,
1515 UrlFetchApp : new MockUrlFetchApp ( ) ,
16+ Utilities : {
17+ base64Encode : function ( data ) {
18+ return Buffer . from ( data ) . toString ( 'base64' ) ;
19+ }
20+ } ,
1621 __proto__ : gas . globalMockDefault
1722} ;
1823var OAuth2 = gas . require ( './src' , mocks ) ;
@@ -108,6 +113,37 @@ describe('Service', function() {
108113
109114 assert . deepEqual ( service . getToken ( true ) , newToken ) ;
110115 } ) ;
116+
117+ it ( 'should load null tokens from the cache' ,
118+ function ( ) {
119+ var cache = new MockCache ( ) ;
120+ var properties = new MockProperties ( ) ;
121+ for ( var i = 0 ; i < 10 ; ++ i ) {
122+ var service = OAuth2 . createService ( 'test' )
123+ . setPropertyStore ( properties )
124+ . setCache ( cache ) ;
125+ service . getToken ( ) ;
126+ }
127+ assert . equal ( properties . counter , 1 ) ;
128+ } ) ;
129+
130+ it ( 'should load null tokens from memory' ,
131+ function ( ) {
132+ var cache = new MockCache ( ) ;
133+ var properties = new MockProperties ( ) ;
134+ var service = OAuth2 . createService ( 'test' )
135+ . setPropertyStore ( properties )
136+ . setCache ( cache ) ;
137+
138+ service . getToken ( ) ;
139+ var cacheStart = cache . counter ;
140+ var propertiesStart = properties . counter ;
141+ for ( var i = 0 ; i < 10 ; ++ i ) {
142+ service . getToken ( ) ;
143+ }
144+ assert . equal ( cache . counter , cacheStart ) ;
145+ assert . equal ( properties . counter , propertiesStart ) ;
146+ } ) ;
111147 } ) ;
112148
113149 describe ( '#saveToken_()' , function ( ) {
@@ -294,6 +330,81 @@ describe('Service', function() {
294330 } ) ;
295331 } ) ;
296332 } ) ;
333+
334+ describe ( '#exchangeGrant_()' , function ( ) {
335+ var toLowerCaseKeys_ = OAuth2 . toLowerCaseKeys_ ;
336+
337+ it ( 'should not set auth header if the grant type is not client_credentials' ,
338+ function ( done ) {
339+ mocks . UrlFetchApp . resultFunction = function ( url , urlOptions ) {
340+ assert . isUndefined ( toLowerCaseKeys_ ( urlOptions . headers ) . authorization ) ;
341+ done ( ) ;
342+ } ;
343+ var service = OAuth2 . createService ( 'test' )
344+ . setGrantType ( 'fake' )
345+ . setTokenUrl ( 'http://www.example.com' ) ;
346+ service . exchangeGrant_ ( ) ;
347+ } ) ;
348+
349+ it ( 'should not set auth header if the client ID is not set' ,
350+ function ( done ) {
351+ mocks . UrlFetchApp . resultFunction = function ( url , urlOptions ) {
352+ assert . isUndefined ( toLowerCaseKeys_ ( urlOptions . headers ) . authorization ) ;
353+ done ( ) ;
354+ } ;
355+ var service = OAuth2 . createService ( 'test' )
356+ . setGrantType ( 'client_credentials' )
357+ . setTokenUrl ( 'http://www.example.com' ) ;
358+ service . exchangeGrant_ ( ) ;
359+ } ) ;
360+
361+ it ( 'should not set auth header if the client secret is not set' ,
362+ function ( done ) {
363+ mocks . UrlFetchApp . resultFunction = function ( url , urlOptions ) {
364+ assert . isUndefined ( toLowerCaseKeys_ ( urlOptions . headers ) . authorization ) ;
365+ done ( ) ;
366+ } ;
367+ var service = OAuth2 . createService ( 'test' )
368+ . setGrantType ( 'client_credentials' )
369+ . setTokenUrl ( 'http://www.example.com' )
370+ . setClientId ( 'abc' ) ;
371+ service . exchangeGrant_ ( ) ;
372+ } ) ;
373+
374+ it ( 'should not set auth header if it is already set' ,
375+ function ( done ) {
376+ mocks . UrlFetchApp . resultFunction = function ( url , urlOptions ) {
377+ assert . equal ( toLowerCaseKeys_ ( urlOptions . headers ) . authorization ,
378+ 'something' ) ;
379+ done ( ) ;
380+ } ;
381+ var service = OAuth2 . createService ( 'test' )
382+ . setGrantType ( 'client_credentials' )
383+ . setTokenUrl ( 'http://www.example.com' )
384+ . setClientId ( 'abc' )
385+ . setClientSecret ( 'def' )
386+ . setTokenHeaders ( {
387+ authorization : 'something'
388+ } ) ;
389+ service . exchangeGrant_ ( ) ;
390+ } ) ;
391+
392+ it ( 'should set the auth header for the client_credentials grant type, if ' +
393+ 'the client ID and client secret are set and the authorization header' +
394+ 'is not already set' , function ( done ) {
395+ mocks . UrlFetchApp . resultFunction = function ( url , urlOptions ) {
396+ assert . equal ( toLowerCaseKeys_ ( urlOptions . headers ) . authorization ,
397+ 'Basic YWJjOmRlZg==' ) ;
398+ done ( ) ;
399+ } ;
400+ var service = OAuth2 . createService ( 'test' )
401+ . setGrantType ( 'client_credentials' )
402+ . setTokenUrl ( 'http://www.example.com' )
403+ . setClientId ( 'abc' )
404+ . setClientSecret ( 'def' ) ;
405+ service . exchangeGrant_ ( ) ;
406+ } ) ;
407+ } ) ;
297408} ) ;
298409
299410describe ( 'Utilities' , function ( ) {
@@ -313,4 +424,33 @@ describe('Utilities', function() {
313424 assert . deepEqual ( o , { foo : [ 100 ] , bar : 2 , baz : { } } ) ;
314425 } ) ;
315426 } ) ;
427+
428+ describe ( '#toLowerCaseKeys_()' , function ( ) {
429+ var toLowerCaseKeys_ = OAuth2 . toLowerCaseKeys_ ;
430+
431+ it ( 'should contain only lower-case keys' , function ( ) {
432+ var data = {
433+ 'a' : true ,
434+ 'A' : true ,
435+ 'B' : true ,
436+ 'Cc' : true ,
437+ 'D2' : true ,
438+ 'E!@#' : true
439+ } ;
440+ var lowerCaseData = toLowerCaseKeys_ ( data ) ;
441+ assert . deepEqual ( lowerCaseData , {
442+ 'a' : true ,
443+ 'b' : true ,
444+ 'cc' : true ,
445+ 'd2' : true ,
446+ 'e!@#' : true
447+ } ) ;
448+ } ) ;
449+
450+ it ( 'should handle null, undefined, and empty objects' , function ( ) {
451+ assert . isNull ( toLowerCaseKeys_ ( null ) ) ;
452+ assert . isUndefined ( toLowerCaseKeys_ ( undefined ) ) ;
453+ assert . isEmpty ( toLowerCaseKeys_ ( { } ) ) ;
454+ } ) ;
455+ } ) ;
316456} ) ;
0 commit comments