retry-helper.test.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. const mockCore = jest.genMockFromModule('@actions/core') as any
  2. mockCore.info = (message: string) => {
  3. info.push(message)
  4. }
  5. let info: string[]
  6. let retryHelper: any
  7. describe('retry-helper tests', () => {
  8. beforeAll(() => {
  9. // Mocks
  10. jest.setMock('@actions/core', mockCore)
  11. // Now import
  12. const retryHelperModule = require('../lib/retry-helper')
  13. retryHelper = new retryHelperModule.RetryHelper(3, 0, 0)
  14. })
  15. beforeEach(() => {
  16. // Reset info
  17. info = []
  18. })
  19. afterAll(() => {
  20. // Reset modules
  21. jest.resetModules()
  22. })
  23. it('first attempt succeeds', async () => {
  24. const actual = await retryHelper.execute(async () => {
  25. return 'some result'
  26. })
  27. expect(actual).toBe('some result')
  28. expect(info).toHaveLength(0)
  29. })
  30. it('second attempt succeeds', async () => {
  31. let attempts = 0
  32. const actual = await retryHelper.execute(() => {
  33. if (++attempts == 1) {
  34. throw new Error('some error')
  35. }
  36. return Promise.resolve('some result')
  37. })
  38. expect(attempts).toBe(2)
  39. expect(actual).toBe('some result')
  40. expect(info).toHaveLength(2)
  41. expect(info[0]).toBe('some error')
  42. expect(info[1]).toMatch(/Waiting .+ seconds before trying again/)
  43. })
  44. it('third attempt succeeds', async () => {
  45. let attempts = 0
  46. const actual = await retryHelper.execute(() => {
  47. if (++attempts < 3) {
  48. throw new Error(`some error ${attempts}`)
  49. }
  50. return Promise.resolve('some result')
  51. })
  52. expect(attempts).toBe(3)
  53. expect(actual).toBe('some result')
  54. expect(info).toHaveLength(4)
  55. expect(info[0]).toBe('some error 1')
  56. expect(info[1]).toMatch(/Waiting .+ seconds before trying again/)
  57. expect(info[2]).toBe('some error 2')
  58. expect(info[3]).toMatch(/Waiting .+ seconds before trying again/)
  59. })
  60. it('all attempts fail succeeds', async () => {
  61. let attempts = 0
  62. let error: Error = (null as unknown) as Error
  63. try {
  64. await retryHelper.execute(() => {
  65. throw new Error(`some error ${++attempts}`)
  66. })
  67. } catch (err) {
  68. error = err
  69. }
  70. expect(error.message).toBe('some error 3')
  71. expect(attempts).toBe(3)
  72. expect(info).toHaveLength(4)
  73. expect(info[0]).toBe('some error 1')
  74. expect(info[1]).toMatch(/Waiting .+ seconds before trying again/)
  75. expect(info[2]).toBe('some error 2')
  76. expect(info[3]).toMatch(/Waiting .+ seconds before trying again/)
  77. })
  78. })