diff --git a/fixtures/events/event-0-the-one-who-post-and-users-repost.json b/fixtures/events/event-0-the-one-who-post-and-users-repost.json new file mode 100644 index 0000000..1e062eb --- /dev/null +++ b/fixtures/events/event-0-the-one-who-post-and-users-repost.json @@ -0,0 +1,9 @@ +{ + "id": "155ee53d9319d427ac0d5a8f0089654d8db66d0f1b31d8bd0d389b7a5417992f", + "pubkey": "04c915daefee38317fa734444acee390a8269fe5810b2241e5e6dd343dfbecc9", + "created_at": 1712507673, + "kind": 0, + "tags": [], + "content": "{\"displayName\":\"ODELL\",\"pubkey\":\"04c915daefee38317fa734444acee390a8269fe5810b2241e5e6dd343dfbecc9\",\"npub\":\"npub1qny3tkh0acurzla8x3zy4nhrjz5zd8l9sy9jys09umwng00manysew95gx\",\"created_at\":1712419265,\"display_name\":\"ODELL\",\"name\":\"ODELL\",\"website\":\"https://odell.xyz\",\"about\":\"FREEDOM TECH IS HOPE 🫡 | COFOUNDER - OPENSATS AND BITCOIN PARK | MANAGING PARTNER - TEN31 |\",\"lud16\":\"odell@vlt.ge\",\"nip05\":\"odell@werunbtc.com\",\"picture\":\"https://m.primal.net/Hrsv.webp\",\"banner\":\"https://m.primal.net/HqQz.jpg\"}", + "sig": "355663a38ebd1cb31b5d2864357c4fdbeecfaedd602133638cf255ea30e6e532e3c927495c5eb5dfc0e77046d2e1d4e8be271f279c2c7eb9c9273028bfc033f4" +} diff --git a/fixtures/events/event-0-the-one-who-repost.json b/fixtures/events/event-0-the-one-who-repost.json new file mode 100644 index 0000000..145e4d1 --- /dev/null +++ b/fixtures/events/event-0-the-one-who-repost.json @@ -0,0 +1,9 @@ +{ + "id": "343e756c454d1fe623e0ea5a7653e5d0cb643fee49acef4b4e8df7645d27c8e4", + "pubkey": "82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2", + "created_at": 1712835974, + "kind": 0, + "tags": [], + "content": "{\"lud16\":\"jack@primal.net\",\"about\":\"bitcoin & chill\",\"picture\":\"https:\\/\\/nostr.build\\/i\\/p\\/nostr.build_6b9909bccf0f4fdaf7aacd9bc01e4ce70dab86f7d90395f2ce925e6ea06ed7cd.jpeg\",\"display_name\":\"\",\"lud06\":\"\",\"banner\":\"https:\\/\\/upload.wikimedia.org\\/wikipedia\\/commons\\/b\\/b4\\/The_Sun_by_the_Atmospheric_Imaging_Assembly_of_NASA%27s_Solar_Dynamics_Observatory_-_20100819.jpg\",\"website\":\"\",\"nip05\":\"\",\"name\":\"jack\"}", + "sig": "f3a896b67145eeca606c30375a146055c424ce1216f3e894d720733912aba3a90cf70e018d131246977c85b4ed9491fa43843e7728caab6b28da5d80decf9045" +} diff --git a/fixtures/events/event-1-reposted.json b/fixtures/events/event-1-reposted.json new file mode 100644 index 0000000..96d4c29 --- /dev/null +++ b/fixtures/events/event-1-reposted.json @@ -0,0 +1,9 @@ +{ + "id": "b460c8eb16ce7b3ebe3079240c47bb7cace5ad2bd0246fab1ed36a12fb816b1e", + "pubkey": "04c915daefee38317fa734444acee390a8269fe5810b2241e5e6dd343dfbecc9", + "created_at": 1713045404, + "kind": 1, + "tags": [], + "content": "BITCOIN IS THE ONLY GLOBAL FREE MARKET. 24/7/365 LIQUIDITY. NO CIRCUIT BREAKERS. FEATURE NOT A BUG. STAY HUMBLE AND STACK SATS.", + "sig": "b56ddd466d00de591f371b1933e73deeeba2f56f4b0ee8179b3f6a6b4e45f6bb850a6802d6be17055d13c699b733f610b69fbfbbfbcd609c526b8c5097b28505" +} diff --git a/fixtures/events/event-6.json b/fixtures/events/event-6.json new file mode 100644 index 0000000..bb3e94f --- /dev/null +++ b/fixtures/events/event-6.json @@ -0,0 +1,18 @@ +{ + "id": "863185c0b3a18316f438b7920a1f5217ac5a0f2a078dc003f9969512e8c8a5de", + "pubkey": "82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2", + "created_at": 1713045438, + "kind": 6, + "tags": [ + [ + "e", + "b460c8eb16ce7b3ebe3079240c47bb7cace5ad2bd0246fab1ed36a12fb816b1e" + ], + [ + "p", + "04c915daefee38317fa734444acee390a8269fe5810b2241e5e6dd343dfbecc9" + ] + ], + "content": "{\"content\":\"BITCOIN IS THE ONLY GLOBAL FREE MARKET. 24\\/7\\/365 LIQUIDITY. NO CIRCUIT BREAKERS. FEATURE NOT A BUG. STAY HUMBLE AND STACK SATS.\",\"id\":\"b460c8eb16ce7b3ebe3079240c47bb7cace5ad2bd0246fab1ed36a12fb816b1e\",\"tags\":[],\"sig\":\"b56ddd466d00de591f371b1933e73deeeba2f56f4b0ee8179b3f6a6b4e45f6bb850a6802d6be17055d13c699b733f610b69fbfbbfbcd609c526b8c5097b28505\",\"created_at\":1713045404,\"kind\":1,\"pubkey\":\"04c915daefee38317fa734444acee390a8269fe5810b2241e5e6dd343dfbecc9\"}", + "sig": "3bf75ad219c87194679ac08c2d90c1845cb0352633d73e1cf1b7e83e7be61a18a47dcb4746b4b9dfc1d640b7578a4a602d2f68eec605494a335c0732b3b61f37" +} diff --git a/src/storages/hydrate.test.ts b/src/storages/hydrate.test.ts index e9567a5..7ef7487 100644 --- a/src/storages/hydrate.test.ts +++ b/src/storages/hydrate.test.ts @@ -4,14 +4,18 @@ import { db } from '@/db.ts'; import { hydrateEvents } from '@/storages/hydrate.ts'; import event0 from '~/fixtures/events/event-0.json' with { type: 'json' }; +import event0madePost from '~/fixtures/events/event-0-the-one-who-post-and-users-repost.json' with { type: 'json' }; +import event0madeRepost from '~/fixtures/events/event-0-the-one-who-repost.json' with { type: 'json' }; import event1 from '~/fixtures/events/event-1.json' with { type: 'json' }; +import event1reposted from '~/fixtures/events/event-1-reposted.json' with { type: 'json' }; +import event6 from '~/fixtures/events/event-6.json' with { type: 'json' }; const eventsDB = new EventsDB(db); Deno.test('hydrate author', async () => { // Save events to database - await eventsDB.event(event1); await eventsDB.event(event0); + await eventsDB.event(event1); assertEquals((event1 as any).author, undefined, "Event hasn't been hydrated yet"); @@ -26,8 +30,39 @@ Deno.test('hydrate author', async () => { }); const expectedEvent = { ...event1, author: event0 }; - assertEquals(event1, expectedEvent); + await eventsDB.remove([{ kinds: [0, 1] }]); + assertEquals(await eventsDB.query([{ kinds: [0, 1] }]), []); + + clearTimeout(timeoutId); +}); + +Deno.test('hydrate repost', async () => { + // Save events to database + await eventsDB.event(event0madePost); + await eventsDB.event(event0madeRepost); + await eventsDB.event(event1reposted); + await eventsDB.event(event6); + + assertEquals((event6 as any).author, undefined, "Event hasn't been hydrated author yet"); + assertEquals((event6 as any).repost, undefined, "Event hasn't been hydrated repost yet"); + + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 1000); + + await hydrateEvents({ + events: [event6], + relations: ['repost', 'author'], + storage: eventsDB, + signal: controller.signal, + }); + + const expectedEvent6 = { ...event6, author: event0madeRepost, repost: { ...event1reposted, author: event0madePost } }; + assertEquals(event6, expectedEvent6); + + await eventsDB.remove([{ kinds: [0, 1, 6] }]); + assertEquals(await eventsDB.query([{ kinds: [0, 1, 6] }]), []); + clearTimeout(timeoutId); });