import { it, expect, vi, beforeEach, afterEach, describe } from 'vitest'
import { createMemoryBackend } from './memory.js'

describe('createMemoryBackend', () => {
  it('miss → undefined', async () => {
    const backend = createMemoryBackend()
    await expect(backend.get('missing')).resolves.toBeUndefined()
  })

  it('set + get round-trip', async () => {
    const backend = createMemoryBackend()
    await backend.set('k', 'v')
    await expect(backend.get('k')).resolves.toBe('v')
  })

  it('del removes a key', async () => {
    const backend = createMemoryBackend()
    await backend.set('k', 'v')
    await backend.del('k')
    await expect(backend.get('k')).resolves.toBeUndefined()
  })

  describe('ttl expiry', () => {
    beforeEach(() => {
      vi.useFakeTimers()
      vi.setSystemTime(new Date('2026-06-16T12:00:00.000Z'))
    })

    afterEach(() => {
      vi.useRealTimers()
    })

    it('lazy-expires on read after ttl', async () => {
      const backend = createMemoryBackend()
      await backend.set('k', 'v', 1)
      vi.advanceTimersByTime(1001)
      await expect(backend.get('k')).resolves.toBeUndefined()
    })
  })
})
