import { describe, expect, test } from 'bun:test'
import { enqueueRevalidateWithRedis, REVALIDATE_ENQUEUE_SCRIPT, type RevalidateQueueClient } from './revalidate-queue'

describe('enqueueRevalidateWithRedis', () => {
	test('atomically releases NX dedupe when XADD fails', async () => {
		let dedupePresent = false
		const calls: Array<{ keyCount: number; keysAndArgs: string[] }> = []
		const redis: RevalidateQueueClient = {
			async eval(script, keyCount, ...keysAndArgs) {
				calls.push({ keyCount, keysAndArgs })
				expect(script).toBe(REVALIDATE_ENQUEUE_SCRIPT)
				expect(script).toContain("redis.pcall('XADD'")
				expect(script).not.toContain('MAXLEN')
				expect(script).toContain("redis.call('XRANGE'")
				expect(script).toContain("redis.call('XLEN'")
				expect(script).toContain("redis.call('DEL', KEYS[1])")

				// Model the script's atomic XADD failure cleanup path. No caller can
				// observe this temporary key outside the single EVAL execution.
				dedupePresent = true
				dedupePresent = false
				throw new Error('Redis XADD failed')
			},
		}

		const result = await enqueueRevalidateWithRedis(redis, 'did:plc:test', 'site', 'storage-miss:index.html')

		expect(result).toEqual({ enqueued: false, result: 'error' })
		expect(dedupePresent).toBe(false)
		expect(calls).toEqual([
			{
				keyCount: 4,
				keysAndArgs: [
					'revalidate:site:storage-miss:did:plc:test:site',
					'wisp:revalidate',
					'wisp:revalidate:quarantine:did%3Aplc%3Atest/site',
					'wisp:revalidate:version:did%3Aplc%3Atest/site',
					'600',
					'10000',
					'did:plc:test',
					'site',
					'storage-miss:index.html',
					expect.any(String),
				],
			},
		])
	})

	test('treats a script dedupe response as deduped', async () => {
		const redis: RevalidateQueueClient = {
			async eval() {
				return [0, '123-0']
			},
		}

		await expect(enqueueRevalidateWithRedis(redis, 'did:plc:test', 'site', 'rewrite-miss:index.html')).resolves.toEqual(
			{
				enqueued: false,
				result: 'deduped',
			},
		)
	})

	test('suppresses repairs while the site is durably quarantined', async () => {
		const redis: RevalidateQueueClient = { eval: async () => [-2, 'dlq-9'] }
		await expect(enqueueRevalidateWithRedis(redis, 'did:plc:test', 'site', 'storage-miss:index.html')).resolves.toEqual(
			{
				enqueued: false,
				result: 'quarantined',
			},
		)
	})

	test('returns hard backpressure instead of trimming pending entries at capacity', async () => {
		const redis: RevalidateQueueClient = { eval: async () => [-1, ''] }
		await expect(enqueueRevalidateWithRedis(redis, 'did:plc:test', 'site', 'storage-miss:index.html')).resolves.toEqual(
			{
				enqueued: false,
				result: 'error',
			},
		)
	})

	test('accepts only a concrete stream ID as a successful enqueue', async () => {
		const redis: RevalidateQueueClient = { eval: async () => [1, '456-0'] }
		await expect(
			enqueueRevalidateWithRedis(redis, 'did:plc:test', 'site', 'legacy-source-cid-backfill'),
		).resolves.toEqual({
			enqueued: true,
			result: 'enqueued',
		})
	})
})
