diff --git a/deno.json b/deno.json index dfeea2f6..33cb119c 100644 --- a/deno.json +++ b/deno.json @@ -74,6 +74,7 @@ "@soapbox/logi": "jsr:@soapbox/logi@^0.3.0", "@soapbox/safe-fetch": "jsr:@soapbox/safe-fetch@^2.0.0", "@std/assert": "jsr:@std/assert@^0.225.1", + "@std/async": "jsr:@std/async@^1.0.10", "@std/cli": "jsr:@std/cli@^0.223.0", "@std/crypto": "jsr:@std/crypto@^0.224.0", "@std/encoding": "jsr:@std/encoding@^0.224.0", diff --git a/deno.lock b/deno.lock index 1f039c17..20e8a8f8 100644 --- a/deno.lock +++ b/deno.lock @@ -58,6 +58,7 @@ "jsr:@std/assert@^1.0.10": "1.0.11", "jsr:@std/assert@~0.213.1": "0.213.1", "jsr:@std/assert@~0.225.1": "0.225.3", + "jsr:@std/async@^1.0.10": "1.0.10", "jsr:@std/bytes@0.223": "0.223.0", "jsr:@std/bytes@0.224": "0.224.0", "jsr:@std/bytes@0.224.0": "0.224.0", @@ -604,6 +605,9 @@ "jsr:@std/internal@^1.0.5" ] }, + "@std/async@1.0.10": { + "integrity": "2ff1b1c7d33d1416159989b0f69e59ec7ee8cb58510df01e454def2108b3dbec" + }, "@std/bytes@0.223.0": { "integrity": "84b75052cd8680942c397c2631318772b295019098f40aac5c36cead4cba51a8" }, @@ -2489,6 +2493,7 @@ "jsr:@soapbox/logi@0.3", "jsr:@soapbox/safe-fetch@2", "jsr:@std/assert@~0.225.1", + "jsr:@std/async@^1.0.10", "jsr:@std/cli@0.223", "jsr:@std/crypto@0.224", "jsr:@std/encoding@0.224", diff --git a/packages/ditto/storages/DittoRelayStore.test.ts b/packages/ditto/storages/DittoRelayStore.test.ts index 66690efa..407b77e5 100644 --- a/packages/ditto/storages/DittoRelayStore.test.ts +++ b/packages/ditto/storages/DittoRelayStore.test.ts @@ -2,12 +2,39 @@ import { DittoPolyPg } from '@ditto/db'; import { DittoConf } from '@ditto/conf'; import { genEvent, MockRelay } from '@nostrify/nostrify/test'; import { assertEquals } from '@std/assert'; +import { waitFor } from '@std/async/unstable-wait-for'; import { generateSecretKey, getPublicKey } from 'nostr-tools'; import { DittoRelayStore } from './DittoRelayStore.ts'; import type { NostrMetadata } from '@nostrify/types'; +Deno.test('generates set event for nip05 request', async () => { + await using test = setupTest(); + + const admin = await test.conf.signer.getPublicKey(); + const event = genEvent({ kind: 3036, tags: [['r', 'alex@gleasonator.dev'], ['p', admin]] }); + + await test.store.event(event); + + const filter = { kinds: [30383], authors: [admin], '#d': [event.id] }; + + await waitFor(async () => { + const { count } = await test.store.count([filter]); + return count > 0; + }, 3000); + + const [result] = await test.store.query([filter]); + + assertEquals(result?.tags, [ + ['d', event.id], + ['p', event.pubkey], + ['k', '3036'], + ['r', 'alex@gleasonator.dev'], + ['n', 'pending'], + ]); +}); + Deno.test('updateAuthorData sets nip05', async () => { const alex = generateSecretKey(); @@ -38,20 +65,25 @@ Deno.test('updateAuthorData sets nip05', async () => { assertEquals(row?.nip05_hostname, 'gleasonator.dev'); }); -function setupTest(cb: (req: Request) => Response | Promise) { +function setupTest(cb?: (req: Request) => Response | Promise) { const conf = new DittoConf(Deno.env); const db = new DittoPolyPg(conf.databaseUrl); const relay = new MockRelay(); const mockFetch: typeof fetch = async (input, init) => { const req = new Request(input, init); - return await cb(req); + if (cb) { + return await cb(req); + } else { + return new Response('Not mocked', { status: 404 }); + } }; const store = new DittoRelayStore({ conf, db, relay, fetch: mockFetch }); return { db, + conf, store, [Symbol.asyncDispose]: async () => { await store[Symbol.asyncDispose]();