/**
 * `readCookie` chỉ đọc cookie non-HttpOnly từ `document.cookie`. Test các
 * edge case URL-encoding, multiple cookies, missing/SSR.
 */
import { readCookie } from '@/util/cookie'

describe('[util/cookie] readCookie', () => {
  const setDocCookie = (value: string) => {
    Object.defineProperty(document, 'cookie', {
      value,
      configurable: true,
      writable: true,
    })
  }

  afterEach(() => {
    setDocCookie('')
  })

  it('trả null khi document undefined (SSR)', () => {
    // jsdom đặt `document` non-configurable nên không redefine được. Dùng
    // `jest.isolateModules` + tạm thời gán `globalThis.document = undefined`
    // qua `Reflect.deleteProperty`-style để verify branch SSR-guard.
    const original = (globalThis as { document?: Document }).document
    ;(globalThis as { document?: Document }).document = undefined
    try {
      expect(readCookie('foo')).toBeNull()
    } finally {
      ;(globalThis as { document?: Document }).document = original
    }
  })

  it('trả null khi cookie rỗng', () => {
    setDocCookie('')
    expect(readCookie('foo')).toBeNull()
  })

  it('trả null khi không tìm thấy cookie có tên đó', () => {
    setDocCookie('a=1; b=2')
    expect(readCookie('foo')).toBeNull()
  })

  it('lấy đúng cookie giữa nhiều cookie khác', () => {
    setDocCookie('a=1; XSRF-TOKEN=abc123; c=3')
    expect(readCookie('XSRF-TOKEN')).toBe('abc123')
  })

  it('decode URI-encoded value', () => {
    setDocCookie('token=hello%20world')
    expect(readCookie('token')).toBe('hello world')
  })

  it('giữ nguyên dấu `=` xuất hiện sau dấu `=` đầu tiên (base64 padding)', () => {
    setDocCookie('token=eyJhbGciOiJIUzI1NiJ9==')
    expect(readCookie('token')).toBe('eyJhbGciOiJIUzI1NiJ9==')
  })

  it('không match prefix giả (cookie tên `XSRF-TOKEN-other` không match `XSRF-TOKEN`)', () => {
    setDocCookie('XSRF-TOKEN-other=fake; foo=bar')
    expect(readCookie('XSRF-TOKEN')).toBeNull()
  })
})
