@@ -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