UNPKG

@fedify/testing

Version:

Testing utilities for Fedify applications

155 lines (150 loc) 5.06 kB
import { trace } from "@opentelemetry/api"; import type { Context, InboxContext, RequestContext, } from "@fedify/fedify/federation"; import type { Federation } from "@fedify/fedify/federation"; import { RouterError } from "@fedify/fedify/federation"; import { lookupObject as globalLookupObject, traverseCollection as globalTraverseCollection, } from "@fedify/fedify/vocab"; import { lookupWebFinger as globalLookupWebFinger } from "@fedify/fedify/webfinger"; import { mockDocumentLoader } from "./docloader.ts"; // NOTE: Copied from @fedify/fedify/testing/context.ts export function createContext<TContextData>( values: Partial<Context<TContextData>> & { url?: URL; data: TContextData; federation: Federation<TContextData>; }, ): Context<TContextData> { const { federation, url = new URL("http://example.com/"), canonicalOrigin, data, documentLoader, contextLoader, tracerProvider, clone, getNodeInfoUri, getActorUri, getObjectUri, getOutboxUri, getInboxUri, getFollowingUri, getFollowersUri, getLikedUri, getFeaturedUri, getFeaturedTagsUri, parseUri, getActorKeyPairs, getDocumentLoader, lookupObject, traverseCollection, lookupNodeInfo, lookupWebFinger, sendActivity, routeActivity, } = values; function throwRouteError(): URL { 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, tracerProvider: tracerProvider ?? trace.getTracerProvider(), clone: clone ?? ((data) => createContext({ ...values, data })), getNodeInfoUri: getNodeInfoUri ?? throwRouteError, getActorUri: getActorUri ?? throwRouteError, getObjectUri: getObjectUri ?? throwRouteError, getOutboxUri: getOutboxUri ?? throwRouteError, getInboxUri: getInboxUri ?? throwRouteError, getFollowingUri: getFollowingUri ?? throwRouteError, getFollowersUri: getFollowersUri ?? throwRouteError, getLikedUri: getLikedUri ?? throwRouteError, getFeaturedUri: getFeaturedUri ?? throwRouteError, getFeaturedTagsUri: getFeaturedTagsUri ?? throwRouteError, parseUri: parseUri ?? ((_uri) => { throw new Error("Not implemented"); }), getDocumentLoader: getDocumentLoader ?? ((_params) => { throw new Error("Not implemented"); }), getActorKeyPairs: getActorKeyPairs ?? ((_handle) => Promise.resolve([])), lookupObject: lookupObject ?? ((uri, options = {}) => { return globalLookupObject(uri, { documentLoader: options.documentLoader ?? documentLoader ?? mockDocumentLoader, contextLoader: options.contextLoader ?? contextLoader ?? mockDocumentLoader, }); }), traverseCollection: traverseCollection ?? ((collection, options = {}) => { return globalTraverseCollection(collection, { documentLoader: options.documentLoader ?? documentLoader ?? mockDocumentLoader, contextLoader: options.contextLoader ?? contextLoader ?? mockDocumentLoader, }); }), lookupNodeInfo: lookupNodeInfo ?? ((_params) => { throw new Error("Not implemented"); }), lookupWebFinger: lookupWebFinger ?? ((resource, options = {}) => { return globalLookupWebFinger(resource, options); }), sendActivity: sendActivity ?? ((_params) => { throw new Error("Not implemented"); }), routeActivity: routeActivity ?? ((_params) => { throw new Error("Not implemented"); }), }; } export function createRequestContext<TContextData>( args: Partial<RequestContext<TContextData>> & { url: URL; data: TContextData; federation: Federation<TContextData>; }, ): RequestContext<TContextData> { 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"); }), }; } export function createInboxContext<TContextData>( args: Partial<InboxContext<TContextData>> & { url?: URL; data: TContextData; recipient?: string | null; federation: Federation<TContextData>; }, ): InboxContext<TContextData> { return { ...createContext(args), clone: args.clone ?? ((data) => createInboxContext({ ...args, data })), recipient: args.recipient ?? null, forwardActivity: args.forwardActivity ?? ((_params) => { throw new Error("Not implemented"); }), }; }