From 56875c4d32038a356f2e6f4e8363edf309dcfca2 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 28 Apr 2026 01:21:29 +0100 Subject: [PATCH] refactor: split generic plugin test fixtures --- CHANGELOG.md | 1 + .../.generated/plugin-sdk-api-baseline.sha256 | 4 +- docs/plugins/sdk-subpaths.md | 2 + docs/plugins/sdk-testing.md | 83 +++++++++++-------- extensions/browser/test-support.ts | 2 +- .../src/app-server/transcript-mirror.test.ts | 2 +- extensions/deepinfra/index.test.ts | 4 +- extensions/deepinfra/onboard.test.ts | 2 +- extensions/discord/src/chunk.test.ts | 2 +- extensions/discord/src/monitor.test.ts | 2 +- .../monitor/monitor.agent-components.test.ts | 2 +- .../src/monitor/inbound-processing.test.ts | 2 +- extensions/memory-core/src/cli.test.ts | 2 +- extensions/openshell/src/backend.e2e.test.ts | 2 +- .../openshell/src/openshell-core.test.ts | 2 +- .../telegram/src/test-support/write-skill.ts | 2 +- package.json | 4 + .../check-no-extension-test-core-imports.ts | 2 + scripts/lib/plugin-sdk-doc-metadata.ts | 3 + scripts/lib/plugin-sdk-entrypoints.json | 1 + src/plugin-sdk/test-fixtures.ts | 22 +++++ .../contracts/plugin-sdk-subpaths.test.ts | 8 ++ 22 files changed, 105 insertions(+), 51 deletions(-) create mode 100644 src/plugin-sdk/test-fixtures.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index c9a3a055c60..5807e19a98b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ Docs: https://docs.openclaw.ai - Gateway/runtime: reuse the current plugin metadata snapshot for provider discovery so repeated model-provider discovery avoids rebuilding plugin manifest metadata. Thanks @shakkernerd. - Gateway/startup: pass the plugin metadata snapshot from config validation into plugin bootstrap so startup reuses one manifest product instead of rebuilding plugin metadata. Thanks @shakkernerd. - Plugin SDK/testing: promote bundled plugin/provider/channel contract helpers to focused SDK test subpaths and retire the repo-only `test/helpers/plugins` TypeScript bridge. Thanks @vincentkoc. +- Plugin SDK/testing: add a focused generic fixture subpath for CLI capture, sandbox, skill, agent-message, system-event, terminal, chunking, auth-token, and typed-case helpers. Thanks @vincentkoc. - Plugin SDK/testing: add focused plugin runtime and environment fixture subpaths so plugin tests can avoid the broad `plugin-sdk/testing` barrel for common setup helpers. Thanks @vincentkoc. - Plugin SDK/testing: add a focused `plugin-sdk/plugin-test-api` helper subpath and move bundled plugin registration tests off the repo-only plugin API bridge. Thanks @vincentkoc. - Plugin SDK: add generic host hooks for session state, next-turn context, trusted tool policy, UI descriptors, events, scheduler cleanup, and run-scoped plugin context. (#72287) Thanks @100yenadmin. diff --git a/docs/.generated/plugin-sdk-api-baseline.sha256 b/docs/.generated/plugin-sdk-api-baseline.sha256 index 41ba9795d5d..183996a15e7 100644 --- a/docs/.generated/plugin-sdk-api-baseline.sha256 +++ b/docs/.generated/plugin-sdk-api-baseline.sha256 @@ -1,2 +1,2 @@ -26eb392e2b8bc103f0aba289344134392ebd55e99a0254cce16327cc7ca4cf93 plugin-sdk-api-baseline.json -24f6b50b8c9a2b004491c335eab25786d9024869c710d1784e5748bae4bd0698 plugin-sdk-api-baseline.jsonl +5c810137267a9ddaeab9abc40219e4a02bafec32767533df06bcca7109ee1608 plugin-sdk-api-baseline.json +ec3183fad4412002a07d61359e7f62a7b9ca6b2ddf70ddb1d1afb713cf5d053a plugin-sdk-api-baseline.jsonl diff --git a/docs/plugins/sdk-subpaths.md b/docs/plugins/sdk-subpaths.md index e66a79feb7e..b8f554b2242 100644 --- a/docs/plugins/sdk-subpaths.md +++ b/docs/plugins/sdk-subpaths.md @@ -29,6 +29,7 @@ For the plugin authoring guide, see [Plugin SDK overview](/plugins/sdk-overview) | `plugin-sdk/plugin-test-runtime` | Plugin runtime, registry, provider-registration, setup-wizard, and runtime task-flow fixtures for tests | | `plugin-sdk/provider-test-contracts` | Provider runtime, auth, discovery, onboard, catalog, web-search/fetch, and wizard contract helpers | | `plugin-sdk/test-env` | Test environment, fetch/network, live-test, temporary filesystem, and time-control fixtures | +| `plugin-sdk/test-fixtures` | Generic CLI, sandbox, skill, agent-message, system-event, terminal, chunking, auth-token, and typed-case test fixtures | | `plugin-sdk/migration` | Migration provider item helpers such as `createMigrationItem`, reason constants, item status markers, redaction helpers, and `summarizeMigrationItems` | | `plugin-sdk/migration-runtime` | Runtime migration helpers such as `copyMigrationFileItem` and `writeMigrationReport` | @@ -271,6 +272,7 @@ For the plugin authoring guide, see [Plugin SDK overview](/plugins/sdk-overview) | `plugin-sdk/channel-test-helpers` | Channel-oriented test helpers for account startup lifecycle, directory assertions, send-config threading, runtime mocks, status issues, outbound delivery, and hook registration | | `plugin-sdk/plugin-test-contracts` | Plugin package, registration, public artifact, direct import, runtime API, and import side-effect contract helpers | | `plugin-sdk/provider-test-contracts` | Provider runtime, auth, discovery, onboard, catalog, wizard, web-search/fetch, and stream contract helpers | + | `plugin-sdk/test-fixtures` | Generic CLI runtime capture, sandbox context, skill writer, agent-message, system-event, terminal-text, chunking, auth-token, and typed-case fixtures | diff --git a/docs/plugins/sdk-testing.md b/docs/plugins/sdk-testing.md index 5a0e0d52f57..21c8dd50652 100644 --- a/docs/plugins/sdk-testing.md +++ b/docs/plugins/sdk-testing.md @@ -35,6 +35,8 @@ plugins. **Environment/network test import:** `openclaw/plugin-sdk/test-env` +**Generic fixture import:** `openclaw/plugin-sdk/test-fixtures` + The testing subpath exports a narrow set of helpers for plugin authors: ```typescript @@ -50,45 +52,53 @@ import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-t import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describeOpenAIProviderRuntimeContract } from "openclaw/plugin-sdk/provider-test-contracts"; import { withEnv, withFetchPreconnect } from "openclaw/plugin-sdk/test-env"; +import { createCliRuntimeCapture, typedCases } from "openclaw/plugin-sdk/test-fixtures"; ``` ### Available exports -| Export | Purpose | -| -------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | -| `createTestPluginApi` | Build a minimal plugin API mock for direct registration unit tests. Import from `plugin-sdk/plugin-test-api` | -| `expectChannelInboundContextContract` | Assert channel inbound context shape. Import from `plugin-sdk/channel-contract-testing` | -| `installChannelOutboundPayloadContractSuite` | Install channel outbound payload contract cases. Import from `plugin-sdk/channel-contract-testing` | -| `createStartAccountContext` | Build channel account lifecycle contexts. Import from `plugin-sdk/channel-test-helpers` | -| `describePluginRegistrationContract` | Install plugin registration contract checks. Import from `plugin-sdk/plugin-test-contracts` | -| `registerSingleProviderPlugin` | Register one provider plugin in loader smoke tests. Import from `plugin-sdk/plugin-test-runtime` | -| `registerProviderPlugin` | Capture all provider kinds from one plugin. Import from `plugin-sdk/plugin-test-runtime` | -| `registerProviderPlugins` | Capture provider registrations across multiple plugins. Import from `plugin-sdk/plugin-test-runtime` | -| `requireRegisteredProvider` | Assert that a provider collection contains an id. Import from `plugin-sdk/plugin-test-runtime` | -| `createRuntimeEnv` | Build a mocked CLI/plugin runtime environment. Import from `plugin-sdk/plugin-test-runtime` | -| `createPluginSetupWizardStatus` | Build setup status helpers for channel plugins. Import from `plugin-sdk/plugin-test-runtime` | -| `describeOpenAIProviderRuntimeContract` | Install provider-family runtime contract checks. Import from `plugin-sdk/provider-test-contracts` | -| `installCommonResolveTargetErrorCases` | Shared test cases for target resolution error handling | -| `shouldAckReaction` | Check whether a channel should add an ack reaction | -| `removeAckReactionAfterReply` | Remove ack reaction after reply delivery | -| `createTestRegistry` | Build a channel plugin registry fixture | -| `createEmptyPluginRegistry` | Build an empty plugin registry fixture | -| `setActivePluginRegistry` | Install a registry fixture for plugin runtime tests | -| `createRequestCaptureJsonFetch` | Capture JSON fetch requests in media helper tests. Import from `plugin-sdk/test-env` | -| `withFetchPreconnect` | Run fetch tests with preconnect hooks installed. Import from `plugin-sdk/test-env` | -| `withEnv` / `withEnvAsync` | Temporarily patch environment variables. Import from `plugin-sdk/test-env` | -| `createTempHomeEnv` / `withTempDir` | Create isolated filesystem test fixtures. Import from `plugin-sdk/test-env` | -| `createMockServerResponse` | Create a minimal HTTP server response mock. Import from `plugin-sdk/test-env` | -| `runProviderCatalog` | Execute a provider catalog hook with test dependencies | -| `resolveProviderWizardOptions` | Resolve provider setup wizard choices in contract tests | -| `resolveProviderModelPickerEntries` | Resolve provider model-picker entries in contract tests | -| `buildProviderPluginMethodChoice` | Build provider wizard choice ids for assertions | -| `setProviderWizardProvidersResolverForTest` | Inject provider wizard providers for isolated tests | -| `createProviderUsageFetch` | Build provider usage fetch fixtures | -| `useFrozenTime` / `useRealTime` | Freeze and restore timers for time-sensitive tests. Import from `plugin-sdk/test-env` | -| `createTestWizardPrompter` | Build a mocked setup wizard prompter | -| `createRuntimeTaskFlow` | Create isolated runtime task-flow state | -| `typedCases` | Preserve literal types for table-driven tests | +| Export | Purpose | +| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | +| `createTestPluginApi` | Build a minimal plugin API mock for direct registration unit tests. Import from `plugin-sdk/plugin-test-api` | +| `expectChannelInboundContextContract` | Assert channel inbound context shape. Import from `plugin-sdk/channel-contract-testing` | +| `installChannelOutboundPayloadContractSuite` | Install channel outbound payload contract cases. Import from `plugin-sdk/channel-contract-testing` | +| `createStartAccountContext` | Build channel account lifecycle contexts. Import from `plugin-sdk/channel-test-helpers` | +| `describePluginRegistrationContract` | Install plugin registration contract checks. Import from `plugin-sdk/plugin-test-contracts` | +| `registerSingleProviderPlugin` | Register one provider plugin in loader smoke tests. Import from `plugin-sdk/plugin-test-runtime` | +| `registerProviderPlugin` | Capture all provider kinds from one plugin. Import from `plugin-sdk/plugin-test-runtime` | +| `registerProviderPlugins` | Capture provider registrations across multiple plugins. Import from `plugin-sdk/plugin-test-runtime` | +| `requireRegisteredProvider` | Assert that a provider collection contains an id. Import from `plugin-sdk/plugin-test-runtime` | +| `createRuntimeEnv` | Build a mocked CLI/plugin runtime environment. Import from `plugin-sdk/plugin-test-runtime` | +| `createPluginSetupWizardStatus` | Build setup status helpers for channel plugins. Import from `plugin-sdk/plugin-test-runtime` | +| `describeOpenAIProviderRuntimeContract` | Install provider-family runtime contract checks. Import from `plugin-sdk/provider-test-contracts` | +| `installCommonResolveTargetErrorCases` | Shared test cases for target resolution error handling | +| `shouldAckReaction` | Check whether a channel should add an ack reaction | +| `removeAckReactionAfterReply` | Remove ack reaction after reply delivery | +| `createTestRegistry` | Build a channel plugin registry fixture | +| `createEmptyPluginRegistry` | Build an empty plugin registry fixture | +| `setActivePluginRegistry` | Install a registry fixture for plugin runtime tests | +| `createRequestCaptureJsonFetch` | Capture JSON fetch requests in media helper tests. Import from `plugin-sdk/test-env` | +| `withFetchPreconnect` | Run fetch tests with preconnect hooks installed. Import from `plugin-sdk/test-env` | +| `withEnv` / `withEnvAsync` | Temporarily patch environment variables. Import from `plugin-sdk/test-env` | +| `createTempHomeEnv` / `withTempDir` | Create isolated filesystem test fixtures. Import from `plugin-sdk/test-env` | +| `createMockServerResponse` | Create a minimal HTTP server response mock. Import from `plugin-sdk/test-env` | +| `createCliRuntimeCapture` | Capture CLI runtime output in tests. Import from `plugin-sdk/test-fixtures` | +| `createSandboxTestContext` | Build sandbox test contexts. Import from `plugin-sdk/test-fixtures` | +| `writeSkill` | Write skill fixtures. Import from `plugin-sdk/test-fixtures` | +| `makeAgentAssistantMessage` | Build agent transcript message fixtures. Import from `plugin-sdk/test-fixtures` | +| `peekSystemEvents` / `resetSystemEventsForTest` | Inspect and reset system event fixtures. Import from `plugin-sdk/test-fixtures` | +| `sanitizeTerminalText` | Sanitize terminal output for assertions. Import from `plugin-sdk/test-fixtures` | +| `countLines` / `hasBalancedFences` | Assert chunking output shape. Import from `plugin-sdk/test-fixtures` | +| `runProviderCatalog` | Execute a provider catalog hook with test dependencies | +| `resolveProviderWizardOptions` | Resolve provider setup wizard choices in contract tests | +| `resolveProviderModelPickerEntries` | Resolve provider model-picker entries in contract tests | +| `buildProviderPluginMethodChoice` | Build provider wizard choice ids for assertions | +| `setProviderWizardProvidersResolverForTest` | Inject provider wizard providers for isolated tests | +| `createProviderUsageFetch` | Build provider usage fetch fixtures | +| `useFrozenTime` / `useRealTime` | Freeze and restore timers for time-sensitive tests. Import from `plugin-sdk/test-env` | +| `createTestWizardPrompter` | Build a mocked setup wizard prompter | +| `createRuntimeTaskFlow` | Create isolated runtime task-flow state | +| `typedCases` | Preserve literal types for table-driven tests. Import from `plugin-sdk/test-fixtures` | Bundled-plugin contract suites also use SDK testing subpaths for test-only registry, manifest, public-artifact, and runtime fixture helpers. Core-only @@ -97,7 +107,8 @@ Keep new extension tests on `openclaw/plugin-sdk/testing` or a narrower documented SDK subpath such as `plugin-sdk/plugin-test-api` or `plugin-sdk/channel-contract-testing`, `plugin-sdk/channel-test-helpers`, `plugin-sdk/plugin-test-contracts`, `plugin-sdk/plugin-test-runtime`, -`plugin-sdk/provider-test-contracts`, or `plugin-sdk/test-env` rather than +`plugin-sdk/provider-test-contracts`, `plugin-sdk/test-env`, or +`plugin-sdk/test-fixtures` rather than importing repo `src/**` files or repo `test/helpers/plugins/*` bridges directly. ### Types diff --git a/extensions/browser/test-support.ts b/extensions/browser/test-support.ts index f078f5bc63b..fc7005fc7de 100644 --- a/extensions/browser/test-support.ts +++ b/extensions/browser/test-support.ts @@ -3,7 +3,7 @@ export { expectGeneratedTokenPersistedToGatewayAuth, type CliMockOutputRuntime, type CliRuntimeCapture, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/test-fixtures"; export { createTempHomeEnv, withEnv, diff --git a/extensions/codex/src/app-server/transcript-mirror.test.ts b/extensions/codex/src/app-server/transcript-mirror.test.ts index 76499195401..c5e57dff5d8 100644 --- a/extensions/codex/src/app-server/transcript-mirror.test.ts +++ b/extensions/codex/src/app-server/transcript-mirror.test.ts @@ -10,7 +10,7 @@ import { castAgentMessage, makeAgentAssistantMessage, makeAgentUserMessage, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/test-fixtures"; import { afterEach, describe, expect, it } from "vitest"; import { mirrorCodexAppServerTranscript } from "./transcript-mirror.js"; diff --git a/extensions/deepinfra/index.test.ts b/extensions/deepinfra/index.test.ts index d2cf96441ec..b5b0c60f047 100644 --- a/extensions/deepinfra/index.test.ts +++ b/extensions/deepinfra/index.test.ts @@ -1,8 +1,8 @@ -import { describe, expect, it } from "vitest"; import { createCapturedPluginRegistration, registerSingleProviderPlugin, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import { describe, expect, it } from "vitest"; import deepinfraPlugin from "./index.js"; describe("deepinfra augmentModelCatalog", () => { diff --git a/extensions/deepinfra/onboard.test.ts b/extensions/deepinfra/onboard.test.ts index 0b1a8b5eddf..4729ab1f0da 100644 --- a/extensions/deepinfra/onboard.test.ts +++ b/extensions/deepinfra/onboard.test.ts @@ -6,7 +6,7 @@ import { type OpenClawConfig, resolveAgentModelPrimaryValue, } from "openclaw/plugin-sdk/provider-onboard"; -import { captureEnv } from "openclaw/plugin-sdk/testing"; +import { captureEnv } from "openclaw/plugin-sdk/test-env"; import { afterEach, describe, expect, it, vi } from "vitest"; import { applyDeepInfraProviderConfig, diff --git a/extensions/discord/src/chunk.test.ts b/extensions/discord/src/chunk.test.ts index a8cee387fa9..18de332e2ee 100644 --- a/extensions/discord/src/chunk.test.ts +++ b/extensions/discord/src/chunk.test.ts @@ -1,4 +1,4 @@ -import { countLines, hasBalancedFences } from "openclaw/plugin-sdk/testing"; +import { countLines, hasBalancedFences } from "openclaw/plugin-sdk/test-fixtures"; import { describe, expect, it } from "vitest"; import { chunkDiscordText, chunkDiscordTextWithMode } from "./chunk.js"; diff --git a/extensions/discord/src/monitor.test.ts b/extensions/discord/src/monitor.test.ts index 0456d2f26dd..d89b1c46a01 100644 --- a/extensions/discord/src/monitor.test.ts +++ b/extensions/discord/src/monitor.test.ts @@ -1,5 +1,5 @@ import { ChannelType, type Guild } from "@buape/carbon"; -import { typedCases } from "openclaw/plugin-sdk/testing"; +import { typedCases } from "openclaw/plugin-sdk/test-fixtures"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { allowListMatches, diff --git a/extensions/discord/src/monitor/monitor.agent-components.test.ts b/extensions/discord/src/monitor/monitor.agent-components.test.ts index 654b75b77ed..b927cbe4067 100644 --- a/extensions/discord/src/monitor/monitor.agent-components.test.ts +++ b/extensions/discord/src/monitor/monitor.agent-components.test.ts @@ -2,7 +2,7 @@ import type { ButtonInteraction, ComponentData, StringSelectMenuInteraction } fr import { ChannelType } from "discord-api-types/v10"; import type { DiscordAccountConfig, OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { buildAgentSessionKey } from "openclaw/plugin-sdk/routing"; -import { peekSystemEvents, resetSystemEventsForTest } from "openclaw/plugin-sdk/testing"; +import { peekSystemEvents, resetSystemEventsForTest } from "openclaw/plugin-sdk/test-fixtures"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { expectPairingReplyText } from "../../../../test/helpers/pairing-reply.js"; import { diff --git a/extensions/imessage/src/monitor/inbound-processing.test.ts b/extensions/imessage/src/monitor/inbound-processing.test.ts index 73edd838a23..52afd426942 100644 --- a/extensions/imessage/src/monitor/inbound-processing.test.ts +++ b/extensions/imessage/src/monitor/inbound-processing.test.ts @@ -1,5 +1,5 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; -import { sanitizeTerminalText } from "openclaw/plugin-sdk/testing"; +import { sanitizeTerminalText } from "openclaw/plugin-sdk/test-fixtures"; import { describe, expect, it, vi } from "vitest"; import { describeIMessageEchoDropLog, diff --git a/extensions/memory-core/src/cli.test.ts b/extensions/memory-core/src/cli.test.ts index 39a537d80b1..322819e4640 100644 --- a/extensions/memory-core/src/cli.test.ts +++ b/extensions/memory-core/src/cli.test.ts @@ -7,7 +7,7 @@ import { spyRuntimeErrors, spyRuntimeJson, spyRuntimeLogs, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/test-fixtures"; import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { readShortTermRecallEntries, recordShortTermRecalls } from "./short-term-promotion.js"; diff --git a/extensions/openshell/src/backend.e2e.test.ts b/extensions/openshell/src/backend.e2e.test.ts index 64364ae2ff7..3711a4cc508 100644 --- a/extensions/openshell/src/backend.e2e.test.ts +++ b/extensions/openshell/src/backend.e2e.test.ts @@ -3,7 +3,7 @@ import fs from "node:fs/promises"; import net from "node:net"; import os from "node:os"; import path from "node:path"; -import { createSandboxTestContext } from "openclaw/plugin-sdk/testing"; +import { createSandboxTestContext } from "openclaw/plugin-sdk/test-fixtures"; import { describe, expect, it } from "vitest"; import { createSandboxBrowserConfig, diff --git a/extensions/openshell/src/openshell-core.test.ts b/extensions/openshell/src/openshell-core.test.ts index a2365a59a8b..3d3539ebb5d 100644 --- a/extensions/openshell/src/openshell-core.test.ts +++ b/extensions/openshell/src/openshell-core.test.ts @@ -2,7 +2,7 @@ import nodeFs from "node:fs"; import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import { createSandboxTestContext } from "openclaw/plugin-sdk/testing"; +import { createSandboxTestContext } from "openclaw/plugin-sdk/test-fixtures"; import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import type { OpenShellSandboxBackend } from "./backend.js"; import { diff --git a/extensions/telegram/src/test-support/write-skill.ts b/extensions/telegram/src/test-support/write-skill.ts index 0d8a846055f..1375b8b73a1 100644 --- a/extensions/telegram/src/test-support/write-skill.ts +++ b/extensions/telegram/src/test-support/write-skill.ts @@ -1 +1 @@ -export { writeSkill } from "openclaw/plugin-sdk/testing"; +export { writeSkill } from "openclaw/plugin-sdk/test-fixtures"; diff --git a/package.json b/package.json index 720c999f807..22acdc65286 100644 --- a/package.json +++ b/package.json @@ -526,6 +526,10 @@ "types": "./dist/plugin-sdk/test-env.d.ts", "default": "./dist/plugin-sdk/test-env.js" }, + "./plugin-sdk/test-fixtures": { + "types": "./dist/plugin-sdk/test-fixtures.d.ts", + "default": "./dist/plugin-sdk/test-fixtures.js" + }, "./plugin-sdk/testing": { "types": "./dist/plugin-sdk/testing.d.ts", "default": "./dist/plugin-sdk/testing.js" diff --git a/scripts/check-no-extension-test-core-imports.ts b/scripts/check-no-extension-test-core-imports.ts index 2eae28bbb34..22e2f4016a9 100644 --- a/scripts/check-no-extension-test-core-imports.ts +++ b/scripts/check-no-extension-test-core-imports.ts @@ -47,6 +47,8 @@ const MOCK_RELATIVE_MODULE_PATTERN = const RELATIVE_CORE_HINT = "Use openclaw/plugin-sdk/testing or a focused plugin-sdk test/runtime subpath instead of core internals."; +// Tombstones for retired repo-only plugin helper bridge files. Keep this list so +// deleted bridges fail loudly if they are recreated instead of using SDK subpaths. const RETIRED_EXTENSION_TEST_HELPER_BRIDGE_FILES = [ "test/helpers/plugins/env.ts", "test/helpers/plugins/fetch-mock.ts", diff --git a/scripts/lib/plugin-sdk-doc-metadata.ts b/scripts/lib/plugin-sdk-doc-metadata.ts index 641669c2570..15982d4394d 100644 --- a/scripts/lib/plugin-sdk-doc-metadata.ts +++ b/scripts/lib/plugin-sdk-doc-metadata.ts @@ -119,6 +119,9 @@ export const pluginSdkDocMetadata = { "test-env": { category: "utilities", }, + "test-fixtures": { + category: "utilities", + }, } as const satisfies Record; export type PluginSdkDocEntrypoint = keyof typeof pluginSdkDocMetadata; diff --git a/scripts/lib/plugin-sdk-entrypoints.json b/scripts/lib/plugin-sdk-entrypoints.json index 6d86e51949f..eb6eaf70b20 100644 --- a/scripts/lib/plugin-sdk-entrypoints.json +++ b/scripts/lib/plugin-sdk-entrypoints.json @@ -115,6 +115,7 @@ "plugin-test-runtime", "provider-test-contracts", "test-env", + "test-fixtures", "testing", "temp-path", "logging-core", diff --git a/src/plugin-sdk/test-fixtures.ts b/src/plugin-sdk/test-fixtures.ts new file mode 100644 index 00000000000..6f1f7f4f489 --- /dev/null +++ b/src/plugin-sdk/test-fixtures.ts @@ -0,0 +1,22 @@ +// Focused public test helpers for generic fixtures shared by plugin tests. + +export { + createCliRuntimeCapture, + firstWrittenJsonArg, + spyRuntimeErrors, + spyRuntimeJson, + spyRuntimeLogs, +} from "../cli/test-runtime-capture.js"; +export type { CliMockOutputRuntime, CliRuntimeCapture } from "../cli/test-runtime-capture.js"; +export { createSandboxTestContext } from "../agents/sandbox/test-fixtures.js"; +export { writeSkill } from "../agents/skills.e2e-test-helpers.js"; +export { + castAgentMessage, + makeAgentAssistantMessage, + makeAgentUserMessage, +} from "../agents/test-helpers/agent-message-fixtures.js"; +export { peekSystemEvents, resetSystemEventsForTest } from "../infra/system-events.js"; +export { sanitizeTerminalText } from "../terminal/safe-text.js"; +export { countLines, hasBalancedFences } from "../test-utils/chunk-test-helpers.js"; +export { expectGeneratedTokenPersistedToGatewayAuth } from "../test-utils/auth-token-assertions.js"; +export { typedCases } from "../test-utils/typed-cases.js"; diff --git a/src/plugins/contracts/plugin-sdk-subpaths.test.ts b/src/plugins/contracts/plugin-sdk-subpaths.test.ts index dfc782f5ed2..050207e7ea2 100644 --- a/src/plugins/contracts/plugin-sdk-subpaths.test.ts +++ b/src/plugins/contracts/plugin-sdk-subpaths.test.ts @@ -60,6 +60,7 @@ const PUBLIC_SDK_TEST_HELPER_SUBPATHS = [ "plugin-test-runtime", "provider-test-contracts", "test-env", + "test-fixtures", ] as const; const importResolvedPluginSdkSubpath = async (specifier: string) => import(specifier); @@ -747,6 +748,13 @@ describe("plugin-sdk subpath exports", () => { "installPinnedHostnameTestHooks", "isLiveTestEnabled", ]); + expectSourceMentions("test-fixtures", [ + "createCliRuntimeCapture", + "createSandboxTestContext", + "makeAgentAssistantMessage", + "peekSystemEvents", + "typedCases", + ]); }); it("keeps public SDK test helper subpaths free of top-level Vitest module mocks", () => {