11'use strict' ;
22
33const { assert } = require ( 'chai' ) ;
4+ const sinon = require ( 'sinon' ) ;
45const mockery = require ( 'mockery' ) ;
56const Joi = require ( 'joi' ) ;
7+ const DEFAULT_BUILD_TIMEOUT = 90 ; // in minutes
68
79describe ( 'index test' , ( ) => {
810 let instance ;
911 let schemaMock ;
1012 let Executor ;
13+ let requestMock ;
1114
1215 before ( ( ) => {
1316 mockery . enable ( {
@@ -24,10 +27,14 @@ describe('index test', () => {
2427 stop : Joi . object ( ) . required ( ) ,
2528 startPeriodic : Joi . object ( ) . required ( ) ,
2629 stopPeriodic : Joi . object ( ) . required ( ) ,
27- status : Joi . object ( ) . required ( )
30+ status : Joi . object ( ) . required ( ) ,
31+ exchangeTokenForBuild : Joi . object ( ) . required ( )
2832 }
2933 }
3034 } ;
35+ requestMock = sinon . stub ( ) ;
36+ mockery . registerMock ( 'requestretry' , requestMock ) ;
37+
3138 mockery . registerMock ( 'screwdriver-data-schema' , schemaMock ) ;
3239
3340 // eslint-disable-next-line global-require
@@ -151,4 +158,77 @@ describe('index test', () => {
151158 assert . equal ( data . buildId , 'a' ) ;
152159 } ) ;
153160 } ) ;
161+
162+ describe ( 'exchangeTokenForBuild' , ( ) => {
163+ let postConfig ;
164+ let options ;
165+ let buildTimeout ;
166+ let fakeResponse ;
167+
168+ beforeEach ( ( ) => {
169+ postConfig = {
170+ buildId : 111 ,
171+ apiUri : 'https://dummy.com' ,
172+ token : 'dummyTemporalToken'
173+ } ;
174+ buildTimeout = 150 ;
175+ options = {
176+ uri : `${ postConfig . apiUri } /v4/builds/${ postConfig . buildId } /token` ,
177+ method : 'POST' ,
178+ body : { buildTimeout } ,
179+ headers : { Authorization : `Bearer ${ postConfig . token } ` } ,
180+ strictSSL : true ,
181+ json : true
182+ } ;
183+ fakeResponse = {
184+ statusCode : 200 ,
185+ body : {
186+ token : 'dummyBuildToken'
187+ }
188+ } ;
189+ } ) ;
190+
191+ it ( 'succeeds to exchange temporal JWT to build JWT' , async ( ) => {
192+ requestMock . withArgs ( options ) . resolves ( fakeResponse ) ;
193+
194+ await instance . exchangeTokenForBuild ( postConfig , buildTimeout ) . then ( ( buildToken ) => {
195+ assert . equal ( fakeResponse . body . token , buildToken ) ;
196+ } ) ;
197+ } ) ;
198+
199+ it ( 'succeeds to exchange temporal JWT to build JWT without buildTimeout args' , async ( ) => {
200+ options . body . buildTimeout = DEFAULT_BUILD_TIMEOUT ;
201+ requestMock . withArgs ( options ) . resolves ( fakeResponse ) ;
202+
203+ await instance . exchangeTokenForBuild ( postConfig ) . then ( ( buildToken ) => {
204+ assert . equal ( fakeResponse . body . token , buildToken ) ;
205+ } ) ;
206+ } ) ;
207+
208+ it ( 'returns error if buildTimeout value is invalid' , async ( ) => {
209+ buildTimeout = 'aaa' ;
210+ const returnMessage = `Invalid buildTimeout value: ${ buildTimeout } ` ;
211+
212+ await instance . exchangeTokenForBuild ( postConfig , buildTimeout ) . then ( ( ) => {
213+ throw new Error ( 'did not fail' ) ;
214+ } , ( err ) => {
215+ assert . equal ( err . message , returnMessage ) ;
216+ } ) ;
217+ } ) ;
218+
219+ it ( 'returns error if response code is not 200' , async ( ) => {
220+ fakeResponse . statusCode = 409 ;
221+
222+ const returnMessage =
223+ `Failed to exchange build token: ${ JSON . stringify ( fakeResponse . body ) } ` ;
224+
225+ requestMock . withArgs ( options ) . resolves ( fakeResponse ) ;
226+
227+ await instance . exchangeTokenForBuild ( postConfig , buildTimeout ) . then ( ( ) => {
228+ throw new Error ( 'did not fail' ) ;
229+ } , ( err ) => {
230+ assert . equal ( err . message , returnMessage ) ;
231+ } ) ;
232+ } ) ;
233+ } ) ;
154234} ) ;
0 commit comments