Files
oh-my-pi-telegram/tests/public-api.test.ts

124 lines
3.9 KiB
TypeScript

/**
* Regression tests for public package API exports
* Zones: package boundary, extension interop
* Guards stable public subpaths and the removal of deep lib wildcard exports
*/
import assert from "node:assert/strict";
import { readFile } from "node:fs/promises";
import test from "node:test";
async function assertPackagePathNotExported(specifier: string): Promise<void> {
await assert.rejects(
() => import(specifier),
(error: unknown) =>
error instanceof Error &&
"code" in error &&
error.code === "ERR_PACKAGE_PATH_NOT_EXPORTED",
);
}
test("Public package subpaths expose the stable extension API", async () => {
const [
root,
inbound,
outbound,
delivery,
activity,
updates,
commands,
sections,
status,
voice,
keyboard,
] = await Promise.all([
import("@evandrodevbr/oh-my-pi-telegram"),
import("@evandrodevbr/oh-my-pi-telegram/inbound"),
import("@evandrodevbr/oh-my-pi-telegram/outbound"),
import("@evandrodevbr/oh-my-pi-telegram/delivery"),
import("@evandrodevbr/oh-my-pi-telegram/activity"),
import("@evandrodevbr/oh-my-pi-telegram/updates"),
import("@evandrodevbr/oh-my-pi-telegram/commands"),
import("@evandrodevbr/oh-my-pi-telegram/sections"),
import("@evandrodevbr/oh-my-pi-telegram/status"),
import("@evandrodevbr/oh-my-pi-telegram/voice"),
import("@evandrodevbr/oh-my-pi-telegram/keyboard"),
]);
assert.deepEqual(Object.keys(root), ["default"]);
assert.deepEqual(Object.keys(inbound).sort(), [
"registerTelegramInboundHandler",
]);
assert.deepEqual(Object.keys(outbound).sort(), [
"recordTelegramRuntimeEvent",
"registerTelegramOutboundHandler",
]);
assert.deepEqual(Object.keys(delivery).sort(), [
"deleteTelegramView",
"editTelegramView",
"sendTelegramChatAction",
"sendTelegramView",
]);
assert.deepEqual(Object.keys(activity).sort(), [
"registerTelegramActivityHandler",
]);
assert.deepEqual(Object.keys(updates).sort(), [
"registerTelegramUpdateHandler",
]);
assert.deepEqual(Object.keys(commands).sort(), ["registerTelegramCommand"]);
assert.deepEqual(Object.keys(sections).sort(), [
"getTelegramSectionDiagnostics",
"registerTelegramSection",
]);
assert.deepEqual(Object.keys(status).sort(), [
"registerTelegramStatusLineProvider",
]);
assert.deepEqual(Object.keys(voice).sort(), [
"TELEGRAM_VOICE_REPLY_MODES",
"computeVoicePromptContribution",
"computeVoiceTurnFlags",
"getTelegramVoiceReplyMode",
"getTelegramVoiceSendTranscript",
"isVoiceTurn",
"registerTelegramVoiceSynthesisProvider",
"registerTelegramVoiceTranscriptionProvider",
"shouldSuppressPreviewForVoice",
]);
assert.deepEqual(Object.keys(keyboard), []);
});
test("Package declares the OMP extension entry point and Pi lifecycle compatibility floor", async () => {
const packageJson = JSON.parse(
await readFile(new URL("../package.json", import.meta.url), "utf8"),
) as {
omp?: {
compatibleWith?: Record<string, string>;
extensions?: string[];
};
peerDependencies?: Record<string, string>;
};
assert.deepEqual(packageJson.omp?.extensions, ["./index.ts"]);
assert.equal(
packageJson.omp?.compatibleWith?.["@oh-my-pi/pi-coding-agent"],
">=16.5.2",
);
assert.equal(
packageJson.peerDependencies?.["@earendil-works/pi-coding-agent"],
">=0.80.6",
);
assert.equal(
packageJson.peerDependencies?.["@earendil-works/pi-agent-core"],
">=0.80.6",
);
assert.equal(
packageJson.peerDependencies?.["@earendil-works/pi-ai"],
">=0.80.6",
);
});
test("Package-private lib implementation paths are not exported", async () => {
await assertPackagePathNotExported("@evandrodevbr/oh-my-pi-telegram/lib/updates.ts");
await assertPackagePathNotExported("@evandrodevbr/oh-my-pi-telegram/lib/sections.ts");
await assertPackagePathNotExported("@evandrodevbr/oh-my-pi-telegram/api/updates.ts");
});