retry-helper.test.ts 2.3 KB

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