delay.test.js 1.2 KB

123456789101112131415161718192021222324252627282930313233
  1. const delay = require('./delay')
  2. const { AbortController } = require('./AbortController')
  3. describe('delay', () => {
  4. it('should wait for the specified time', async () => {
  5. const start = Date.now()
  6. await delay(100)
  7. expect(Date.now() - start).toBeGreaterThanOrEqual(100)
  8. })
  9. it('should reject if signal is already aborted', async () => {
  10. const signal = { aborted: true }
  11. const start = Date.now()
  12. await expect(delay(100, { signal })).rejects.toHaveProperty('name', 'AbortError')
  13. // should really be instant but using a very large range in case CI decides to be super busy and block the event loop for a while
  14. expect(Date.now() - start).toBeLessThan(50)
  15. })
  16. it('should reject when signal is aborted', async () => {
  17. const controller = new AbortController()
  18. const start = Date.now()
  19. const testDelay = delay(100, { signal: controller.signal })
  20. await Promise.all([
  21. delay(50).then(() => controller.abort()),
  22. expect(testDelay).rejects.toHaveProperty('name', 'AbortError')
  23. ])
  24. // should have rejected before the timer is done
  25. const time = Date.now() - start
  26. expect(time).toBeGreaterThanOrEqual(50)
  27. expect(time).toBeLessThan(100)
  28. })
  29. })