From 8057561cee7d45611d211ce51cd4f0619eb49550 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 28 Apr 2026 00:53:58 +0100 Subject: [PATCH] refactor: promote plugin test helpers to sdk --- CHANGELOG.md | 1 + .../.generated/plugin-sdk-api-baseline.sha256 | 4 +- docs/plugins/sdk-subpaths.md | 26 ++++---- docs/plugins/sdk-testing.md | 29 ++++++--- .../plugin-registration.contract.test.ts | 2 +- .../provider-runtime.contract.test.ts | 2 +- .../src/test-support/monitor-test-support.ts | 2 +- .../plugin-registration.contract.test.ts | 2 +- .../provider-discovery.contract.test.ts | 2 +- .../plugin-registration.contract.test.ts | 2 +- extensions/discord/src/channel.test.ts | 2 +- extensions/discord/src/subagent-hooks.test.ts | 6 +- .../fal/plugin-registration.contract.test.ts | 2 +- extensions/feishu/src/subagent-hooks.test.ts | 4 +- .../test-support/lifecycle-test-support.ts | 2 +- .../provider-auth.contract.test.ts | 2 +- .../provider-discovery.contract.test.ts | 2 +- .../provider-runtime.contract.test.ts | 2 +- extensions/google/index.test.ts | 2 +- .../plugin-registration.contract.test.ts | 4 +- .../google/provider-runtime.contract.test.ts | 2 +- extensions/googlechat/src/channel.test.ts | 4 +- extensions/googlechat/src/setup.test.ts | 10 ++-- .../plugin-registration.contract.test.ts | 2 +- extensions/irc/runtime-api.test.ts | 2 +- extensions/irc/src/send.test.ts | 2 +- extensions/irc/src/setup.test.ts | 10 ++-- extensions/line/src/setup-surface.test.ts | 2 +- extensions/litellm/onboard.test.ts | 2 +- .../plugin-registration.contract.test.ts | 2 +- .../matrix/src/matrix/subagent-hooks.test.ts | 4 +- .../mattermost/src/mattermost/send.test.ts | 2 +- extensions/minimax/onboard.test.ts | 4 +- .../plugin-registration.contract.test.ts | 2 +- .../provider-discovery.contract.test.ts | 2 +- extensions/mistral/onboard.test.ts | 4 +- extensions/moonshot/index.test.ts | 2 +- .../msteams/src/channel.directory.test.ts | 4 +- .../src/channel.lifecycle.test.ts | 6 +- .../src/send.cfg-threading.test.ts | 4 +- extensions/nostr/src/channel.inbound.test.ts | 2 +- extensions/nostr/src/channel.outbound.test.ts | 2 +- .../plugin-registration.contract.test.ts | 2 +- .../plugin-registration.contract.test.ts | 4 +- .../openai/provider-auth.contract.test.ts | 2 +- .../openai/provider-runtime.contract.test.ts | 2 +- .../provider-catalog.contract-test-support.ts | 8 +-- extensions/opencode-go/onboard.test.ts | 2 +- .../plugin-registration.contract.test.ts | 2 +- extensions/opencode/onboard.test.ts | 4 +- .../plugin-registration.contract.test.ts | 2 +- extensions/openrouter/onboard.test.ts | 4 +- .../provider-runtime.contract.test.ts | 2 +- extensions/qa-channel/src/channel.test.ts | 2 +- .../qwen/plugin-registration.contract.test.ts | 2 +- .../qwen/provider-discovery.contract.test.ts | 2 +- .../plugin-registration.contract.test.ts | 2 +- .../provider-discovery.contract.test.ts | 2 +- .../slack/src/outbound-delivery.test.ts | 4 +- extensions/synthetic/onboard.test.ts | 4 +- .../plugin-registration.contract.test.ts | 2 +- .../venice/provider-runtime.contract.test.ts | 2 +- .../plugin-registration.contract.test.ts | 2 +- .../whatsapp/src/directory-config.test.ts | 2 +- extensions/xai/onboard.test.ts | 4 +- .../xai/plugin-registration.contract.test.ts | 2 +- extensions/xiaomi/onboard.test.ts | 4 +- extensions/zai/onboard.test.ts | 2 +- .../zai/provider-runtime.contract.test.ts | 2 +- extensions/zalo/runtime-api.test.ts | 2 +- extensions/zalo/src/channel.directory.test.ts | 4 +- extensions/zalo/src/channel.startup.test.ts | 4 +- extensions/zalo/src/status-issues.test.ts | 2 +- .../monitor-mocks-test-support.ts | 2 +- extensions/zalouser/src/status-issues.test.ts | 2 +- package.json | 12 ++++ .../check-no-extension-test-core-imports.ts | 39 +++++++++++- scripts/ci-changed-scope.mjs | 2 +- scripts/lib/plugin-sdk-doc-metadata.ts | 15 +++++ scripts/lib/plugin-sdk-entrypoints.json | 3 + scripts/test-projects.test-support.mjs | 2 +- .../channel-import-guardrails.test.ts | 2 +- src/plugin-sdk/channel-test-helpers.ts | 33 ++++++++++ src/plugin-sdk/plugin-test-contracts.ts | 24 ++++++++ src/plugin-sdk/provider-test-contracts.ts | 60 +++++++++++++++++++ .../test-helpers}/contracts-testkit.ts | 4 +- .../plugin-sdk/test-helpers}/direct-smoke.ts | 0 .../plugin-sdk/test-helpers}/directory.ts | 2 +- .../test-helpers}/jiti-runtime-api.ts | 0 .../test-helpers}/onboard-config.ts | 4 +- .../test-helpers}/outbound-delivery.ts | 2 +- .../package-manifest-contract.ts | 11 ++-- .../plugin-registration-contract-cases.ts | 0 .../plugin-registration-contract.ts | 5 +- .../test-helpers}/plugin-runtime-mock.ts | 8 +-- .../test-helpers}/provider-auth-contract.ts | 53 ++++++++-------- .../test-helpers}/provider-catalog.ts | 4 +- .../test-helpers}/provider-contract-suites.ts | 8 +-- .../test-helpers}/provider-contract.ts | 6 +- .../provider-discovery-contract.ts | 6 +- .../test-helpers}/provider-onboard.ts | 8 +-- .../provider-runtime-contract.ts | 8 +-- .../provider-wizard-contract-suites.ts | 8 +-- .../test-helpers}/public-artifacts.ts | 2 +- .../test-helpers}/public-surface-loader.ts | 37 ++++++++---- .../plugin-sdk/test-helpers}/send-config.ts | 0 .../test-helpers}/start-account-context.ts | 6 +- .../test-helpers}/start-account-lifecycle.ts | 2 +- .../plugin-sdk/test-helpers}/status-issues.ts | 0 .../plugin-sdk/test-helpers}/stream-hooks.ts | 0 .../test-helpers}/subagent-hooks.ts | 0 .../web-fetch-provider-contract.ts | 6 +- .../web-search-provider-contract.ts | 4 +- .../core-extension-facade-boundary.test.ts | 2 +- src/plugins/contracts/loader.contract.test.ts | 2 +- ...memory-embedding-provider.contract.test.ts | 4 +- .../package-manifest.contract.test.ts | 2 +- ...in-registration.anthropic.contract.test.ts | 4 +- ...plugin-registration.brave.contract.test.ts | 4 +- ...plugin-registration.comfy.contract.test.ts | 4 +- ...gin-registration.deepgram.contract.test.ts | 4 +- ...n-registration.duckduckgo.contract.test.ts | 4 +- ...n-registration.elevenlabs.contract.test.ts | 4 +- .../plugin-registration.exa.contract.test.ts | 4 +- .../plugin-registration.fal.contract.test.ts | 4 +- ...in-registration.firecrawl.contract.test.ts | 4 +- ...lugin-registration.google.contract.test.ts | 4 +- .../plugin-registration.groq.contract.test.ts | 4 +- ...in-registration.microsoft.contract.test.ts | 4 +- ...ugin-registration.minimax.contract.test.ts | 4 +- ...ugin-registration.mistral.contract.test.ts | 4 +- ...gin-registration.moonshot.contract.test.ts | 4 +- ...lugin-registration.openai.contract.test.ts | 4 +- ...n-registration.openrouter.contract.test.ts | 4 +- ...n-registration.perplexity.contract.test.ts | 4 +- ...n-registration.senseaudio.contract.test.ts | 4 +- ...lugin-registration.tavily.contract.test.ts | 4 +- ...egistration.tts-local-cli.contract.test.ts | 4 +- .../plugin-registration.xai.contract.test.ts | 4 +- .../plugin-registration.zai.contract.test.ts | 4 +- .../contracts/providers.contract.test.ts | 4 +- .../contracts/registry.contract.test.ts | 2 +- ...ntime-import-side-effects.contract.test.ts | 2 +- src/plugins/contracts/shape.contract.test.ts | 4 +- .../plugins/contracts}/tts-contract-suites.ts | 3 +- src/plugins/contracts/tts.contract.test.ts | 2 +- .../web-fetch-provider.contract.test.ts | 2 +- .../wizard.choice-resolution.contract.test.ts | 2 +- .../wizard.model-picker.contract.test.ts | 2 +- .../wizard.setup-options.contract.test.ts | 2 +- .../registry.dual-kind-memory-gate.test.ts | 4 +- src/scripts/ci-changed-scope.test.ts | 2 +- test/scripts/test-projects.test.ts | 2 +- 153 files changed, 496 insertions(+), 291 deletions(-) create mode 100644 src/plugin-sdk/channel-test-helpers.ts create mode 100644 src/plugin-sdk/plugin-test-contracts.ts create mode 100644 src/plugin-sdk/provider-test-contracts.ts rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/contracts-testkit.ts (96%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/direct-smoke.ts (100%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/directory.ts (90%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/jiti-runtime-api.ts (100%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/onboard-config.ts (88%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/outbound-delivery.ts (88%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/package-manifest-contract.ts (94%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/plugin-registration-contract-cases.ts (100%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/plugin-registration-contract.ts (97%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/plugin-runtime-mock.ts (99%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/provider-auth-contract.ts (92%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/provider-catalog.ts (89%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/provider-contract-suites.ts (95%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/provider-contract.ts (95%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/provider-discovery-contract.ts (99%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/provider-onboard.ts (93%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/provider-runtime-contract.ts (99%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/provider-wizard-contract-suites.ts (97%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/public-artifacts.ts (97%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/public-surface-loader.ts (69%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/send-config.ts (100%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/start-account-context.ts (91%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/start-account-lifecycle.ts (98%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/status-issues.ts (100%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/stream-hooks.ts (100%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/subagent-hooks.ts (100%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/web-fetch-provider-contract.ts (94%) rename {test/helpers/plugins => src/plugin-sdk/test-helpers}/web-search-provider-contract.ts (98%) rename {test/helpers/plugins => src/plugins/contracts}/tts-contract-suites.ts (99%) diff --git a/CHANGELOG.md b/CHANGELOG.md index cdf286d9c8a..bcce02b1e7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ Docs: https://docs.openclaw.ai - Channels/QQBot: add full group chat support (history tracking, @-mention gating, activation modes, per-group config, FIFO message queue with deliver debounce), C2C `stream_messages` streaming with a `StreamingController` lifecycle manager, unified `sendMedia` with chunked upload for large files, and refactor the engine into pipeline stages, focused outbound submodules, builtin slash-command modules, and explicit DI ports via `createEngineAdapters()`. (#70624) Thanks @cxyhhhhh. - 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 `plugin-sdk/plugin-test-api` helper subpath and move bundled plugin registration tests off the repo-only plugin API bridge. Thanks @vincentkoc. - Plugin SDK/testing: expose provider catalog, wizard, registry, manifest, public-artifact, outbound, and TTS contract helpers through documented SDK testing seams so bundled plugin tests no longer import repo `src/**` internals. Thanks @vincentkoc. - Matrix: attach versioned structured approval metadata to pending approval messages so capable Matrix clients can render richer approval UI while body text and reaction fallback keep working. (#72432) Thanks @kakahu2015. diff --git a/docs/.generated/plugin-sdk-api-baseline.sha256 b/docs/.generated/plugin-sdk-api-baseline.sha256 index 2c3002c6cb3..fc6b924df1e 100644 --- a/docs/.generated/plugin-sdk-api-baseline.sha256 +++ b/docs/.generated/plugin-sdk-api-baseline.sha256 @@ -1,2 +1,2 @@ -0736a1666860383e3e5f8ada181c016455d8304a2852ac6966355765f799add4 plugin-sdk-api-baseline.json -761cdb609547f5912513e5714d8b0ec8fff2b29905690af376cc5bdd74f2c279 plugin-sdk-api-baseline.jsonl +8ddaaac1ae57b1b5d89d906653b5441bd69b1a296582422541de99944fdb382e plugin-sdk-api-baseline.json +73c8f58d5ce7056c67ed6abb12e90285f2101c6af94a4c8f4ecae02a6c494b79 plugin-sdk-api-baseline.jsonl diff --git a/docs/plugins/sdk-subpaths.md b/docs/plugins/sdk-subpaths.md index 714beea859e..4f1a64f3b88 100644 --- a/docs/plugins/sdk-subpaths.md +++ b/docs/plugins/sdk-subpaths.md @@ -16,16 +16,19 @@ For the plugin authoring guide, see [Plugin SDK overview](/plugins/sdk-overview) ## Plugin entry -| Subpath | Key exports | -| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `plugin-sdk/plugin-entry` | `definePluginEntry` | -| `plugin-sdk/core` | `defineChannelPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase`, `defineSetupPluginEntry`, `buildChannelConfigSchema` | -| `plugin-sdk/config-schema` | `OpenClawSchema` | -| `plugin-sdk/provider-entry` | `defineSingleProviderPluginEntry` | -| `plugin-sdk/testing` | Public plugin test fixtures, provider registration/catalog helpers, wizard contract hooks, and bundled-plugin contract maintenance helpers | -| `plugin-sdk/plugin-test-api` | Minimal `OpenClawPluginApi` mock builder for direct plugin registration unit tests | -| `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` | +| Subpath | Key exports | +| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `plugin-sdk/plugin-entry` | `definePluginEntry` | +| `plugin-sdk/core` | `defineChannelPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase`, `defineSetupPluginEntry`, `buildChannelConfigSchema` | +| `plugin-sdk/config-schema` | `OpenClawSchema` | +| `plugin-sdk/provider-entry` | `defineSingleProviderPluginEntry` | +| `plugin-sdk/testing` | Public plugin test fixtures, provider registration/catalog helpers, wizard contract hooks, and bundled-plugin contract maintenance helpers | +| `plugin-sdk/plugin-test-api` | Minimal `OpenClawPluginApi` mock builder for direct plugin registration unit tests | +| `plugin-sdk/channel-test-helpers` | Channel account lifecycle, directory, send-config, runtime mock, and hook test helpers | +| `plugin-sdk/plugin-test-contracts` | Plugin registration, package manifest, public artifact, runtime API, import side-effect, and direct import contract helpers | +| `plugin-sdk/provider-test-contracts` | Provider runtime, auth, discovery, onboard, catalog, web-search/fetch, and wizard contract helpers | +| `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` | @@ -262,6 +265,9 @@ For the plugin authoring guide, see [Plugin SDK overview](/plugins/sdk-overview) | `plugin-sdk/zod` | Re-exported `zod` for plugin SDK consumers | | `plugin-sdk/testing` | Public extension test helpers including plugin registry/runtime mocks, provider registration capture, setup-wizard helpers, fetch/env/temp/time fixtures, schema/media/live-test helpers, `installCommonResolveTargetErrorCases`, `writeSkill`, `createTestRegistry`, and live generation env loading. Extension `*.test-support.ts` helpers stay on this or focused SDK subpaths, not core internals | | `plugin-sdk/plugin-test-api` | Minimal `createTestPluginApi` helper for direct plugin registration unit tests without importing repo test helper bridges | + | `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 | diff --git a/docs/plugins/sdk-testing.md b/docs/plugins/sdk-testing.md index 95b410a90f0..8fe15d1b622 100644 --- a/docs/plugins/sdk-testing.md +++ b/docs/plugins/sdk-testing.md @@ -25,6 +25,12 @@ plugins. **Channel contract import:** `openclaw/plugin-sdk/channel-contract-testing` +**Channel test helper import:** `openclaw/plugin-sdk/channel-test-helpers` + +**Plugin contract import:** `openclaw/plugin-sdk/plugin-test-contracts` + +**Provider contract import:** `openclaw/plugin-sdk/provider-test-contracts` + The testing subpath exports a narrow set of helpers for plugin authors: ```typescript @@ -35,6 +41,9 @@ import { } from "openclaw/plugin-sdk/testing"; import { createTestPluginApi } from "openclaw/plugin-sdk/plugin-test-api"; import { expectChannelInboundContextContract } from "openclaw/plugin-sdk/channel-contract-testing"; +import { createStartAccountContext } from "openclaw/plugin-sdk/channel-test-helpers"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describeOpenAIProviderRuntimeContract } from "openclaw/plugin-sdk/provider-test-contracts"; ``` ### Available exports @@ -44,6 +53,9 @@ import { expectChannelInboundContextContract } from "openclaw/plugin-sdk/channel | `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` | +| `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 | @@ -73,11 +85,14 @@ import { expectChannelInboundContextContract } from "openclaw/plugin-sdk/channel | `typedCases` | Preserve literal types for table-driven tests | Bundled-plugin contract suites also use SDK testing subpaths for test-only -registry, manifest, public-artifact, and runtime fixture helpers. 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` rather than importing repo `src/**` files -directly. +registry, manifest, public-artifact, and runtime fixture helpers. Core-only +suites that depend on bundled OpenClaw inventory stay under `src/plugins/contracts`. +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`, or `plugin-sdk/provider-test-contracts` +rather than importing repo `src/**` files or repo `test/helpers/plugins/*` +bridges directly. ### Types @@ -136,8 +151,8 @@ entry to declare `kind: "memory"`. ### Testing runtime config access -Prefer the shared plugin runtime mock from the repo test helpers when testing -bundled plugins. Its deprecated `runtime.config.loadConfig()` and +Prefer the shared plugin runtime mock from `openclaw/plugin-sdk/channel-test-helpers` +when testing bundled channel plugins. Its deprecated `runtime.config.loadConfig()` and `runtime.config.writeConfigFile(...)` mocks throw by default so tests catch new usage of compatibility APIs. Override those mocks only when the test is explicitly covering legacy compatibility behavior. diff --git a/extensions/alibaba/plugin-registration.contract.test.ts b/extensions/alibaba/plugin-registration.contract.test.ts index 2f0e360981b..3d9664ef6b2 100644 --- a/extensions/alibaba/plugin-registration.contract.test.ts +++ b/extensions/alibaba/plugin-registration.contract.test.ts @@ -1,4 +1,4 @@ -import { describePluginRegistrationContract } from "../../test/helpers/plugins/plugin-registration-contract.js"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract({ pluginId: "alibaba", diff --git a/extensions/anthropic/provider-runtime.contract.test.ts b/extensions/anthropic/provider-runtime.contract.test.ts index 1e82b5481f9..aff5846e2ea 100644 --- a/extensions/anthropic/provider-runtime.contract.test.ts +++ b/extensions/anthropic/provider-runtime.contract.test.ts @@ -1,3 +1,3 @@ -import { describeAnthropicProviderRuntimeContract } from "../../test/helpers/plugins/provider-runtime-contract.js"; +import { describeAnthropicProviderRuntimeContract } from "openclaw/plugin-sdk/provider-test-contracts"; describeAnthropicProviderRuntimeContract(() => import("./index.js")); diff --git a/extensions/bluebubbles/src/test-support/monitor-test-support.ts b/extensions/bluebubbles/src/test-support/monitor-test-support.ts index b8f575ac8fa..dfd480657fc 100644 --- a/extensions/bluebubbles/src/test-support/monitor-test-support.ts +++ b/extensions/bluebubbles/src/test-support/monitor-test-support.ts @@ -1,7 +1,7 @@ +import { createPluginRuntimeMock } from "openclaw/plugin-sdk/channel-test-helpers"; import type { PluginRuntime } from "openclaw/plugin-sdk/core"; import type { HistoryEntry } from "openclaw/plugin-sdk/reply-history"; import { vi } from "vitest"; -import { createPluginRuntimeMock } from "../../../../test/helpers/plugins/plugin-runtime-mock.js"; import { _resetBlueBubblesInboundDedupForTest } from "../inbound-dedupe.js"; import { _resetBlueBubblesShortIdState, diff --git a/extensions/byteplus/plugin-registration.contract.test.ts b/extensions/byteplus/plugin-registration.contract.test.ts index 104604850c5..25f6969ad03 100644 --- a/extensions/byteplus/plugin-registration.contract.test.ts +++ b/extensions/byteplus/plugin-registration.contract.test.ts @@ -1,4 +1,4 @@ -import { describePluginRegistrationContract } from "../../test/helpers/plugins/plugin-registration-contract.js"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract({ pluginId: "byteplus", diff --git a/extensions/cloudflare-ai-gateway/provider-discovery.contract.test.ts b/extensions/cloudflare-ai-gateway/provider-discovery.contract.test.ts index 98cc720920a..26d5469b4fd 100644 --- a/extensions/cloudflare-ai-gateway/provider-discovery.contract.test.ts +++ b/extensions/cloudflare-ai-gateway/provider-discovery.contract.test.ts @@ -1,3 +1,3 @@ -import { describeCloudflareAiGatewayProviderDiscoveryContract } from "../../test/helpers/plugins/provider-discovery-contract.js"; +import { describeCloudflareAiGatewayProviderDiscoveryContract } from "openclaw/plugin-sdk/provider-test-contracts"; describeCloudflareAiGatewayProviderDiscoveryContract(() => import("./index.js")); diff --git a/extensions/comfy/plugin-registration.contract.test.ts b/extensions/comfy/plugin-registration.contract.test.ts index 9beeb29fb16..16ba728cd44 100644 --- a/extensions/comfy/plugin-registration.contract.test.ts +++ b/extensions/comfy/plugin-registration.contract.test.ts @@ -1,4 +1,4 @@ -import { describePluginRegistrationContract } from "../../test/helpers/plugins/plugin-registration-contract.js"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract({ pluginId: "comfy", diff --git a/extensions/discord/src/channel.test.ts b/extensions/discord/src/channel.test.ts index 3554ab56a24..f93841f5576 100644 --- a/extensions/discord/src/channel.test.ts +++ b/extensions/discord/src/channel.test.ts @@ -1,8 +1,8 @@ import { readFile } from "node:fs/promises"; import { resolve } from "node:path"; +import { createStartAccountContext } from "openclaw/plugin-sdk/channel-test-helpers"; import type { PluginRuntime } from "openclaw/plugin-sdk/core"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { createStartAccountContext } from "../../../test/helpers/plugins/start-account-context.js"; import type { ResolvedDiscordAccount } from "./accounts.js"; import type { OpenClawConfig } from "./runtime-api.js"; import * as sendModule from "./send.js"; diff --git a/extensions/discord/src/subagent-hooks.test.ts b/extensions/discord/src/subagent-hooks.test.ts index 1331d775fce..952972d5bd4 100644 --- a/extensions/discord/src/subagent-hooks.test.ts +++ b/extensions/discord/src/subagent-hooks.test.ts @@ -1,9 +1,9 @@ -import type { OpenClawPluginApi } from "openclaw/plugin-sdk/core"; -import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { getRequiredHookHandler, registerHookHandlersForTest, -} from "../../../test/helpers/plugins/subagent-hooks.js"; +} from "openclaw/plugin-sdk/channel-test-helpers"; +import type { OpenClawPluginApi } from "openclaw/plugin-sdk/core"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; type ThreadBindingRecord = { accountId: string; diff --git a/extensions/fal/plugin-registration.contract.test.ts b/extensions/fal/plugin-registration.contract.test.ts index 80917895292..5533d2cc894 100644 --- a/extensions/fal/plugin-registration.contract.test.ts +++ b/extensions/fal/plugin-registration.contract.test.ts @@ -1,4 +1,4 @@ -import { describePluginRegistrationContract } from "../../test/helpers/plugins/plugin-registration-contract.js"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract({ pluginId: "fal", diff --git a/extensions/feishu/src/subagent-hooks.test.ts b/extensions/feishu/src/subagent-hooks.test.ts index 84ef8a8697c..731b5ceb435 100644 --- a/extensions/feishu/src/subagent-hooks.test.ts +++ b/extensions/feishu/src/subagent-hooks.test.ts @@ -1,8 +1,8 @@ -import { beforeEach, describe, expect, it } from "vitest"; import { getRequiredHookHandler, registerHookHandlersForTest, -} from "../../../test/helpers/plugins/subagent-hooks.js"; +} from "openclaw/plugin-sdk/channel-test-helpers"; +import { beforeEach, describe, expect, it } from "vitest"; import type { ClawdbotConfig, OpenClawPluginApi } from "../runtime-api.js"; import { registerFeishuSubagentHooks } from "../subagent-hooks-api.js"; import { diff --git a/extensions/feishu/src/test-support/lifecycle-test-support.ts b/extensions/feishu/src/test-support/lifecycle-test-support.ts index a0eb5097fdc..bf9bedba103 100644 --- a/extensions/feishu/src/test-support/lifecycle-test-support.ts +++ b/extensions/feishu/src/test-support/lifecycle-test-support.ts @@ -1,6 +1,6 @@ import { randomUUID } from "node:crypto"; +import { createPluginRuntimeMock } from "openclaw/plugin-sdk/channel-test-helpers"; import { expect, vi, type Mock } from "vitest"; -import { createPluginRuntimeMock } from "../../../../test/helpers/plugins/plugin-runtime-mock.js"; import type { ClawdbotConfig, PluginRuntime, RuntimeEnv } from "../../runtime-api.js"; import { createFeishuMessageReceiveHandler } from "../monitor.message-handler.js"; import { setFeishuRuntime } from "../runtime.js"; diff --git a/extensions/github-copilot/provider-auth.contract.test.ts b/extensions/github-copilot/provider-auth.contract.test.ts index 31a5b0717dd..15bc8acfc51 100644 --- a/extensions/github-copilot/provider-auth.contract.test.ts +++ b/extensions/github-copilot/provider-auth.contract.test.ts @@ -1,3 +1,3 @@ -import { describeGithubCopilotProviderAuthContract } from "../../test/helpers/plugins/provider-auth-contract.js"; +import { describeGithubCopilotProviderAuthContract } from "openclaw/plugin-sdk/provider-test-contracts"; describeGithubCopilotProviderAuthContract(() => import("./index.js")); diff --git a/extensions/github-copilot/provider-discovery.contract.test.ts b/extensions/github-copilot/provider-discovery.contract.test.ts index a02486e0f56..c1488195525 100644 --- a/extensions/github-copilot/provider-discovery.contract.test.ts +++ b/extensions/github-copilot/provider-discovery.contract.test.ts @@ -1,5 +1,5 @@ import { fileURLToPath } from "node:url"; -import { describeGithubCopilotProviderDiscoveryContract } from "../../test/helpers/plugins/provider-discovery-contract.js"; +import { describeGithubCopilotProviderDiscoveryContract } from "openclaw/plugin-sdk/provider-test-contracts"; describeGithubCopilotProviderDiscoveryContract({ load: () => import("./index.js"), diff --git a/extensions/github-copilot/provider-runtime.contract.test.ts b/extensions/github-copilot/provider-runtime.contract.test.ts index dc840ae4762..59f253a2d33 100644 --- a/extensions/github-copilot/provider-runtime.contract.test.ts +++ b/extensions/github-copilot/provider-runtime.contract.test.ts @@ -1,3 +1,3 @@ -import { describeGithubCopilotProviderRuntimeContract } from "../../test/helpers/plugins/provider-runtime-contract.js"; +import { describeGithubCopilotProviderRuntimeContract } from "openclaw/plugin-sdk/provider-test-contracts"; describeGithubCopilotProviderRuntimeContract(() => import("./index.js")); diff --git a/extensions/google/index.test.ts b/extensions/google/index.test.ts index bfecc7f0c8d..c897a18ae7b 100644 --- a/extensions/google/index.test.ts +++ b/extensions/google/index.test.ts @@ -3,9 +3,9 @@ import type { ProviderReplaySessionEntry, ProviderSanitizeReplayHistoryContext, } from "openclaw/plugin-sdk/plugin-entry"; +import { createCapturedThinkingConfigStream } from "openclaw/plugin-sdk/provider-test-contracts"; import { registerProviderPlugin, requireRegisteredProvider } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; -import { createCapturedThinkingConfigStream } from "../../test/helpers/plugins/stream-hooks.js"; import { registerGoogleGeminiCliProvider } from "./gemini-cli-provider.js"; import { registerGoogleProvider } from "./provider-registration.js"; diff --git a/extensions/google/plugin-registration.contract.test.ts b/extensions/google/plugin-registration.contract.test.ts index 3c18525e463..2bd1f87403c 100644 --- a/extensions/google/plugin-registration.contract.test.ts +++ b/extensions/google/plugin-registration.contract.test.ts @@ -1,5 +1,5 @@ -import { pluginRegistrationContractCases } from "../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract({ ...pluginRegistrationContractCases.google, diff --git a/extensions/google/provider-runtime.contract.test.ts b/extensions/google/provider-runtime.contract.test.ts index 85a729bf514..b74febbac09 100644 --- a/extensions/google/provider-runtime.contract.test.ts +++ b/extensions/google/provider-runtime.contract.test.ts @@ -1,3 +1,3 @@ -import { describeGoogleProviderRuntimeContract } from "../../test/helpers/plugins/provider-runtime-contract.js"; +import { describeGoogleProviderRuntimeContract } from "openclaw/plugin-sdk/provider-test-contracts"; describeGoogleProviderRuntimeContract(() => import("./index.js")); diff --git a/extensions/googlechat/src/channel.test.ts b/extensions/googlechat/src/channel.test.ts index 01a5511485f..409944588dd 100644 --- a/extensions/googlechat/src/channel.test.ts +++ b/extensions/googlechat/src/channel.test.ts @@ -1,8 +1,8 @@ -import { afterEach, describe, expect, it, vi } from "vitest"; import { createDirectoryTestRuntime, expectDirectorySurface, -} from "../../../test/helpers/plugins/directory.ts"; +} from "openclaw/plugin-sdk/channel-test-helpers"; +import { afterEach, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../runtime-api.js"; import { googlechatDirectoryAdapter, diff --git a/extensions/googlechat/src/setup.test.ts b/extensions/googlechat/src/setup.test.ts index c7a07d2da8c..1a7f98a1509 100644 --- a/extensions/googlechat/src/setup.test.ts +++ b/extensions/googlechat/src/setup.test.ts @@ -1,3 +1,8 @@ +import { + expectLifecyclePatch, + expectPendingUntilAbort, + startAccountAndTrackLifecycle, +} from "openclaw/plugin-sdk/channel-test-helpers"; import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/setup"; import { createPluginSetupWizardConfigure, @@ -7,11 +12,6 @@ import { type WizardPrompter, } from "openclaw/plugin-sdk/testing"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { - expectLifecyclePatch, - expectPendingUntilAbort, - startAccountAndTrackLifecycle, -} from "../../../test/helpers/plugins/start-account-lifecycle.js"; import type { OpenClawConfig } from "../runtime-api.js"; import { listGoogleChatAccountIds, diff --git a/extensions/gradium/plugin-registration.contract.test.ts b/extensions/gradium/plugin-registration.contract.test.ts index ddcd9a8c217..78dee01f495 100644 --- a/extensions/gradium/plugin-registration.contract.test.ts +++ b/extensions/gradium/plugin-registration.contract.test.ts @@ -1,4 +1,4 @@ -import { describePluginRegistrationContract } from "../../test/helpers/plugins/plugin-registration-contract.js"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract({ pluginId: "gradium", diff --git a/extensions/irc/runtime-api.test.ts b/extensions/irc/runtime-api.test.ts index 0f415f34544..340063d5085 100644 --- a/extensions/irc/runtime-api.test.ts +++ b/extensions/irc/runtime-api.test.ts @@ -1,5 +1,5 @@ +import { runDirectImportSmoke } from "openclaw/plugin-sdk/plugin-test-contracts"; import { describe, expect, it } from "vitest"; -import { runDirectImportSmoke } from "../../test/helpers/plugins/direct-smoke.js"; describe("irc bundled api seams", () => { it("loads narrow public api modules in direct smoke", async () => { diff --git a/extensions/irc/src/send.test.ts b/extensions/irc/src/send.test.ts index 25a323fbe22..abbe1e97a87 100644 --- a/extensions/irc/src/send.test.ts +++ b/extensions/irc/src/send.test.ts @@ -1,5 +1,5 @@ +import { createSendCfgThreadingRuntime } from "openclaw/plugin-sdk/channel-test-helpers"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { createSendCfgThreadingRuntime } from "../../../test/helpers/plugins/send-config.js"; import type { IrcClient } from "./client.js"; import { setIrcRuntime } from "./runtime.js"; import type { CoreConfig } from "./types.js"; diff --git a/extensions/irc/src/setup.test.ts b/extensions/irc/src/setup.test.ts index 278bde319fa..5985c5782c0 100644 --- a/extensions/irc/src/setup.test.ts +++ b/extensions/irc/src/setup.test.ts @@ -1,3 +1,8 @@ +import { + expectStopPendingUntilAbort, + startAccountAndTrackLifecycle, + waitForStartedMocks, +} from "openclaw/plugin-sdk/channel-test-helpers"; import { createPluginSetupWizardAdapter, createPluginSetupWizardStatus, @@ -7,11 +12,6 @@ import { type WizardPrompter, } from "openclaw/plugin-sdk/testing"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { - expectStopPendingUntilAbort, - startAccountAndTrackLifecycle, - waitForStartedMocks, -} from "../../../test/helpers/plugins/start-account-lifecycle.js"; import { listIrcAccountIds, resolveDefaultIrcAccountId, diff --git a/extensions/line/src/setup-surface.test.ts b/extensions/line/src/setup-surface.test.ts index d7cb4d2c902..bf2f3d9ec73 100644 --- a/extensions/line/src/setup-surface.test.ts +++ b/extensions/line/src/setup-surface.test.ts @@ -1,5 +1,6 @@ import { readFileSync } from "node:fs"; import path from "node:path"; +import { createStartAccountContext } from "openclaw/plugin-sdk/channel-test-helpers"; import { createPluginSetupWizardConfigure, createTestWizardPrompter, @@ -9,7 +10,6 @@ import { import ts from "typescript"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { bundledPluginRoot } from "../../../test/helpers/bundled-plugin-paths.js"; -import { createStartAccountContext } from "../../../test/helpers/plugins/start-account-context.js"; import type { OpenClawConfig, PluginRuntime, ResolvedLineAccount } from "../api.js"; import { linePlugin } from "./channel.js"; import { lineGatewayAdapter } from "./gateway.js"; diff --git a/extensions/litellm/onboard.test.ts b/extensions/litellm/onboard.test.ts index 37ac2527fc1..9f03f0ccc39 100644 --- a/extensions/litellm/onboard.test.ts +++ b/extensions/litellm/onboard.test.ts @@ -1,5 +1,5 @@ +import { expectProviderOnboardMergedLegacyConfig } from "openclaw/plugin-sdk/provider-test-contracts"; import { describe, expect, it } from "vitest"; -import { expectProviderOnboardMergedLegacyConfig } from "../../test/helpers/plugins/provider-onboard.js"; import { applyLitellmProviderConfig } from "./onboard.js"; describe("litellm onboard", () => { diff --git a/extensions/lmstudio/plugin-registration.contract.test.ts b/extensions/lmstudio/plugin-registration.contract.test.ts index 4ece8673dfa..f3c980f63eb 100644 --- a/extensions/lmstudio/plugin-registration.contract.test.ts +++ b/extensions/lmstudio/plugin-registration.contract.test.ts @@ -1,4 +1,4 @@ -import { describePluginRegistrationContract } from "../../test/helpers/plugins/plugin-registration-contract.js"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract({ pluginId: "lmstudio", diff --git a/extensions/matrix/src/matrix/subagent-hooks.test.ts b/extensions/matrix/src/matrix/subagent-hooks.test.ts index 98d7b8fc85a..f1cce2140dd 100644 --- a/extensions/matrix/src/matrix/subagent-hooks.test.ts +++ b/extensions/matrix/src/matrix/subagent-hooks.test.ts @@ -1,9 +1,9 @@ import type { OpenClawPluginApi as MatrixEntryPluginApi } from "openclaw/plugin-sdk/channel-entry-contract"; -import { beforeEach, describe, expect, it, vi } from "vitest"; import { getRequiredHookHandler, registerHookHandlersForTest, -} from "../../../../test/helpers/plugins/subagent-hooks.js"; +} from "openclaw/plugin-sdk/channel-test-helpers"; +import { beforeEach, describe, expect, it, vi } from "vitest"; import { registerMatrixSubagentHooks } from "../../subagent-hooks-api.js"; // Hoisted stubs referenced in vi.mock factories below diff --git a/extensions/mattermost/src/mattermost/send.test.ts b/extensions/mattermost/src/mattermost/send.test.ts index 93539082fe1..eac0670bfa1 100644 --- a/extensions/mattermost/src/mattermost/send.test.ts +++ b/extensions/mattermost/src/mattermost/send.test.ts @@ -1,5 +1,5 @@ +import { expectProvidedCfgSkipsRuntimeLoad } from "openclaw/plugin-sdk/channel-test-helpers"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { expectProvidedCfgSkipsRuntimeLoad } from "../../../../test/helpers/plugins/send-config.js"; let parseMattermostTarget: typeof import("./send.js").parseMattermostTarget; let sendMessageMattermost: typeof import("./send.js").sendMessageMattermost; diff --git a/extensions/minimax/onboard.test.ts b/extensions/minimax/onboard.test.ts index 0bdcfa5f249..58ddb32e870 100644 --- a/extensions/minimax/onboard.test.ts +++ b/extensions/minimax/onboard.test.ts @@ -1,9 +1,9 @@ import { resolveAgentModelPrimaryValue } from "openclaw/plugin-sdk/provider-onboard"; -import { describe, expect, it } from "vitest"; import { expectProviderOnboardMergedLegacyConfig, expectProviderOnboardPreservesPrimary, -} from "../../test/helpers/plugins/provider-onboard.js"; +} from "openclaw/plugin-sdk/provider-test-contracts"; +import { describe, expect, it } from "vitest"; import { applyMinimaxApiConfig, applyMinimaxApiProviderConfig } from "./onboard.js"; describe("minimax onboard", () => { diff --git a/extensions/minimax/plugin-registration.contract.test.ts b/extensions/minimax/plugin-registration.contract.test.ts index d202fea531d..11d7a84567d 100644 --- a/extensions/minimax/plugin-registration.contract.test.ts +++ b/extensions/minimax/plugin-registration.contract.test.ts @@ -1,4 +1,4 @@ -import { describePluginRegistrationContract } from "../../test/helpers/plugins/plugin-registration-contract.js"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract({ pluginId: "minimax", diff --git a/extensions/minimax/provider-discovery.contract.test.ts b/extensions/minimax/provider-discovery.contract.test.ts index b38fd6a9bc2..ec1a6aafbaa 100644 --- a/extensions/minimax/provider-discovery.contract.test.ts +++ b/extensions/minimax/provider-discovery.contract.test.ts @@ -1,3 +1,3 @@ -import { describeMinimaxProviderDiscoveryContract } from "../../test/helpers/plugins/provider-discovery-contract.js"; +import { describeMinimaxProviderDiscoveryContract } from "openclaw/plugin-sdk/provider-test-contracts"; describeMinimaxProviderDiscoveryContract(() => import("./index.js")); diff --git a/extensions/mistral/onboard.test.ts b/extensions/mistral/onboard.test.ts index da5d753d396..84db9ca6346 100644 --- a/extensions/mistral/onboard.test.ts +++ b/extensions/mistral/onboard.test.ts @@ -1,8 +1,8 @@ -import { describe, expect, it } from "vitest"; import { expectProviderOnboardMergedLegacyConfig, expectProviderOnboardPrimaryAndFallbacks, -} from "../../test/helpers/plugins/provider-onboard.js"; +} from "openclaw/plugin-sdk/provider-test-contracts"; +import { describe, expect, it } from "vitest"; import { buildMistralModelDefinition as buildBundledMistralModelDefinition } from "./model-definitions.js"; import { applyMistralConfig, diff --git a/extensions/moonshot/index.test.ts b/extensions/moonshot/index.test.ts index d6806425c92..d1694abdd58 100644 --- a/extensions/moonshot/index.test.ts +++ b/extensions/moonshot/index.test.ts @@ -1,8 +1,8 @@ import fs from "node:fs"; import type { Context, Model } from "@mariozechner/pi-ai"; +import { createCapturedThinkingConfigStream } from "openclaw/plugin-sdk/provider-test-contracts"; import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; -import { createCapturedThinkingConfigStream } from "../../test/helpers/plugins/stream-hooks.js"; import plugin from "./index.js"; import { createKimiWebSearchProvider } from "./src/kimi-web-search-provider.js"; diff --git a/extensions/msteams/src/channel.directory.test.ts b/extensions/msteams/src/channel.directory.test.ts index 3a779380de4..2cafdc66769 100644 --- a/extensions/msteams/src/channel.directory.test.ts +++ b/extensions/msteams/src/channel.directory.test.ts @@ -1,8 +1,8 @@ -import { afterEach, describe, expect, it, vi } from "vitest"; import { createDirectoryTestRuntime, expectDirectorySurface, -} from "../../../test/helpers/plugins/directory.js"; +} from "openclaw/plugin-sdk/channel-test-helpers"; +import { afterEach, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig, RuntimeEnv } from "../runtime-api.js"; import { msteamsDirectoryAdapter } from "./directory.js"; import { resolveMSTeamsOutboundSessionRoute } from "./session-route.js"; diff --git a/extensions/nextcloud-talk/src/channel.lifecycle.test.ts b/extensions/nextcloud-talk/src/channel.lifecycle.test.ts index 4198010b768..2c0cb17b39f 100644 --- a/extensions/nextcloud-talk/src/channel.lifecycle.test.ts +++ b/extensions/nextcloud-talk/src/channel.lifecycle.test.ts @@ -1,10 +1,10 @@ -import { afterEach, describe, expect, it, vi } from "vitest"; -import { createStartAccountContext } from "../../../test/helpers/plugins/start-account-context.js"; +import { createStartAccountContext } from "openclaw/plugin-sdk/channel-test-helpers"; import { expectStopPendingUntilAbort, startAccountAndTrackLifecycle, waitForStartedMocks, -} from "../../../test/helpers/plugins/start-account-lifecycle.js"; +} from "openclaw/plugin-sdk/channel-test-helpers"; +import { afterEach, describe, expect, it, vi } from "vitest"; import type { ResolvedNextcloudTalkAccount } from "./accounts.js"; const hoisted = vi.hoisted(() => ({ diff --git a/extensions/nextcloud-talk/src/send.cfg-threading.test.ts b/extensions/nextcloud-talk/src/send.cfg-threading.test.ts index 36b2603c1d4..bb2e9a4eb3c 100644 --- a/extensions/nextcloud-talk/src/send.cfg-threading.test.ts +++ b/extensions/nextcloud-talk/src/send.cfg-threading.test.ts @@ -1,8 +1,8 @@ -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { createSendCfgThreadingRuntime, expectProvidedCfgSkipsRuntimeLoad, -} from "../../../test/helpers/plugins/send-config.js"; +} from "openclaw/plugin-sdk/channel-test-helpers"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; const hoisted = vi.hoisted(() => ({ loadConfig: vi.fn(), diff --git a/extensions/nostr/src/channel.inbound.test.ts b/extensions/nostr/src/channel.inbound.test.ts index e22da53d019..0c5e2e329f6 100644 --- a/extensions/nostr/src/channel.inbound.test.ts +++ b/extensions/nostr/src/channel.inbound.test.ts @@ -1,5 +1,5 @@ +import { createStartAccountContext } from "openclaw/plugin-sdk/channel-test-helpers"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { createStartAccountContext } from "../../../test/helpers/plugins/start-account-context.js"; import type { PluginRuntime } from "../runtime-api.js"; import { startNostrGatewayAccount } from "./gateway.js"; import { setNostrRuntime } from "./runtime.js"; diff --git a/extensions/nostr/src/channel.outbound.test.ts b/extensions/nostr/src/channel.outbound.test.ts index 366776c0b13..84bcf22e31e 100644 --- a/extensions/nostr/src/channel.outbound.test.ts +++ b/extensions/nostr/src/channel.outbound.test.ts @@ -1,6 +1,6 @@ +import { createStartAccountContext } from "openclaw/plugin-sdk/channel-test-helpers"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { createStartAccountContext } from "../../../test/helpers/plugins/start-account-context.js"; import type { PluginRuntime } from "../runtime-api.js"; import { nostrOutboundAdapter, startNostrGatewayAccount } from "./gateway.js"; import { setNostrRuntime } from "./runtime.js"; diff --git a/extensions/ollama/plugin-registration.contract.test.ts b/extensions/ollama/plugin-registration.contract.test.ts index 942961ae389..9ac1b62a860 100644 --- a/extensions/ollama/plugin-registration.contract.test.ts +++ b/extensions/ollama/plugin-registration.contract.test.ts @@ -1,4 +1,4 @@ -import { describePluginRegistrationContract } from "../../test/helpers/plugins/plugin-registration-contract.js"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract({ pluginId: "ollama", diff --git a/extensions/openai/plugin-registration.contract.test.ts b/extensions/openai/plugin-registration.contract.test.ts index 7d6278974df..412177c1db4 100644 --- a/extensions/openai/plugin-registration.contract.test.ts +++ b/extensions/openai/plugin-registration.contract.test.ts @@ -1,5 +1,5 @@ -import { pluginRegistrationContractCases } from "../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract({ ...pluginRegistrationContractCases.openai, diff --git a/extensions/openai/provider-auth.contract.test.ts b/extensions/openai/provider-auth.contract.test.ts index 301068e9def..83c91587e3f 100644 --- a/extensions/openai/provider-auth.contract.test.ts +++ b/extensions/openai/provider-auth.contract.test.ts @@ -1,3 +1,3 @@ -import { describeOpenAICodexProviderAuthContract } from "../../test/helpers/plugins/provider-auth-contract.js"; +import { describeOpenAICodexProviderAuthContract } from "openclaw/plugin-sdk/provider-test-contracts"; describeOpenAICodexProviderAuthContract(() => import("./index.js")); diff --git a/extensions/openai/provider-runtime.contract.test.ts b/extensions/openai/provider-runtime.contract.test.ts index 8ec59b70973..35ea4cc5904 100644 --- a/extensions/openai/provider-runtime.contract.test.ts +++ b/extensions/openai/provider-runtime.contract.test.ts @@ -1,3 +1,3 @@ -import { describeOpenAIProviderRuntimeContract } from "../../test/helpers/plugins/provider-runtime-contract.js"; +import { describeOpenAIProviderRuntimeContract } from "openclaw/plugin-sdk/provider-test-contracts"; describeOpenAIProviderRuntimeContract(() => import("./index.js")); diff --git a/extensions/openai/test-support/provider-catalog.contract-test-support.ts b/extensions/openai/test-support/provider-catalog.contract-test-support.ts index f18bd495df5..5c0f082d795 100644 --- a/extensions/openai/test-support/provider-catalog.contract-test-support.ts +++ b/extensions/openai/test-support/provider-catalog.contract-test-support.ts @@ -1,5 +1,3 @@ -import { registerProviderPlugin, requireRegisteredProvider } from "openclaw/plugin-sdk/testing"; -import { beforeEach, describe, it, vi } from "vitest"; import { expectAugmentedCodexCatalog, expectedAugmentedOpenaiCodexCatalogEntriesWithGpt55, @@ -7,8 +5,10 @@ import { expectCodexMissingAuthHint, importProviderRuntimeCatalogModule, loadBundledPluginPublicSurface, -} from "../../../test/helpers/plugins/provider-catalog.js"; -import type { ProviderPlugin } from "../../../test/helpers/plugins/provider-catalog.js"; +} from "openclaw/plugin-sdk/provider-test-contracts"; +import type { ProviderPlugin } from "openclaw/plugin-sdk/provider-test-contracts"; +import { registerProviderPlugin, requireRegisteredProvider } from "openclaw/plugin-sdk/testing"; +import { beforeEach, describe, it, vi } from "vitest"; const PROVIDER_CATALOG_CONTRACT_TIMEOUT_MS = 300_000; diff --git a/extensions/opencode-go/onboard.test.ts b/extensions/opencode-go/onboard.test.ts index 99300b779e2..043c3b6debf 100644 --- a/extensions/opencode-go/onboard.test.ts +++ b/extensions/opencode-go/onboard.test.ts @@ -1,5 +1,5 @@ +import { expectProviderOnboardPrimaryAndFallbacks } from "openclaw/plugin-sdk/provider-test-contracts"; import { describe, expect, it } from "vitest"; -import { expectProviderOnboardPrimaryAndFallbacks } from "../../test/helpers/plugins/provider-onboard.js"; import { applyOpencodeGoConfig, applyOpencodeGoProviderConfig } from "./onboard.js"; const MODEL_REF = "opencode-go/kimi-k2.6"; diff --git a/extensions/opencode-go/plugin-registration.contract.test.ts b/extensions/opencode-go/plugin-registration.contract.test.ts index 27c21950c3f..6c11fa342f1 100644 --- a/extensions/opencode-go/plugin-registration.contract.test.ts +++ b/extensions/opencode-go/plugin-registration.contract.test.ts @@ -1,4 +1,4 @@ -import { describePluginRegistrationContract } from "../../test/helpers/plugins/plugin-registration-contract.js"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract({ pluginId: "opencode-go", diff --git a/extensions/opencode/onboard.test.ts b/extensions/opencode/onboard.test.ts index 9c0f85622e6..10a246d77c2 100644 --- a/extensions/opencode/onboard.test.ts +++ b/extensions/opencode/onboard.test.ts @@ -1,8 +1,8 @@ -import { describe, it } from "vitest"; import { expectProviderOnboardAllowlistAlias, expectProviderOnboardPrimaryAndFallbacks, -} from "../../test/helpers/plugins/provider-onboard.js"; +} from "openclaw/plugin-sdk/provider-test-contracts"; +import { describe, it } from "vitest"; import { applyOpencodeZenConfig, applyOpencodeZenProviderConfig } from "./onboard.js"; const MODEL_REF = "opencode/claude-opus-4-6"; diff --git a/extensions/opencode/plugin-registration.contract.test.ts b/extensions/opencode/plugin-registration.contract.test.ts index c3824f2b9a6..3f88098e88f 100644 --- a/extensions/opencode/plugin-registration.contract.test.ts +++ b/extensions/opencode/plugin-registration.contract.test.ts @@ -1,4 +1,4 @@ -import { describePluginRegistrationContract } from "../../test/helpers/plugins/plugin-registration-contract.js"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract({ pluginId: "opencode", diff --git a/extensions/openrouter/onboard.test.ts b/extensions/openrouter/onboard.test.ts index d1ba212c85a..3ad77156403 100644 --- a/extensions/openrouter/onboard.test.ts +++ b/extensions/openrouter/onboard.test.ts @@ -1,8 +1,8 @@ -import { describe, it } from "vitest"; import { expectProviderOnboardAllowlistAlias, expectProviderOnboardPrimaryAndFallbacks, -} from "../../test/helpers/plugins/provider-onboard.js"; +} from "openclaw/plugin-sdk/provider-test-contracts"; +import { describe, it } from "vitest"; import { applyOpenrouterConfig, applyOpenrouterProviderConfig, diff --git a/extensions/openrouter/provider-runtime.contract.test.ts b/extensions/openrouter/provider-runtime.contract.test.ts index dca90ed129f..bd196d62e17 100644 --- a/extensions/openrouter/provider-runtime.contract.test.ts +++ b/extensions/openrouter/provider-runtime.contract.test.ts @@ -1,3 +1,3 @@ -import { describeOpenRouterProviderRuntimeContract } from "../../test/helpers/plugins/provider-runtime-contract.js"; +import { describeOpenRouterProviderRuntimeContract } from "openclaw/plugin-sdk/provider-test-contracts"; describeOpenRouterProviderRuntimeContract(() => import("./index.js")); diff --git a/extensions/qa-channel/src/channel.test.ts b/extensions/qa-channel/src/channel.test.ts index 8eec6a51f37..d97c1c06217 100644 --- a/extensions/qa-channel/src/channel.test.ts +++ b/extensions/qa-channel/src/channel.test.ts @@ -1,3 +1,4 @@ +import { createStartAccountContext } from "openclaw/plugin-sdk/channel-test-helpers"; import type { PluginRuntime } from "openclaw/plugin-sdk/core"; import { createTestRegistry, @@ -6,7 +7,6 @@ import { } from "openclaw/plugin-sdk/testing"; import { extractToolPayload } from "openclaw/plugin-sdk/tool-payload"; import { afterEach, describe, expect, it } from "vitest"; -import { createStartAccountContext } from "../../../test/helpers/plugins/start-account-context.js"; import { createQaBusState, startQaBusServer } from "../../qa-lab/bus-api.js"; import { qaChannelPlugin, setQaChannelRuntime } from "../api.js"; diff --git a/extensions/qwen/plugin-registration.contract.test.ts b/extensions/qwen/plugin-registration.contract.test.ts index ea9c22da91b..7bb1ec634d6 100644 --- a/extensions/qwen/plugin-registration.contract.test.ts +++ b/extensions/qwen/plugin-registration.contract.test.ts @@ -1,4 +1,4 @@ -import { describePluginRegistrationContract } from "../../test/helpers/plugins/plugin-registration-contract.js"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract({ pluginId: "qwen", diff --git a/extensions/qwen/provider-discovery.contract.test.ts b/extensions/qwen/provider-discovery.contract.test.ts index ed017ec9799..b50a25c549d 100644 --- a/extensions/qwen/provider-discovery.contract.test.ts +++ b/extensions/qwen/provider-discovery.contract.test.ts @@ -1,3 +1,3 @@ -import { describeModelStudioProviderDiscoveryContract } from "../../test/helpers/plugins/provider-discovery-contract.js"; +import { describeModelStudioProviderDiscoveryContract } from "openclaw/plugin-sdk/provider-test-contracts"; describeModelStudioProviderDiscoveryContract(() => import("./index.js")); diff --git a/extensions/runway/plugin-registration.contract.test.ts b/extensions/runway/plugin-registration.contract.test.ts index 93cd97a0f73..32c08690275 100644 --- a/extensions/runway/plugin-registration.contract.test.ts +++ b/extensions/runway/plugin-registration.contract.test.ts @@ -1,4 +1,4 @@ -import { describePluginRegistrationContract } from "../../test/helpers/plugins/plugin-registration-contract.js"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract({ pluginId: "runway", diff --git a/extensions/sglang/provider-discovery.contract.test.ts b/extensions/sglang/provider-discovery.contract.test.ts index 3a5a6483764..e5ba54920af 100644 --- a/extensions/sglang/provider-discovery.contract.test.ts +++ b/extensions/sglang/provider-discovery.contract.test.ts @@ -1,5 +1,5 @@ import { fileURLToPath } from "node:url"; -import { describeSglangProviderDiscoveryContract } from "../../test/helpers/plugins/provider-discovery-contract.js"; +import { describeSglangProviderDiscoveryContract } from "openclaw/plugin-sdk/provider-test-contracts"; describeSglangProviderDiscoveryContract({ load: () => import("./index.js"), diff --git a/extensions/slack/src/outbound-delivery.test.ts b/extensions/slack/src/outbound-delivery.test.ts index 5c2d4f4f167..c894d7b7e3a 100644 --- a/extensions/slack/src/outbound-delivery.test.ts +++ b/extensions/slack/src/outbound-delivery.test.ts @@ -1,4 +1,3 @@ -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { addTestHook, createEmptyPluginRegistry, @@ -10,7 +9,8 @@ import { resetGlobalHookRunner, setActivePluginRegistry, type PluginHookRegistration, -} from "../../../test/helpers/plugins/outbound-delivery.js"; +} from "openclaw/plugin-sdk/channel-test-helpers"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { slackOutbound } from "./outbound-adapter.js"; import type { OpenClawConfig } from "./runtime-api.js"; diff --git a/extensions/synthetic/onboard.test.ts b/extensions/synthetic/onboard.test.ts index 0a2f67f900e..24bc334f885 100644 --- a/extensions/synthetic/onboard.test.ts +++ b/extensions/synthetic/onboard.test.ts @@ -1,8 +1,8 @@ -import { describe, expect, it } from "vitest"; import { expectProviderOnboardMergedLegacyConfig, expectProviderOnboardPrimaryModel, -} from "../../test/helpers/plugins/provider-onboard.js"; +} from "openclaw/plugin-sdk/provider-test-contracts"; +import { describe, expect, it } from "vitest"; import { SYNTHETIC_DEFAULT_MODEL_REF as SYNTHETIC_DEFAULT_MODEL_REF_PUBLIC } from "./api.js"; import { applySyntheticConfig, diff --git a/extensions/together/plugin-registration.contract.test.ts b/extensions/together/plugin-registration.contract.test.ts index 4d10bf93c19..077d5e060c6 100644 --- a/extensions/together/plugin-registration.contract.test.ts +++ b/extensions/together/plugin-registration.contract.test.ts @@ -1,4 +1,4 @@ -import { describePluginRegistrationContract } from "../../test/helpers/plugins/plugin-registration-contract.js"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract({ pluginId: "together", diff --git a/extensions/venice/provider-runtime.contract.test.ts b/extensions/venice/provider-runtime.contract.test.ts index f26769833c5..4937d4fc46f 100644 --- a/extensions/venice/provider-runtime.contract.test.ts +++ b/extensions/venice/provider-runtime.contract.test.ts @@ -1,3 +1,3 @@ -import { describeVeniceProviderRuntimeContract } from "../../test/helpers/plugins/provider-runtime-contract.js"; +import { describeVeniceProviderRuntimeContract } from "openclaw/plugin-sdk/provider-test-contracts"; describeVeniceProviderRuntimeContract(() => import("./index.js")); diff --git a/extensions/vydra/plugin-registration.contract.test.ts b/extensions/vydra/plugin-registration.contract.test.ts index 03662d5e7dd..c596c458cb7 100644 --- a/extensions/vydra/plugin-registration.contract.test.ts +++ b/extensions/vydra/plugin-registration.contract.test.ts @@ -1,4 +1,4 @@ -import { describePluginRegistrationContract } from "../../test/helpers/plugins/plugin-registration-contract.js"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract({ pluginId: "vydra", diff --git a/extensions/whatsapp/src/directory-config.test.ts b/extensions/whatsapp/src/directory-config.test.ts index f54a9b425d8..030e91802bd 100644 --- a/extensions/whatsapp/src/directory-config.test.ts +++ b/extensions/whatsapp/src/directory-config.test.ts @@ -1,5 +1,5 @@ +import { createDirectoryTestRuntime } from "openclaw/plugin-sdk/channel-test-helpers"; import { describe, expect, it } from "vitest"; -import { createDirectoryTestRuntime } from "../../../test/helpers/plugins/directory.ts"; import { listWhatsAppDirectoryGroupsFromConfig, listWhatsAppDirectoryPeersFromConfig, diff --git a/extensions/xai/onboard.test.ts b/extensions/xai/onboard.test.ts index 769ed6ef6ef..0142b28818e 100644 --- a/extensions/xai/onboard.test.ts +++ b/extensions/xai/onboard.test.ts @@ -2,12 +2,12 @@ import { resolveAgentModelFallbackValues, resolveAgentModelPrimaryValue, } from "openclaw/plugin-sdk/provider-onboard"; -import { describe, expect, it } from "vitest"; import { createConfigWithFallbacks, createLegacyProviderConfig, EXPECTED_FALLBACKS, -} from "../../test/helpers/plugins/onboard-config.js"; +} from "openclaw/plugin-sdk/provider-test-contracts"; +import { describe, expect, it } from "vitest"; import { applyXaiConfig, applyXaiProviderConfig, XAI_DEFAULT_MODEL_REF } from "./onboard.js"; describe("xai onboard", () => { diff --git a/extensions/xai/plugin-registration.contract.test.ts b/extensions/xai/plugin-registration.contract.test.ts index bf97b7f035f..a5b160f3eda 100644 --- a/extensions/xai/plugin-registration.contract.test.ts +++ b/extensions/xai/plugin-registration.contract.test.ts @@ -1,4 +1,4 @@ -import { describePluginRegistrationContract } from "../../test/helpers/plugins/plugin-registration-contract.js"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract({ pluginId: "xai", diff --git a/extensions/xiaomi/onboard.test.ts b/extensions/xiaomi/onboard.test.ts index 12d5e1183ea..d98d0408027 100644 --- a/extensions/xiaomi/onboard.test.ts +++ b/extensions/xiaomi/onboard.test.ts @@ -1,8 +1,8 @@ -import { describe, expect, it } from "vitest"; import { expectProviderOnboardMergedLegacyConfig, expectProviderOnboardPrimaryModel, -} from "../../test/helpers/plugins/provider-onboard.js"; +} from "openclaw/plugin-sdk/provider-test-contracts"; +import { describe, expect, it } from "vitest"; import { applyXiaomiConfig, applyXiaomiProviderConfig } from "./onboard.js"; describe("xiaomi onboard", () => { diff --git a/extensions/zai/onboard.test.ts b/extensions/zai/onboard.test.ts index 5318de99b28..3a97ed519f1 100644 --- a/extensions/zai/onboard.test.ts +++ b/extensions/zai/onboard.test.ts @@ -1,6 +1,6 @@ import { resolveAgentModelPrimaryValue } from "openclaw/plugin-sdk/provider-onboard"; +import { expectProviderOnboardPreservesPrimary } from "openclaw/plugin-sdk/provider-test-contracts"; import { describe, expect, it } from "vitest"; -import { expectProviderOnboardPreservesPrimary } from "../../test/helpers/plugins/provider-onboard.js"; import { ZAI_CODING_CN_BASE_URL, ZAI_GLOBAL_BASE_URL } from "./model-definitions.js"; import { applyZaiConfig, applyZaiProviderConfig } from "./onboard.js"; diff --git a/extensions/zai/provider-runtime.contract.test.ts b/extensions/zai/provider-runtime.contract.test.ts index f6830b26605..affb527cb35 100644 --- a/extensions/zai/provider-runtime.contract.test.ts +++ b/extensions/zai/provider-runtime.contract.test.ts @@ -1,3 +1,3 @@ -import { describeZAIProviderRuntimeContract } from "../../test/helpers/plugins/provider-runtime-contract.js"; +import { describeZAIProviderRuntimeContract } from "openclaw/plugin-sdk/provider-test-contracts"; describeZAIProviderRuntimeContract(() => import("./index.js")); diff --git a/extensions/zalo/runtime-api.test.ts b/extensions/zalo/runtime-api.test.ts index 813b229a3a1..ccbeb17c5ec 100644 --- a/extensions/zalo/runtime-api.test.ts +++ b/extensions/zalo/runtime-api.test.ts @@ -1,6 +1,6 @@ import path from "node:path"; +import { loadRuntimeApiExportTypesViaJiti } from "openclaw/plugin-sdk/plugin-test-contracts"; import { describe, expect, it } from "vitest"; -import { loadRuntimeApiExportTypesViaJiti } from "../../test/helpers/plugins/jiti-runtime-api.js"; describe("zalo runtime api", () => { it("loads the narrow runtime api without reentering setup surfaces", () => { diff --git a/extensions/zalo/src/channel.directory.test.ts b/extensions/zalo/src/channel.directory.test.ts index c461a350813..9fe160e0051 100644 --- a/extensions/zalo/src/channel.directory.test.ts +++ b/extensions/zalo/src/channel.directory.test.ts @@ -1,8 +1,8 @@ -import { describe, expect, it } from "vitest"; import { createDirectoryTestRuntime, expectDirectorySurface, -} from "../../../test/helpers/plugins/directory.js"; +} from "openclaw/plugin-sdk/channel-test-helpers"; +import { describe, expect, it } from "vitest"; import type { OpenClawConfig, RuntimeEnv } from "../runtime-api.js"; import { zaloPlugin } from "./channel.js"; diff --git a/extensions/zalo/src/channel.startup.test.ts b/extensions/zalo/src/channel.startup.test.ts index 0e3cf07e979..11070a51343 100644 --- a/extensions/zalo/src/channel.startup.test.ts +++ b/extensions/zalo/src/channel.startup.test.ts @@ -1,10 +1,10 @@ -import { afterEach, describe, expect, it, vi } from "vitest"; import { expectLifecyclePatch, expectPendingUntilAbort, startAccountAndTrackLifecycle, waitForStartedMocks, -} from "../../../test/helpers/plugins/start-account-lifecycle.js"; +} from "openclaw/plugin-sdk/channel-test-helpers"; +import { afterEach, describe, expect, it, vi } from "vitest"; import type { ResolvedZaloAccount } from "./accounts.js"; const hoisted = vi.hoisted(() => ({ diff --git a/extensions/zalo/src/status-issues.test.ts b/extensions/zalo/src/status-issues.test.ts index f89d1720266..77a8e1680e2 100644 --- a/extensions/zalo/src/status-issues.test.ts +++ b/extensions/zalo/src/status-issues.test.ts @@ -1,5 +1,5 @@ +import { expectOpenDmPolicyConfigIssue } from "openclaw/plugin-sdk/channel-test-helpers"; import { describe, it } from "vitest"; -import { expectOpenDmPolicyConfigIssue } from "../../../test/helpers/plugins/status-issues.js"; import { collectZaloStatusIssues } from "./status-issues.js"; describe("collectZaloStatusIssues", () => { diff --git a/extensions/zalo/test-support/monitor-mocks-test-support.ts b/extensions/zalo/test-support/monitor-mocks-test-support.ts index 4c91d5c3546..b8f5c5bcc95 100644 --- a/extensions/zalo/test-support/monitor-mocks-test-support.ts +++ b/extensions/zalo/test-support/monitor-mocks-test-support.ts @@ -1,10 +1,10 @@ +import { createPluginRuntimeMock } from "openclaw/plugin-sdk/channel-test-helpers"; import { createEmptyPluginRegistry, createRuntimeEnv, setActivePluginRegistry, } from "openclaw/plugin-sdk/testing"; import { vi, type Mock } from "vitest"; -import { createPluginRuntimeMock } from "../../../test/helpers/plugins/plugin-runtime-mock.js"; import type { OpenClawConfig } from "../runtime-api.js"; import type { ResolvedZaloAccount } from "../src/types.js"; diff --git a/extensions/zalouser/src/status-issues.test.ts b/extensions/zalouser/src/status-issues.test.ts index 1b948e1fdf5..d85cc5b3131 100644 --- a/extensions/zalouser/src/status-issues.test.ts +++ b/extensions/zalouser/src/status-issues.test.ts @@ -1,5 +1,5 @@ +import { expectOpenDmPolicyConfigIssue } from "openclaw/plugin-sdk/channel-test-helpers"; import { describe, expect, it } from "vitest"; -import { expectOpenDmPolicyConfigIssue } from "../../../test/helpers/plugins/status-issues.js"; import { collectZalouserStatusIssues } from "./status-issues.js"; describe("collectZalouserStatusIssues", () => { diff --git a/package.json b/package.json index e734a806536..59af27d7ab6 100644 --- a/package.json +++ b/package.json @@ -502,10 +502,22 @@ "types": "./dist/plugin-sdk/lazy-runtime.d.ts", "default": "./dist/plugin-sdk/lazy-runtime.js" }, + "./plugin-sdk/channel-test-helpers": { + "types": "./dist/plugin-sdk/channel-test-helpers.d.ts", + "default": "./dist/plugin-sdk/channel-test-helpers.js" + }, "./plugin-sdk/plugin-test-api": { "types": "./dist/plugin-sdk/plugin-test-api.d.ts", "default": "./dist/plugin-sdk/plugin-test-api.js" }, + "./plugin-sdk/plugin-test-contracts": { + "types": "./dist/plugin-sdk/plugin-test-contracts.d.ts", + "default": "./dist/plugin-sdk/plugin-test-contracts.js" + }, + "./plugin-sdk/provider-test-contracts": { + "types": "./dist/plugin-sdk/provider-test-contracts.d.ts", + "default": "./dist/plugin-sdk/provider-test-contracts.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 75c49613084..6a1b2c3ffde 100644 --- a/scripts/check-no-extension-test-core-imports.ts +++ b/scripts/check-no-extension-test-core-imports.ts @@ -19,15 +19,19 @@ const FORBIDDEN_PATTERNS: Array<{ pattern: RegExp; hint: string }> = [ }, { pattern: /["'](?:\.\.\/)+(?:test-utils\/)[^"']+["']/, - hint: "Use test/helpers/plugins/* for repo-only bundled extension test helpers.", + hint: "Use a documented openclaw/plugin-sdk test subpath for bundled extension test helpers.", + }, + { + pattern: /["'](?:\.\.\/)+(?:test\/helpers\/plugins\/)[^"']+["']/, + hint: "Use a documented openclaw/plugin-sdk test subpath instead of repo-only plugin helper bridges.", }, { pattern: /["'](?:\.\.\/)+(?:src\/test-utils\/)[^"']+["']/, - hint: "Use test/helpers/plugins/* for repo-only helpers, or openclaw/plugin-sdk/testing for public surfaces.", + hint: "Use a documented openclaw/plugin-sdk test subpath for public surfaces.", }, { pattern: /["'](?:\.\.\/)+(?:src\/plugins\/types\.js)["']/, - hint: "Use public plugin-sdk/core types or test/helpers/plugins/* instead.", + hint: "Use public plugin-sdk/core types or documented plugin-sdk test helpers instead.", }, { pattern: /["'](?:\.\.\/)+(?:src\/channels\/plugins\/contracts\/test-helpers\.js)["']/, @@ -49,17 +53,46 @@ const RETIRED_EXTENSION_TEST_HELPER_BRIDGE_FILES = [ "test/helpers/plugins/frozen-time.ts", "test/helpers/plugins/media-understanding.ts", "test/helpers/plugins/mock-http-response.ts", + "test/helpers/plugins/contracts-testkit.ts", + "test/helpers/plugins/direct-smoke.ts", + "test/helpers/plugins/directory.ts", + "test/helpers/plugins/jiti-runtime-api.ts", + "test/helpers/plugins/onboard-config.ts", + "test/helpers/plugins/outbound-delivery.ts", + "test/helpers/plugins/package-manifest-contract.ts", "test/helpers/plugins/plugin-api.ts", + "test/helpers/plugins/plugin-registration-contract-cases.ts", + "test/helpers/plugins/plugin-registration-contract.ts", "test/helpers/plugins/plugin-registration.ts", + "test/helpers/plugins/plugin-runtime-mock.ts", "test/helpers/plugins/plugin-registry.ts", + "test/helpers/plugins/provider-auth-contract.ts", + "test/helpers/plugins/provider-catalog.ts", + "test/helpers/plugins/provider-contract-suites.ts", + "test/helpers/plugins/provider-contract.ts", + "test/helpers/plugins/provider-discovery-contract.ts", + "test/helpers/plugins/provider-onboard.ts", "test/helpers/plugins/provider-registration.ts", + "test/helpers/plugins/provider-runtime-contract.ts", "test/helpers/plugins/provider-usage-fetch.ts", + "test/helpers/plugins/provider-wizard-contract-suites.ts", + "test/helpers/plugins/public-artifacts.ts", + "test/helpers/plugins/public-surface-loader.ts", "test/helpers/plugins/runtime-taskflow.ts", "test/helpers/plugins/runtime-env.ts", + "test/helpers/plugins/send-config.ts", "test/helpers/plugins/setup-wizard.ts", + "test/helpers/plugins/start-account-context.ts", + "test/helpers/plugins/start-account-lifecycle.ts", + "test/helpers/plugins/status-issues.ts", + "test/helpers/plugins/stream-hooks.ts", + "test/helpers/plugins/subagent-hooks.ts", "test/helpers/plugins/temp-dir.ts", "test/helpers/plugins/temp-home.ts", + "test/helpers/plugins/tts-contract-suites.ts", "test/helpers/plugins/typed-cases.ts", + "test/helpers/plugins/web-fetch-provider-contract.ts", + "test/helpers/plugins/web-search-provider-contract.ts", ]; function isExtensionTestFile(filePath: string): boolean { diff --git a/scripts/ci-changed-scope.mjs b/scripts/ci-changed-scope.mjs index f5e9a77a0ba..ab04bebca37 100644 --- a/scripts/ci-changed-scope.mjs +++ b/scripts/ci-changed-scope.mjs @@ -51,7 +51,7 @@ const FULL_INSTALL_SMOKE_SCOPE_RE = /^(Dockerfile$|\.npmrc$|package\.json$|pnpm-lock\.yaml$|pnpm-workspace\.yaml$|scripts\/ci-changed-scope\.mjs$|scripts\/install\.sh$|scripts\/test-install-sh-docker\.sh$|scripts\/docker\/|scripts\/e2e\/(?:Dockerfile(?:\.qr-import)?|qr-import-docker\.sh|bun-global-install-smoke\.sh)$|\.github\/workflows\/install-smoke\.yml$|\.github\/actions\/setup-node-env\/action\.yml$)/; const FAST_INSTALL_SMOKE_RUNTIME_SCOPE_RE = /^src\/(?:channels|gateway|plugin-sdk|plugins)\//; const NODE_FAST_PLUGIN_CONTRACT_SCOPE_RE = - /^(src\/plugins\/contracts\/(?:inventory\/bundled-capability-metadata|registry)\.ts$|test\/helpers\/plugins\/tts-contract-suites\.ts$|scripts\/test-projects(?:\.test-support)?\.mjs$|test\/scripts\/test-projects\.test\.ts$)/; + /^(src\/plugins\/contracts\/(?:inventory\/bundled-capability-metadata|registry|tts-contract-suites)\.ts$|scripts\/test-projects(?:\.test-support)?\.mjs$|test\/scripts\/test-projects\.test\.ts$)/; const NODE_FAST_CI_ROUTING_SCOPE_RE = /^(scripts\/ci-changed-scope\.mjs$|src\/commands\/status\.scan-result\.test\.ts$|src\/scripts\/ci-changed-scope\.test\.ts$|\.github\/workflows\/ci\.yml$)/; const NODE_FAST_SCOPE_RE = new RegExp( diff --git a/scripts/lib/plugin-sdk-doc-metadata.ts b/scripts/lib/plugin-sdk-doc-metadata.ts index 7a9c167c838..a2aa593f65b 100644 --- a/scripts/lib/plugin-sdk-doc-metadata.ts +++ b/scripts/lib/plugin-sdk-doc-metadata.ts @@ -41,6 +41,12 @@ export const pluginSdkDocMetadata = { "plugin-entry": { category: "core", }, + "plugin-test-api": { + category: "utilities", + }, + "plugin-test-contracts": { + category: "utilities", + }, "channel-actions": { category: "channel", }, @@ -53,6 +59,9 @@ export const pluginSdkDocMetadata = { "channel-contract": { category: "channel", }, + "channel-contract-testing": { + category: "channel", + }, "channel-pairing": { category: "channel", }, @@ -98,6 +107,12 @@ export const pluginSdkDocMetadata = { testing: { category: "utilities", }, + "channel-test-helpers": { + category: "utilities", + }, + "provider-test-contracts": { + 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 dc6fbe8366e..c04c6066f42 100644 --- a/scripts/lib/plugin-sdk-entrypoints.json +++ b/scripts/lib/plugin-sdk-entrypoints.json @@ -109,7 +109,10 @@ "acp-binding-runtime", "acp-binding-resolve-runtime", "lazy-runtime", + "channel-test-helpers", "plugin-test-api", + "plugin-test-contracts", + "provider-test-contracts", "testing", "temp-path", "logging-core", diff --git a/scripts/test-projects.test-support.mjs b/scripts/test-projects.test-support.mjs index 4421c3e3f56..d1f2b0804c2 100644 --- a/scripts/test-projects.test-support.mjs +++ b/scripts/test-projects.test-support.mjs @@ -219,7 +219,7 @@ const BROAD_CHANGED_FALLBACK_PATTERNS = [ ]; const PRECISE_SOURCE_TEST_TARGETS = new Map([ [ - "test/helpers/plugins/tts-contract-suites.ts", + "src/plugins/contracts/tts-contract-suites.ts", [ "src/plugins/contracts/core-extension-facade-boundary.test.ts", "src/plugins/contracts/tts.contract.test.ts", diff --git a/src/channels/plugins/contracts/channel-import-guardrails.test.ts b/src/channels/plugins/contracts/channel-import-guardrails.test.ts index d6147b8c69c..a96407b7746 100644 --- a/src/channels/plugins/contracts/channel-import-guardrails.test.ts +++ b/src/channels/plugins/contracts/channel-import-guardrails.test.ts @@ -1,9 +1,9 @@ import { readdirSync, readFileSync } from "node:fs"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; +import { GUARDED_EXTENSION_PUBLIC_SURFACE_BASENAMES } from "openclaw/plugin-sdk/plugin-test-contracts"; import { describe, expect, it } from "vitest"; import { classifyBundledExtensionSourcePath } from "../../../../scripts/lib/extension-source-classifier.mjs"; -import { GUARDED_EXTENSION_PUBLIC_SURFACE_BASENAMES } from "../../../../test/helpers/plugins/public-artifacts.js"; import { loadPluginManifestRegistry } from "../../../plugins/manifest-registry.js"; const ROOT_DIR = resolve(dirname(fileURLToPath(import.meta.url)), "../../.."); diff --git a/src/plugin-sdk/channel-test-helpers.ts b/src/plugin-sdk/channel-test-helpers.ts new file mode 100644 index 00000000000..4b2d52aace4 --- /dev/null +++ b/src/plugin-sdk/channel-test-helpers.ts @@ -0,0 +1,33 @@ +export { createDirectoryTestRuntime, expectDirectorySurface } from "./test-helpers/directory.js"; +export { + addTestHook, + createEmptyPluginRegistry, + createOutboundTestPlugin, + createTestRegistry, + deliverOutboundPayloads, + initializeGlobalHookRunner, + releasePinnedPluginChannelRegistry, + resetGlobalHookRunner, + setActivePluginRegistry, + type PluginHookRegistration, +} from "./test-helpers/outbound-delivery.js"; +export { createPluginRuntimeMock } from "./test-helpers/plugin-runtime-mock.js"; +export { + createSendCfgThreadingRuntime, + expectProvidedCfgSkipsRuntimeLoad, + expectRuntimeCfgFallback, +} from "./test-helpers/send-config.js"; +export { createStartAccountContext } from "./test-helpers/start-account-context.js"; +export { + abortStartedAccount, + expectLifecyclePatch, + expectPendingUntilAbort, + expectStopPendingUntilAbort, + startAccountAndTrackLifecycle, + waitForStartedMocks, +} from "./test-helpers/start-account-lifecycle.js"; +export { expectOpenDmPolicyConfigIssue } from "./test-helpers/status-issues.js"; +export { + getRequiredHookHandler, + registerHookHandlersForTest, +} from "./test-helpers/subagent-hooks.js"; diff --git a/src/plugin-sdk/plugin-test-contracts.ts b/src/plugin-sdk/plugin-test-contracts.ts new file mode 100644 index 00000000000..7e8c8ee49c3 --- /dev/null +++ b/src/plugin-sdk/plugin-test-contracts.ts @@ -0,0 +1,24 @@ +export { + assertNoImportTimeSideEffects, + createPluginRegistryFixture, + registerProviders, + registerTestPlugin, + registerVirtualTestPlugin, + requireProvider, + uniqueSortedStrings, +} from "./test-helpers/contracts-testkit.js"; +export { runDirectImportSmoke } from "./test-helpers/direct-smoke.js"; +export { loadRuntimeApiExportTypesViaJiti } from "./test-helpers/jiti-runtime-api.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"; +export { + GUARDED_EXTENSION_PUBLIC_SURFACE_BASENAMES, + BUNDLED_RUNTIME_SIDECAR_BASENAMES, + getPublicArtifactBasename, +} from "./test-helpers/public-artifacts.js"; +export { + loadBundledPluginPublicSurface, + loadBundledPluginPublicSurfaceSync, + resolveWorkspacePackagePublicModuleUrl, +} from "./test-helpers/public-surface-loader.js"; diff --git a/src/plugin-sdk/provider-test-contracts.ts b/src/plugin-sdk/provider-test-contracts.ts new file mode 100644 index 00000000000..0d9634eaec9 --- /dev/null +++ b/src/plugin-sdk/provider-test-contracts.ts @@ -0,0 +1,60 @@ +export { + describeGithubCopilotProviderAuthContract, + describeOpenAICodexProviderAuthContract, + type ProviderAuthContractPluginLoader, +} from "./test-helpers/provider-auth-contract.js"; +export { + expectAugmentedCodexCatalog, + expectedAugmentedOpenaiCodexCatalogEntriesWithGpt55, + expectCodexBuiltInSuppression, + expectCodexMissingAuthHint, + importProviderRuntimeCatalogModule, + loadBundledPluginPublicSurface, + loadBundledPluginPublicSurfaceSync, + type ProviderPlugin, +} from "./test-helpers/provider-catalog.js"; +export { describeProviderContracts } from "./test-helpers/provider-contract.js"; +export { + installProviderPluginContractSuite, + installWebFetchProviderContractSuite, + installWebSearchProviderContractSuite, +} from "./test-helpers/provider-contract-suites.js"; +export { + describeCloudflareAiGatewayProviderDiscoveryContract, + describeGithubCopilotProviderDiscoveryContract, + describeMinimaxProviderDiscoveryContract, + describeModelStudioProviderDiscoveryContract, + describeSglangProviderDiscoveryContract, + describeVllmProviderDiscoveryContract, + type ProviderDiscoveryContractPluginLoader, +} from "./test-helpers/provider-discovery-contract.js"; +export { + EXPECTED_FALLBACKS, + createConfigWithFallbacks, + createLegacyProviderConfig, +} from "./test-helpers/onboard-config.js"; +export { + expectProviderOnboardAllowlistAlias, + expectProviderOnboardMergedLegacyConfig, + expectProviderOnboardPreservesPrimary, + expectProviderOnboardPrimaryAndFallbacks, + expectProviderOnboardPrimaryModel, +} from "./test-helpers/provider-onboard.js"; +export { + describeAnthropicProviderRuntimeContract, + describeGithubCopilotProviderRuntimeContract, + describeGoogleProviderRuntimeContract, + describeOpenAIProviderRuntimeContract, + describeOpenRouterProviderRuntimeContract, + describeVeniceProviderRuntimeContract, + describeZAIProviderRuntimeContract, + type ProviderRuntimeContractPluginLoader, +} from "./test-helpers/provider-runtime-contract.js"; +export { + describeProviderWizardChoiceResolutionContract, + describeProviderWizardModelPickerContract, + describeProviderWizardSetupOptionsContract, +} from "./test-helpers/provider-wizard-contract-suites.js"; +export { createCapturedThinkingConfigStream } from "./test-helpers/stream-hooks.js"; +export { describeWebFetchProviderContracts } from "./test-helpers/web-fetch-provider-contract.js"; +export { describeWebSearchProviderContracts } from "./test-helpers/web-search-provider-contract.js"; diff --git a/test/helpers/plugins/contracts-testkit.ts b/src/plugin-sdk/test-helpers/contracts-testkit.ts similarity index 96% rename from test/helpers/plugins/contracts-testkit.ts rename to src/plugin-sdk/test-helpers/contracts-testkit.ts index 1f94dcf5d9a..1569ad900eb 100644 --- a/test/helpers/plugins/contracts-testkit.ts +++ b/src/plugin-sdk/test-helpers/contracts-testkit.ts @@ -1,4 +1,4 @@ -import type { OpenClawPluginApi } from "openclaw/plugin-sdk/plugin-entry"; +import type { OpenClawPluginApi } from "../plugin-entry.js"; import { createPluginRecord, createPluginRegistry, @@ -7,7 +7,7 @@ import { type OpenClawConfig, type PluginRecord, type PluginRuntime, -} from "openclaw/plugin-sdk/testing"; +} from "../testing.js"; export { registerProviders, requireProvider }; diff --git a/test/helpers/plugins/direct-smoke.ts b/src/plugin-sdk/test-helpers/direct-smoke.ts similarity index 100% rename from test/helpers/plugins/direct-smoke.ts rename to src/plugin-sdk/test-helpers/direct-smoke.ts diff --git a/test/helpers/plugins/directory.ts b/src/plugin-sdk/test-helpers/directory.ts similarity index 90% rename from test/helpers/plugins/directory.ts rename to src/plugin-sdk/test-helpers/directory.ts index be97fa8d842..b3bf1df1530 100644 --- a/test/helpers/plugins/directory.ts +++ b/src/plugin-sdk/test-helpers/directory.ts @@ -1,4 +1,4 @@ -import type { ChannelDirectoryAdapter } from "openclaw/plugin-sdk/channel-contract"; +import type { ChannelDirectoryAdapter } from "../channel-contract.js"; type DirectorySurface = { listPeers: NonNullable; diff --git a/test/helpers/plugins/jiti-runtime-api.ts b/src/plugin-sdk/test-helpers/jiti-runtime-api.ts similarity index 100% rename from test/helpers/plugins/jiti-runtime-api.ts rename to src/plugin-sdk/test-helpers/jiti-runtime-api.ts diff --git a/test/helpers/plugins/onboard-config.ts b/src/plugin-sdk/test-helpers/onboard-config.ts similarity index 88% rename from test/helpers/plugins/onboard-config.ts rename to src/plugin-sdk/test-helpers/onboard-config.ts index 15516776e2d..3dbaef731fc 100644 --- a/test/helpers/plugins/onboard-config.ts +++ b/src/plugin-sdk/test-helpers/onboard-config.ts @@ -1,5 +1,5 @@ -import type { ModelApi } from "openclaw/plugin-sdk/provider-model-shared"; -import type { OpenClawConfig } from "openclaw/plugin-sdk/testing"; +import type { ModelApi } from "../provider-model-shared.js"; +import type { OpenClawConfig } from "../testing.js"; export const EXPECTED_FALLBACKS = ["anthropic/claude-opus-4-5"] as const; diff --git a/test/helpers/plugins/outbound-delivery.ts b/src/plugin-sdk/test-helpers/outbound-delivery.ts similarity index 88% rename from test/helpers/plugins/outbound-delivery.ts rename to src/plugin-sdk/test-helpers/outbound-delivery.ts index 38fa4f1cfcd..5ea9fa98825 100644 --- a/test/helpers/plugins/outbound-delivery.ts +++ b/src/plugin-sdk/test-helpers/outbound-delivery.ts @@ -9,4 +9,4 @@ export { resetGlobalHookRunner, setActivePluginRegistry, type PluginHookRegistration, -} from "openclaw/plugin-sdk/testing"; +} from "../testing.js"; diff --git a/test/helpers/plugins/package-manifest-contract.ts b/src/plugin-sdk/test-helpers/package-manifest-contract.ts similarity index 94% rename from test/helpers/plugins/package-manifest-contract.ts rename to src/plugin-sdk/test-helpers/package-manifest-contract.ts index fd5d01eccc8..b4d937df01d 100644 --- a/test/helpers/plugins/package-manifest-contract.ts +++ b/src/plugin-sdk/test-helpers/package-manifest-contract.ts @@ -1,12 +1,7 @@ import fs from "node:fs"; import path from "node:path"; -import { - isAtLeast, - parseMinHostVersionRequirement, - parseSemver, -} from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; -import { bundledPluginFile } from "../bundled-plugin-paths.js"; +import { isAtLeast, parseMinHostVersionRequirement, parseSemver } from "../testing.js"; type PackageManifest = { dependencies?: Record; @@ -31,6 +26,10 @@ function readJson(relativePath: string): T { return JSON.parse(fs.readFileSync(absolutePath, "utf8")) as T; } +function bundledPluginFile(pluginId: string, relativePath: string): string { + return `extensions/${pluginId}/${relativePath}`; +} + export function describePackageManifestContract(params: PackageManifestContractParams) { const packagePath = bundledPluginFile(params.pluginId, "package.json"); diff --git a/test/helpers/plugins/plugin-registration-contract-cases.ts b/src/plugin-sdk/test-helpers/plugin-registration-contract-cases.ts similarity index 100% rename from test/helpers/plugins/plugin-registration-contract-cases.ts rename to src/plugin-sdk/test-helpers/plugin-registration-contract-cases.ts diff --git a/test/helpers/plugins/plugin-registration-contract.ts b/src/plugin-sdk/test-helpers/plugin-registration-contract.ts similarity index 97% rename from test/helpers/plugins/plugin-registration-contract.ts rename to src/plugin-sdk/test-helpers/plugin-registration-contract.ts index 6238d15de20..98ccf111244 100644 --- a/test/helpers/plugins/plugin-registration-contract.ts +++ b/src/plugin-sdk/test-helpers/plugin-registration-contract.ts @@ -1,8 +1,5 @@ -import { - loadPluginManifestRegistry, - pluginRegistrationContractRegistry, -} from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; +import { loadPluginManifestRegistry, pluginRegistrationContractRegistry } from "../testing.js"; type PluginRegistrationContractParams = { pluginId: string; diff --git a/test/helpers/plugins/plugin-runtime-mock.ts b/src/plugin-sdk/test-helpers/plugin-runtime-mock.ts similarity index 99% rename from test/helpers/plugins/plugin-runtime-mock.ts rename to src/plugin-sdk/test-helpers/plugin-runtime-mock.ts index 660f3d27a7f..636486eccc4 100644 --- a/test/helpers/plugins/plugin-runtime-mock.ts +++ b/src/plugin-sdk/test-helpers/plugin-runtime-mock.ts @@ -1,15 +1,15 @@ +import { vi } from "vitest"; import { implicitMentionKindWhen, resolveInboundMentionDecision, -} from "openclaw/plugin-sdk/channel-mention-gating"; +} from "../channel-mention-gating.js"; import { createAckReactionHandle, removeAckReactionAfterReply, removeAckReactionHandleAfterReply, shouldAckReaction, -} from "openclaw/plugin-sdk/testing"; -import type { PluginRuntime } from "openclaw/plugin-sdk/testing"; -import { vi } from "vitest"; +} from "../testing.js"; +import type { PluginRuntime } from "../testing.js"; const DEFAULT_PROVIDER = "openai"; const DEFAULT_MODEL = "gpt-5.5"; diff --git a/test/helpers/plugins/provider-auth-contract.ts b/src/plugin-sdk/test-helpers/provider-auth-contract.ts similarity index 92% rename from test/helpers/plugins/provider-auth-contract.ts rename to src/plugin-sdk/test-helpers/provider-auth-contract.ts index e8e33499c6d..e1c79b8a10f 100644 --- a/test/helpers/plugins/provider-auth-contract.ts +++ b/src/plugin-sdk/test-helpers/provider-auth-contract.ts @@ -1,15 +1,12 @@ -import { - clearRuntimeAuthProfileStoreSnapshots, - type AuthProfileStore, -} from "openclaw/plugin-sdk/agent-runtime"; -import { createNonExitingRuntime } from "openclaw/plugin-sdk/runtime"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { clearRuntimeAuthProfileStoreSnapshots, type AuthProfileStore } from "../agent-runtime.js"; +import { createNonExitingRuntime } from "../runtime.js"; import type { WizardMultiSelectParams, WizardPrompter, WizardProgress, WizardSelectParams, -} from "openclaw/plugin-sdk/setup"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +} from "../setup.js"; import { registerProviders, requireProvider } from "./contracts-testkit.js"; type LoginOpenAICodexOAuth = @@ -30,28 +27,6 @@ export type ProviderAuthContractPluginLoader = () => Promise<{ default: Parameters[0]; }>; -vi.mock("openclaw/plugin-sdk/provider-auth-login", async () => { - const actual = await vi.importActual( - "openclaw/plugin-sdk/provider-auth-login", - ); - return { - ...actual, - loginOpenAICodexOAuth: loginOpenAICodexOAuthMock, - githubCopilotLoginCommand: githubCopilotLoginCommandMock, - }; -}); - -vi.mock("openclaw/plugin-sdk/provider-auth", async () => { - const actual = await vi.importActual( - "openclaw/plugin-sdk/provider-auth", - ); - return { - ...actual, - ensureAuthProfileStore: ensureAuthProfileStoreMock, - listProfilesForProvider: listProfilesForProviderMock, - }; -}); - function buildPrompter(): WizardPrompter { const progress: WizardProgress = { update() {}, @@ -131,6 +106,26 @@ function buildOpenAICodexOAuthResult(params: { function installSharedAuthProfileStoreHooks(state: { authStore: AuthProfileStore }) { beforeEach(() => { + vi.doMock("openclaw/plugin-sdk/provider-auth-login", async () => { + const actual = await vi.importActual< + typeof import("openclaw/plugin-sdk/provider-auth-login") + >("openclaw/plugin-sdk/provider-auth-login"); + return { + ...actual, + loginOpenAICodexOAuth: loginOpenAICodexOAuthMock, + githubCopilotLoginCommand: githubCopilotLoginCommandMock, + }; + }); + vi.doMock("openclaw/plugin-sdk/provider-auth", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/provider-auth", + ); + return { + ...actual, + ensureAuthProfileStore: ensureAuthProfileStoreMock, + listProfilesForProvider: listProfilesForProviderMock, + }; + }); state.authStore = { version: 1, profiles: {} }; ensureAuthProfileStoreMock.mockReset(); ensureAuthProfileStoreMock.mockImplementation(() => state.authStore); diff --git a/test/helpers/plugins/provider-catalog.ts b/src/plugin-sdk/test-helpers/provider-catalog.ts similarity index 89% rename from test/helpers/plugins/provider-catalog.ts rename to src/plugin-sdk/test-helpers/provider-catalog.ts index 16a1ef8bc86..2c23a50e217 100644 --- a/test/helpers/plugins/provider-catalog.ts +++ b/src/plugin-sdk/test-helpers/provider-catalog.ts @@ -3,8 +3,8 @@ export { expectedAugmentedOpenaiCodexCatalogEntriesWithGpt55, expectCodexBuiltInSuppression, expectCodexMissingAuthHint, -} from "openclaw/plugin-sdk/testing"; -export type { ProviderPlugin } from "openclaw/plugin-sdk/provider-model-shared"; +} from "../testing.js"; +export type { ProviderPlugin } from "../provider-model-shared.js"; export { loadBundledPluginPublicSurface, loadBundledPluginPublicSurfaceSync, diff --git a/test/helpers/plugins/provider-contract-suites.ts b/src/plugin-sdk/test-helpers/provider-contract-suites.ts similarity index 95% rename from test/helpers/plugins/provider-contract-suites.ts rename to src/plugin-sdk/test-helpers/provider-contract-suites.ts index fc1785f6bd1..008d29be21f 100644 --- a/test/helpers/plugins/provider-contract-suites.ts +++ b/src/plugin-sdk/test-helpers/provider-contract-suites.ts @@ -1,8 +1,8 @@ -import type { ProviderPlugin } from "openclaw/plugin-sdk/provider-model-shared"; -import type { WebFetchProviderPlugin } from "openclaw/plugin-sdk/provider-web-fetch-contract"; -import type { WebSearchProviderPlugin } from "openclaw/plugin-sdk/provider-web-search-contract"; -import type { OpenClawConfig } from "openclaw/plugin-sdk/testing"; import { expect, it } from "vitest"; +import type { ProviderPlugin } from "../provider-model-shared.js"; +import type { WebFetchProviderPlugin } from "../provider-web-fetch-contract.js"; +import type { WebSearchProviderPlugin } from "../provider-web-search-contract.js"; +import type { OpenClawConfig } from "../testing.js"; type Lazy = T | (() => T); diff --git a/test/helpers/plugins/provider-contract.ts b/src/plugin-sdk/test-helpers/provider-contract.ts similarity index 95% rename from test/helpers/plugins/provider-contract.ts rename to src/plugin-sdk/test-helpers/provider-contract.ts index c01e2ec4043..0b11ded9f54 100644 --- a/test/helpers/plugins/provider-contract.ts +++ b/src/plugin-sdk/test-helpers/provider-contract.ts @@ -1,10 +1,10 @@ -import type { ProviderPlugin } from "openclaw/plugin-sdk/provider-model-shared"; +import { describe, expect, it } from "vitest"; +import type { ProviderPlugin } from "../provider-model-shared.js"; import { providerContractLoadError, resolveBundledExplicitProviderContractsFromPublicArtifacts, resolveProviderContractProvidersForPluginIds, -} from "openclaw/plugin-sdk/testing"; -import { describe, expect, it } from "vitest"; +} from "../testing.js"; import { installProviderPluginContractSuite } from "./provider-contract-suites.js"; type ProviderContractEntry = { diff --git a/test/helpers/plugins/provider-discovery-contract.ts b/src/plugin-sdk/test-helpers/provider-discovery-contract.ts similarity index 99% rename from test/helpers/plugins/provider-discovery-contract.ts rename to src/plugin-sdk/test-helpers/provider-discovery-contract.ts index 7fcca3c2230..cb4729a8f6a 100644 --- a/test/helpers/plugins/provider-discovery-contract.ts +++ b/src/plugin-sdk/test-helpers/provider-discovery-contract.ts @@ -1,10 +1,10 @@ -import type { AuthProfileStore, OpenClawConfig } from "openclaw/plugin-sdk/provider-auth"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import type { AuthProfileStore, OpenClawConfig } from "../provider-auth.js"; import { registerProviderPlugins as registerProviders, requireRegisteredProvider as requireProvider, runProviderCatalog, -} from "openclaw/plugin-sdk/testing"; -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +} from "../testing.js"; const resolveCopilotApiTokenMock = vi.hoisted(() => vi.fn()); const buildVllmProviderMock = vi.hoisted(() => vi.fn()); diff --git a/test/helpers/plugins/provider-onboard.ts b/src/plugin-sdk/test-helpers/provider-onboard.ts similarity index 93% rename from test/helpers/plugins/provider-onboard.ts rename to src/plugin-sdk/test-helpers/provider-onboard.ts index d0309631d9e..3b07a5c6dc4 100644 --- a/test/helpers/plugins/provider-onboard.ts +++ b/src/plugin-sdk/test-helpers/provider-onboard.ts @@ -1,10 +1,10 @@ +import { expect } from "vitest"; import { resolveAgentModelFallbackValues, resolveAgentModelPrimaryValue, -} from "openclaw/plugin-sdk/provider-onboard"; -import type { ModelApi } from "openclaw/plugin-sdk/provider-onboard"; -import type { OpenClawConfig } from "openclaw/plugin-sdk/testing"; -import { expect } from "vitest"; +} from "../provider-onboard.js"; +import type { ModelApi } from "../provider-onboard.js"; +import type { OpenClawConfig } from "../testing.js"; import { createConfigWithFallbacks, createLegacyProviderConfig, diff --git a/test/helpers/plugins/provider-runtime-contract.ts b/src/plugin-sdk/test-helpers/provider-runtime-contract.ts similarity index 99% rename from test/helpers/plugins/provider-runtime-contract.ts rename to src/plugin-sdk/test-helpers/provider-runtime-contract.ts index 66ba2caf428..158e539f68a 100644 --- a/test/helpers/plugins/provider-runtime-contract.ts +++ b/src/plugin-sdk/test-helpers/provider-runtime-contract.ts @@ -1,15 +1,15 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import type { ProviderRuntimeModel } from "openclaw/plugin-sdk/plugin-entry"; -import type { ProviderPlugin } from "openclaw/plugin-sdk/provider-model-shared"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import type { ProviderRuntimeModel } from "../plugin-entry.js"; +import type { ProviderPlugin } from "../provider-model-shared.js"; import { createProviderUsageFetch, makeResponse, registerProviderPlugin, requireRegisteredProvider, -} from "openclaw/plugin-sdk/testing"; -import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +} from "../testing.js"; const CONTRACT_SETUP_TIMEOUT_MS = 300_000; diff --git a/test/helpers/plugins/provider-wizard-contract-suites.ts b/src/plugin-sdk/test-helpers/provider-wizard-contract-suites.ts similarity index 97% rename from test/helpers/plugins/provider-wizard-contract-suites.ts rename to src/plugin-sdk/test-helpers/provider-wizard-contract-suites.ts index 8a231b43373..392991cf1f8 100644 --- a/test/helpers/plugins/provider-wizard-contract-suites.ts +++ b/src/plugin-sdk/test-helpers/provider-wizard-contract-suites.ts @@ -1,13 +1,13 @@ -import type { ProviderAuthMethod } from "openclaw/plugin-sdk/plugin-entry"; -import type { ProviderPlugin } from "openclaw/plugin-sdk/provider-model-shared"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import type { ProviderAuthMethod } from "../plugin-entry.js"; +import type { ProviderPlugin } from "../provider-model-shared.js"; import { buildProviderPluginMethodChoice, resolveProviderModelPickerEntries, resolveProviderPluginChoice, resolveProviderWizardOptions, setProviderWizardProvidersResolverForTest, -} from "openclaw/plugin-sdk/testing"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +} from "../testing.js"; const resolvePluginProvidersMock = vi.fn(); let restoreProviderResolver: (() => void) | undefined; diff --git a/test/helpers/plugins/public-artifacts.ts b/src/plugin-sdk/test-helpers/public-artifacts.ts similarity index 97% rename from test/helpers/plugins/public-artifacts.ts rename to src/plugin-sdk/test-helpers/public-artifacts.ts index 5337eff07dc..1448b92870d 100644 --- a/test/helpers/plugins/public-artifacts.ts +++ b/src/plugin-sdk/test-helpers/public-artifacts.ts @@ -1,4 +1,4 @@ -import { assertUniqueValues, BUNDLED_RUNTIME_SIDECAR_PATHS } from "openclaw/plugin-sdk/testing"; +import { assertUniqueValues, BUNDLED_RUNTIME_SIDECAR_PATHS } from "../testing.js"; export function getPublicArtifactBasename(relativePath: string): string { return relativePath.split("/").at(-1) ?? relativePath; diff --git a/test/helpers/plugins/public-surface-loader.ts b/src/plugin-sdk/test-helpers/public-surface-loader.ts similarity index 69% rename from test/helpers/plugins/public-surface-loader.ts rename to src/plugin-sdk/test-helpers/public-surface-loader.ts index c5bc6617621..679afdc11b6 100644 --- a/test/helpers/plugins/public-surface-loader.ts +++ b/src/plugin-sdk/test-helpers/public-surface-loader.ts @@ -4,9 +4,9 @@ import { pathToFileURL } from "node:url"; const repoRoot = process.cwd(); -function readJson(filePath: string): T | undefined { +function readJson(filePath: string): unknown { try { - return JSON.parse(fs.readFileSync(filePath, "utf8")) as T; + return JSON.parse(fs.readFileSync(filePath, "utf8")); } catch { return undefined; } @@ -29,7 +29,9 @@ function resolveSourceArtifactPath(packageDir: string, artifactBasename: string) function resolveExtensionDirByManifestId(pluginId: string): string { const pluginDir = path.resolve(repoRoot, "extensions", pluginId); - const manifest = readJson<{ id?: unknown }>(path.join(pluginDir, "openclaw.plugin.json")); + const manifest = readJson(path.join(pluginDir, "openclaw.plugin.json")) as + | { id?: unknown } + | undefined; if (manifest?.id === pluginId) { return pluginDir; } @@ -43,7 +45,9 @@ function resolveWorkspacePackageDir(packageName: string): string { continue; } const packageDir = path.join(extensionsDir, entry.name); - const manifest = readJson<{ name?: unknown }>(path.join(packageDir, "package.json")); + const manifest = readJson(path.join(packageDir, "package.json")) as + | { name?: unknown } + | undefined; if (manifest?.name === packageName) { return packageDir; } @@ -51,23 +55,30 @@ function resolveWorkspacePackageDir(packageName: string): string { throw new Error(`Unknown workspace package: ${packageName}`); } -export async function loadBundledPluginPublicSurface(params: { +type AsyncBundledPluginPublicSurfaceLoader = (params: { pluginId: string; artifactBasename: string; -}): Promise { +}) => Promise; + +// oxlint-disable-next-line typescript/no-unnecessary-type-parameters -- Test loaders use caller-supplied module surface types. +type BundledPluginPublicSurfaceLoader = (params: { + pluginId: string; + artifactBasename: string; +}) => T; + +export const loadBundledPluginPublicSurface: AsyncBundledPluginPublicSurfaceLoader = async ( + params, +) => { const artifactPath = resolveSourceArtifactPath( resolveExtensionDirByManifestId(params.pluginId), params.artifactBasename, ); - return (await import(pathToFileURL(artifactPath).href)) as T; -} + return await import(pathToFileURL(artifactPath).href); +}; -export function loadBundledPluginPublicSurfaceSync(_params: { - pluginId: string; - artifactBasename: string; -}): T { +export const loadBundledPluginPublicSurfaceSync: BundledPluginPublicSurfaceLoader = (_params) => { throw new Error("Synchronous bundled plugin public-surface loading is not available here"); -} +}; export function resolveWorkspacePackagePublicModuleUrl(params: { packageName: string; diff --git a/test/helpers/plugins/send-config.ts b/src/plugin-sdk/test-helpers/send-config.ts similarity index 100% rename from test/helpers/plugins/send-config.ts rename to src/plugin-sdk/test-helpers/send-config.ts diff --git a/test/helpers/plugins/start-account-context.ts b/src/plugin-sdk/test-helpers/start-account-context.ts similarity index 91% rename from test/helpers/plugins/start-account-context.ts rename to src/plugin-sdk/test-helpers/start-account-context.ts index 37c7031ef42..4155a695fc6 100644 --- a/test/helpers/plugins/start-account-context.ts +++ b/src/plugin-sdk/test-helpers/start-account-context.ts @@ -1,11 +1,11 @@ -import { createRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { vi } from "vitest"; +import { createRuntimeEnv } from "../testing.js"; import type { ChannelAccountSnapshot, ChannelGatewayContext, OpenClawConfig, RuntimeEnv, -} from "openclaw/plugin-sdk/testing"; -import { vi } from "vitest"; +} from "../testing.js"; export function createStartAccountContext(params: { account: TAccount; diff --git a/test/helpers/plugins/start-account-lifecycle.ts b/src/plugin-sdk/test-helpers/start-account-lifecycle.ts similarity index 98% rename from test/helpers/plugins/start-account-lifecycle.ts rename to src/plugin-sdk/test-helpers/start-account-lifecycle.ts index d699e2614bd..d6e05dceb23 100644 --- a/test/helpers/plugins/start-account-lifecycle.ts +++ b/src/plugin-sdk/test-helpers/start-account-lifecycle.ts @@ -1,5 +1,5 @@ -import type { ChannelAccountSnapshot, ChannelGatewayContext } from "openclaw/plugin-sdk/testing"; import { expect, vi } from "vitest"; +import type { ChannelAccountSnapshot, ChannelGatewayContext } from "../testing.js"; import { createStartAccountContext } from "./start-account-context.js"; export function startAccountAndTrackLifecycle(params: { diff --git a/test/helpers/plugins/status-issues.ts b/src/plugin-sdk/test-helpers/status-issues.ts similarity index 100% rename from test/helpers/plugins/status-issues.ts rename to src/plugin-sdk/test-helpers/status-issues.ts diff --git a/test/helpers/plugins/stream-hooks.ts b/src/plugin-sdk/test-helpers/stream-hooks.ts similarity index 100% rename from test/helpers/plugins/stream-hooks.ts rename to src/plugin-sdk/test-helpers/stream-hooks.ts diff --git a/test/helpers/plugins/subagent-hooks.ts b/src/plugin-sdk/test-helpers/subagent-hooks.ts similarity index 100% rename from test/helpers/plugins/subagent-hooks.ts rename to src/plugin-sdk/test-helpers/subagent-hooks.ts diff --git a/test/helpers/plugins/web-fetch-provider-contract.ts b/src/plugin-sdk/test-helpers/web-fetch-provider-contract.ts similarity index 94% rename from test/helpers/plugins/web-fetch-provider-contract.ts rename to src/plugin-sdk/test-helpers/web-fetch-provider-contract.ts index c48bc530950..039638f11f0 100644 --- a/test/helpers/plugins/web-fetch-provider-contract.ts +++ b/src/plugin-sdk/test-helpers/web-fetch-provider-contract.ts @@ -1,10 +1,10 @@ -import type { WebFetchProviderPlugin } from "openclaw/plugin-sdk/provider-web-fetch-contract"; +import { describe, expect, it } from "vitest"; +import type { WebFetchProviderPlugin } from "../provider-web-fetch-contract.js"; import { pluginRegistrationContractRegistry, resolveBundledExplicitWebFetchProvidersFromPublicArtifacts, resolveWebFetchProviderContractEntriesForPluginId, -} from "openclaw/plugin-sdk/testing"; -import { describe, expect, it } from "vitest"; +} from "../testing.js"; import { installWebFetchProviderContractSuite } from "./provider-contract-suites.js"; function resolveWebFetchCredentialValue(provider: WebFetchProviderPlugin): unknown { diff --git a/test/helpers/plugins/web-search-provider-contract.ts b/src/plugin-sdk/test-helpers/web-search-provider-contract.ts similarity index 98% rename from test/helpers/plugins/web-search-provider-contract.ts rename to src/plugin-sdk/test-helpers/web-search-provider-contract.ts index 5cf8562a35c..1b6e0288d80 100644 --- a/test/helpers/plugins/web-search-provider-contract.ts +++ b/src/plugin-sdk/test-helpers/web-search-provider-contract.ts @@ -1,9 +1,9 @@ +import { describe, expect, it } from "vitest"; import { pluginRegistrationContractRegistry, resolveBundledExplicitWebSearchProvidersFromPublicArtifacts, resolveWebSearchProviderContractEntriesForPluginId, -} from "openclaw/plugin-sdk/testing"; -import { describe, expect, it } from "vitest"; +} from "../testing.js"; import { installWebSearchProviderContractSuite } from "./provider-contract-suites.js"; type WebSearchContractEntry = ReturnType< diff --git a/src/plugins/contracts/core-extension-facade-boundary.test.ts b/src/plugins/contracts/core-extension-facade-boundary.test.ts index 66b276a73cc..22e4ae5e0a6 100644 --- a/src/plugins/contracts/core-extension-facade-boundary.test.ts +++ b/src/plugins/contracts/core-extension-facade-boundary.test.ts @@ -13,7 +13,7 @@ const genericCoreFixtureFiles = [ "src/commands/auth-choice.apply.plugin-provider.test.ts", "src/plugins/contracts/memory-embedding-provider.contract.test.ts", "src/plugins/discovery.test.ts", - "test/helpers/plugins/tts-contract-suites.ts", + "src/plugins/contracts/tts-contract-suites.ts", ] as const; const forbiddenGenericFixtureTerms = [ /\bOllama\b|\bollama\b/u, diff --git a/src/plugins/contracts/loader.contract.test.ts b/src/plugins/contracts/loader.contract.test.ts index 4dd9831c87b..5e921b679cf 100644 --- a/src/plugins/contracts/loader.contract.test.ts +++ b/src/plugins/contracts/loader.contract.test.ts @@ -1,5 +1,5 @@ +import { uniqueSortedStrings } from "openclaw/plugin-sdk/plugin-test-contracts"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { uniqueSortedStrings } from "../../../test/helpers/plugins/contracts-testkit.js"; import { withBundledPluginAllowlistCompat } from "../bundled-compat.js"; import { resolveManifestContractPluginIds } from "../plugin-registry.js"; import { __testing as providerTesting } from "../providers.js"; diff --git a/src/plugins/contracts/memory-embedding-provider.contract.test.ts b/src/plugins/contracts/memory-embedding-provider.contract.test.ts index 68100c45fcc..8f0c089e1b9 100644 --- a/src/plugins/contracts/memory-embedding-provider.contract.test.ts +++ b/src/plugins/contracts/memory-embedding-provider.contract.test.ts @@ -1,8 +1,8 @@ -import { describe, expect, it } from "vitest"; import { createPluginRegistryFixture, registerVirtualTestPlugin, -} from "../../../test/helpers/plugins/contracts-testkit.js"; +} from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describe, expect, it } from "vitest"; import { getRegisteredMemoryEmbeddingProvider } from "../memory-embedding-providers.js"; describe("memory embedding provider registration", () => { diff --git a/src/plugins/contracts/package-manifest.contract.test.ts b/src/plugins/contracts/package-manifest.contract.test.ts index bca25a083b3..eb1d0dc22a5 100644 --- a/src/plugins/contracts/package-manifest.contract.test.ts +++ b/src/plugins/contracts/package-manifest.contract.test.ts @@ -1,4 +1,4 @@ -import { describePackageManifestContract } from "../../../test/helpers/plugins/package-manifest-contract.js"; +import { describePackageManifestContract } from "openclaw/plugin-sdk/plugin-test-contracts"; type PackageManifestContractParams = Parameters[0]; diff --git a/src/plugins/contracts/plugin-registration.anthropic.contract.test.ts b/src/plugins/contracts/plugin-registration.anthropic.contract.test.ts index 59f39827e91..1b0090d5c3e 100644 --- a/src/plugins/contracts/plugin-registration.anthropic.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.anthropic.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.anthropic); diff --git a/src/plugins/contracts/plugin-registration.brave.contract.test.ts b/src/plugins/contracts/plugin-registration.brave.contract.test.ts index fbce19063e6..505c1bcf92e 100644 --- a/src/plugins/contracts/plugin-registration.brave.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.brave.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.brave); diff --git a/src/plugins/contracts/plugin-registration.comfy.contract.test.ts b/src/plugins/contracts/plugin-registration.comfy.contract.test.ts index 160683e8703..4ae652e0931 100644 --- a/src/plugins/contracts/plugin-registration.comfy.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.comfy.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.comfy); diff --git a/src/plugins/contracts/plugin-registration.deepgram.contract.test.ts b/src/plugins/contracts/plugin-registration.deepgram.contract.test.ts index 2381206afd9..a644e754f12 100644 --- a/src/plugins/contracts/plugin-registration.deepgram.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.deepgram.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.deepgram); diff --git a/src/plugins/contracts/plugin-registration.duckduckgo.contract.test.ts b/src/plugins/contracts/plugin-registration.duckduckgo.contract.test.ts index 3dbcc0b05df..93b47c1790d 100644 --- a/src/plugins/contracts/plugin-registration.duckduckgo.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.duckduckgo.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.duckduckgo); diff --git a/src/plugins/contracts/plugin-registration.elevenlabs.contract.test.ts b/src/plugins/contracts/plugin-registration.elevenlabs.contract.test.ts index 0dd1c95737b..d7306f719b6 100644 --- a/src/plugins/contracts/plugin-registration.elevenlabs.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.elevenlabs.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.elevenlabs); diff --git a/src/plugins/contracts/plugin-registration.exa.contract.test.ts b/src/plugins/contracts/plugin-registration.exa.contract.test.ts index 6b720324603..a58c576c177 100644 --- a/src/plugins/contracts/plugin-registration.exa.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.exa.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.exa); diff --git a/src/plugins/contracts/plugin-registration.fal.contract.test.ts b/src/plugins/contracts/plugin-registration.fal.contract.test.ts index 8f55c37eb07..ae12e9b9ef6 100644 --- a/src/plugins/contracts/plugin-registration.fal.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.fal.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.fal); diff --git a/src/plugins/contracts/plugin-registration.firecrawl.contract.test.ts b/src/plugins/contracts/plugin-registration.firecrawl.contract.test.ts index b48ea63c7b3..4d0e5577b3b 100644 --- a/src/plugins/contracts/plugin-registration.firecrawl.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.firecrawl.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.firecrawl); diff --git a/src/plugins/contracts/plugin-registration.google.contract.test.ts b/src/plugins/contracts/plugin-registration.google.contract.test.ts index 02fc00124a3..9ec118fb165 100644 --- a/src/plugins/contracts/plugin-registration.google.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.google.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.google); diff --git a/src/plugins/contracts/plugin-registration.groq.contract.test.ts b/src/plugins/contracts/plugin-registration.groq.contract.test.ts index 92662f35688..b53312f9acf 100644 --- a/src/plugins/contracts/plugin-registration.groq.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.groq.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.groq); diff --git a/src/plugins/contracts/plugin-registration.microsoft.contract.test.ts b/src/plugins/contracts/plugin-registration.microsoft.contract.test.ts index 325d11bcdb7..6aba4751b6b 100644 --- a/src/plugins/contracts/plugin-registration.microsoft.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.microsoft.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.microsoft); diff --git a/src/plugins/contracts/plugin-registration.minimax.contract.test.ts b/src/plugins/contracts/plugin-registration.minimax.contract.test.ts index 4908c109c14..6b973e6f9a5 100644 --- a/src/plugins/contracts/plugin-registration.minimax.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.minimax.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.minimax); diff --git a/src/plugins/contracts/plugin-registration.mistral.contract.test.ts b/src/plugins/contracts/plugin-registration.mistral.contract.test.ts index 43669c67593..7a9125f0fee 100644 --- a/src/plugins/contracts/plugin-registration.mistral.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.mistral.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.mistral); diff --git a/src/plugins/contracts/plugin-registration.moonshot.contract.test.ts b/src/plugins/contracts/plugin-registration.moonshot.contract.test.ts index 748b721e757..cea224ae48e 100644 --- a/src/plugins/contracts/plugin-registration.moonshot.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.moonshot.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.moonshot); diff --git a/src/plugins/contracts/plugin-registration.openai.contract.test.ts b/src/plugins/contracts/plugin-registration.openai.contract.test.ts index 88afb2e7883..ffccf2cdc5b 100644 --- a/src/plugins/contracts/plugin-registration.openai.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.openai.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.openai); diff --git a/src/plugins/contracts/plugin-registration.openrouter.contract.test.ts b/src/plugins/contracts/plugin-registration.openrouter.contract.test.ts index 311763d4e47..90103723ca3 100644 --- a/src/plugins/contracts/plugin-registration.openrouter.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.openrouter.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.openrouter); diff --git a/src/plugins/contracts/plugin-registration.perplexity.contract.test.ts b/src/plugins/contracts/plugin-registration.perplexity.contract.test.ts index 5eb2d816119..f5cab46bdd8 100644 --- a/src/plugins/contracts/plugin-registration.perplexity.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.perplexity.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.perplexity); diff --git a/src/plugins/contracts/plugin-registration.senseaudio.contract.test.ts b/src/plugins/contracts/plugin-registration.senseaudio.contract.test.ts index 4acc9413601..68f9fbc1e04 100644 --- a/src/plugins/contracts/plugin-registration.senseaudio.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.senseaudio.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.senseaudio); diff --git a/src/plugins/contracts/plugin-registration.tavily.contract.test.ts b/src/plugins/contracts/plugin-registration.tavily.contract.test.ts index 3eb8981efa2..c21393c209b 100644 --- a/src/plugins/contracts/plugin-registration.tavily.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.tavily.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.tavily); diff --git a/src/plugins/contracts/plugin-registration.tts-local-cli.contract.test.ts b/src/plugins/contracts/plugin-registration.tts-local-cli.contract.test.ts index 1cf11ef933b..b7be64a98bc 100644 --- a/src/plugins/contracts/plugin-registration.tts-local-cli.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.tts-local-cli.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases["tts-local-cli"]); diff --git a/src/plugins/contracts/plugin-registration.xai.contract.test.ts b/src/plugins/contracts/plugin-registration.xai.contract.test.ts index 7ab504ea57a..95e3d114090 100644 --- a/src/plugins/contracts/plugin-registration.xai.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.xai.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.xai); diff --git a/src/plugins/contracts/plugin-registration.zai.contract.test.ts b/src/plugins/contracts/plugin-registration.zai.contract.test.ts index 3450e901bdf..1777791c78f 100644 --- a/src/plugins/contracts/plugin-registration.zai.contract.test.ts +++ b/src/plugins/contracts/plugin-registration.zai.contract.test.ts @@ -1,4 +1,4 @@ -import { pluginRegistrationContractCases } from "../../../test/helpers/plugins/plugin-registration-contract-cases.js"; -import { describePluginRegistrationContract } from "../../../test/helpers/plugins/plugin-registration-contract.js"; +import { pluginRegistrationContractCases } from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts"; describePluginRegistrationContract(pluginRegistrationContractCases.zai); diff --git a/src/plugins/contracts/providers.contract.test.ts b/src/plugins/contracts/providers.contract.test.ts index a8abe94381c..a92331b7cd7 100644 --- a/src/plugins/contracts/providers.contract.test.ts +++ b/src/plugins/contracts/providers.contract.test.ts @@ -1,5 +1,5 @@ -import { describeProviderContracts } from "../../../test/helpers/plugins/provider-contract.js"; -import { describeWebSearchProviderContracts } from "../../../test/helpers/plugins/web-search-provider-contract.js"; +import { describeProviderContracts } from "openclaw/plugin-sdk/provider-test-contracts"; +import { describeWebSearchProviderContracts } from "openclaw/plugin-sdk/provider-test-contracts"; for (const providerId of [ "anthropic", diff --git a/src/plugins/contracts/registry.contract.test.ts b/src/plugins/contracts/registry.contract.test.ts index b3decb14734..5aa46c71fb5 100644 --- a/src/plugins/contracts/registry.contract.test.ts +++ b/src/plugins/contracts/registry.contract.test.ts @@ -1,5 +1,5 @@ +import { uniqueSortedStrings } from "openclaw/plugin-sdk/plugin-test-contracts"; import { describe, expect, it } from "vitest"; -import { uniqueSortedStrings } from "../../../test/helpers/plugins/contracts-testkit.js"; import { loadPluginManifestRegistry } from "../manifest-registry.js"; import { resolveManifestContractPluginIds } from "../plugin-registry.js"; import { diff --git a/src/plugins/contracts/runtime-import-side-effects.contract.test.ts b/src/plugins/contracts/runtime-import-side-effects.contract.test.ts index 85b9f80b0bb..1eae19ad2bb 100644 --- a/src/plugins/contracts/runtime-import-side-effects.contract.test.ts +++ b/src/plugins/contracts/runtime-import-side-effects.contract.test.ts @@ -1,5 +1,5 @@ +import { assertNoImportTimeSideEffects } from "openclaw/plugin-sdk/plugin-test-contracts"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { assertNoImportTimeSideEffects } from "../../../test/helpers/plugins/contracts-testkit.js"; const listChannelPlugins = vi.hoisted(() => vi.fn(() => [ diff --git a/src/plugins/contracts/shape.contract.test.ts b/src/plugins/contracts/shape.contract.test.ts index 29ff4fd423b..9ac0fb36c20 100644 --- a/src/plugins/contracts/shape.contract.test.ts +++ b/src/plugins/contracts/shape.contract.test.ts @@ -1,8 +1,8 @@ -import { describe, expect, it } from "vitest"; import { createPluginRegistryFixture, registerVirtualTestPlugin, -} from "../../../test/helpers/plugins/contracts-testkit.js"; +} from "openclaw/plugin-sdk/plugin-test-contracts"; +import { describe, expect, it } from "vitest"; import { buildPluginShapeSummary } from "../inspect-shape.js"; describe("plugin shape compatibility matrix", () => { diff --git a/test/helpers/plugins/tts-contract-suites.ts b/src/plugins/contracts/tts-contract-suites.ts similarity index 99% rename from test/helpers/plugins/tts-contract-suites.ts rename to src/plugins/contracts/tts-contract-suites.ts index ec77ba4ec24..79f73d3d8d2 100644 --- a/test/helpers/plugins/tts-contract-suites.ts +++ b/src/plugins/contracts/tts-contract-suites.ts @@ -1,4 +1,5 @@ import type { AssistantMessage } from "@mariozechner/pi-ai"; +import { resolveWorkspacePackagePublicModuleUrl } from "openclaw/plugin-sdk/plugin-test-contracts"; import type { ResolvedTtsConfig, SpeechProviderPlugin } from "openclaw/plugin-sdk/speech-core"; import type { OpenClawConfig } from "openclaw/plugin-sdk/testing"; import { @@ -9,7 +10,7 @@ import { withEnvAsync, } from "openclaw/plugin-sdk/testing"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { resolveWorkspacePackagePublicModuleUrl } from "./public-surface-loader.js"; +import { BUNDLED_PLUGIN_CONTRACT_SNAPSHOTS } from "./inventory/bundled-capability-metadata.js"; type TtsRuntimeModule = typeof import("openclaw/plugin-sdk/tts-runtime"); type TtsCoreModule = typeof import("openclaw/plugin-sdk/speech-core"); diff --git a/src/plugins/contracts/tts.contract.test.ts b/src/plugins/contracts/tts.contract.test.ts index d0900acfb3b..9d935390af2 100644 --- a/src/plugins/contracts/tts.contract.test.ts +++ b/src/plugins/contracts/tts.contract.test.ts @@ -3,7 +3,7 @@ import { describeTtsConfigContract, describeTtsProviderRuntimeContract, describeTtsSummarizationContract, -} from "../../../test/helpers/plugins/tts-contract-suites.js"; +} from "./tts-contract-suites.js"; describeTtsAutoApplyContract(); describeTtsConfigContract(); diff --git a/src/plugins/contracts/web-fetch-provider.contract.test.ts b/src/plugins/contracts/web-fetch-provider.contract.test.ts index a71de01200d..dfe2c97a2e5 100644 --- a/src/plugins/contracts/web-fetch-provider.contract.test.ts +++ b/src/plugins/contracts/web-fetch-provider.contract.test.ts @@ -1,4 +1,4 @@ -import { describeWebFetchProviderContracts } from "../../../test/helpers/plugins/web-fetch-provider-contract.js"; +import { describeWebFetchProviderContracts } from "openclaw/plugin-sdk/provider-test-contracts"; import { pluginRegistrationContractRegistry } from "./registry.js"; const webFetchProviderContractTests = pluginRegistrationContractRegistry.filter( diff --git a/src/plugins/contracts/wizard.choice-resolution.contract.test.ts b/src/plugins/contracts/wizard.choice-resolution.contract.test.ts index 9ef4151fcbb..f58dbf4b9a1 100644 --- a/src/plugins/contracts/wizard.choice-resolution.contract.test.ts +++ b/src/plugins/contracts/wizard.choice-resolution.contract.test.ts @@ -1,3 +1,3 @@ -import { describeProviderWizardChoiceResolutionContract } from "../../../test/helpers/plugins/provider-wizard-contract-suites.js"; +import { describeProviderWizardChoiceResolutionContract } from "openclaw/plugin-sdk/provider-test-contracts"; describeProviderWizardChoiceResolutionContract(); diff --git a/src/plugins/contracts/wizard.model-picker.contract.test.ts b/src/plugins/contracts/wizard.model-picker.contract.test.ts index 9300bcce969..c9af32bebd7 100644 --- a/src/plugins/contracts/wizard.model-picker.contract.test.ts +++ b/src/plugins/contracts/wizard.model-picker.contract.test.ts @@ -1,3 +1,3 @@ -import { describeProviderWizardModelPickerContract } from "../../../test/helpers/plugins/provider-wizard-contract-suites.js"; +import { describeProviderWizardModelPickerContract } from "openclaw/plugin-sdk/provider-test-contracts"; describeProviderWizardModelPickerContract(); diff --git a/src/plugins/contracts/wizard.setup-options.contract.test.ts b/src/plugins/contracts/wizard.setup-options.contract.test.ts index 2ace6e2adfc..b09e371e76a 100644 --- a/src/plugins/contracts/wizard.setup-options.contract.test.ts +++ b/src/plugins/contracts/wizard.setup-options.contract.test.ts @@ -1,3 +1,3 @@ -import { describeProviderWizardSetupOptionsContract } from "../../../test/helpers/plugins/provider-wizard-contract-suites.js"; +import { describeProviderWizardSetupOptionsContract } from "openclaw/plugin-sdk/provider-test-contracts"; describeProviderWizardSetupOptionsContract(); diff --git a/src/plugins/registry.dual-kind-memory-gate.test.ts b/src/plugins/registry.dual-kind-memory-gate.test.ts index 14e92a5368a..e2e7460f97b 100644 --- a/src/plugins/registry.dual-kind-memory-gate.test.ts +++ b/src/plugins/registry.dual-kind-memory-gate.test.ts @@ -1,9 +1,9 @@ -import { afterEach, describe, expect, it } from "vitest"; import { createPluginRegistryFixture, registerTestPlugin, registerVirtualTestPlugin, -} from "../../test/helpers/plugins/contracts-testkit.js"; +} from "openclaw/plugin-sdk/plugin-test-contracts"; +import { afterEach, describe, expect, it } from "vitest"; import { clearMemoryEmbeddingProviders } from "./memory-embedding-providers.js"; import { _resetMemoryPluginState, diff --git a/src/scripts/ci-changed-scope.test.ts b/src/scripts/ci-changed-scope.test.ts index f1562e34ed6..febfb024574 100644 --- a/src/scripts/ci-changed-scope.test.ts +++ b/src/scripts/ci-changed-scope.test.ts @@ -527,7 +527,7 @@ describe("detectChangedScope", () => { detectNodeFastScope([ bundledCapabilityMetadataPath, "src/plugins/contracts/registry.ts", - "test/helpers/plugins/tts-contract-suites.ts", + "src/plugins/contracts/tts-contract-suites.ts", "scripts/test-projects.test-support.mjs", "test/scripts/test-projects.test.ts", ]), diff --git a/test/scripts/test-projects.test.ts b/test/scripts/test-projects.test.ts index 55303db0492..ece5f48ded2 100644 --- a/test/scripts/test-projects.test.ts +++ b/test/scripts/test-projects.test.ts @@ -270,7 +270,7 @@ describe("scripts/test-projects changed-target routing", () => { it("routes precise plugin contract helpers without broad-running every shard", () => { expect( resolveChangedTargetArgs(["--changed", "origin/main"], process.cwd(), () => [ - "test/helpers/plugins/tts-contract-suites.ts", + "src/plugins/contracts/tts-contract-suites.ts", ]), ).toEqual([ "src/plugins/contracts/core-extension-facade-boundary.test.ts",