import * as localStorage from '../utils/local-storage'
import { getNumberOfRetries, getLastRetryDate } from './retries'

describe('getNumberOfRetries', () => {
  let getLocalStorageItemSpy: jest.SpyInstance<string | null, [key: string]>

  beforeEach(() => {
    getLocalStorageItemSpy = jest.spyOn(localStorage, 'getItem')
  })

  afterEach(() => {
    jest.restoreAllMocks()
  })

  it('returns 0 if value was not found in localStorage', () => {
    getLocalStorageItemSpy.mockReturnValueOnce(null)

    const result = getNumberOfRetries()

    expect(result).toBe(0)
  })

  it('returns 0 if value is 0', () => {
    getLocalStorageItemSpy.mockReturnValueOnce('0')

    const result = getNumberOfRetries()

    expect(result).toBe(0)
  })

  it('returns number value if value is defined', () => {
    getLocalStorageItemSpy.mockReturnValueOnce('6')

    const result = getNumberOfRetries()

    expect(result).toBe(6)
  })

  it('returns 0 value if value is not a number', () => {
    getLocalStorageItemSpy.mockReturnValueOnce('aaabbb')

    const result = getNumberOfRetries()

    expect(result).toBe(0)
  })
})

describe('getLastRetryDate', () => {
  const minDate = new Date(0)
  let getLocalStorageItemSpy: jest.SpyInstance<string | null, [key: string]>

  beforeEach(() => {
    getLocalStorageItemSpy = jest.spyOn(localStorage, 'getItem')
  })

  afterEach(() => {
    jest.restoreAllMocks()
  })

  it('returns min date if value was not found in localStorage', () => {
    getLocalStorageItemSpy.mockReturnValueOnce(null)

    const result = getLastRetryDate()

    expect(result?.getTime()).toBe(minDate.getTime())
  })

  it('returns date value if value is defined', () => {
    const currentDate = Date.now()

    getLocalStorageItemSpy.mockReturnValueOnce(String(currentDate))

    const result = getLastRetryDate()

    expect(result?.getTime()).toBe(currentDate)
  })

  it('returns 0 value if value is not a number', () => {
    getLocalStorageItemSpy.mockReturnValueOnce('aaabbb')

    const result = getLastRetryDate()

    expect(result?.getTime()).toBe(minDate.getTime())
  })
})
