import { describe, expect, it, vi } from 'vitest'
import {
  buildUnsubscribeUrl,
  signSequenceUnsubToken,
  verifySequenceUnsubToken,
} from '../src/services/sequences/unsubscribe-token'

vi.mock('@zync/auth', () => ({
  timingSafeEqual: (a: string, b: string): boolean => {
    const { timingSafeEqual: nodeTSE } = require('node:crypto')
    const bufA = Buffer.from(a, 'utf8')
    const bufB = Buffer.from(b, 'utf8')
    if (bufA.length !== bufB.length) return false
    return nodeTSE(bufA, bufB)
  },
}))

describe('sequence unsubscribe tokens', () => {
  it('verify only matches the bound enrollment and tenant', async () => {
    const token = await signSequenceUnsubToken('enroll-1', 'tenant-1', 'secret-key')

    await expect(
      verifySequenceUnsubToken(token, 'enroll-1', 'tenant-1', 'secret-key'),
    ).resolves.toBe(true)
    await expect(
      verifySequenceUnsubToken(token, 'enroll-2', 'tenant-1', 'secret-key'),
    ).resolves.toBe(false)
    await expect(
      verifySequenceUnsubToken(token, 'enroll-1', 'tenant-2', 'secret-key'),
    ).resolves.toBe(false)
  })

  it('builds the public unsubscribe URL', () => {
    expect(buildUnsubscribeUrl('enroll-1', 'token-1')).toBe(
      'https://zync.is/unsubscribe/sequence?e=token-1&id=enroll-1',
    )
  })
})
