joerglohrerde/publish/tests/relays_test.ts

62 lines
1.8 KiB
TypeScript

import { assertEquals } from '@std/assert'
import { publishToRelays } from '../src/core/relays.ts'
const sampleEvent = {
kind: 1,
pubkey: 'p',
created_at: 1,
tags: [],
content: 'x',
id: 'i',
sig: 's',
}
Deno.test('publishToRelays: meldet OK-Antworten je relay', async () => {
const injected = async (url: string, _ev: unknown) => {
if (url.includes('fail')) return { ok: false, reason: 'nope' }
return { ok: true }
}
const result = await publishToRelays(
['wss://ok1.example', 'wss://ok2.example', 'wss://fail.example'],
sampleEvent,
{ publishFn: injected, retries: 0, timeoutMs: 100 },
)
assertEquals(result.ok.sort(), ['wss://ok1.example', 'wss://ok2.example'])
assertEquals(result.failed, ['wss://fail.example'])
})
Deno.test('publishToRelays: retry bei Fehler', async () => {
let attempts = 0
const injected = async () => {
attempts++
if (attempts < 2) return { ok: false, reason: 'transient' }
return { ok: true }
}
const result = await publishToRelays(
['wss://flaky.example'],
sampleEvent,
{ publishFn: injected, retries: 1, timeoutMs: 100, backoffMs: 1 },
)
assertEquals(result.ok, ['wss://flaky.example'])
assertEquals(attempts, 2)
})
Deno.test('publishToRelays: timeout → failed', async () => {
const pendingTimers: number[] = []
const injected = () =>
new Promise<{ ok: boolean }>((resolve) => {
const t = setTimeout(() => resolve({ ok: true }), 500)
pendingTimers.push(t)
})
try {
const result = await publishToRelays(
['wss://slow.example'],
sampleEvent,
{ publishFn: injected, retries: 0, timeoutMs: 10 },
)
assertEquals(result.failed, ['wss://slow.example'])
} finally {
for (const t of pendingTimers) clearTimeout(t)
}
})