@fedify/fedify
Version:
An ActivityPub server framework
912 lines (911 loc) • 18 kB
JavaScript
import "@js-temporal/polyfill";
import "urlpattern-polyfill";
globalThis.addEventListener = () => {};
import { t as esm_default } from "../esm-DVILvP5e.mjs";
import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
import "../std__assert-CRDpx_HF.mjs";
import { a as parseProtocol, c as parseUsage, i as parseOutboundService, n as parseInboundService, o as parseServices, r as parseNodeInfo, s as parseSoftware, t as getNodeInfo } from "../client-D_1QpnWt.mjs";
import { test } from "@fedify/fixture";
//#region src/nodeinfo/client.test.ts
test("getNodeInfo()", async (t) => {
esm_default.spyGlobal();
esm_default.get("https://example.com/.well-known/nodeinfo", { body: { links: [{
rel: "http://nodeinfo.diaspora.software/ns/schema/2.1",
href: "https://example.com/nodeinfo/2.1"
}] } });
const rawExpected = {
software: {
name: "foo",
version: "1.2.3"
},
protocols: ["activitypub", "diaspora"],
usage: {
users: {},
localPosts: 123,
localComments: 456
}
};
esm_default.get("https://example.com/nodeinfo/2.1", { body: rawExpected });
esm_default.get("https://example.com/404", { status: 404 });
const expected = {
software: {
name: "foo",
version: "1.2.3"
},
protocols: ["activitypub", "diaspora"],
usage: {
users: {},
localPosts: 123,
localComments: 456
}
};
await t.step("indirect", async () => {
assertEquals(await getNodeInfo("https://example.com/"), expected);
assertEquals(await getNodeInfo("https://example.com/", { parse: "none" }), rawExpected);
});
await t.step("direct", async () => {
assertEquals(await getNodeInfo("https://example.com/nodeinfo/2.1", { direct: true }), expected);
});
esm_default.removeRoutes();
esm_default.get("https://example.com/.well-known/nodeinfo", { body: { links: [] } });
await t.step("indirect: no links", async () => {
assertEquals(await getNodeInfo("https://example.com/"), void 0);
});
esm_default.removeRoutes();
esm_default.get("https://example.com/.well-known/nodeinfo", { status: 404 });
await t.step("indirect: 404", async () => {
assertEquals(await getNodeInfo("https://example.com/"), void 0);
});
await t.step("direct: 404", async () => {
assertEquals(await getNodeInfo("https://example.com/nodeinfo/2.0", { direct: true }), void 0);
assertEquals(await getNodeInfo("https://example.com/404", { direct: true }), void 0);
});
esm_default.hardReset();
});
test("parseNodeInfo()", () => {
const input = {
software: {
name: "foo",
version: "1.2.3",
repository: "https://codeberg.org/foo/foo",
homepage: "https://foo.example"
},
protocols: ["activitypub", "diaspora"],
services: {
inbound: [
"atom1.0",
"pop3",
"twitter"
],
outbound: [
"atom1.0",
"diaspora",
"facebook"
]
},
openRegistrations: true,
usage: {
users: {
activeHalfyear: 10,
activeMonth: 20,
total: 30
},
localPosts: 123,
localComments: 456
},
metadata: {
foo: 123,
bar: "456"
}
};
const output = {
software: {
name: "foo",
version: "1.2.3",
repository: new URL("https://codeberg.org/foo/foo"),
homepage: new URL("https://foo.example")
},
protocols: ["activitypub", "diaspora"],
services: {
inbound: [
"atom1.0",
"pop3",
"twitter"
],
outbound: [
"atom1.0",
"diaspora",
"facebook"
]
},
openRegistrations: true,
usage: {
users: {
activeHalfyear: 10,
activeMonth: 20,
total: 30
},
localPosts: 123,
localComments: 456
},
metadata: {
foo: 123,
bar: "456"
}
};
assertEquals(parseNodeInfo(123), null);
assertEquals(parseNodeInfo(123, { tryBestEffort: true }), null);
assertEquals(parseNodeInfo(input), output);
assertEquals(parseNodeInfo({
...input,
software: {
name: " FOO ",
version: "1.2.3"
}
}), null);
assertEquals(parseNodeInfo({
...input,
software: {
name: " FOO ",
version: "1.2.3"
}
}, { tryBestEffort: true }), {
...output,
software: {
name: output.software.name,
version: output.software.version
}
});
assertEquals(parseNodeInfo({
...input,
protocols: 123
}), null);
assertEquals(parseNodeInfo({
...input,
protocols: 123
}, { tryBestEffort: true }), {
...output,
protocols: []
});
assertEquals(parseNodeInfo({
...input,
protocols: ["activitypub", "foo"]
}), null);
assertEquals(parseNodeInfo({
...input,
protocols: ["activitypub", "foo"]
}, { tryBestEffort: true }), {
...output,
protocols: ["activitypub"]
});
assertEquals(parseNodeInfo({
...input,
services: 123
}), null);
assertEquals(parseNodeInfo({
...input,
services: 123
}, { tryBestEffort: true }), {
software: output.software,
protocols: output.protocols,
openRegistrations: output.openRegistrations,
usage: output.usage,
metadata: output.metadata
});
assertEquals(parseNodeInfo({
...input,
services: { inbound: ["atom1.0", "foo"] }
}), null);
assertEquals(parseNodeInfo({
...input,
services: { inbound: ["atom1.0", "foo"] }
}, { tryBestEffort: true }), {
software: output.software,
protocols: output.protocols,
services: { inbound: ["atom1.0"] },
openRegistrations: output.openRegistrations,
usage: output.usage,
metadata: output.metadata
});
assertEquals(parseNodeInfo({
...input,
openRegistrations: 123
}), null);
assertEquals(parseNodeInfo({
...input,
openRegistrations: 123
}, { tryBestEffort: true }), {
software: output.software,
protocols: output.protocols,
services: output.services,
usage: output.usage,
metadata: output.metadata
});
assertEquals(parseNodeInfo({
...input,
usage: 123
}), null);
assertEquals(parseNodeInfo({
...input,
usage: 123
}, { tryBestEffort: true }), {
software: output.software,
protocols: output.protocols,
services: output.services,
openRegistrations: output.openRegistrations,
usage: {
users: {},
localPosts: 0,
localComments: 0
},
metadata: output.metadata
});
assertEquals(parseNodeInfo({
...input,
metadata: 123
}), null);
assertEquals(parseNodeInfo({
...input,
metadata: 123
}, { tryBestEffort: true }), {
software: output.software,
protocols: output.protocols,
services: output.services,
openRegistrations: output.openRegistrations,
usage: output.usage
});
});
test("parseSoftware()", () => {
assertEquals(parseSoftware({
name: "foo",
version: "1.2.3",
repository: "https://codeberg.org/foo/foo",
homepage: "https://foo.example"
}), {
name: "foo",
version: "1.2.3",
repository: new URL("https://codeberg.org/foo/foo"),
homepage: new URL("https://foo.example")
});
assertEquals(parseSoftware({
name: "foo",
version: "4.5.6-beta.7+build.8"
}), {
name: "foo",
version: "4.5.6-beta.7+build.8"
});
assertEquals(parseSoftware(123), null);
assertEquals(parseSoftware(123, { tryBestEffort: true }), null);
assertEquals(parseSoftware({ name: 123 }), null);
assertEquals(parseSoftware({ name: 123 }, { tryBestEffort: true }), null);
assertEquals(parseSoftware({ name: "" }), null);
assertEquals(parseSoftware({ name: "" }, { tryBestEffort: true }), null);
assertEquals(parseSoftware({ name: " FOO " }), null);
assertEquals(parseSoftware({ name: " FOO " }, { tryBestEffort: true }), {
name: "foo",
version: "0.0.0"
});
assertEquals(parseSoftware({
name: "foo",
version: 123
}), {
name: "foo",
version: "123"
});
assertEquals(parseSoftware({
name: "foo",
version: 123
}, { tryBestEffort: true }), {
name: "foo",
version: "123"
});
assertEquals(parseSoftware({
name: "foo",
version: "abc"
}), {
name: "foo",
version: "abc"
});
assertEquals(parseSoftware({
name: "foo",
version: "abc"
}, { tryBestEffort: true }), {
name: "foo",
version: "abc"
});
assertEquals(parseSoftware({
name: "foo",
version: " 1.2.3 "
}), {
name: "foo",
version: " 1.2.3 "
});
assertEquals(parseSoftware({
name: "foo",
version: " 1.2.3 "
}, { tryBestEffort: true }), {
name: "foo",
version: " 1.2.3 "
});
assertEquals(parseSoftware({
name: "foo",
version: "1.2.3",
repository: 123
}), null);
assertEquals(parseSoftware({
name: "foo",
version: "1.2.3",
homepage: 456
}), null);
assertEquals(parseSoftware({
name: "foo",
version: "1.2.3",
repository: 123,
homepage: 456
}, { tryBestEffort: true }), {
name: "foo",
version: "1.2.3"
});
assertEquals(parseSoftware({
name: "foo",
version: "1.2.3",
repository: ""
}), null);
assertEquals(parseSoftware({
name: "foo",
version: "1.2.3",
homepage: ""
}), null);
assertEquals(parseSoftware({
name: "foo",
version: "1.2.3",
repository: "",
homepage: ""
}, { tryBestEffort: true }), {
name: "foo",
version: "1.2.3"
});
assertEquals(parseSoftware({
name: "foo",
version: "2.81",
repository: "",
homepage: ""
}, { tryBestEffort: true }), {
name: "foo",
version: "2.81"
});
assertEquals(parseSoftware({
name: "foo",
version: "3",
repository: "",
homepage: ""
}, { tryBestEffort: true }), {
name: "foo",
version: "3"
});
assertEquals(parseSoftware({
name: "foo",
version: "2.1.3.4",
repository: "",
homepage: ""
}, { tryBestEffort: true }), {
name: "foo",
version: "2.1.3.4"
});
});
test("parseProtocol()", () => {
for (const protocol of [
"activitypub",
"buddycloud",
"dfrn",
"diaspora",
"libertree",
"ostatus",
"pumpio",
"tent",
"xmpp",
"zot"
]) assertEquals(parseProtocol(protocol), protocol);
assertEquals(parseProtocol("foo"), null);
});
test("parseServices()", () => {
assertEquals(parseServices({
inbound: [
"atom1.0",
"pop3",
"twitter"
],
outbound: [
"atom1.0",
"diaspora",
"facebook"
]
}), {
inbound: [
"atom1.0",
"pop3",
"twitter"
],
outbound: [
"atom1.0",
"diaspora",
"facebook"
]
});
assertEquals(parseServices({ inbound: [
"atom1.0",
"pop3",
"twitter"
] }), { inbound: [
"atom1.0",
"pop3",
"twitter"
] });
assertEquals(parseServices({ outbound: [
"atom1.0",
"diaspora",
"facebook"
] }), { outbound: [
"atom1.0",
"diaspora",
"facebook"
] });
assertEquals(parseServices({}), {});
assertEquals(parseServices(123), null);
assertEquals(parseServices(123, { tryBestEffort: true }), {});
assertEquals(parseServices({
inbound: [
"atom1.0",
"pop3",
"twitter",
"foo"
],
outbound: [
"atom1.0",
"diaspora",
"facebook"
]
}), null);
assertEquals(parseServices({
inbound: [
"atom1.0",
"pop3",
"twitter"
],
outbound: [
"atom1.0",
"diaspora",
"facebook",
"bar"
]
}), null);
assertEquals(parseServices({
inbound: [
"atom1.0",
"pop3",
"twitter",
"foo"
],
outbound: [
"atom1.0",
"diaspora",
"facebook",
"bar"
]
}, { tryBestEffort: true }), {
inbound: [
"atom1.0",
"pop3",
"twitter"
],
outbound: [
"atom1.0",
"diaspora",
"facebook"
]
});
});
test("parseInboundService()", () => {
for (const service of [
"atom1.0",
"gnusocial",
"imap",
"pnut",
"pop3",
"pumpio",
"rss2.0",
"twitter"
]) assertEquals(parseInboundService(service), service);
assertEquals(parseInboundService("foo"), null);
});
test("parseOutboundService()", () => {
for (const service of [
"atom1.0",
"blogger",
"buddycloud",
"diaspora",
"dreamwidth",
"drupal",
"facebook",
"friendica",
"gnusocial",
"google",
"insanejournal",
"libertree",
"linkedin",
"livejournal",
"mediagoblin",
"myspace",
"pinterest",
"pnut",
"posterous",
"pumpio",
"redmatrix",
"rss2.0",
"smtp",
"tent",
"tumblr",
"twitter",
"wordpress",
"xmpp"
]) assertEquals(parseOutboundService(service), service);
assertEquals(parseOutboundService("foo"), null);
});
test("parseUsage()", () => {
assertEquals(parseUsage({
users: {},
localPosts: 123,
localComments: 456
}), {
users: {},
localPosts: 123,
localComments: 456
});
assertEquals(parseUsage({
users: {
activeHalfyear: 10,
activeMonth: 20,
total: 30
},
localPosts: 123,
localComments: 456
}), {
users: {
activeHalfyear: 10,
activeMonth: 20,
total: 30
},
localPosts: 123,
localComments: 456
});
assertEquals(parseUsage(123), null);
assertEquals(parseUsage(123, { tryBestEffort: true }), null);
assertEquals(parseUsage({
users: {},
localPosts: "123",
localComments: 456
}), null);
assertEquals(parseUsage({
users: {},
localPosts: "123",
localComments: 456
}, { tryBestEffort: true }), {
users: {},
localPosts: 123,
localComments: 456
});
assertEquals(parseUsage({
users: {},
localPosts: "",
localComments: 456
}), null);
assertEquals(parseUsage({
users: {},
localPosts: "",
localComments: 456
}, { tryBestEffort: true }), {
users: {},
localPosts: 0,
localComments: 456
});
assertEquals(parseUsage({
users: {},
localPosts: [],
localComments: 456
}), null);
assertEquals(parseUsage({
users: {},
localPosts: [],
localComments: 456
}, { tryBestEffort: true }), {
users: {},
localPosts: 0,
localComments: 456
});
assertEquals(parseUsage({
users: {},
localPosts: 123,
localComments: "456"
}), null);
assertEquals(parseUsage({
users: {},
localPosts: 123,
localComments: "456"
}, { tryBestEffort: true }), {
users: {},
localPosts: 123,
localComments: 456
});
assertEquals(parseUsage({
users: {},
localPosts: 123,
localComments: ""
}), null);
assertEquals(parseUsage({
users: {},
localPosts: 123,
localComments: ""
}, { tryBestEffort: true }), {
users: {},
localPosts: 123,
localComments: 0
});
assertEquals(parseUsage({
users: null,
localPosts: 123,
localComments: []
}), null);
assertEquals(parseUsage({
users: null,
localPosts: 123,
localComments: ""
}, { tryBestEffort: true }), {
users: {},
localPosts: 123,
localComments: 0
});
assertEquals(parseUsage({
users: {},
localPosts: 123,
localComments: []
}), null);
assertEquals(parseUsage({
users: {},
localPosts: 123,
localComments: []
}, { tryBestEffort: true }), {
users: {},
localPosts: 123,
localComments: 0
});
assertEquals(parseUsage({
users: {
activeHalfyear: "10",
activeMonth: 20,
total: 30
},
localPosts: 123,
localComments: 456
}), null);
assertEquals(parseUsage({
users: {
activeHalfyear: "10",
activeMonth: 20,
total: 30
},
localPosts: 123,
localComments: 456
}, { tryBestEffort: true }), {
users: {
activeHalfyear: 10,
activeMonth: 20,
total: 30
},
localPosts: 123,
localComments: 456
});
assertEquals(parseUsage({
users: {
activeHalfyear: "",
activeMonth: 20,
total: 30
},
localPosts: 123,
localComments: 456
}), null);
assertEquals(parseUsage({
users: {
activeHalfyear: "",
activeMonth: 20,
total: 30
},
localPosts: 123,
localComments: 456
}, { tryBestEffort: true }), {
users: {
activeMonth: 20,
total: 30
},
localPosts: 123,
localComments: 456
});
assertEquals(parseUsage({
users: {
activeHalfyear: [],
activeMonth: 20,
total: 30
},
localPosts: 123,
localComments: 456
}), null);
assertEquals(parseUsage({
users: {
activeHalfyear: [],
activeMonth: 20,
total: 30
},
localPosts: 123,
localComments: 456
}, { tryBestEffort: true }), {
users: {
activeMonth: 20,
total: 30
},
localPosts: 123,
localComments: 456
});
assertEquals(parseUsage({
users: {
activeHalfyear: 10,
activeMonth: "20",
total: 30
},
localPosts: 123,
localComments: 456
}), null);
assertEquals(parseUsage({
users: {
activeHalfyear: 10,
activeMonth: "20",
total: 30
},
localPosts: 123,
localComments: 456
}, { tryBestEffort: true }), {
users: {
activeHalfyear: 10,
activeMonth: 20,
total: 30
},
localPosts: 123,
localComments: 456
});
assertEquals(parseUsage({
users: {
activeHalfyear: 10,
activeMonth: "",
total: 30
},
localPosts: 123,
localComments: 456
}), null);
assertEquals(parseUsage({
users: {
activeHalfyear: 10,
activeMonth: "",
total: 30
},
localPosts: 123,
localComments: 456
}, { tryBestEffort: true }), {
users: {
activeHalfyear: 10,
total: 30
},
localPosts: 123,
localComments: 456
});
assertEquals(parseUsage({
users: {
activeHalfyear: 10,
activeMonth: [],
total: 30
},
localPosts: 123,
localComments: 456
}), null);
assertEquals(parseUsage({
users: {
activeHalfyear: 10,
activeMonth: [],
total: 30
},
localPosts: 123,
localComments: 456
}, { tryBestEffort: true }), {
users: {
activeHalfyear: 10,
total: 30
},
localPosts: 123,
localComments: 456
});
assertEquals(parseUsage({
users: {
activeHalfyear: 10,
activeMonth: 20,
total: "30"
},
localPosts: 123,
localComments: 456
}), null);
assertEquals(parseUsage({
users: {
activeHalfyear: 10,
activeMonth: 20,
total: "30"
},
localPosts: 123,
localComments: 456
}, { tryBestEffort: true }), {
users: {
activeHalfyear: 10,
activeMonth: 20,
total: 30
},
localPosts: 123,
localComments: 456
});
assertEquals(parseUsage({
users: {
activeHalfyear: 10,
activeMonth: 20,
total: ""
},
localPosts: 123,
localComments: 456
}), null);
assertEquals(parseUsage({
users: {
activeHalfyear: 10,
activeMonth: 20,
total: ""
},
localPosts: 123,
localComments: 456
}, { tryBestEffort: true }), {
users: {
activeHalfyear: 10,
activeMonth: 20
},
localPosts: 123,
localComments: 456
});
assertEquals(parseUsage({
users: {
activeHalfyear: 10,
activeMonth: 20,
total: []
},
localPosts: 123,
localComments: 456
}), null);
assertEquals(parseUsage({
users: {
activeHalfyear: 10,
activeMonth: 20,
total: []
},
localPosts: 123,
localComments: 456
}, { tryBestEffort: true }), {
users: {
activeHalfyear: 10,
activeMonth: 20
},
localPosts: 123,
localComments: 456
});
});
//#endregion
export {};