From fd8741b4d81380fc4ec08edebedbb4a114f62e86 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 14 Aug 2026 18:25:49 -0700 Subject: [PATCH] perf(test): narrow plugin registration contract imports (#123902) * perf(test): narrow plugin registration contract imports * fix(test): preserve plugin registration contract boundary --- src/plugin-sdk/plugin-test-contracts.ts | 16 ++++++++++- .../plugin-registration-contract-cases.ts | 4 +-- .../plugin-registration-contract.ts | 28 +++++++++++-------- .../plugin-registration.contract.test.ts | 13 +++++++-- .../plugin-testing-harness.contract.test.ts | 4 +++ 5 files changed, 46 insertions(+), 19 deletions(-) diff --git a/src/plugin-sdk/plugin-test-contracts.ts b/src/plugin-sdk/plugin-test-contracts.ts index 124922b3b0f4..aaf041dedb77 100644 --- a/src/plugin-sdk/plugin-test-contracts.ts +++ b/src/plugin-sdk/plugin-test-contracts.ts @@ -1,6 +1,12 @@ /** * Test SDK subpath for plugin package, registration, and public surface contracts. */ +import { pluginRegistrationContractRegistry } from "../plugins/contracts/registry.js"; +import { + installPluginRegistrationContract, + type PluginRegistrationContractParams, +} from "./test-helpers/plugin-registration-contract.js"; + export { assertNoImportTimeSideEffects, createPluginRegistryFixture, @@ -12,7 +18,15 @@ export { export { runDirectImportSmoke } from "./test-helpers/direct-smoke.js"; export { describePackageManifestContract } from "./test-helpers/package-manifest-contract.js"; export { pluginRegistrationContractCases } from "./test-helpers/plugin-registration-contract-cases.js"; -export { describePluginRegistrationContract } from "./test-helpers/plugin-registration-contract.js"; + +function resolvePluginRegistrationContract(pluginId: string) { + return pluginRegistrationContractRegistry.find((entry) => entry.pluginId === pluginId); +} + +/** Installs tests against the runtime plugin registration contract registry. */ +export function describePluginRegistrationContract(params: PluginRegistrationContractParams) { + installPluginRegistrationContract(params, resolvePluginRegistrationContract); +} export { GUARDED_EXTENSION_PUBLIC_SURFACE_BASENAMES, BUNDLED_RUNTIME_SIDECAR_BASENAMES, diff --git a/src/plugin-sdk/test-helpers/plugin-registration-contract-cases.ts b/src/plugin-sdk/test-helpers/plugin-registration-contract-cases.ts index a12028f1fa34..8501fa1bff3e 100644 --- a/src/plugin-sdk/test-helpers/plugin-registration-contract-cases.ts +++ b/src/plugin-sdk/test-helpers/plugin-registration-contract-cases.ts @@ -1,9 +1,7 @@ /** * Installs bundled plugin registration contract cases used across provider tests. */ -import { describePluginRegistrationContract } from "./plugin-registration-contract.js"; - -type PluginRegistrationContractParams = Parameters[0]; +import type { PluginRegistrationContractParams } from "./plugin-registration-contract.js"; export const pluginRegistrationContractCases = { alibaba: { diff --git a/src/plugin-sdk/test-helpers/plugin-registration-contract.ts b/src/plugin-sdk/test-helpers/plugin-registration-contract.ts index af040173c9d2..f974f1a9ec4b 100644 --- a/src/plugin-sdk/test-helpers/plugin-registration-contract.ts +++ b/src/plugin-sdk/test-helpers/plugin-registration-contract.ts @@ -2,10 +2,9 @@ * Contract suite for bundled plugin registration ownership and manifest auth metadata. */ import { describe, expect, it } from "vitest"; -import { pluginRegistrationContractRegistry } from "../../plugins/contracts/registry.js"; import { loadPluginManifestRegistryCore } from "../../plugins/manifest-registry.js"; -type PluginRegistrationContractParams = { +export type PluginRegistrationContractParams = { pluginId: string; cliBackendIds?: string[]; providerIds?: string[]; @@ -30,18 +29,23 @@ type PluginRegistrationContractParams = { }; }; -function findRegistration(pluginId: string) { - const entry = pluginRegistrationContractRegistry.find( - (candidate) => candidate.pluginId === pluginId, - ); - if (!entry) { - throw new Error(`plugin registration contract missing for ${pluginId}`); - } - return entry; -} +export type PluginRegistrationContractResolver = ( + pluginId: string, +) => Omit | undefined; /** Installs tests that pin a bundled plugin's registered provider/tool ownership. */ -export function describePluginRegistrationContract(params: PluginRegistrationContractParams) { +export function installPluginRegistrationContract( + params: PluginRegistrationContractParams, + resolveRegistration: PluginRegistrationContractResolver, +) { + const findRegistration = (pluginId: string) => { + const entry = resolveRegistration(pluginId); + if (!entry) { + throw new Error(`plugin registration contract missing for ${pluginId}`); + } + return entry; + }; + describe(`${params.pluginId} plugin registration contract`, () => { if (params.cliBackendIds) { it("keeps bundled cli-backend ownership explicit", () => { diff --git a/src/plugins/contracts/plugin-registration.contract.test.ts b/src/plugins/contracts/plugin-registration.contract.test.ts index 962460e7eb10..a2cf20c0aacc 100644 --- a/src/plugins/contracts/plugin-registration.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.contract.test.ts @@ -1,11 +1,18 @@ +import { pluginRegistrationContractCases } from "../../plugin-sdk/test-helpers/plugin-registration-contract-cases.js"; +import { + installPluginRegistrationContract, + type PluginRegistrationContractResolver, +} from "../../plugin-sdk/test-helpers/plugin-registration-contract.js"; // Plugin registration contract tests cover manifest registration cases exposed through the SDK. -import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; -import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { BUNDLED_PLUGIN_CONTRACT_SNAPSHOTS } from "./inventory/bundled-capability-metadata.js"; + +const resolvePluginRegistrationContract: PluginRegistrationContractResolver = (pluginId) => + BUNDLED_PLUGIN_CONTRACT_SNAPSHOTS.find((entry) => entry.pluginId === pluginId); const pluginRegistrationContractCaseList = Object.values(pluginRegistrationContractCases).toSorted( (left, right) => left.pluginId.localeCompare(right.pluginId), ); for (const contractCase of pluginRegistrationContractCaseList) { - describePluginRegistrationContract(contractCase); + installPluginRegistrationContract(contractCase, resolvePluginRegistrationContract); } diff --git a/src/plugins/contracts/plugin-testing-harness.contract.test.ts b/src/plugins/contracts/plugin-testing-harness.contract.test.ts index d56db5fd27af..883e483984eb 100644 --- a/src/plugins/contracts/plugin-testing-harness.contract.test.ts +++ b/src/plugins/contracts/plugin-testing-harness.contract.test.ts @@ -2,6 +2,8 @@ import fs from "node:fs/promises"; import path from "node:path"; import { createPluginRegistryFixture, + describePluginRegistrationContract, + pluginRegistrationContractCases, registerVirtualTestPlugin, } from "openclaw/plugin-sdk/plugin-test-contracts"; import { withTempHome } from "openclaw/plugin-sdk/test-env"; @@ -13,6 +15,8 @@ const echoCases = typedCases([ { message: "beta", expected: "scoped:beta" }, ]); +describePluginRegistrationContract(pluginRegistrationContractCases.brave); + describe("plugin testing harness contracts", () => { it("executes declared tools and reports missing tool contracts", async () => { const previousHome = process.env.HOME;