import { describe, expect, it, vi } from 'vitest'

import { consola } from 'consola'
import { logger, useLogger } from './logger'

vi.mock('consola', () => {
  const logger = {} as any

  logger.create = vi.fn(() => ({ ...logger }))
  logger.withTag = vi.fn(() => ({ ...logger }))

  return { consola: logger }
})

describe('logger', () => {
  it('should expose consola', () => {
    expect(logger).toBe(consola)
  })
})

describe('useLogger', () => {
  it('should expose consola when not passing a tag', () => {
    expect(useLogger()).toBe(consola)
  })

  it('should create a new instance when passing a tag', () => {
    const logger = vi.mocked(consola)

    const instance = useLogger('tag')

    expect(instance).toEqual(logger)
    expect(instance).not.toBe(logger)
    expect(logger.create).toBeCalledWith({})
    expect(logger.withTag).toBeCalledWith('tag')
  })

  it('should create a new instance when passing a tag and options', () => {
    const logger = vi.mocked(consola)

    const instance = useLogger('tag', { level: 0 })

    expect(instance).toEqual(logger)
    expect(instance).not.toBe(logger)
    expect(logger.create).toBeCalledWith({ level: 0 })
    expect(logger.withTag).toBeCalledWith('tag')
  })
})