You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

79 lines
2.4 KiB

import {
IndexRelayTransportError,
clearDevIndexRelayUnavailableThisSession,
isDevIndexRelayUnavailableThisSession,
isIndexRelayTransportFailure,
rawToIndexRelayEvent
} from '@/lib/index-relay-http'
import { finalizeEvent, generateSecretKey, getPublicKey, verifyEvent } from 'nostr-tools'
import { describe, expect, it, beforeEach } from 'vitest'
describe('isIndexRelayTransportFailure', () => {
it('treats IndexRelayTransportError as transport failure', () => {
expect(isIndexRelayTransportFailure(new IndexRelayTransportError())).toBe(true)
expect(isIndexRelayTransportFailure(new IndexRelayTransportError(new Error('HTTP 500')))).toBe(true)
})
it('treats network TypeError as transport failure', () => {
expect(isIndexRelayTransportFailure(new TypeError('Failed to fetch'))).toBe(true)
})
})
describe('dev index relay session skip', () => {
beforeEach(() => {
clearDevIndexRelayUnavailableThisSession()
})
it('starts available after clear', () => {
expect(isDevIndexRelayUnavailableThisSession()).toBe(false)
})
})
describe('rawToIndexRelayEvent', () => {
it('accepts kind 30040 with empty or null content per NKBIP-01', () => {
const sk = generateSecretKey()
const pubkey = getPublicKey(sk)
const verified = finalizeEvent(
{
kind: 30040,
created_at: 1_700_000_000,
tags: [
['d', 'book'],
['title', 'Test Book'],
['a', `30041:${pubkey}:chapter-1`]
],
content: ''
},
sk
)
const mercuryRow = { ...verified, content: null } as unknown as Record<string, unknown>
const parsed = rawToIndexRelayEvent(mercuryRow)
expect(parsed?.content).toBe('')
expect(parsed?.kind).toBe(30040)
expect(verifyEvent(parsed!)).toBe(true)
})
it('rejects kind 30040 when tags do not match id/sig', () => {
const sk = generateSecretKey()
const pubkey = getPublicKey(sk)
const verified = finalizeEvent(
{
kind: 30040,
created_at: 1_700_000_000,
tags: [
['d', 'book'],
['title', 'Test Book'],
['a', `30041:${pubkey}:chapter-1`],
['a', `30041:${pubkey}:chapter-2`]
],
content: ''
},
sk
)
const scrambled = {
...verified,
tags: [...verified.tags].reverse()
} as unknown as Record<string, unknown>
expect(rawToIndexRelayEvent(scrambled)).toBeNull()
})
})