1
0
forked from Kieran/snort
snort/packages/system/tests/request-builder.test.ts

184 lines
5.1 KiB
TypeScript
Raw Normal View History

import { RelayCache } from "../src/outbox-model";
2023-07-23 22:19:26 +00:00
import { RequestBuilder, RequestStrategy } from "../src/request-builder";
2023-05-19 14:15:13 +00:00
import { describe, expect } from "@jest/globals";
2023-06-13 14:56:06 +00:00
import { bytesToHex } from "@noble/curves/abstract/utils";
2023-10-06 12:16:28 +00:00
import { FeedCache, unixNow, unixNowMs } from "@snort/shared";
import { NostrSystem, UsersRelays } from "../src";
2023-03-28 14:34:01 +00:00
2023-05-29 21:25:40 +00:00
const DummyCache = {
2023-06-19 08:55:40 +00:00
getFromCache: (pk?: string) => {
2023-05-29 21:25:40 +00:00
if (!pk) return undefined;
2023-06-19 08:55:40 +00:00
return {
pubkey: pk,
created_at: unixNow(),
relays: [
{
url: `wss://${pk}.com/`,
settings: {
read: true,
write: true,
},
2023-05-29 21:25:40 +00:00
},
2023-07-22 18:37:46 +00:00
],
2023-06-19 08:55:40 +00:00
};
2023-05-29 21:25:40 +00:00
},
update: () => {
return Promise.resolve<"new" | "updated" | "refresh" | "no_change">("new");
},
buffer: () => {
return Promise.resolve<Array<string>>([]);
},
bulkSet: () => {
return Promise.resolve();
},
} as unknown as FeedCache<UsersRelays>;
2023-10-06 12:16:28 +00:00
const System = new NostrSystem({
relayCache: DummyCache,
});
2023-05-29 21:25:40 +00:00
describe("RequestBuilder", () => {
2023-03-28 14:34:01 +00:00
describe("basic", () => {
test("empty filter", () => {
const b = new RequestBuilder("test");
b.withFilter();
2023-05-29 21:25:40 +00:00
expect(b.buildRaw()).toEqual([{}]);
2023-03-28 14:34:01 +00:00
});
test("only kind", () => {
const b = new RequestBuilder("test");
b.withFilter().kinds([0]);
2023-05-29 21:25:40 +00:00
expect(b.buildRaw()).toMatchObject([{ kinds: [0] }]);
2023-03-28 14:34:01 +00:00
});
test("empty authors", () => {
const b = new RequestBuilder("test");
b.withFilter().authors([]);
2023-05-29 21:25:40 +00:00
expect(b.buildRaw()).toMatchObject([{ authors: [] }]);
2023-03-28 14:34:01 +00:00
});
test("authors/kinds/ids", () => {
const authors = ["a1", "a2"];
const kinds = [0, 1, 2, 3];
const ids = ["id1", "id2", "id3"];
const b = new RequestBuilder("test");
b.withFilter().authors(authors).kinds(kinds).ids(ids);
2023-05-29 21:25:40 +00:00
expect(b.buildRaw()).toMatchObject([{ ids, authors, kinds }]);
2023-03-28 14:34:01 +00:00
});
test("authors and kinds, duplicates removed", () => {
const authors = ["a1", "a2"];
const kinds = [0, 1, 2, 3];
const ids = ["id1", "id2", "id3"];
const b = new RequestBuilder("test");
b.withFilter().ids(ids).authors(authors).kinds(kinds).ids(ids).authors(authors).kinds(kinds);
2023-05-29 21:25:40 +00:00
expect(b.buildRaw()).toMatchObject([{ ids, authors, kinds }]);
2023-03-28 14:34:01 +00:00
});
test("search", () => {
const b = new RequestBuilder("test");
b.withFilter().kinds([1]).search("test-search");
2023-05-29 21:25:40 +00:00
expect(b.buildRaw()).toMatchObject([{ kinds: [1], search: "test-search" }]);
2023-03-28 14:34:01 +00:00
});
test("timeline", () => {
const authors = ["a1", "a2"];
const kinds = [0, 1, 2, 3];
const until = 10;
const since = 5;
const b = new RequestBuilder("test");
b.withFilter().kinds(kinds).authors(authors).since(since).until(until);
2023-05-29 21:25:40 +00:00
expect(b.buildRaw()).toMatchObject([{ kinds, authors, until, since }]);
2023-03-28 14:34:01 +00:00
});
test("multi-filter timeline", () => {
const authors = ["a1", "a2"];
const kinds = [0, 1, 2, 3];
const until = 10;
const since = 5;
const b = new RequestBuilder("test");
b.withFilter().kinds(kinds).authors(authors).since(since).until(until);
b.withFilter().kinds(kinds).authors(authors).since(since).until(until);
2023-05-29 21:25:40 +00:00
expect(b.buildRaw()).toMatchObject([
2023-03-28 14:34:01 +00:00
{ kinds, authors, until, since },
{ kinds, authors, until, since },
]);
});
});
2023-05-29 21:25:40 +00:00
describe("diff basic", () => {
const rb = new RequestBuilder("test");
const f0 = rb.withFilter();
const a = rb.buildRaw();
f0.authors(["a"]);
expect(a).toEqual([{}]);
2023-10-06 12:16:28 +00:00
const b = rb.buildDiff(System, a);
2023-05-29 21:25:40 +00:00
expect(b).toMatchObject([
{
filters: [{ authors: ["a"] }],
},
]);
});
describe("build gossip simply", () => {
const rb = new RequestBuilder("test");
rb.withFilter().authors(["a", "b"]).kinds([0]);
2023-10-06 12:16:28 +00:00
const a = rb.build(System);
expect(a).toMatchObject([
2023-05-29 21:25:40 +00:00
{
strategy: RequestStrategy.AuthorsRelays,
relay: "wss://a.com/",
filters: [
{
kinds: [0],
authors: ["a"],
},
],
},
{
strategy: RequestStrategy.AuthorsRelays,
relay: "wss://b.com/",
filters: [
{
kinds: [0],
authors: ["b"],
},
],
},
]);
});
describe("build gossip merged similar filters", () => {
const rb = new RequestBuilder("test");
rb.withFilter().authors(["a", "b"]).kinds([0]);
rb.withFilter().authors(["a", "b"]).kinds([10002]);
rb.withFilter().authors(["a"]).limit(10).kinds([4]);
2023-10-06 12:16:28 +00:00
const a = rb.build(System);
expect(a).toMatchObject([
2023-05-29 21:25:40 +00:00
{
strategy: RequestStrategy.AuthorsRelays,
relay: "wss://a.com/",
filters: [
{
kinds: [0, 10002],
authors: ["a"],
},
{
kinds: [4],
authors: ["a"],
limit: 10,
},
],
},
{
strategy: RequestStrategy.AuthorsRelays,
relay: "wss://b.com/",
filters: [
{
kinds: [0, 10002],
authors: ["b"],
},
],
},
]);
});
2023-10-06 12:20:20 +00:00
});