retry-helper.test.ts 2.5 KB

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