1717
1818const assert = require ( 'assert' ) ;
1919const Client = require ( '../../lib/client.js' ) ;
20+ const Cloudant = require ( '../../cloudant.js' ) ;
2021const nock = require ( '../nock.js' ) ;
2122const uuidv4 = require ( 'uuid/v4' ) ; // random
2223
@@ -31,10 +32,10 @@ const COOKIEAUTH_PLUGIN = [ { cookieauth: { autoRenew: false } } ];
3132// mock cookies
3233
3334const MOCK_COOKIE = 'AuthSession=Y2xbZWr0bQlpcc19ZQN8OeU4OWFCNYcZOxgdhy-QRDp4i6JQrfkForX5OU5P' ;
34- const MOCK_SET_COOKIE_HEADER = { 'set-cookie' : `${ MOCK_COOKIE } ; Version=1; Max-Age=86400 ; Path=/; HttpOnly` } ;
35+ const MOCK_SET_COOKIE_HEADER = { 'set-cookie' : `${ MOCK_COOKIE } ; Version=1; Max-Age=1 ; Path=/; HttpOnly` } ;
3536
3637const MOCK_COOKIE_2 = 'AuthSession=Q2fbIWc0kQspdc39OQL89eS4PWECcYEZDxgdgy-0RCp2i0dcrDkfoWX7OI5A' ;
37- const MOCK_SET_COOKIE_HEADER_2 = { 'set-cookie' : `${ MOCK_COOKIE_2 } ; Version=1; Max-Age=86400 ; Path=/; HttpOnly` } ;
38+ const MOCK_SET_COOKIE_HEADER_2 = { 'set-cookie' : `${ MOCK_COOKIE_2 } ; Version=1; Max-Age=1 ; Path=/; HttpOnly` } ;
3839
3940describe ( '#db CookieAuth Plugin' , function ( ) {
4041 before ( function ( done ) {
@@ -358,5 +359,44 @@ describe('#db CookieAuth Plugin', function() {
358359 done ( ) ;
359360 } ) ;
360361 } ) ;
362+
363+ it ( 'pre-emptive renewal outlasts original session' , function ( ) {
364+ if ( process . env . NOCK_OFF ) {
365+ this . skip ( ) ;
366+ }
367+
368+ var mocks = nock ( SERVER )
369+ . post ( '/_session' , { name : ME , password : PASSWORD } )
370+ . reply ( 200 , { ok : true } , MOCK_SET_COOKIE_HEADER )
371+ . get ( DBNAME )
372+ . matchHeader ( 'cookie' , MOCK_COOKIE )
373+ . reply ( 200 , { doc_count : 0 } )
374+ // pre-emptive renewals every 500 ms
375+ . post ( '/_session' , { name : ME , password : PASSWORD } )
376+ . times ( 2 )
377+ . reply ( 200 , { ok : true } , MOCK_SET_COOKIE_HEADER_2 )
378+ . get ( DBNAME )
379+ . matchHeader ( 'cookie' , MOCK_COOKIE_2 )
380+ . reply ( 200 , { doc_count : 0 } ) ;
381+
382+ var cloudantClient = new Cloudant ( {
383+ url : SERVER ,
384+ username : ME ,
385+ password : PASSWORD ,
386+ maxAttempt : 1
387+ // Note using default cookieauth plugin
388+ } ) ;
389+ return cloudantClient . db . get ( DBNAME . substring ( 1 ) ) /* Remove leading slash */
390+ . then ( ( ) => {
391+ // Wait long enough for a pre-emptive renewal and orignal session to lapse
392+ return new Promise ( resolve => setTimeout ( resolve , 1000 ) ) ;
393+ } )
394+ . then ( ( ) => {
395+ return cloudantClient . db . get ( DBNAME . substring ( 1 ) ) ;
396+ } )
397+ . finally ( ( ) => {
398+ mocks . done ( ) ;
399+ } ) ;
400+ } ) ;
361401 } ) ;
362402} ) ;
0 commit comments