2020-02-13 21:25:46 +03:00
import * as core from '@actions/core'
import { RetryHelper } from '../lib/retry-helper'
2019-12-12 21:16:16 +03:00
let info : string [ ]
let retryHelper : any
describe ( 'retry-helper tests' , ( ) = > {
beforeAll ( ( ) = > {
2020-02-13 21:25:46 +03:00
// Mock @actions/core info()
jest . spyOn ( core , 'info' ) . mockImplementation ( ( message : string ) = > {
info . push ( message )
} )
2019-12-12 21:16:16 +03:00
2020-02-13 21:25:46 +03:00
retryHelper = new RetryHelper ( 3 , 0 , 0 )
2019-12-12 21:16:16 +03:00
} )
beforeEach ( ( ) = > {
// Reset info
info = [ ]
} )
afterAll ( ( ) = > {
2020-02-13 21:25:46 +03:00
// Restore
jest . restoreAllMocks ( )
2019-12-12 21:16:16 +03:00
} )
it ( 'first attempt succeeds' , async ( ) = > {
const actual = await retryHelper . execute ( async ( ) = > {
return 'some result'
} )
expect ( actual ) . toBe ( 'some result' )
expect ( info ) . toHaveLength ( 0 )
} )
it ( 'second attempt succeeds' , async ( ) = > {
let attempts = 0
const actual = await retryHelper . execute ( ( ) = > {
if ( ++ attempts == 1 ) {
throw new Error ( 'some error' )
}
return Promise . resolve ( 'some result' )
} )
expect ( attempts ) . toBe ( 2 )
expect ( actual ) . toBe ( 'some result' )
expect ( info ) . toHaveLength ( 2 )
expect ( info [ 0 ] ) . toBe ( 'some error' )
expect ( info [ 1 ] ) . toMatch ( /Waiting .+ seconds before trying again/ )
} )
it ( 'third attempt succeeds' , async ( ) = > {
let attempts = 0
const actual = await retryHelper . execute ( ( ) = > {
if ( ++ attempts < 3 ) {
throw new Error ( ` some error ${ attempts } ` )
}
return Promise . resolve ( 'some result' )
} )
expect ( attempts ) . toBe ( 3 )
expect ( actual ) . toBe ( 'some result' )
expect ( info ) . toHaveLength ( 4 )
expect ( info [ 0 ] ) . toBe ( 'some error 1' )
expect ( info [ 1 ] ) . toMatch ( /Waiting .+ seconds before trying again/ )
expect ( info [ 2 ] ) . toBe ( 'some error 2' )
expect ( info [ 3 ] ) . toMatch ( /Waiting .+ seconds before trying again/ )
} )
it ( 'all attempts fail succeeds' , async ( ) = > {
let attempts = 0
let error : Error = ( null as unknown ) as Error
try {
await retryHelper . execute ( ( ) = > {
throw new Error ( ` some error ${ ++ attempts } ` )
} )
} catch ( err ) {
2021-10-19 17:52:57 +03:00
error = err as Error
2019-12-12 21:16:16 +03:00
}
expect ( error . message ) . toBe ( 'some error 3' )
expect ( attempts ) . toBe ( 3 )
expect ( info ) . toHaveLength ( 4 )
expect ( info [ 0 ] ) . toBe ( 'some error 1' )
expect ( info [ 1 ] ) . toMatch ( /Waiting .+ seconds before trying again/ )
expect ( info [ 2 ] ) . toBe ( 'some error 2' )
expect ( info [ 3 ] ) . toMatch ( /Waiting .+ seconds before trying again/ )
} )
} )