ditto/src/storages/hydrate.test.ts
2024-04-16 09:31:03 -03:00

105 lines
3.7 KiB
TypeScript

import { assertEquals } from '@/deps-test.ts';
import { EventsDB } from '@/storages/events-db.ts';
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 event0madeQuoteRepost from '~/fixtures/events/event-0-the-one-who-quote-repost.json' with { type: 'json' };
import event1 from '~/fixtures/events/event-1.json' with { type: 'json' };
import event1quoteRepost from '~/fixtures/events/event-1-quote-repost.json' with { type: 'json' };
import event1willBeQuoteReposted from '~/fixtures/events/event-1-that-will-be-quote-reposted.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' };
import { DittoEvent } from '@/interfaces/DittoEvent.ts';
const eventsDB = new EventsDB(db);
Deno.test('hydrate author', async () => {
// Save events to database
await eventsDB.event(event0);
await eventsDB.event(event1);
assertEquals((event1 as DittoEvent).author, undefined, "Event hasn't been hydrated yet");
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 1000);
await hydrateEvents({
events: [event1],
relations: ['author'],
storage: eventsDB,
signal: controller.signal,
});
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 DittoEvent).author, undefined, "Event hasn't been hydrated author yet");
assertEquals((event6 as DittoEvent).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);
});
Deno.test('hydrate quote repost with hydrate author', async () => {
// Save events to database
await eventsDB.event(event0madeQuoteRepost);
await eventsDB.event(event0);
await eventsDB.event(event1quoteRepost);
await eventsDB.event(event1willBeQuoteReposted);
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 1000);
await hydrateEvents({
events: [event1quoteRepost],
relations: ['author', 'quote_repost'], // if author is called first the performance will be better
storage: eventsDB,
signal: controller.signal,
});
const expectedEvent1quoteRepost = {
...event1quoteRepost,
author: event0madeQuoteRepost,
quote_repost: { ...event1willBeQuoteReposted, author: event0 },
};
assertEquals(event1quoteRepost, expectedEvent1quoteRepost);
await eventsDB.remove([{ kinds: [0, 1] }]);
assertEquals(await eventsDB.query([{ kinds: [0, 1] }]), []);
clearTimeout(timeoutId);
});