import Timeout from '../timeout'

const callbackMock = jest.fn()

describe('timeout', () => {
  beforeEach(() => {
    jest.useFakeTimers()
  })

  afterEach(() => {
    jest.resetAllMocks()
    jest.useRealTimers()
  })

  test('it should implement exponential backoff up until 5 minutes', async () => {
    const timeout = new Timeout()
    timeout.start(callbackMock)
    jest.advanceTimersByTime(5000)
    expect(callbackMock).toHaveBeenCalledTimes(1)
    jest.advanceTimersByTime(20000)
    expect(callbackMock).toHaveBeenCalledTimes(2)
    jest.advanceTimersByTime(45000 + 80000 + 125000 + 180000 + 245000)
    expect(callbackMock).toHaveBeenCalledTimes(7)
    jest.advanceTimersByTime(300000)
    expect(callbackMock).toHaveBeenCalledTimes(8)
    jest.advanceTimersByTime(300000)
    expect(callbackMock).toHaveBeenCalledTimes(9)
  })

  test('it should clear the timer', async () => {
    const timeout = new Timeout()
    timeout.start(callbackMock)
    jest.advanceTimersByTime(5000)
    expect(callbackMock).toHaveBeenCalledTimes(1)
    timeout.clear()
    jest.advanceTimersByTime(20000)
    expect(callbackMock).toHaveBeenCalledTimes(1)
  })
})
