import { describe, expect, it } from 'vitest'
import { generateOpaqueToken, hashToken, verifyToken } from './tokens'

describe('generateOpaqueToken', () => {
  it('produces distinct base64url tokens without standard-base64 or padding chars', () => {
    const a = generateOpaqueToken()
    const b = generateOpaqueToken()
    expect(a).not.toBe(b)
    for (const token of [a, b]) {
      expect(token).not.toMatch(/[+/=]/)
    }
  })
})

describe('hashToken / verifyToken', () => {
  it('verifies a freshly hashed token', async () => {
    const token = generateOpaqueToken()
    const hash = await hashToken(token)
    await expect(verifyToken(token, hash)).resolves.toBe(true)
  })

  it('rejects a tampered token', async () => {
    const token = generateOpaqueToken()
    const hash = await hashToken(token)
    await expect(verifyToken(`${token}x`, hash)).resolves.toBe(false)
  })

  it('returns false for a wrong-length hash without throwing', async () => {
    const token = generateOpaqueToken()
    await expect(verifyToken(token, 'abc')).resolves.toBe(false)
  })
})
