UNPKG

@fedify/fedify

Version:

An ActivityPub server framework

180 lines (179 loc) • 6.52 kB
import "@js-temporal/polyfill"; import "urlpattern-polyfill"; globalThis.addEventListener = () => {}; import { getLogger } from "@logtape/logtape"; import "@opentelemetry/sdk-trace-base"; import "@opentelemetry/core"; import { RouterError } from "@fedify/uri-template"; import { lookupObject, traverseCollection } from "@fedify/vocab"; import { lookupWebFinger } from "@fedify/webfinger"; import { metrics, trace } from "@opentelemetry/api"; //#region ../fixture/dist/mod.js const logger = getLogger(["fixture", "docloader"]); /** * A mock of the document loader. This does not make any actual HTTP requests * towards the remote server, but looks up the local fixture files instead. * * For instance, `mockDocumentLoader("http://example.com/foo/bar")` will look up * the file `testing/fixtures/http/example.com/foo/bar` (no suffix) and return * its content as the response. */ async function mockDocumentLoader(resource, _options) { const url = new URL(resource); if ("navigator" in globalThis && navigator.userAgent === "Cloudflare-Workers") { const testUrl = new URL(url); testUrl.hostname += ".test"; const resp = await fetch(testUrl); if (resp.ok) { const document = await resp.json(); logger.debug("Successfully fetched fixture {resource}: {status} {statusText}\n{body}", { resource, status: resp.status, statusText: resp.statusText, body: document }); return { contextUrl: null, document, documentUrl: resource }; } const error = await resp.text(); logger.error("Failed to fetch fixture {resource}: {error}", { resource, error }); throw new Error(error); } const fixturePath = `${"Deno" in globalThis ? "." : "@fedify/fixture"}/fixtures/${url.host}${url.pathname}.json`; let document; try { document = (await import(fixturePath, { with: { type: "json" } })).default; } catch (error) { logger.error("Failed to read fixture file {path}: {error}", { path: fixturePath, error }); throw error; } return { contextUrl: null, document, documentUrl: resource }; } const testDefinitions = []; //#endregion //#region src/testing/context.ts function createContext(values) { const { federation, url = new URL("http://example.com/"), canonicalOrigin, data, documentLoader, contextLoader, meterProvider, tracerProvider, clone, getNodeInfoUri, getActorUri, getObjectUri, getCollectionUri, getOutboxUri, getInboxUri, getFollowingUri, getFollowersUri, getLikedUri, getFeaturedUri, getFeaturedTagsUri, parseUri, getActorKeyPairs, getDocumentLoader, lookupObject: lookupObject$1, traverseCollection: traverseCollection$1, lookupNodeInfo, lookupWebFinger: lookupWebFinger$1, sendActivity, routeActivity } = values; function throwRouterError() { throw new RouterError("Not implemented"); } return { federation, data, origin: url.origin, canonicalOrigin: canonicalOrigin ?? url.origin, host: url.host, hostname: url.hostname, documentLoader: documentLoader ?? mockDocumentLoader, contextLoader: contextLoader ?? mockDocumentLoader, meterProvider: meterProvider ?? metrics.getMeterProvider(), tracerProvider: tracerProvider ?? trace.getTracerProvider(), clone: clone ?? ((data) => createContext({ ...values, data })), getNodeInfoUri: getNodeInfoUri ?? throwRouterError, getActorUri: getActorUri ?? throwRouterError, getObjectUri: getObjectUri ?? throwRouterError, getCollectionUri: getCollectionUri ?? throwRouterError, getOutboxUri: getOutboxUri ?? throwRouterError, getInboxUri: getInboxUri ?? throwRouterError, getFollowingUri: getFollowingUri ?? throwRouterError, getFollowersUri: getFollowersUri ?? throwRouterError, getLikedUri: getLikedUri ?? throwRouterError, getFeaturedUri: getFeaturedUri ?? throwRouterError, getFeaturedTagsUri: getFeaturedTagsUri ?? throwRouterError, parseUri: parseUri ?? ((_uri) => { throw new Error("Not implemented"); }), getDocumentLoader: getDocumentLoader ?? ((_params) => { throw new Error("Not implemented"); }), getActorKeyPairs: getActorKeyPairs ?? ((_handle) => Promise.resolve([])), lookupObject: lookupObject$1 ?? ((uri, options = {}) => { return lookupObject(uri, { documentLoader: options.documentLoader ?? documentLoader ?? mockDocumentLoader, contextLoader: options.contextLoader ?? contextLoader ?? mockDocumentLoader }); }), traverseCollection: traverseCollection$1 ?? ((collection, options = {}) => { return traverseCollection(collection, { documentLoader: options.documentLoader ?? documentLoader ?? mockDocumentLoader, contextLoader: options.contextLoader ?? contextLoader ?? mockDocumentLoader }); }), lookupNodeInfo: lookupNodeInfo ?? ((_params) => { throw new Error("Not implemented"); }), lookupWebFinger: lookupWebFinger$1 ?? ((resource, options = {}) => { return lookupWebFinger(resource, options); }), sendActivity: sendActivity ?? ((_params) => { throw new Error("Not implemented"); }), routeActivity: routeActivity ?? ((_params) => { throw new Error("Not implemented"); }) }; } function createRequestContext(args) { return { ...createContext(args), clone: args.clone ?? ((data) => createRequestContext({ ...args, data })), request: args.request ?? new Request(args.url), url: args.url, getActor: args.getActor ?? (() => Promise.resolve(null)), getObject: args.getObject ?? (() => Promise.resolve(null)), getSignedKey: args.getSignedKey ?? (() => Promise.resolve(null)), getSignedKeyOwner: args.getSignedKeyOwner ?? (() => Promise.resolve(null)), sendActivity: args.sendActivity ?? ((_params) => { throw new Error("Not implemented"); }) }; } function createInboxContext(args) { return { ...createContext(args), clone: args.clone ?? ((data) => createInboxContext({ ...args, data })), recipient: args.recipient ?? null, forwardActivity: args.forwardActivity ?? ((_forwarder, _recipients, _options) => { throw new Error("Not implemented"); }) }; } function createOutboxContext(args) { const forwardActivity = args.forwardActivity ?? ((_forwarder, _recipients, _options) => { throw new Error("Not implemented"); }); return { ...createContext(args), clone: args.clone ?? ((data) => createOutboxContext({ ...args, data })), identifier: args.identifier, hasDeliveredActivity: args.hasDeliveredActivity ?? (() => false), forwardActivity }; } //#endregion export { testDefinitions as i, createOutboxContext as n, createRequestContext as r, createInboxContext as t };