From f34b41f19897965edda677f9841813961956df76 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 28 Apr 2026 01:12:56 +0100 Subject: [PATCH] refactor: split plugin sdk test helpers --- CHANGELOG.md | 1 + .../.generated/plugin-sdk-api-baseline.sha256 | 4 +- docs/plugins/sdk-subpaths.md | 2 + docs/plugins/sdk-testing.md | 36 +++--- docs/reference/test.md | 2 +- .../amazon-bedrock-mantle/index.test.ts | 2 +- extensions/amazon-bedrock/index.test.ts | 5 +- extensions/amazon-bedrock/lazy-import.test.ts | 2 +- extensions/anthropic-vertex/index.test.ts | 2 +- extensions/anthropic/index.test.ts | 2 +- extensions/arcee/index.test.ts | 4 +- .../azure-speech/azure-speech.live.test.ts | 4 +- extensions/azure-speech/tts.test.ts | 2 +- .../bluebubbles/src/setup-surface.test.ts | 8 +- extensions/browser/test-support.ts | 11 +- extensions/byteplus/index.test.ts | 2 +- extensions/byteplus/live.test.ts | 2 +- extensions/chutes/implicit-provider.test.ts | 2 +- .../cloudflare-ai-gateway/index.test.ts | 2 +- .../src/app-server/dynamic-tools.test.ts | 2 +- .../src/app-server/event-projector.test.ts | 2 +- .../codex/src/app-server/run-attempt.test.ts | 2 +- .../src/app-server/transcript-mirror.test.ts | 2 +- extensions/comfy/comfy.live.test.ts | 2 +- extensions/comfy/index.test.ts | 2 +- extensions/deepgram/audio.live.test.ts | 2 +- extensions/deepgram/audio.test.ts | 2 +- extensions/deepseek/deepseek.live.test.ts | 2 +- extensions/deepseek/index.test.ts | 4 +- extensions/diffs/src/browser.test.ts | 2 +- extensions/diffs/src/store.test.ts | 2 +- extensions/discord/src/api.test.ts | 2 +- .../discord/src/channel-actions.test.ts | 2 +- .../discord/src/directory-contract.test.ts | 2 +- .../message-handler.module-test-helpers.ts | 2 +- .../native-command.plugin-dispatch.test.ts | 5 +- .../native-command.think-autocomplete.test.ts | 5 +- .../src/monitor/provider.allowlist.test.ts | 2 +- .../discord/src/resolve-channels.test.ts | 2 +- extensions/discord/src/resolve-users.test.ts | 2 +- extensions/discord/src/send.test-harness.ts | 2 +- extensions/elevenlabs/elevenlabs.live.test.ts | 4 +- extensions/feishu/src/bot.card-action.test.ts | 2 +- extensions/feishu/src/bot.test.ts | 2 +- .../feishu/src/card-ux-launcher.test.ts | 2 +- ...acp-init-failure.lifecycle.test-support.ts | 2 +- ...monitor.bot-menu.lifecycle.test-support.ts | 2 +- ...dcast.reply-once.lifecycle.test-support.ts | 2 +- ...itor.card-action.lifecycle.test-support.ts | 2 +- extensions/feishu/src/monitor.comment.test.ts | 2 +- .../feishu/src/monitor.reaction.test.ts | 2 +- ...nitor.reply-once.lifecycle.test-support.ts | 2 +- extensions/feishu/src/monitor.startup.test.ts | 2 +- extensions/feishu/src/setup-surface.test.ts | 2 +- .../firecrawl/src/firecrawl-tools.test.ts | 2 +- extensions/fireworks/index.test.ts | 2 +- extensions/github-copilot/models.test.ts | 2 +- .../google-meet/google-meet.live.test.ts | 2 +- extensions/google/google.live.test.ts | 4 +- extensions/google/index.test.ts | 5 +- ...media-understanding-provider.video.test.ts | 2 +- extensions/google/web-search-provider.test.ts | 2 +- .../src/monitor.webhook-routing.test.ts | 4 +- extensions/googlechat/src/setup.test.ts | 6 +- extensions/gradium/gradium.live.test.ts | 4 +- extensions/gradium/speech-provider.test.ts | 2 +- extensions/gradium/tts.test.ts | 2 +- extensions/groq/index.test.ts | 2 +- extensions/imessage/src/status.test.ts | 2 +- extensions/imessage/src/test-plugin.test.ts | 2 +- extensions/inworld/inworld.live.test.ts | 4 +- extensions/irc/src/setup.test.ts | 4 +- extensions/kilocode/index.test.ts | 2 +- extensions/kilocode/onboard.test.ts | 2 +- .../kimi-coding/implicit-provider.test.ts | 2 +- extensions/kimi-coding/index.test.ts | 2 +- .../line/src/bot-message-context.test.ts | 5 +- extensions/line/src/channel.logout.test.ts | 2 +- extensions/line/src/setup-surface.test.ts | 4 +- extensions/litellm/index.test.ts | 2 +- extensions/lmstudio/index.test.ts | 2 +- extensions/lobster/src/test-helpers.ts | 2 +- .../matrix/src/channel.directory.test.ts | 2 +- extensions/matrix/src/channel.resolve.test.ts | 2 +- .../monitor-route-test-support.ts | 4 +- extensions/microsoft/microsoft.live.test.ts | 2 +- extensions/migrate-hermes/provider.test.ts | 2 +- .../minimax/image-generation-provider.test.ts | 2 +- extensions/minimax/index.test.ts | 5 +- extensions/minimax/minimax.live.test.ts | 4 +- .../media-understanding-provider.test.ts | 2 +- extensions/mistral/mistral.live.test.ts | 2 +- extensions/moonshot/index.test.ts | 2 +- .../media-understanding-provider.test.ts | 2 +- extensions/moonshot/moonshot.live.test.ts | 2 +- .../msteams/src/attachments.graph.test.ts | 2 +- extensions/msteams/src/graph-upload.test.ts | 2 +- .../music-generation-providers.live.test.ts | 8 +- extensions/nostr/src/channel.test.ts | 4 +- extensions/nvidia/index.test.ts | 2 +- extensions/ollama/provider-discovery.test.ts | 3 +- extensions/ollama/src/provider-models.test.ts | 2 +- extensions/ollama/src/setup.test.ts | 2 +- extensions/openai/index.test.ts | 5 +- .../media-understanding-provider.test.ts | 2 +- extensions/openai/openai-tts.live.test.ts | 2 +- extensions/openai/openai.live.test.ts | 5 +- .../provider-catalog.contract-test-support.ts | 5 +- extensions/opencode-go/index.test.ts | 5 +- extensions/opencode/index.test.ts | 5 +- extensions/openrouter/index.test.ts | 5 +- extensions/openrouter/openrouter.live.test.ts | 5 +- .../perplexity-web-search-provider.test.ts | 2 +- extensions/qa-channel/src/channel.test.ts | 2 +- extensions/qianfan/index.test.ts | 4 +- extensions/qwen/index.test.ts | 3 +- .../qwen/media-understanding-provider.test.ts | 2 +- .../media-understanding-provider.test.ts | 2 +- .../shared/windows-cmd-shim-test-fixtures.ts | 2 +- extensions/signal/src/core.test.ts | 2 +- .../src/monitor.tool-result.test-harness.ts | 2 +- extensions/slack/src/channel.test.ts | 2 +- .../slack/src/directory-contract.test.ts | 2 +- .../src/inbound-context.contract.test.ts | 2 +- extensions/slack/src/setup-surface.test.ts | 4 +- extensions/synology-chat/src/channel.test.ts | 2 +- extensions/synology-chat/src/core.test.ts | 4 +- .../telegram/src/account-inspect.test.ts | 2 +- extensions/telegram/src/accounts.test.ts | 2 +- .../telegram/src/action-runtime.test.ts | 2 +- .../src/bot-native-commands.test-helpers.ts | 2 +- ...te-telegram-bot.channel-post-media.test.ts | 2 +- .../bot.create-telegram-bot.test-harness.ts | 2 +- extensions/telegram/src/bot.test.ts | 2 +- .../telegram/src/directory-contract.test.ts | 3 +- .../src/inbound-context.contract.test.ts | 2 +- extensions/telegram/src/probe.test.ts | 2 +- extensions/telegram/src/send.test-harness.ts | 2 +- .../src/target-writeback.test-shared.ts | 2 +- extensions/telegram/src/token.test.ts | 2 +- .../telegram/src/update-offset-store.test.ts | 2 +- .../generation-live-test-helpers.ts | 2 +- extensions/tlon/src/core.test.ts | 4 +- extensions/venice/index.test.ts | 2 +- .../video-generation-providers.live.test.ts | 20 ++-- extensions/volcengine/index.test.ts | 2 +- .../vydra/image-generation-provider.test.ts | 2 +- extensions/vydra/speech-provider.test.ts | 2 +- .../vydra/video-generation-provider.test.ts | 2 +- extensions/vydra/vydra.live.test.ts | 4 +- extensions/webhooks/src/http.test.ts | 3 +- .../src/accounts.whatsapp-auth.test.ts | 2 +- .../whatsapp/src/auto-reply.test-harness.ts | 2 +- ...o-reply.connection-and-logging.e2e.test.ts | 2 +- .../auto-reply/web-auto-reply-utils.test.ts | 2 +- extensions/whatsapp/src/channel.setup.test.ts | 2 +- .../whatsapp/src/directory-contract.test.ts | 2 +- extensions/whatsapp/src/media.test.ts | 4 +- extensions/whatsapp/src/setup-surface.test.ts | 6 +- extensions/xai/code-execution.test.ts | 2 +- extensions/xai/index.test.ts | 5 +- extensions/xai/web-search.test.ts | 2 +- extensions/xai/x-search.test.ts | 2 +- extensions/xai/xai.live.test.ts | 5 +- extensions/xiaomi/xiaomi.live.test.ts | 4 +- extensions/zai/index.test.ts | 2 +- .../zalo/src/monitor.image.polling.test.ts | 2 +- extensions/zalo/src/monitor.lifecycle.test.ts | 2 +- .../src/monitor.polling.media-reply.test.ts | 2 +- extensions/zalo/src/monitor.webhook.test.ts | 5 +- extensions/zalo/src/setup-status.test.ts | 2 +- extensions/zalo/src/setup-surface.test.ts | 4 +- .../monitor-mocks-test-support.ts | 2 +- extensions/zalouser/src/channel.setup.test.ts | 3 +- extensions/zalouser/src/channel.test.ts | 2 +- extensions/zalouser/src/setup-surface.test.ts | 2 +- package.json | 8 ++ .../check-no-extension-test-core-imports.ts | 4 +- scripts/lib/plugin-sdk-doc-metadata.ts | 6 + scripts/lib/plugin-sdk-entrypoints.json | 2 + .../plugins/setup-wizard-helpers.test.ts | 2 +- .../plugins/setup-wizard-proxy.test.ts | 2 +- src/plugin-sdk/channel-setup.test.ts | 2 +- src/plugin-sdk/plugin-test-runtime.ts | 87 ++++++++++++++ src/plugin-sdk/test-env.ts | 64 ++++++++++ .../test-helpers/provider-runtime-contract.ts | 62 +++++----- .../contracts/plugin-sdk-subpaths.test.ts | 111 ++++++++++++++++++ src/plugins/contracts/tts-contract-suites.ts | 9 +- test/helpers/channels/directory-ids.ts | 2 +- test/helpers/provider-replay-policy.ts | 2 +- test/image-generation.runtime.live.test.ts | 5 +- 191 files changed, 627 insertions(+), 270 deletions(-) create mode 100644 src/plugin-sdk/plugin-test-runtime.ts create mode 100644 src/plugin-sdk/test-env.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 94af07e17e5..2eaf0114e70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ Docs: https://docs.openclaw.ai - Gateway/runtime: reuse the current plugin metadata snapshot for provider discovery so repeated model-provider discovery avoids rebuilding plugin manifest metadata. Thanks @shakkernerd. - Gateway/startup: pass the plugin metadata snapshot from config validation into plugin bootstrap so startup reuses one manifest product instead of rebuilding plugin metadata. Thanks @shakkernerd. - Plugin SDK/testing: promote bundled plugin/provider/channel contract helpers to focused SDK test subpaths and retire the repo-only `test/helpers/plugins` TypeScript bridge. Thanks @vincentkoc. +- Plugin SDK/testing: add focused plugin runtime and environment fixture subpaths so plugin tests can avoid the broad `plugin-sdk/testing` barrel for common setup helpers. Thanks @vincentkoc. - Plugin SDK/testing: add a focused `plugin-sdk/plugin-test-api` helper subpath and move bundled plugin registration tests off the repo-only plugin API bridge. Thanks @vincentkoc. - Plugin SDK: add generic host hooks for session state, next-turn context, trusted tool policy, UI descriptors, events, scheduler cleanup, and run-scoped plugin context. (#72287) Thanks @100yenadmin. - 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. diff --git a/docs/.generated/plugin-sdk-api-baseline.sha256 b/docs/.generated/plugin-sdk-api-baseline.sha256 index e7a9b9ddfd8..41ba9795d5d 100644 --- a/docs/.generated/plugin-sdk-api-baseline.sha256 +++ b/docs/.generated/plugin-sdk-api-baseline.sha256 @@ -1,2 +1,2 @@ -92af5bb106da8278417701c301bc0dcc346cb21886956ab44b2b857e37b581be plugin-sdk-api-baseline.json -9139536904eea7239a0d0060562270b06eb43ab755c9e012a5c6687447bbcb48 plugin-sdk-api-baseline.jsonl +26eb392e2b8bc103f0aba289344134392ebd55e99a0254cce16327cc7ca4cf93 plugin-sdk-api-baseline.json +24f6b50b8c9a2b004491c335eab25786d9024869c710d1784e5748bae4bd0698 plugin-sdk-api-baseline.jsonl diff --git a/docs/plugins/sdk-subpaths.md b/docs/plugins/sdk-subpaths.md index f76359292a9..e66a79feb7e 100644 --- a/docs/plugins/sdk-subpaths.md +++ b/docs/plugins/sdk-subpaths.md @@ -26,7 +26,9 @@ For the plugin authoring guide, see [Plugin SDK overview](/plugins/sdk-overview) | `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/plugin-test-runtime` | Plugin runtime, registry, provider-registration, setup-wizard, and runtime task-flow fixtures for tests | | `plugin-sdk/provider-test-contracts` | Provider runtime, auth, discovery, onboard, catalog, web-search/fetch, and wizard contract helpers | +| `plugin-sdk/test-env` | Test environment, fetch/network, live-test, temporary filesystem, and time-control fixtures | | `plugin-sdk/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` | diff --git a/docs/plugins/sdk-testing.md b/docs/plugins/sdk-testing.md index 8fe15d1b622..5a0e0d52f57 100644 --- a/docs/plugins/sdk-testing.md +++ b/docs/plugins/sdk-testing.md @@ -29,8 +29,12 @@ plugins. **Plugin contract import:** `openclaw/plugin-sdk/plugin-test-contracts` +**Plugin runtime test import:** `openclaw/plugin-sdk/plugin-test-runtime` + **Provider contract import:** `openclaw/plugin-sdk/provider-test-contracts` +**Environment/network test import:** `openclaw/plugin-sdk/test-env` + The testing subpath exports a narrow set of helpers for plugin authors: ```typescript @@ -43,7 +47,9 @@ 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 { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describeOpenAIProviderRuntimeContract } from "openclaw/plugin-sdk/provider-test-contracts"; +import { withEnv, withFetchPreconnect } from "openclaw/plugin-sdk/test-env"; ``` ### Available exports @@ -55,6 +61,12 @@ import { describeOpenAIProviderRuntimeContract } from "openclaw/plugin-sdk/provi | `installChannelOutboundPayloadContractSuite` | Install channel outbound payload contract cases. Import from `plugin-sdk/channel-contract-testing` | | `createStartAccountContext` | Build channel account lifecycle contexts. Import from `plugin-sdk/channel-test-helpers` | | `describePluginRegistrationContract` | Install plugin registration contract checks. Import from `plugin-sdk/plugin-test-contracts` | +| `registerSingleProviderPlugin` | Register one provider plugin in loader smoke tests. Import from `plugin-sdk/plugin-test-runtime` | +| `registerProviderPlugin` | Capture all provider kinds from one plugin. Import from `plugin-sdk/plugin-test-runtime` | +| `registerProviderPlugins` | Capture provider registrations across multiple plugins. Import from `plugin-sdk/plugin-test-runtime` | +| `requireRegisteredProvider` | Assert that a provider collection contains an id. Import from `plugin-sdk/plugin-test-runtime` | +| `createRuntimeEnv` | Build a mocked CLI/plugin runtime environment. Import from `plugin-sdk/plugin-test-runtime` | +| `createPluginSetupWizardStatus` | Build setup status helpers for channel plugins. Import from `plugin-sdk/plugin-test-runtime` | | `describeOpenAIProviderRuntimeContract` | Install provider-family runtime contract checks. Import from `plugin-sdk/provider-test-contracts` | | `installCommonResolveTargetErrorCases` | Shared test cases for target resolution error handling | | `shouldAckReaction` | Check whether a channel should add an ack reaction | @@ -62,25 +74,19 @@ import { describeOpenAIProviderRuntimeContract } from "openclaw/plugin-sdk/provi | `createTestRegistry` | Build a channel plugin registry fixture | | `createEmptyPluginRegistry` | Build an empty plugin registry fixture | | `setActivePluginRegistry` | Install a registry fixture for plugin runtime tests | -| `createRequestCaptureJsonFetch` | Capture JSON fetch requests in media helper tests | -| `withFetchPreconnect` | Run fetch tests with preconnect hooks installed | -| `withEnv` / `withEnvAsync` | Temporarily patch environment variables | -| `createTempHomeEnv` / `withTempDir` | Create isolated filesystem test fixtures | -| `createMockServerResponse` | Create a minimal HTTP server response mock | -| `registerSingleProviderPlugin` | Register one provider plugin in loader smoke tests | -| `registerProviderPlugin` | Capture all provider kinds from one plugin | -| `registerProviderPlugins` | Capture provider registrations across multiple plugins | -| `requireRegisteredProvider` | Assert that a provider collection contains an id | +| `createRequestCaptureJsonFetch` | Capture JSON fetch requests in media helper tests. Import from `plugin-sdk/test-env` | +| `withFetchPreconnect` | Run fetch tests with preconnect hooks installed. Import from `plugin-sdk/test-env` | +| `withEnv` / `withEnvAsync` | Temporarily patch environment variables. Import from `plugin-sdk/test-env` | +| `createTempHomeEnv` / `withTempDir` | Create isolated filesystem test fixtures. Import from `plugin-sdk/test-env` | +| `createMockServerResponse` | Create a minimal HTTP server response mock. Import from `plugin-sdk/test-env` | | `runProviderCatalog` | Execute a provider catalog hook with test dependencies | | `resolveProviderWizardOptions` | Resolve provider setup wizard choices in contract tests | | `resolveProviderModelPickerEntries` | Resolve provider model-picker entries in contract tests | | `buildProviderPluginMethodChoice` | Build provider wizard choice ids for assertions | | `setProviderWizardProvidersResolverForTest` | Inject provider wizard providers for isolated tests | | `createProviderUsageFetch` | Build provider usage fetch fixtures | -| `useFrozenTime` / `useRealTime` | Freeze and restore timers for time-sensitive tests | -| `createRuntimeEnv` | Build a mocked CLI/plugin runtime environment | +| `useFrozenTime` / `useRealTime` | Freeze and restore timers for time-sensitive tests. Import from `plugin-sdk/test-env` | | `createTestWizardPrompter` | Build a mocked setup wizard prompter | -| `createPluginSetupWizardStatus` | Build setup status helpers for channel plugins | | `createRuntimeTaskFlow` | Create isolated runtime task-flow state | | `typedCases` | Preserve literal types for table-driven tests | @@ -90,9 +96,9 @@ suites that depend on bundled OpenClaw inventory stay under `src/plugins/contrac 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. +`plugin-sdk/plugin-test-contracts`, `plugin-sdk/plugin-test-runtime`, +`plugin-sdk/provider-test-contracts`, or `plugin-sdk/test-env` rather than +importing repo `src/**` files or repo `test/helpers/plugins/*` bridges directly. ### Types diff --git a/docs/reference/test.md b/docs/reference/test.md index 582cfa095f9..78084f292d6 100644 --- a/docs/reference/test.md +++ b/docs/reference/test.md @@ -18,7 +18,7 @@ title: "Tests" - Test wrapper runs end with a short `[test] passed|failed|skipped ... in ...` summary. Vitest's own duration line stays the per-shard detail. - Full, extension, and include-pattern shard runs update local timing data in `.artifacts/vitest-shard-timings.json`; later whole-config runs use those timings to balance slow and fast shards. Include-pattern CI shards append the shard name to the timing key, which keeps filtered shard timings visible without replacing whole-config timing data. Set `OPENCLAW_TEST_PROJECTS_TIMINGS=0` to ignore the local timing artifact. - Selected `plugin-sdk` and `commands` test files now route through dedicated light lanes that keep only `test/setup.ts`, leaving runtime-heavy cases on their existing lanes. -- Source files with sibling tests map to that sibling before falling back to wider directory globs. Helper edits under `test/helpers/channels` and `test/helpers/plugins` use a local import graph to run importing tests instead of broad-running every shard when the dependency path is precise. +- Source files with sibling tests map to that sibling before falling back to wider directory globs. Helper edits under `test/helpers/channels`, `src/plugin-sdk/test-helpers`, and `src/plugins/contracts` use a local import graph to run importing tests instead of broad-running every shard when the dependency path is precise. - `auto-reply` now also splits into three dedicated configs (`core`, `top-level`, `reply`) so the reply harness does not dominate the lighter top-level status/token/helper tests. - Base Vitest config now defaults to `pool: "threads"` and `isolate: false`, with the shared non-isolated runner enabled across the repo configs. - `pnpm test:channels` runs `vitest.channels.config.ts`. diff --git a/extensions/amazon-bedrock-mantle/index.test.ts b/extensions/amazon-bedrock-mantle/index.test.ts index de3936812b9..39e10389d46 100644 --- a/extensions/amazon-bedrock-mantle/index.test.ts +++ b/extensions/amazon-bedrock-mantle/index.test.ts @@ -1,4 +1,4 @@ -import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; +import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; import bedrockMantlePlugin from "./index.js"; diff --git a/extensions/amazon-bedrock/index.test.ts b/extensions/amazon-bedrock/index.test.ts index 33e9a7486f7..5baa6fa19f1 100644 --- a/extensions/amazon-bedrock/index.test.ts +++ b/extensions/amazon-bedrock/index.test.ts @@ -2,7 +2,10 @@ import { readFileSync } from "node:fs"; import { resolve } from "node:path"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import type { PluginRuntime } from "openclaw/plugin-sdk/core"; -import { buildPluginApi, registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; +import { + buildPluginApi, + registerSingleProviderPlugin, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { resetBedrockDiscoveryCacheForTest } from "./discovery.js"; import amazonBedrockPlugin from "./index.js"; diff --git a/extensions/amazon-bedrock/lazy-import.test.ts b/extensions/amazon-bedrock/lazy-import.test.ts index a47d1579465..bc656a5c391 100644 --- a/extensions/amazon-bedrock/lazy-import.test.ts +++ b/extensions/amazon-bedrock/lazy-import.test.ts @@ -1,4 +1,4 @@ -import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; +import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, describe, expect, it, vi } from "vitest"; function mockBedrockSdkImportTripwire(): () => number { diff --git a/extensions/anthropic-vertex/index.test.ts b/extensions/anthropic-vertex/index.test.ts index 5f5a200475b..6d737172407 100644 --- a/extensions/anthropic-vertex/index.test.ts +++ b/extensions/anthropic-vertex/index.test.ts @@ -1,4 +1,4 @@ -import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; +import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"; const { hasAnthropicVertexAvailableAuthMock } = vi.hoisted(() => ({ diff --git a/extensions/anthropic/index.test.ts b/extensions/anthropic/index.test.ts index f9212671b1c..dbdb132ec96 100644 --- a/extensions/anthropic/index.test.ts +++ b/extensions/anthropic/index.test.ts @@ -5,7 +5,7 @@ import type { import { capturePluginRegistration, registerSingleProviderPlugin, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it, vi } from "vitest"; const { readClaudeCliCredentialsForSetupMock, readClaudeCliCredentialsForRuntimeMock } = vi.hoisted( diff --git a/extensions/arcee/index.test.ts b/extensions/arcee/index.test.ts index ce624b7d827..8379057b443 100644 --- a/extensions/arcee/index.test.ts +++ b/extensions/arcee/index.test.ts @@ -1,8 +1,8 @@ -import { resolveProviderAuthEnvVarCandidates } from "openclaw/plugin-sdk/provider-env-vars"; import { registerSingleProviderPlugin, resolveProviderPluginChoice, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import { resolveProviderAuthEnvVarCandidates } from "openclaw/plugin-sdk/provider-env-vars"; import { describe, expect, it } from "vitest"; import { runSingleProviderCatalog } from "../test-support/provider-model-test-helpers.js"; import arceePlugin from "./index.js"; diff --git a/extensions/azure-speech/azure-speech.live.test.ts b/extensions/azure-speech/azure-speech.live.test.ts index 2215084cd07..034882e96e9 100644 --- a/extensions/azure-speech/azure-speech.live.test.ts +++ b/extensions/azure-speech/azure-speech.live.test.ts @@ -1,8 +1,8 @@ import { - isLiveTestEnabled, registerProviderPlugin, requireRegisteredProvider, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import { isLiveTestEnabled } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; diff --git a/extensions/azure-speech/tts.test.ts b/extensions/azure-speech/tts.test.ts index 1afdb574168..38511ffc0f3 100644 --- a/extensions/azure-speech/tts.test.ts +++ b/extensions/azure-speech/tts.test.ts @@ -1,4 +1,4 @@ -import { installPinnedHostnameTestHooks } from "openclaw/plugin-sdk/testing"; +import { installPinnedHostnameTestHooks } from "openclaw/plugin-sdk/test-env"; import { afterEach, describe, expect, it, vi } from "vitest"; import { azureSpeechTTS, diff --git a/extensions/bluebubbles/src/setup-surface.test.ts b/extensions/bluebubbles/src/setup-surface.test.ts index fb98de88a97..aaa6fa26fe0 100644 --- a/extensions/bluebubbles/src/setup-surface.test.ts +++ b/extensions/bluebubbles/src/setup-surface.test.ts @@ -1,13 +1,13 @@ import { adaptScopedAccountAccessor } from "openclaw/plugin-sdk/channel-config-helpers"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; -import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/routing"; -import { isPrivateNetworkOptInEnabled } from "openclaw/plugin-sdk/ssrf-runtime"; import { createSetupWizardAdapter, createTestWizardPrompter, runSetupWizardConfigure, - type WizardPrompter, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import type { WizardPrompter } from "openclaw/plugin-sdk/plugin-test-runtime"; +import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/routing"; +import { isPrivateNetworkOptInEnabled } from "openclaw/plugin-sdk/ssrf-runtime"; import { describe, expect, it, vi } from "vitest"; import { resolveBlueBubblesAccount } from "./accounts.js"; import { BlueBubblesConfigSchema } from "./config-schema.js"; diff --git a/extensions/browser/test-support.ts b/extensions/browser/test-support.ts index 194e014f1d3..f078f5bc63b 100644 --- a/extensions/browser/test-support.ts +++ b/extensions/browser/test-support.ts @@ -1,14 +1,15 @@ export { createCliRuntimeCapture, - createTempHomeEnv, expectGeneratedTokenPersistedToGatewayAuth, type CliMockOutputRuntime, type CliRuntimeCapture, - type FetchMock, - type TempHomeEnv, +} from "openclaw/plugin-sdk/testing"; +export { + createTempHomeEnv, withEnv, withEnvAsync, withFetchPreconnect, isLiveTestEnabled, - type OpenClawConfig, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/test-env"; +export type { FetchMock, TempHomeEnv } from "openclaw/plugin-sdk/test-env"; +export type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; diff --git a/extensions/byteplus/index.test.ts b/extensions/byteplus/index.test.ts index 2fdb636bfe7..7aedb4523ec 100644 --- a/extensions/byteplus/index.test.ts +++ b/extensions/byteplus/index.test.ts @@ -1,6 +1,6 @@ import { readFileSync } from "node:fs"; import { resolve } from "node:path"; -import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; +import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; import { BYTEPLUS_CODING_MODEL_CATALOG, BYTEPLUS_MODEL_CATALOG } from "./models.js"; diff --git a/extensions/byteplus/live.test.ts b/extensions/byteplus/live.test.ts index 03467081b08..943a2f063a2 100644 --- a/extensions/byteplus/live.test.ts +++ b/extensions/byteplus/live.test.ts @@ -3,7 +3,7 @@ import { createSingleUserPromptMessage, extractNonEmptyAssistantText, isLiveTestEnabled, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { BYTEPLUS_CODING_BASE_URL, BYTEPLUS_DEFAULT_COST } from "./models.js"; diff --git a/extensions/chutes/implicit-provider.test.ts b/extensions/chutes/implicit-provider.test.ts index 046cce62776..fa091d68e2b 100644 --- a/extensions/chutes/implicit-provider.test.ts +++ b/extensions/chutes/implicit-provider.test.ts @@ -1,5 +1,5 @@ +import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime"; import { resolveOAuthApiKeyMarker } from "openclaw/plugin-sdk/provider-auth"; -import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; import { afterEach, describe, expect, it, vi } from "vitest"; import plugin from "./index.js"; import { CHUTES_BASE_URL } from "./models.js"; diff --git a/extensions/cloudflare-ai-gateway/index.test.ts b/extensions/cloudflare-ai-gateway/index.test.ts index f5e99f7d2a0..3c8b46b97de 100644 --- a/extensions/cloudflare-ai-gateway/index.test.ts +++ b/extensions/cloudflare-ai-gateway/index.test.ts @@ -1,5 +1,5 @@ import type { StreamFn } from "@mariozechner/pi-agent-core"; -import { capturePluginRegistration } from "openclaw/plugin-sdk/testing"; +import { capturePluginRegistration } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; diff --git a/extensions/codex/src/app-server/dynamic-tools.test.ts b/extensions/codex/src/app-server/dynamic-tools.test.ts index 5bd12e066e2..8f039cd63ae 100644 --- a/extensions/codex/src/app-server/dynamic-tools.test.ts +++ b/extensions/codex/src/app-server/dynamic-tools.test.ts @@ -9,7 +9,7 @@ import { createEmptyPluginRegistry, createMockPluginRegistry, setActivePluginRegistry, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, describe, expect, it, vi } from "vitest"; import { createCodexDynamicToolBridge } from "./dynamic-tools.js"; import type { JsonValue } from "./protocol.js"; diff --git a/extensions/codex/src/app-server/event-projector.test.ts b/extensions/codex/src/app-server/event-projector.test.ts index 6044e168ff5..cfcb22b6f47 100644 --- a/extensions/codex/src/app-server/event-projector.test.ts +++ b/extensions/codex/src/app-server/event-projector.test.ts @@ -8,7 +8,7 @@ import { initializeGlobalHookRunner, resetGlobalHookRunner, } from "openclaw/plugin-sdk/hook-runtime"; -import { createMockPluginRegistry } from "openclaw/plugin-sdk/testing"; +import { createMockPluginRegistry } from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { CodexAppServerEventProjector, diff --git a/extensions/codex/src/app-server/run-attempt.test.ts b/extensions/codex/src/app-server/run-attempt.test.ts index 796f8b904e0..2566b2602b8 100644 --- a/extensions/codex/src/app-server/run-attempt.test.ts +++ b/extensions/codex/src/app-server/run-attempt.test.ts @@ -18,7 +18,7 @@ import { initializeGlobalHookRunner, resetGlobalHookRunner, } from "openclaw/plugin-sdk/hook-runtime"; -import { createMockPluginRegistry } from "openclaw/plugin-sdk/testing"; +import { createMockPluginRegistry } from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { CODEX_GPT5_BEHAVIOR_CONTRACT } from "../../prompt-overlay.js"; import * as elicitationBridge from "./elicitation-bridge.js"; diff --git a/extensions/codex/src/app-server/transcript-mirror.test.ts b/extensions/codex/src/app-server/transcript-mirror.test.ts index 462513997ee..76499195401 100644 --- a/extensions/codex/src/app-server/transcript-mirror.test.ts +++ b/extensions/codex/src/app-server/transcript-mirror.test.ts @@ -5,9 +5,9 @@ import { initializeGlobalHookRunner, resetGlobalHookRunner, } from "openclaw/plugin-sdk/hook-runtime"; +import { createMockPluginRegistry } from "openclaw/plugin-sdk/plugin-test-runtime"; import { castAgentMessage, - createMockPluginRegistry, makeAgentAssistantMessage, makeAgentUserMessage, } from "openclaw/plugin-sdk/testing"; diff --git a/extensions/comfy/comfy.live.test.ts b/extensions/comfy/comfy.live.test.ts index bc6e7e0e3fc..b7af743c5c8 100644 --- a/extensions/comfy/comfy.live.test.ts +++ b/extensions/comfy/comfy.live.test.ts @@ -2,7 +2,7 @@ import { resolveOpenClawAgentDir } from "openclaw/plugin-sdk/agent-runtime"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { createTestPluginApi } from "openclaw/plugin-sdk/plugin-test-api"; import { getRuntimeConfig } from "openclaw/plugin-sdk/runtime-config-snapshot"; -import { isLiveTestEnabled } from "openclaw/plugin-sdk/testing"; +import { isLiveTestEnabled } from "openclaw/plugin-sdk/test-env"; import { beforeAll, describe, expect, it } from "vitest"; import plugin from "./index.js"; import { getComfyConfig, isComfyCapabilityConfigured } from "./workflow-runtime.js"; diff --git a/extensions/comfy/index.test.ts b/extensions/comfy/index.test.ts index fc69b24fbcb..d516e8127cd 100644 --- a/extensions/comfy/index.test.ts +++ b/extensions/comfy/index.test.ts @@ -2,7 +2,7 @@ import fs from "node:fs"; import { registerSingleProviderPlugin, resolveProviderPluginChoice, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; diff --git a/extensions/deepgram/audio.live.test.ts b/extensions/deepgram/audio.live.test.ts index 85f5b950d92..31b5bc5f742 100644 --- a/extensions/deepgram/audio.live.test.ts +++ b/extensions/deepgram/audio.live.test.ts @@ -1,4 +1,4 @@ -import { isLiveTestEnabled } from "openclaw/plugin-sdk/testing"; +import { isLiveTestEnabled } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { runRealtimeSttLiveTest, diff --git a/extensions/deepgram/audio.test.ts b/extensions/deepgram/audio.test.ts index d97777b336a..657d2308fa1 100644 --- a/extensions/deepgram/audio.test.ts +++ b/extensions/deepgram/audio.test.ts @@ -2,7 +2,7 @@ import { createAuthCaptureJsonFetch, createRequestCaptureJsonFetch, installPinnedHostnameTestHooks, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { transcribeDeepgramAudio } from "./audio.js"; diff --git a/extensions/deepseek/deepseek.live.test.ts b/extensions/deepseek/deepseek.live.test.ts index 4bb7fa3c58d..ac9f6289bcf 100644 --- a/extensions/deepseek/deepseek.live.test.ts +++ b/extensions/deepseek/deepseek.live.test.ts @@ -10,7 +10,7 @@ import { createSingleUserPromptMessage, extractNonEmptyAssistantText, isLiveTestEnabled, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { buildDeepSeekProvider } from "./provider-catalog.js"; import { createDeepSeekV4ThinkingWrapper } from "./stream.js"; diff --git a/extensions/deepseek/index.test.ts b/extensions/deepseek/index.test.ts index c92bc28a68a..d0799cf7a0f 100644 --- a/extensions/deepseek/index.test.ts +++ b/extensions/deepseek/index.test.ts @@ -1,10 +1,10 @@ import type { Context, Model } from "@mariozechner/pi-ai"; import { createAssistantMessageEventStream } from "@mariozechner/pi-ai"; -import { buildOpenAICompletionsParams } from "openclaw/plugin-sdk/provider-transport-runtime"; import { registerSingleProviderPlugin, resolveProviderPluginChoice, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import { buildOpenAICompletionsParams } from "openclaw/plugin-sdk/provider-transport-runtime"; import { describe, expect, it } from "vitest"; import { runSingleProviderCatalog } from "../test-support/provider-model-test-helpers.js"; import deepseekPlugin from "./index.js"; diff --git a/extensions/diffs/src/browser.test.ts b/extensions/diffs/src/browser.test.ts index 5db475787d6..d9012563286 100644 --- a/extensions/diffs/src/browser.test.ts +++ b/extensions/diffs/src/browser.test.ts @@ -2,7 +2,7 @@ import fs from "node:fs/promises"; import type { IncomingMessage, ServerResponse } from "node:http"; import path from "node:path"; import { createTestPluginApi } from "openclaw/plugin-sdk/plugin-test-api"; -import { createMockServerResponse } from "openclaw/plugin-sdk/testing"; +import { createMockServerResponse } from "openclaw/plugin-sdk/test-env"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../api.js"; import type { OpenClawPluginApi, OpenClawPluginToolContext } from "../api.js"; diff --git a/extensions/diffs/src/store.test.ts b/extensions/diffs/src/store.test.ts index 0f32b275a3d..7cf53887c5e 100644 --- a/extensions/diffs/src/store.test.ts +++ b/extensions/diffs/src/store.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs/promises"; import type { IncomingMessage } from "node:http"; import path from "node:path"; -import { createMockServerResponse } from "openclaw/plugin-sdk/testing"; +import { createMockServerResponse } from "openclaw/plugin-sdk/test-env"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { createDiffsHttpHandler } from "./http.js"; import { DiffArtifactStore } from "./store.js"; diff --git a/extensions/discord/src/api.test.ts b/extensions/discord/src/api.test.ts index b9604f766ab..07bf2a9aab6 100644 --- a/extensions/discord/src/api.test.ts +++ b/extensions/discord/src/api.test.ts @@ -1,4 +1,4 @@ -import { withFetchPreconnect } from "openclaw/plugin-sdk/testing"; +import { withFetchPreconnect } from "openclaw/plugin-sdk/test-env"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { fetchDiscord } from "./api.js"; import { jsonResponse } from "./test-http-helpers.js"; diff --git a/extensions/discord/src/channel-actions.test.ts b/extensions/discord/src/channel-actions.test.ts index 161a044fe5d..e99a4ef1726 100644 --- a/extensions/discord/src/channel-actions.test.ts +++ b/extensions/discord/src/channel-actions.test.ts @@ -1,6 +1,6 @@ import type { ChannelMessageActionContext } from "openclaw/plugin-sdk/channel-contract"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; -import { withEnv } from "openclaw/plugin-sdk/testing"; +import { withEnv } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it, vi } from "vitest"; const handleDiscordMessageActionMock = vi.hoisted(() => diff --git a/extensions/discord/src/directory-contract.test.ts b/extensions/discord/src/directory-contract.test.ts index f56a1b4e3fd..bfef141500c 100644 --- a/extensions/discord/src/directory-contract.test.ts +++ b/extensions/discord/src/directory-contract.test.ts @@ -1,5 +1,5 @@ import type { BaseProbeResult, BaseTokenResolution } from "openclaw/plugin-sdk/channel-contract"; -import type { OpenClawConfig } from "openclaw/plugin-sdk/testing"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { describe, expect, expectTypeOf, it } from "vitest"; import { expectDirectoryIds } from "../../../test/helpers/channels/directory-ids.js"; import { diff --git a/extensions/discord/src/monitor/message-handler.module-test-helpers.ts b/extensions/discord/src/monitor/message-handler.module-test-helpers.ts index 6cd13c98cbf..499bc5d4efc 100644 --- a/extensions/discord/src/monitor/message-handler.module-test-helpers.ts +++ b/extensions/discord/src/monitor/message-handler.module-test-helpers.ts @@ -1,4 +1,4 @@ -import type { MockFn } from "openclaw/plugin-sdk/testing"; +import type { MockFn } from "openclaw/plugin-sdk/plugin-test-runtime"; import { vi } from "vitest"; import type { DiscordInboundWorkerTestingHooks } from "./inbound-worker.js"; diff --git a/extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts b/extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts index 5e6c07d1568..865e5afa31e 100644 --- a/extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts +++ b/extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts @@ -8,8 +8,11 @@ import { matchPluginCommand, registerPluginCommand, } from "openclaw/plugin-sdk/plugin-runtime"; +import { + createTestRegistry, + setActivePluginRegistry, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { dispatchReplyWithDispatcher } from "openclaw/plugin-sdk/reply-dispatch-runtime"; -import { createTestRegistry, setActivePluginRegistry } from "openclaw/plugin-sdk/testing"; import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { defineThrowingDiscordChannelGetter } from "../test-support/partial-channel.js"; import { resolveDiscordNativeInteractionRouteState } from "./native-command-route.js"; diff --git a/extensions/discord/src/monitor/native-command.think-autocomplete.test.ts b/extensions/discord/src/monitor/native-command.think-autocomplete.test.ts index 69f0e3ab2f7..6ee877bab96 100644 --- a/extensions/discord/src/monitor/native-command.think-autocomplete.test.ts +++ b/extensions/discord/src/monitor/native-command.think-autocomplete.test.ts @@ -3,8 +3,11 @@ import os from "node:os"; import path from "node:path"; import { ChannelType, type AutocompleteInteraction } from "@buape/carbon"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; +import { + createEmptyPluginRegistry, + setActivePluginRegistry, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { clearSessionStoreCacheForTest } from "openclaw/plugin-sdk/session-store-runtime"; -import { createEmptyPluginRegistry, setActivePluginRegistry } from "openclaw/plugin-sdk/testing"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { createNoopThreadBindingManager } from "./thread-bindings.js"; diff --git a/extensions/discord/src/monitor/provider.allowlist.test.ts b/extensions/discord/src/monitor/provider.allowlist.test.ts index 33f042467b2..c0164e7cef1 100644 --- a/extensions/discord/src/monitor/provider.allowlist.test.ts +++ b/extensions/discord/src/monitor/provider.allowlist.test.ts @@ -1,4 +1,4 @@ -import { createNonExitingRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { createNonExitingRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; import * as resolveChannelsModule from "../resolve-channels.js"; import * as resolveUsersModule from "../resolve-users.js"; diff --git a/extensions/discord/src/resolve-channels.test.ts b/extensions/discord/src/resolve-channels.test.ts index ec98a1bc19d..74abb9a1455 100644 --- a/extensions/discord/src/resolve-channels.test.ts +++ b/extensions/discord/src/resolve-channels.test.ts @@ -1,4 +1,4 @@ -import { withFetchPreconnect } from "openclaw/plugin-sdk/testing"; +import { withFetchPreconnect } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { resolveDiscordChannelAllowlist } from "./resolve-channels.js"; import { jsonResponse, urlToString } from "./test-http-helpers.js"; diff --git a/extensions/discord/src/resolve-users.test.ts b/extensions/discord/src/resolve-users.test.ts index 78666186ddb..222d6589351 100644 --- a/extensions/discord/src/resolve-users.test.ts +++ b/extensions/discord/src/resolve-users.test.ts @@ -1,4 +1,4 @@ -import { withFetchPreconnect } from "openclaw/plugin-sdk/testing"; +import { withFetchPreconnect } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { resolveDiscordUserAllowlist } from "./resolve-users.js"; import { jsonResponse, urlToString } from "./test-http-helpers.js"; diff --git a/extensions/discord/src/send.test-harness.ts b/extensions/discord/src/send.test-harness.ts index c0069f99770..39a51787de3 100644 --- a/extensions/discord/src/send.test-harness.ts +++ b/extensions/discord/src/send.test-harness.ts @@ -1,4 +1,4 @@ -import type { MockFn } from "openclaw/plugin-sdk/testing"; +import type { MockFn } from "openclaw/plugin-sdk/plugin-test-runtime"; import { vi } from "vitest"; type DiscordWebMediaMockFactoryResult = { diff --git a/extensions/elevenlabs/elevenlabs.live.test.ts b/extensions/elevenlabs/elevenlabs.live.test.ts index 57bc37e17d4..6a2760e7850 100644 --- a/extensions/elevenlabs/elevenlabs.live.test.ts +++ b/extensions/elevenlabs/elevenlabs.live.test.ts @@ -1,8 +1,8 @@ import { - isLiveTestEnabled, registerProviderPlugin, requireRegisteredProvider, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import { isLiveTestEnabled } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { normalizeTranscriptForMatch, diff --git a/extensions/feishu/src/bot.card-action.test.ts b/extensions/feishu/src/bot.card-action.test.ts index 4ca24492088..e8e046be66e 100644 --- a/extensions/feishu/src/bot.card-action.test.ts +++ b/extensions/feishu/src/bot.card-action.test.ts @@ -1,4 +1,4 @@ -import { createRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { createRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, it, expect, vi, beforeEach } from "vitest"; import type { ClawdbotConfig, RuntimeEnv } from "../runtime-api.js"; import { diff --git a/extensions/feishu/src/bot.test.ts b/extensions/feishu/src/bot.test.ts index 7b3db8914a1..4cf6acdd2db 100644 --- a/extensions/feishu/src/bot.test.ts +++ b/extensions/feishu/src/bot.test.ts @@ -1,6 +1,6 @@ import type * as ConversationRuntime from "openclaw/plugin-sdk/conversation-runtime"; +import { createRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import type { ResolvedAgentRoute } from "openclaw/plugin-sdk/routing"; -import { createRuntimeEnv } from "openclaw/plugin-sdk/testing"; import { beforeEach, describe, expect, it, vi } from "vitest"; import type { ClawdbotConfig, PluginRuntime } from "../runtime-api.js"; import type { FeishuMessageEvent } from "./bot.js"; diff --git a/extensions/feishu/src/card-ux-launcher.test.ts b/extensions/feishu/src/card-ux-launcher.test.ts index 5ca6c794c1d..1ca9eb5ee66 100644 --- a/extensions/feishu/src/card-ux-launcher.test.ts +++ b/extensions/feishu/src/card-ux-launcher.test.ts @@ -1,4 +1,4 @@ -import { createRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { createRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it, vi, beforeEach } from "vitest"; import type { ClawdbotConfig, RuntimeEnv } from "../runtime-api.js"; import { diff --git a/extensions/feishu/src/monitor.acp-init-failure.lifecycle.test-support.ts b/extensions/feishu/src/monitor.acp-init-failure.lifecycle.test-support.ts index 9e9130b8000..4a119cfbd47 100644 --- a/extensions/feishu/src/monitor.acp-init-failure.lifecycle.test-support.ts +++ b/extensions/feishu/src/monitor.acp-init-failure.lifecycle.test-support.ts @@ -1,5 +1,5 @@ import "./lifecycle.test-support.js"; -import { createRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { createRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type { ClawdbotConfig } from "../runtime-api.js"; import { diff --git a/extensions/feishu/src/monitor.bot-menu.lifecycle.test-support.ts b/extensions/feishu/src/monitor.bot-menu.lifecycle.test-support.ts index f026fa2e29e..fcde3aa569d 100644 --- a/extensions/feishu/src/monitor.bot-menu.lifecycle.test-support.ts +++ b/extensions/feishu/src/monitor.bot-menu.lifecycle.test-support.ts @@ -1,4 +1,4 @@ -import { createRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { createRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import "./lifecycle.test-support.js"; import { diff --git a/extensions/feishu/src/monitor.broadcast.reply-once.lifecycle.test-support.ts b/extensions/feishu/src/monitor.broadcast.reply-once.lifecycle.test-support.ts index 7ce3344db24..75539db2a16 100644 --- a/extensions/feishu/src/monitor.broadcast.reply-once.lifecycle.test-support.ts +++ b/extensions/feishu/src/monitor.broadcast.reply-once.lifecycle.test-support.ts @@ -1,5 +1,5 @@ import "./lifecycle.test-support.js"; -import { createNonExitingRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { createNonExitingRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type { ClawdbotConfig, RuntimeEnv } from "../runtime-api.js"; import { FeishuConfigSchema } from "./config-schema.js"; diff --git a/extensions/feishu/src/monitor.card-action.lifecycle.test-support.ts b/extensions/feishu/src/monitor.card-action.lifecycle.test-support.ts index 90f6e077ca4..0e796eb9c24 100644 --- a/extensions/feishu/src/monitor.card-action.lifecycle.test-support.ts +++ b/extensions/feishu/src/monitor.card-action.lifecycle.test-support.ts @@ -1,4 +1,4 @@ -import { createRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { createRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import "./lifecycle.test-support.js"; import { resetProcessedFeishuCardActionTokensForTests } from "./card-action.js"; diff --git a/extensions/feishu/src/monitor.comment.test.ts b/extensions/feishu/src/monitor.comment.test.ts index 4e906e0b9c1..04b1135b547 100644 --- a/extensions/feishu/src/monitor.comment.test.ts +++ b/extensions/feishu/src/monitor.comment.test.ts @@ -1,4 +1,4 @@ -import { createNonExitingRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { createNonExitingRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type { ClawdbotConfig } from "../runtime-api.js"; import * as dedup from "./dedup.js"; diff --git a/extensions/feishu/src/monitor.reaction.test.ts b/extensions/feishu/src/monitor.reaction.test.ts index e006d417f92..7ef26d0c5d7 100644 --- a/extensions/feishu/src/monitor.reaction.test.ts +++ b/extensions/feishu/src/monitor.reaction.test.ts @@ -3,7 +3,7 @@ import { resolveInboundDebounceMs, } from "openclaw/plugin-sdk/channel-inbound-debounce"; import { hasControlCommand } from "openclaw/plugin-sdk/command-detection"; -import { createNonExitingRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { createNonExitingRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type { ClawdbotConfig, PluginRuntime } from "../runtime-api.js"; import { parseFeishuMessageEvent, type FeishuMessageEvent } from "./bot.js"; diff --git a/extensions/feishu/src/monitor.reply-once.lifecycle.test-support.ts b/extensions/feishu/src/monitor.reply-once.lifecycle.test-support.ts index 66faa3f8cd1..b07129c42d5 100644 --- a/extensions/feishu/src/monitor.reply-once.lifecycle.test-support.ts +++ b/extensions/feishu/src/monitor.reply-once.lifecycle.test-support.ts @@ -1,4 +1,4 @@ -import { createRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { createRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import "./lifecycle.test-support.js"; import { diff --git a/extensions/feishu/src/monitor.startup.test.ts b/extensions/feishu/src/monitor.startup.test.ts index f9c44c64c62..7d1d4c96fff 100644 --- a/extensions/feishu/src/monitor.startup.test.ts +++ b/extensions/feishu/src/monitor.startup.test.ts @@ -1,4 +1,4 @@ -import { createNonExitingRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { createNonExitingRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, describe, expect, it, vi } from "vitest"; import type { ClawdbotConfig } from "../runtime-api.js"; import { monitorFeishuProvider, stopFeishuMonitor } from "./monitor.js"; diff --git a/extensions/feishu/src/setup-surface.test.ts b/extensions/feishu/src/setup-surface.test.ts index 1f207c5e7cb..cbe4a6f5bdc 100644 --- a/extensions/feishu/src/setup-surface.test.ts +++ b/extensions/feishu/src/setup-surface.test.ts @@ -4,7 +4,7 @@ import { createPluginSetupWizardStatus, createTestWizardPrompter, runSetupWizardConfigure, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it, vi } from "vitest"; vi.mock("./probe.js", () => ({ diff --git a/extensions/firecrawl/src/firecrawl-tools.test.ts b/extensions/firecrawl/src/firecrawl-tools.test.ts index 4689d372341..683dd9c2307 100644 --- a/extensions/firecrawl/src/firecrawl-tools.test.ts +++ b/extensions/firecrawl/src/firecrawl-tools.test.ts @@ -1,5 +1,5 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; -import { mockPinnedHostnameResolution } from "openclaw/plugin-sdk/testing"; +import { mockPinnedHostnameResolution } from "openclaw/plugin-sdk/test-env"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { DEFAULT_FIRECRAWL_BASE_URL, diff --git a/extensions/fireworks/index.test.ts b/extensions/fireworks/index.test.ts index 350c85baca2..c1c5a485fb0 100644 --- a/extensions/fireworks/index.test.ts +++ b/extensions/fireworks/index.test.ts @@ -2,7 +2,7 @@ import type { ProviderRuntimeModel } from "openclaw/plugin-sdk/plugin-entry"; import { registerSingleProviderPlugin, resolveProviderPluginChoice, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import { createProviderDynamicModelContext, diff --git a/extensions/github-copilot/models.test.ts b/extensions/github-copilot/models.test.ts index 3edc43dfcae..4b94ca591b9 100644 --- a/extensions/github-copilot/models.test.ts +++ b/extensions/github-copilot/models.test.ts @@ -1,4 +1,4 @@ -import { createProviderUsageFetch, makeResponse } from "openclaw/plugin-sdk/testing"; +import { createProviderUsageFetch, makeResponse } from "openclaw/plugin-sdk/test-env"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { buildCopilotModelDefinition, getDefaultCopilotModelIds } from "./models-defaults.js"; import { fetchCopilotUsage } from "./usage.js"; diff --git a/extensions/google-meet/google-meet.live.test.ts b/extensions/google-meet/google-meet.live.test.ts index c0059d10d90..d38bdb5702d 100644 --- a/extensions/google-meet/google-meet.live.test.ts +++ b/extensions/google-meet/google-meet.live.test.ts @@ -1,4 +1,4 @@ -import { isLiveTestEnabled } from "openclaw/plugin-sdk/testing"; +import { isLiveTestEnabled } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { buildGoogleMeetExportManifest, googleMeetExportFileNames } from "./src/cli.js"; import { diff --git a/extensions/google/google.live.test.ts b/extensions/google/google.live.test.ts index 4849455488e..d04bbf250d8 100644 --- a/extensions/google/google.live.test.ts +++ b/extensions/google/google.live.test.ts @@ -1,8 +1,8 @@ import { - isLiveTestEnabled, registerProviderPlugin, requireRegisteredProvider, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import { isLiveTestEnabled } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { normalizeTranscriptForMatch } from "../../test/helpers/stt-live-audio.js"; import plugin from "./index.js"; diff --git a/extensions/google/index.test.ts b/extensions/google/index.test.ts index c897a18ae7b..ab76956776c 100644 --- a/extensions/google/index.test.ts +++ b/extensions/google/index.test.ts @@ -3,8 +3,11 @@ import type { ProviderReplaySessionEntry, ProviderSanitizeReplayHistoryContext, } from "openclaw/plugin-sdk/plugin-entry"; +import { + registerProviderPlugin, + requireRegisteredProvider, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { createCapturedThinkingConfigStream } from "openclaw/plugin-sdk/provider-test-contracts"; -import { registerProviderPlugin, requireRegisteredProvider } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; import { registerGoogleGeminiCliProvider } from "./gemini-cli-provider.js"; import { registerGoogleProvider } from "./provider-registration.js"; diff --git a/extensions/google/media-understanding-provider.video.test.ts b/extensions/google/media-understanding-provider.video.test.ts index da3f6a3ecc6..27d641e5c1c 100644 --- a/extensions/google/media-understanding-provider.video.test.ts +++ b/extensions/google/media-understanding-provider.video.test.ts @@ -2,7 +2,7 @@ import { createRequestCaptureJsonFetch, installPinnedHostnameTestHooks, withFetchPreconnect, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { describeGeminiVideo, transcribeGeminiAudio } from "./media-understanding-provider.js"; import { resolveGoogleGenerativeAiHttpRequestConfig } from "./runtime-api.js"; diff --git a/extensions/google/web-search-provider.test.ts b/extensions/google/web-search-provider.test.ts index d55949de6a4..fa6b7af6b68 100644 --- a/extensions/google/web-search-provider.test.ts +++ b/extensions/google/web-search-provider.test.ts @@ -1,5 +1,5 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; -import { withEnv } from "openclaw/plugin-sdk/testing"; +import { withEnv } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { __testing, createGeminiWebSearchProvider } from "./src/gemini-web-search-provider.js"; diff --git a/extensions/googlechat/src/monitor.webhook-routing.test.ts b/extensions/googlechat/src/monitor.webhook-routing.test.ts index 6f3fe9b592b..5f284c9120a 100644 --- a/extensions/googlechat/src/monitor.webhook-routing.test.ts +++ b/extensions/googlechat/src/monitor.webhook-routing.test.ts @@ -2,9 +2,9 @@ import { EventEmitter } from "node:events"; import type { IncomingMessage } from "node:http"; import { createEmptyPluginRegistry, - createMockServerResponse, setActivePluginRegistry, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import { createMockServerResponse } from "openclaw/plugin-sdk/test-env"; import { afterEach, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig, PluginRuntime } from "../runtime-api.js"; import type { ResolvedGoogleChatAccount } from "./accounts.js"; diff --git a/extensions/googlechat/src/setup.test.ts b/extensions/googlechat/src/setup.test.ts index 1a7f98a1509..295eba73c71 100644 --- a/extensions/googlechat/src/setup.test.ts +++ b/extensions/googlechat/src/setup.test.ts @@ -3,14 +3,14 @@ import { expectPendingUntilAbort, startAccountAndTrackLifecycle, } from "openclaw/plugin-sdk/channel-test-helpers"; -import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/setup"; import { createPluginSetupWizardConfigure, createPluginSetupWizardStatus, createTestWizardPrompter, runSetupWizardConfigure, - type WizardPrompter, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import type { WizardPrompter } from "openclaw/plugin-sdk/plugin-test-runtime"; +import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/setup"; import { afterEach, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../runtime-api.js"; import { diff --git a/extensions/gradium/gradium.live.test.ts b/extensions/gradium/gradium.live.test.ts index c3ae7c77fe0..981277492a9 100644 --- a/extensions/gradium/gradium.live.test.ts +++ b/extensions/gradium/gradium.live.test.ts @@ -2,10 +2,10 @@ import { writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { - isLiveTestEnabled, registerProviderPlugin, requireRegisteredProvider, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import { isLiveTestEnabled } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; diff --git a/extensions/gradium/speech-provider.test.ts b/extensions/gradium/speech-provider.test.ts index 5b88500c2f3..bd439770b65 100644 --- a/extensions/gradium/speech-provider.test.ts +++ b/extensions/gradium/speech-provider.test.ts @@ -1,4 +1,4 @@ -import { installPinnedHostnameTestHooks } from "openclaw/plugin-sdk/testing"; +import { installPinnedHostnameTestHooks } from "openclaw/plugin-sdk/test-env"; import { afterEach, describe, expect, it, vi } from "vitest"; import { buildGradiumSpeechProvider } from "./speech-provider.js"; diff --git a/extensions/gradium/tts.test.ts b/extensions/gradium/tts.test.ts index 07e5627f436..847ade1e0fa 100644 --- a/extensions/gradium/tts.test.ts +++ b/extensions/gradium/tts.test.ts @@ -1,4 +1,4 @@ -import { installPinnedHostnameTestHooks } from "openclaw/plugin-sdk/testing"; +import { installPinnedHostnameTestHooks } from "openclaw/plugin-sdk/test-env"; import { afterEach, describe, expect, it, vi } from "vitest"; import { gradiumTTS } from "./tts.js"; diff --git a/extensions/groq/index.test.ts b/extensions/groq/index.test.ts index 5bf876e2b99..a18bb3a2a6c 100644 --- a/extensions/groq/index.test.ts +++ b/extensions/groq/index.test.ts @@ -1,4 +1,4 @@ -import { capturePluginRegistration } from "openclaw/plugin-sdk/testing"; +import { capturePluginRegistration } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import { contributeGroqResolvedModelCompat, resolveGroqReasoningCompatPatch } from "./api.js"; import plugin from "./index.js"; diff --git a/extensions/imessage/src/status.test.ts b/extensions/imessage/src/status.test.ts index 6acd1fde808..a7147e8cbd0 100644 --- a/extensions/imessage/src/status.test.ts +++ b/extensions/imessage/src/status.test.ts @@ -1,6 +1,6 @@ +import { createPluginSetupWizardStatus } from "openclaw/plugin-sdk/plugin-test-runtime"; import * as processRuntime from "openclaw/plugin-sdk/process-runtime"; import * as setupRuntime from "openclaw/plugin-sdk/setup"; -import { createPluginSetupWizardStatus } from "openclaw/plugin-sdk/testing"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { resolveIMessageAccount } from "./accounts.js"; import * as channelRuntimeModule from "./channel.runtime.js"; diff --git a/extensions/imessage/src/test-plugin.test.ts b/extensions/imessage/src/test-plugin.test.ts index 04227edd0fe..d36815e4553 100644 --- a/extensions/imessage/src/test-plugin.test.ts +++ b/extensions/imessage/src/test-plugin.test.ts @@ -1,7 +1,7 @@ import { listImportedBundledPluginFacadeIds, resetFacadeRuntimeStateForTest, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { createIMessageTestPlugin } from "./imessage.test-plugin.js"; diff --git a/extensions/inworld/inworld.live.test.ts b/extensions/inworld/inworld.live.test.ts index 6f1144cf6df..d6cb0954a1f 100644 --- a/extensions/inworld/inworld.live.test.ts +++ b/extensions/inworld/inworld.live.test.ts @@ -1,8 +1,8 @@ import { - isLiveTestEnabled, registerProviderPlugin, requireRegisteredProvider, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import { isLiveTestEnabled } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; diff --git a/extensions/irc/src/setup.test.ts b/extensions/irc/src/setup.test.ts index 5985c5782c0..2fa5784c93e 100644 --- a/extensions/irc/src/setup.test.ts +++ b/extensions/irc/src/setup.test.ts @@ -9,8 +9,8 @@ import { createTestWizardPrompter, promptSetupWizardAllowFrom, runSetupWizardConfigure, - type WizardPrompter, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import type { WizardPrompter } from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, describe, expect, it, vi } from "vitest"; import { listIrcAccountIds, diff --git a/extensions/kilocode/index.test.ts b/extensions/kilocode/index.test.ts index d17ed9d0ac6..c5857bd4af7 100644 --- a/extensions/kilocode/index.test.ts +++ b/extensions/kilocode/index.test.ts @@ -1,6 +1,6 @@ import type { StreamFn } from "@mariozechner/pi-agent-core"; import type { Context, Model } from "@mariozechner/pi-ai"; -import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; +import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import { expectPassthroughReplayPolicy } from "../../test/helpers/provider-replay-policy.ts"; import plugin from "./index.js"; diff --git a/extensions/kilocode/onboard.test.ts b/extensions/kilocode/onboard.test.ts index f3215ea260f..951f25254bf 100644 --- a/extensions/kilocode/onboard.test.ts +++ b/extensions/kilocode/onboard.test.ts @@ -1,7 +1,7 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { resolveEnvApiKey } from "openclaw/plugin-sdk/provider-auth-runtime"; import { resolveAgentModelPrimaryValue } from "openclaw/plugin-sdk/provider-onboard"; -import { captureEnv } from "openclaw/plugin-sdk/testing"; +import { captureEnv } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { buildKilocodeModelDefinition, diff --git a/extensions/kimi-coding/implicit-provider.test.ts b/extensions/kimi-coding/implicit-provider.test.ts index 6f2544c0ea4..120e8992248 100644 --- a/extensions/kimi-coding/implicit-provider.test.ts +++ b/extensions/kimi-coding/implicit-provider.test.ts @@ -1,4 +1,4 @@ -import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; +import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; diff --git a/extensions/kimi-coding/index.test.ts b/extensions/kimi-coding/index.test.ts index fe9921c8861..70899521bb9 100644 --- a/extensions/kimi-coding/index.test.ts +++ b/extensions/kimi-coding/index.test.ts @@ -1,4 +1,4 @@ -import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; +import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; diff --git a/extensions/line/src/bot-message-context.test.ts b/extensions/line/src/bot-message-context.test.ts index 052b23bd76a..1c5ea597597 100644 --- a/extensions/line/src/bot-message-context.test.ts +++ b/extensions/line/src/bot-message-context.test.ts @@ -5,7 +5,10 @@ import type { webhook } from "@line/bot-sdk"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { getSessionBindingService } from "openclaw/plugin-sdk/conversation-runtime"; import { __testing as sessionBindingTesting } from "openclaw/plugin-sdk/conversation-runtime"; -import { createTestRegistry, setActivePluginRegistry } from "openclaw/plugin-sdk/testing"; +import { + createTestRegistry, + setActivePluginRegistry, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { lineBindingsAdapter } from "./bindings.js"; import { buildLineMessageContext, buildLinePostbackContext } from "./bot-message-context.js"; diff --git a/extensions/line/src/channel.logout.test.ts b/extensions/line/src/channel.logout.test.ts index e6a830aae9e..faf395ad71a 100644 --- a/extensions/line/src/channel.logout.test.ts +++ b/extensions/line/src/channel.logout.test.ts @@ -1,4 +1,4 @@ -import { createRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { createRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig, PluginRuntime, ResolvedLineAccount } from "../api.js"; import { lineGatewayAdapter } from "./gateway.js"; diff --git a/extensions/line/src/setup-surface.test.ts b/extensions/line/src/setup-surface.test.ts index bf2f3d9ec73..d6c35095eef 100644 --- a/extensions/line/src/setup-surface.test.ts +++ b/extensions/line/src/setup-surface.test.ts @@ -5,8 +5,8 @@ import { createPluginSetupWizardConfigure, createTestWizardPrompter, runSetupWizardConfigure, - type WizardPrompter, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import type { WizardPrompter } from "openclaw/plugin-sdk/plugin-test-runtime"; import ts from "typescript"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { bundledPluginRoot } from "../../../test/helpers/bundled-plugin-paths.js"; diff --git a/extensions/litellm/index.test.ts b/extensions/litellm/index.test.ts index f09ed96f528..8b7c401d74d 100644 --- a/extensions/litellm/index.test.ts +++ b/extensions/litellm/index.test.ts @@ -1,7 +1,7 @@ import { mkdtempSync, rmSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; -import { capturePluginRegistration } from "openclaw/plugin-sdk/testing"; +import { capturePluginRegistration } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it, vi } from "vitest"; import plugin from "./index.js"; diff --git a/extensions/lmstudio/index.test.ts b/extensions/lmstudio/index.test.ts index 6942ad12fb3..bfd8f955043 100644 --- a/extensions/lmstudio/index.test.ts +++ b/extensions/lmstudio/index.test.ts @@ -1,7 +1,7 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/plugin-entry"; +import { capturePluginRegistration } from "openclaw/plugin-sdk/plugin-test-runtime"; import { CUSTOM_LOCAL_AUTH_MARKER } from "openclaw/plugin-sdk/provider-auth"; import type { ModelProviderConfig } from "openclaw/plugin-sdk/provider-model-shared"; -import { capturePluginRegistration } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; import { LMSTUDIO_LOCAL_API_KEY_PLACEHOLDER } from "./src/defaults.js"; diff --git a/extensions/lobster/src/test-helpers.ts b/extensions/lobster/src/test-helpers.ts index 0395a985a0f..8831303364f 100644 --- a/extensions/lobster/src/test-helpers.ts +++ b/extensions/lobster/src/test-helpers.ts @@ -1,6 +1,6 @@ type PathEnvKey = "PATH" | "Path" | "PATHEXT" | "Pathext"; -export { createWindowsCmdShimFixture } from "openclaw/plugin-sdk/testing"; +export { createWindowsCmdShimFixture } from "openclaw/plugin-sdk/test-env"; const PATH_ENV_KEYS = ["PATH", "Path", "PATHEXT", "Pathext"] as const; export type PlatformPathEnvSnapshot = { diff --git a/extensions/matrix/src/channel.directory.test.ts b/extensions/matrix/src/channel.directory.test.ts index fbabb024c72..21ac8d41e62 100644 --- a/extensions/matrix/src/channel.directory.test.ts +++ b/extensions/matrix/src/channel.directory.test.ts @@ -1,4 +1,4 @@ -import { createRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { createRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import { beforeEach, describe, expect, it } from "vitest"; import type { RuntimeEnv } from "../runtime-api.js"; import { matrixPlugin } from "./channel.js"; diff --git a/extensions/matrix/src/channel.resolve.test.ts b/extensions/matrix/src/channel.resolve.test.ts index be17b57d93c..43f23834476 100644 --- a/extensions/matrix/src/channel.resolve.test.ts +++ b/extensions/matrix/src/channel.resolve.test.ts @@ -1,4 +1,4 @@ -import { createNonExitingRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { createNonExitingRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; const resolveMatrixTargetsMock = vi.hoisted(() => vi.fn(async () => [])); diff --git a/extensions/matrix/src/test-support/monitor-route-test-support.ts b/extensions/matrix/src/test-support/monitor-route-test-support.ts index a7bbd8257d6..0f29eb99880 100644 --- a/extensions/matrix/src/test-support/monitor-route-test-support.ts +++ b/extensions/matrix/src/test-support/monitor-route-test-support.ts @@ -6,5 +6,5 @@ export { resolveAgentRoute } from "openclaw/plugin-sdk/routing"; export { createTestRegistry, setActivePluginRegistry, - type OpenClawConfig, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +export type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; diff --git a/extensions/microsoft/microsoft.live.test.ts b/extensions/microsoft/microsoft.live.test.ts index 1e9918e1cd0..48c6c5e02f6 100644 --- a/extensions/microsoft/microsoft.live.test.ts +++ b/extensions/microsoft/microsoft.live.test.ts @@ -1,4 +1,4 @@ -import { isLiveTestEnabled } from "openclaw/plugin-sdk/testing"; +import { isLiveTestEnabled } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { listMicrosoftVoices } from "./speech-provider.js"; diff --git a/extensions/migrate-hermes/provider.test.ts b/extensions/migrate-hermes/provider.test.ts index 9737518aea2..5795202906a 100644 --- a/extensions/migrate-hermes/provider.test.ts +++ b/extensions/migrate-hermes/provider.test.ts @@ -1,5 +1,5 @@ import path from "node:path"; -import { createCapturedPluginRegistration } from "openclaw/plugin-sdk/testing"; +import { createCapturedPluginRegistration } from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, describe, expect, it } from "vitest"; import pluginEntry from "./index.js"; import { HERMES_REASON_INCLUDE_SECRETS } from "./items.js"; diff --git a/extensions/minimax/image-generation-provider.test.ts b/extensions/minimax/image-generation-provider.test.ts index a17ecb454e6..5ef1ea58276 100644 --- a/extensions/minimax/image-generation-provider.test.ts +++ b/extensions/minimax/image-generation-provider.test.ts @@ -1,5 +1,5 @@ import * as providerAuth from "openclaw/plugin-sdk/provider-auth-runtime"; -import { installPinnedHostnameTestHooks } from "openclaw/plugin-sdk/testing"; +import { installPinnedHostnameTestHooks } from "openclaw/plugin-sdk/test-env"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { buildMinimaxImageGenerationProvider, diff --git a/extensions/minimax/index.test.ts b/extensions/minimax/index.test.ts index 7b95f614b31..4fd4c53b5c8 100644 --- a/extensions/minimax/index.test.ts +++ b/extensions/minimax/index.test.ts @@ -1,6 +1,9 @@ import type { StreamFn } from "@mariozechner/pi-agent-core"; import type { Context, Model } from "@mariozechner/pi-ai"; -import { registerProviderPlugin, requireRegisteredProvider } from "openclaw/plugin-sdk/testing"; +import { + registerProviderPlugin, + requireRegisteredProvider, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it, vi } from "vitest"; import { registerMinimaxProviders } from "./provider-registration.js"; import { createMiniMaxWebSearchProvider } from "./src/minimax-web-search-provider.js"; diff --git a/extensions/minimax/minimax.live.test.ts b/extensions/minimax/minimax.live.test.ts index 37d0a64c96c..996a58e4d68 100644 --- a/extensions/minimax/minimax.live.test.ts +++ b/extensions/minimax/minimax.live.test.ts @@ -1,8 +1,8 @@ import { - isLiveTestEnabled, registerProviderPlugin, requireRegisteredProvider, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import { isLiveTestEnabled } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; import { buildMinimaxSpeechProvider } from "./speech-provider.js"; diff --git a/extensions/mistral/media-understanding-provider.test.ts b/extensions/mistral/media-understanding-provider.test.ts index de7012f6af8..bc769bf17d2 100644 --- a/extensions/mistral/media-understanding-provider.test.ts +++ b/extensions/mistral/media-understanding-provider.test.ts @@ -1,7 +1,7 @@ import { createRequestCaptureJsonFetch, installPinnedHostnameTestHooks, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { mistralMediaUnderstandingProvider } from "./media-understanding-provider.js"; diff --git a/extensions/mistral/mistral.live.test.ts b/extensions/mistral/mistral.live.test.ts index 757c006e0de..b2f86e67b73 100644 --- a/extensions/mistral/mistral.live.test.ts +++ b/extensions/mistral/mistral.live.test.ts @@ -1,4 +1,4 @@ -import { isLiveTestEnabled } from "openclaw/plugin-sdk/testing"; +import { isLiveTestEnabled } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { normalizeTranscriptForMatch, diff --git a/extensions/moonshot/index.test.ts b/extensions/moonshot/index.test.ts index d1694abdd58..ef7248bc5eb 100644 --- a/extensions/moonshot/index.test.ts +++ b/extensions/moonshot/index.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import type { Context, Model } from "@mariozechner/pi-ai"; +import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime"; import { createCapturedThinkingConfigStream } from "openclaw/plugin-sdk/provider-test-contracts"; -import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; import { createKimiWebSearchProvider } from "./src/kimi-web-search-provider.js"; diff --git a/extensions/moonshot/media-understanding-provider.test.ts b/extensions/moonshot/media-understanding-provider.test.ts index 425dc07d41e..85b90068d4a 100644 --- a/extensions/moonshot/media-understanding-provider.test.ts +++ b/extensions/moonshot/media-understanding-provider.test.ts @@ -1,7 +1,7 @@ import { createRequestCaptureJsonFetch, installPinnedHostnameTestHooks, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { describeMoonshotVideo } from "./media-understanding-provider.js"; diff --git a/extensions/moonshot/moonshot.live.test.ts b/extensions/moonshot/moonshot.live.test.ts index 07a57ad679d..c19b7e73e05 100644 --- a/extensions/moonshot/moonshot.live.test.ts +++ b/extensions/moonshot/moonshot.live.test.ts @@ -1,4 +1,4 @@ -import { isLiveTestEnabled } from "openclaw/plugin-sdk/testing"; +import { isLiveTestEnabled } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { createKimiWebSearchProvider } from "./src/kimi-web-search-provider.js"; diff --git a/extensions/msteams/src/attachments.graph.test.ts b/extensions/msteams/src/attachments.graph.test.ts index 65a36b2a5ce..a8bf641139e 100644 --- a/extensions/msteams/src/attachments.graph.test.ts +++ b/extensions/msteams/src/attachments.graph.test.ts @@ -1,4 +1,4 @@ -import { mockPinnedHostnameResolution } from "openclaw/plugin-sdk/testing"; +import { mockPinnedHostnameResolution } from "openclaw/plugin-sdk/test-env"; import { beforeEach, describe, expect, it, vi } from "vitest"; import type { PluginRuntime } from "../runtime-api.js"; import { readRemoteMediaResponse } from "./attachments.test-helpers.js"; diff --git a/extensions/msteams/src/graph-upload.test.ts b/extensions/msteams/src/graph-upload.test.ts index 4182d92dbe3..331738b0d52 100644 --- a/extensions/msteams/src/graph-upload.test.ts +++ b/extensions/msteams/src/graph-upload.test.ts @@ -1,4 +1,4 @@ -import { withFetchPreconnect } from "openclaw/plugin-sdk/testing"; +import { withFetchPreconnect } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it, vi } from "vitest"; import { buildTeamsFileInfoCard } from "./graph-chat.js"; import { resolveGraphChatId, uploadToOneDrive, uploadToSharePoint } from "./graph-upload.js"; diff --git a/extensions/music-generation-providers.live.test.ts b/extensions/music-generation-providers.live.test.ts index bffdefe9482..aa11e749daf 100644 --- a/extensions/music-generation-providers.live.test.ts +++ b/extensions/music-generation-providers.live.test.ts @@ -3,6 +3,10 @@ import { resolveOpenClawAgentDir, } from "openclaw/plugin-sdk/agent-runtime"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; +import { + registerProviderPlugin, + requireRegisteredProvider, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { getRuntimeConfig } from "openclaw/plugin-sdk/runtime-config-snapshot"; import { DEFAULT_LIVE_MUSIC_MODELS, @@ -16,11 +20,9 @@ import { parseCsvFilter, parseProviderModelMap, redactLiveApiKey, - registerProviderPlugin, - requireRegisteredProvider, resolveConfiguredLiveMusicModels, resolveLiveMusicAuthStore, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import googlePlugin from "./google/index.js"; import minimaxPlugin from "./minimax/index.js"; diff --git a/extensions/nostr/src/channel.test.ts b/extensions/nostr/src/channel.test.ts index e9ee740a73e..3b2cf7d3f08 100644 --- a/extensions/nostr/src/channel.test.ts +++ b/extensions/nostr/src/channel.test.ts @@ -2,8 +2,8 @@ import { createPluginSetupWizardConfigure, createTestWizardPrompter, runSetupWizardConfigure, - type WizardPrompter, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import type { WizardPrompter } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../runtime-api.js"; import { nostrSetupWizard } from "./setup-surface.js"; diff --git a/extensions/nvidia/index.test.ts b/extensions/nvidia/index.test.ts index 32bb070eb30..abb72bb8e1c 100644 --- a/extensions/nvidia/index.test.ts +++ b/extensions/nvidia/index.test.ts @@ -2,7 +2,7 @@ import fs from "node:fs"; import { registerSingleProviderPlugin, resolveProviderPluginChoice, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; diff --git a/extensions/ollama/provider-discovery.test.ts b/extensions/ollama/provider-discovery.test.ts index 948aebc1eb8..31bed266639 100644 --- a/extensions/ollama/provider-discovery.test.ts +++ b/extensions/ollama/provider-discovery.test.ts @@ -1,8 +1,9 @@ import { mkdtempSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import type { ModelDefinitionConfig } from "openclaw/plugin-sdk/provider-onboard"; -import { type OpenClawConfig, withFetchPreconnect } from "openclaw/plugin-sdk/testing"; +import { withFetchPreconnect } from "openclaw/plugin-sdk/test-env"; import { afterEach, describe, expect, it, vi } from "vitest"; import { ollamaProviderDiscovery } from "./provider-discovery.js"; diff --git a/extensions/ollama/src/provider-models.test.ts b/extensions/ollama/src/provider-models.test.ts index 67aac923986..a87b7a3c50d 100644 --- a/extensions/ollama/src/provider-models.test.ts +++ b/extensions/ollama/src/provider-models.test.ts @@ -1,4 +1,4 @@ -import { jsonResponse, requestBodyText, requestUrl } from "openclaw/plugin-sdk/testing"; +import { jsonResponse, requestBodyText, requestUrl } from "openclaw/plugin-sdk/test-env"; import { afterEach, describe, expect, it, vi } from "vitest"; import { buildOllamaModelDefinition, diff --git a/extensions/ollama/src/setup.test.ts b/extensions/ollama/src/setup.test.ts index 3d56b61b299..a8c118aa75b 100644 --- a/extensions/ollama/src/setup.test.ts +++ b/extensions/ollama/src/setup.test.ts @@ -1,6 +1,6 @@ import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; import type { WizardPrompter } from "openclaw/plugin-sdk/setup"; -import { jsonResponse, requestBodyText, requestUrl } from "openclaw/plugin-sdk/testing"; +import { jsonResponse, requestBodyText, requestUrl } from "openclaw/plugin-sdk/test-env"; import { afterEach, describe, expect, it, vi } from "vitest"; import { resetOllamaModelShowInfoCacheForTest } from "./provider-models.js"; import { diff --git a/extensions/openai/index.test.ts b/extensions/openai/index.test.ts index ef1b02abb41..0b2b9484f91 100644 --- a/extensions/openai/index.test.ts +++ b/extensions/openai/index.test.ts @@ -1,9 +1,12 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { createTestPluginApi } from "openclaw/plugin-sdk/plugin-test-api"; +import { + registerProviderPlugin, + requireRegisteredProvider, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import * as providerAuth from "openclaw/plugin-sdk/provider-auth-runtime"; import * as providerHttp from "openclaw/plugin-sdk/provider-http"; import type { ProviderPlugin } from "openclaw/plugin-sdk/provider-model-shared"; -import { registerProviderPlugin, requireRegisteredProvider } from "openclaw/plugin-sdk/testing"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { buildOpenAIImageGenerationProvider } from "./image-generation-provider.js"; import plugin from "./index.js"; diff --git a/extensions/openai/media-understanding-provider.test.ts b/extensions/openai/media-understanding-provider.test.ts index a66cadc59f4..d76ce04dd41 100644 --- a/extensions/openai/media-understanding-provider.test.ts +++ b/extensions/openai/media-understanding-provider.test.ts @@ -2,7 +2,7 @@ import { createAuthCaptureJsonFetch, createRequestCaptureJsonFetch, installPinnedHostnameTestHooks, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { transcribeOpenAiAudio } from "./media-understanding-provider.js"; diff --git a/extensions/openai/openai-tts.live.test.ts b/extensions/openai/openai-tts.live.test.ts index d7cd26d9dfd..baa6f2b43fa 100644 --- a/extensions/openai/openai-tts.live.test.ts +++ b/extensions/openai/openai-tts.live.test.ts @@ -1,4 +1,4 @@ -import { isLiveTestEnabled } from "openclaw/plugin-sdk/testing"; +import { isLiveTestEnabled } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { buildOpenAISpeechProvider } from "./speech-provider.js"; diff --git a/extensions/openai/openai.live.test.ts b/extensions/openai/openai.live.test.ts index 95b62531f07..e02c82a4197 100644 --- a/extensions/openai/openai.live.test.ts +++ b/extensions/openai/openai.live.test.ts @@ -7,8 +7,11 @@ import OpenAI from "openai"; import type { ResolvedTtsConfig } from "openclaw/plugin-sdk/agent-runtime"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { encodePngRgba, fillPixel } from "openclaw/plugin-sdk/media-runtime"; +import { + registerProviderPlugin, + requireRegisteredProvider, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { getRuntimeConfig } from "openclaw/plugin-sdk/runtime-config-snapshot"; -import { registerProviderPlugin, requireRegisteredProvider } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; import { runRealtimeSttLiveTest } from "../../test/helpers/stt-live-audio.js"; import plugin from "./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 5c0f082d795..ec0b4c4c728 100644 --- a/extensions/openai/test-support/provider-catalog.contract-test-support.ts +++ b/extensions/openai/test-support/provider-catalog.contract-test-support.ts @@ -1,3 +1,7 @@ +import { + registerProviderPlugin, + requireRegisteredProvider, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { expectAugmentedCodexCatalog, expectedAugmentedOpenaiCodexCatalogEntriesWithGpt55, @@ -7,7 +11,6 @@ import { loadBundledPluginPublicSurface, } 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/index.test.ts b/extensions/opencode-go/index.test.ts index c0b5d6c47d2..8b1dc52135d 100644 --- a/extensions/opencode-go/index.test.ts +++ b/extensions/opencode-go/index.test.ts @@ -1,5 +1,8 @@ import { getModels } from "@mariozechner/pi-ai"; -import { registerProviderPlugin, registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; +import { + registerProviderPlugin, + registerSingleProviderPlugin, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import { expectPassthroughReplayPolicy } from "../../test/helpers/provider-replay-policy.ts"; import plugin from "./index.js"; diff --git a/extensions/opencode/index.test.ts b/extensions/opencode/index.test.ts index 768b79330d6..599e3042930 100644 --- a/extensions/opencode/index.test.ts +++ b/extensions/opencode/index.test.ts @@ -1,4 +1,7 @@ -import { registerProviderPlugin, requireRegisteredProvider } from "openclaw/plugin-sdk/testing"; +import { + registerProviderPlugin, + requireRegisteredProvider, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import { expectPassthroughReplayPolicy } from "../../test/helpers/provider-replay-policy.ts"; import plugin from "./index.js"; diff --git a/extensions/openrouter/index.test.ts b/extensions/openrouter/index.test.ts index 97bb1efabb3..7faf5d5cfc4 100644 --- a/extensions/openrouter/index.test.ts +++ b/extensions/openrouter/index.test.ts @@ -1,4 +1,7 @@ -import { registerProviderPlugin, registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; +import { + registerProviderPlugin, + registerSingleProviderPlugin, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it, vi } from "vitest"; import { expectPassthroughReplayPolicy } from "../../test/helpers/provider-replay-policy.ts"; import openrouterPlugin from "./index.js"; diff --git a/extensions/openrouter/openrouter.live.test.ts b/extensions/openrouter/openrouter.live.test.ts index 8f2e24c4c73..6ba22e869a1 100644 --- a/extensions/openrouter/openrouter.live.test.ts +++ b/extensions/openrouter/openrouter.live.test.ts @@ -1,6 +1,9 @@ import { AuthStorage, ModelRegistry } from "@mariozechner/pi-coding-agent"; import OpenAI from "openai"; -import { registerProviderPlugin, requireRegisteredProvider } from "openclaw/plugin-sdk/testing"; +import { + registerProviderPlugin, + requireRegisteredProvider, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; diff --git a/extensions/perplexity/src/perplexity-web-search-provider.test.ts b/extensions/perplexity/src/perplexity-web-search-provider.test.ts index 87bf1f2443f..8724210859c 100644 --- a/extensions/perplexity/src/perplexity-web-search-provider.test.ts +++ b/extensions/perplexity/src/perplexity-web-search-provider.test.ts @@ -1,4 +1,4 @@ -import { withEnv } from "openclaw/plugin-sdk/testing"; +import { withEnv } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { __testing } from "./perplexity-web-search-provider.runtime.js"; diff --git a/extensions/qa-channel/src/channel.test.ts b/extensions/qa-channel/src/channel.test.ts index d97c1c06217..3d09d42192a 100644 --- a/extensions/qa-channel/src/channel.test.ts +++ b/extensions/qa-channel/src/channel.test.ts @@ -4,7 +4,7 @@ import { createTestRegistry, resetPluginRuntimeStateForTest, setActivePluginRegistry, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { extractToolPayload } from "openclaw/plugin-sdk/tool-payload"; import { afterEach, describe, expect, it } from "vitest"; import { createQaBusState, startQaBusServer } from "../../qa-lab/bus-api.js"; diff --git a/extensions/qianfan/index.test.ts b/extensions/qianfan/index.test.ts index b898f83161b..a25d323efe6 100644 --- a/extensions/qianfan/index.test.ts +++ b/extensions/qianfan/index.test.ts @@ -1,8 +1,8 @@ -import { resolveAgentModelPrimaryValue } from "openclaw/plugin-sdk/provider-onboard"; import { registerSingleProviderPlugin, resolveProviderPluginChoice, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import { resolveAgentModelPrimaryValue } from "openclaw/plugin-sdk/provider-onboard"; import { describe, expect, it } from "vitest"; import { runSingleProviderCatalog } from "../test-support/provider-model-test-helpers.js"; import qianfanPlugin from "./index.js"; diff --git a/extensions/qwen/index.test.ts b/extensions/qwen/index.test.ts index 5949bf61135..ba40f3b1c03 100644 --- a/extensions/qwen/index.test.ts +++ b/extensions/qwen/index.test.ts @@ -1,4 +1,5 @@ -import { type OpenClawConfig, registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; +import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import qwenPlugin from "./index.js"; diff --git a/extensions/qwen/media-understanding-provider.test.ts b/extensions/qwen/media-understanding-provider.test.ts index 9eb618be86b..3b747aa1812 100644 --- a/extensions/qwen/media-understanding-provider.test.ts +++ b/extensions/qwen/media-understanding-provider.test.ts @@ -1,7 +1,7 @@ import { createRequestCaptureJsonFetch, installPinnedHostnameTestHooks, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { describeQwenVideo } from "./media-understanding-provider.js"; diff --git a/extensions/senseaudio/media-understanding-provider.test.ts b/extensions/senseaudio/media-understanding-provider.test.ts index 45ba23af961..a70dd16f68e 100644 --- a/extensions/senseaudio/media-understanding-provider.test.ts +++ b/extensions/senseaudio/media-understanding-provider.test.ts @@ -7,7 +7,7 @@ import { createAuthCaptureJsonFetch, createRequestCaptureJsonFetch, installPinnedHostnameTestHooks, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { transcribeSenseAudioAudio } from "./media-understanding-provider.js"; diff --git a/extensions/shared/windows-cmd-shim-test-fixtures.ts b/extensions/shared/windows-cmd-shim-test-fixtures.ts index ccaa146100e..571629c6708 100644 --- a/extensions/shared/windows-cmd-shim-test-fixtures.ts +++ b/extensions/shared/windows-cmd-shim-test-fixtures.ts @@ -1 +1 @@ -export { createWindowsCmdShimFixture } from "openclaw/plugin-sdk/testing"; +export { createWindowsCmdShimFixture } from "openclaw/plugin-sdk/test-env"; diff --git a/extensions/signal/src/core.test.ts b/extensions/signal/src/core.test.ts index 71c26035969..b0248b8c8ff 100644 --- a/extensions/signal/src/core.test.ts +++ b/extensions/signal/src/core.test.ts @@ -1,5 +1,5 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; -import { createPluginSetupWizardStatus } from "openclaw/plugin-sdk/testing"; +import { createPluginSetupWizardStatus } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it, vi } from "vitest"; import { signalPlugin } from "./channel.js"; import * as clientModule from "./client.js"; diff --git a/extensions/signal/src/monitor.tool-result.test-harness.ts b/extensions/signal/src/monitor.tool-result.test-harness.ts index 0f569e5c83b..b1d16d680ed 100644 --- a/extensions/signal/src/monitor.tool-result.test-harness.ts +++ b/extensions/signal/src/monitor.tool-result.test-harness.ts @@ -1,4 +1,4 @@ -import type { MockFn } from "openclaw/plugin-sdk/testing"; +import type { MockFn } from "openclaw/plugin-sdk/plugin-test-runtime"; import { beforeEach, vi } from "vitest"; import type { SignalDaemonExitEvent, SignalDaemonHandle } from "./daemon.js"; diff --git a/extensions/slack/src/channel.test.ts b/extensions/slack/src/channel.test.ts index a4430c54b44..8d7d7bd9ab3 100644 --- a/extensions/slack/src/channel.test.ts +++ b/extensions/slack/src/channel.test.ts @@ -1,4 +1,4 @@ -import { createRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { createRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { slackPlugin } from "./channel.js"; import { slackOutbound } from "./outbound-adapter.js"; diff --git a/extensions/slack/src/directory-contract.test.ts b/extensions/slack/src/directory-contract.test.ts index 8311eae93ff..b6e27107842 100644 --- a/extensions/slack/src/directory-contract.test.ts +++ b/extensions/slack/src/directory-contract.test.ts @@ -1,5 +1,5 @@ import type { BaseProbeResult } from "openclaw/plugin-sdk/channel-contract"; -import type { OpenClawConfig } from "openclaw/plugin-sdk/testing"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { describe, expect, expectTypeOf, it } from "vitest"; import { expectDirectoryIds } from "../../../test/helpers/channels/directory-ids.js"; import { diff --git a/extensions/slack/src/inbound-context.contract.test.ts b/extensions/slack/src/inbound-context.contract.test.ts index 5b6ec58821d..2bb09b77469 100644 --- a/extensions/slack/src/inbound-context.contract.test.ts +++ b/extensions/slack/src/inbound-context.contract.test.ts @@ -1,6 +1,6 @@ import { expectChannelInboundContextContract } from "openclaw/plugin-sdk/channel-contract-testing"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; -import { createTempHomeEnv } from "openclaw/plugin-sdk/testing"; +import { createTempHomeEnv } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { createInboundSlackTestContext, diff --git a/extensions/slack/src/setup-surface.test.ts b/extensions/slack/src/setup-surface.test.ts index 6225c5a5ec9..4cb1b3ef72c 100644 --- a/extensions/slack/src/setup-surface.test.ts +++ b/extensions/slack/src/setup-surface.test.ts @@ -2,8 +2,8 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { createTestWizardPrompter, runSetupWizardFinalize, - type WizardPrompter, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import type { WizardPrompter } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it, vi } from "vitest"; import { createSlackSetupWizardBase } from "./setup-core.js"; diff --git a/extensions/synology-chat/src/channel.test.ts b/extensions/synology-chat/src/channel.test.ts index 6eb2b1adff4..e24876d7cf1 100644 --- a/extensions/synology-chat/src/channel.test.ts +++ b/extensions/synology-chat/src/channel.test.ts @@ -1,4 +1,4 @@ -import { createPluginSetupWizardStatus } from "openclaw/plugin-sdk/testing"; +import { createPluginSetupWizardStatus } from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type { ResolvedSynologyChatAccount } from "./types.js"; diff --git a/extensions/synology-chat/src/core.test.ts b/extensions/synology-chat/src/core.test.ts index b82d0e166e0..3ffef2bac73 100644 --- a/extensions/synology-chat/src/core.test.ts +++ b/extensions/synology-chat/src/core.test.ts @@ -3,8 +3,8 @@ import { createPluginSetupWizardConfigure, createTestWizardPrompter, runSetupWizardConfigure, - type WizardPrompter, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import type { WizardPrompter } from "openclaw/plugin-sdk/plugin-test-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { listAccountIds, resolveAccount } from "./accounts.js"; import { SynologyChatChannelConfigSchema } from "./config-schema.js"; diff --git a/extensions/telegram/src/account-inspect.test.ts b/extensions/telegram/src/account-inspect.test.ts index dccd3b575ac..aec6ff465ba 100644 --- a/extensions/telegram/src/account-inspect.test.ts +++ b/extensions/telegram/src/account-inspect.test.ts @@ -2,7 +2,7 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; -import { withEnv } from "openclaw/plugin-sdk/testing"; +import { withEnv } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { inspectTelegramAccount } from "./account-inspect.js"; diff --git a/extensions/telegram/src/accounts.test.ts b/extensions/telegram/src/accounts.test.ts index b14e57d3ae2..40a27669be1 100644 --- a/extensions/telegram/src/accounts.test.ts +++ b/extensions/telegram/src/accounts.test.ts @@ -1,6 +1,6 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import * as runtimeEnvModule from "openclaw/plugin-sdk/runtime-env"; -import { withEnv } from "openclaw/plugin-sdk/testing"; +import { withEnv } from "openclaw/plugin-sdk/test-env"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { createTelegramActionGate, diff --git a/extensions/telegram/src/action-runtime.test.ts b/extensions/telegram/src/action-runtime.test.ts index bdae070cd83..ec2dbef091c 100644 --- a/extensions/telegram/src/action-runtime.test.ts +++ b/extensions/telegram/src/action-runtime.test.ts @@ -1,5 +1,5 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; -import { captureEnv } from "openclaw/plugin-sdk/testing"; +import { captureEnv } from "openclaw/plugin-sdk/test-env"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { handleTelegramAction, telegramActionRuntime } from "./action-runtime.js"; diff --git a/extensions/telegram/src/bot-native-commands.test-helpers.ts b/extensions/telegram/src/bot-native-commands.test-helpers.ts index ffd00f747e9..5ee52dfd155 100644 --- a/extensions/telegram/src/bot-native-commands.test-helpers.ts +++ b/extensions/telegram/src/bot-native-commands.test-helpers.ts @@ -1,8 +1,8 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import type { ChannelGroupPolicy } from "openclaw/plugin-sdk/config-types"; import type { TelegramAccountConfig } from "openclaw/plugin-sdk/config-types"; +import type { MockFn } from "openclaw/plugin-sdk/plugin-test-runtime"; import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; -import type { MockFn } from "openclaw/plugin-sdk/testing"; import { vi } from "vitest"; import { createNativeCommandTestParams } from "./bot-native-commands.fixture-test-support.js"; import type { RegisterTelegramNativeCommandsParams } from "./bot-native-commands.js"; diff --git a/extensions/telegram/src/bot.create-telegram-bot.channel-post-media.test.ts b/extensions/telegram/src/bot.create-telegram-bot.channel-post-media.test.ts index 34675e7ebc7..41b9113215f 100644 --- a/extensions/telegram/src/bot.create-telegram-bot.channel-post-media.test.ts +++ b/extensions/telegram/src/bot.create-telegram-bot.channel-post-media.test.ts @@ -1,4 +1,4 @@ -import { useFrozenTime, useRealTime } from "openclaw/plugin-sdk/testing"; +import { useFrozenTime, useRealTime } from "openclaw/plugin-sdk/test-env"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const harness = await import("./bot.create-telegram-bot.test-harness.js"); diff --git a/extensions/telegram/src/bot.create-telegram-bot.test-harness.ts b/extensions/telegram/src/bot.create-telegram-bot.test-harness.ts index 3d1e208ce0e..05c3b3ac024 100644 --- a/extensions/telegram/src/bot.create-telegram-bot.test-harness.ts +++ b/extensions/telegram/src/bot.create-telegram-bot.test-harness.ts @@ -1,6 +1,6 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; +import type { MockFn } from "openclaw/plugin-sdk/plugin-test-runtime"; import type { GetReplyOptions, MsgContext } from "openclaw/plugin-sdk/reply-runtime"; -import type { MockFn } from "openclaw/plugin-sdk/testing"; import { beforeEach, vi } from "vitest"; import type { TelegramBotDeps } from "./bot-deps.js"; diff --git a/extensions/telegram/src/bot.test.ts b/extensions/telegram/src/bot.test.ts index 672abae3d7a..0d765a6894f 100644 --- a/extensions/telegram/src/bot.test.ts +++ b/extensions/telegram/src/bot.test.ts @@ -5,7 +5,7 @@ import { registerPluginInteractiveHandler, } from "openclaw/plugin-sdk/plugin-runtime"; import { loadSessionStore } from "openclaw/plugin-sdk/session-store-runtime"; -import { mockPinnedHostnameResolution } from "openclaw/plugin-sdk/testing"; +import { mockPinnedHostnameResolution } from "openclaw/plugin-sdk/test-env"; import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import type { TelegramInteractiveHandlerContext } from "./interactive-dispatch.js"; const { diff --git a/extensions/telegram/src/directory-contract.test.ts b/extensions/telegram/src/directory-contract.test.ts index e06d9456236..133ce3dfe56 100644 --- a/extensions/telegram/src/directory-contract.test.ts +++ b/extensions/telegram/src/directory-contract.test.ts @@ -1,5 +1,6 @@ import type { BaseProbeResult, BaseTokenResolution } from "openclaw/plugin-sdk/channel-contract"; -import { type OpenClawConfig, withEnvAsync } from "openclaw/plugin-sdk/testing"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; +import { withEnvAsync } from "openclaw/plugin-sdk/test-env"; import { describe, expect, expectTypeOf, it } from "vitest"; import { expectDirectoryIds } from "../../../test/helpers/channels/directory-ids.js"; import { diff --git a/extensions/telegram/src/inbound-context.contract.test.ts b/extensions/telegram/src/inbound-context.contract.test.ts index c5aec97766e..adf2f2b01b2 100644 --- a/extensions/telegram/src/inbound-context.contract.test.ts +++ b/extensions/telegram/src/inbound-context.contract.test.ts @@ -1,5 +1,5 @@ import { expectChannelInboundContextContract } from "openclaw/plugin-sdk/channel-contract-testing"; -import { type OpenClawConfig } from "openclaw/plugin-sdk/testing"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { describe, it } from "vitest"; import { buildTelegramMessageContextForTest } from "./bot-message-context.test-harness.js"; diff --git a/extensions/telegram/src/probe.test.ts b/extensions/telegram/src/probe.test.ts index 95956a699db..d19e08f3368 100644 --- a/extensions/telegram/src/probe.test.ts +++ b/extensions/telegram/src/probe.test.ts @@ -1,4 +1,4 @@ -import { withFetchPreconnect } from "openclaw/plugin-sdk/testing"; +import { withFetchPreconnect } from "openclaw/plugin-sdk/test-env"; import { afterEach, describe, expect, it, vi, type Mock } from "vitest"; import { probeTelegram, resetTelegramProbeFetcherCacheForTests } from "./probe.js"; diff --git a/extensions/telegram/src/send.test-harness.ts b/extensions/telegram/src/send.test-harness.ts index c5cdc3967c9..1e0a3164309 100644 --- a/extensions/telegram/src/send.test-harness.ts +++ b/extensions/telegram/src/send.test-harness.ts @@ -5,7 +5,7 @@ import { kindFromMime, normalizePollInput, } from "openclaw/plugin-sdk/media-runtime"; -import type { MockFn } from "openclaw/plugin-sdk/testing"; +import type { MockFn } from "openclaw/plugin-sdk/plugin-test-runtime"; import { beforeEach, vi } from "vitest"; const { botApi, botCtorSpy } = vi.hoisted(() => ({ diff --git a/extensions/telegram/src/target-writeback.test-shared.ts b/extensions/telegram/src/target-writeback.test-shared.ts index 99617d88989..5777165eff6 100644 --- a/extensions/telegram/src/target-writeback.test-shared.ts +++ b/extensions/telegram/src/target-writeback.test-shared.ts @@ -1,4 +1,4 @@ -import type { OpenClawConfig } from "openclaw/plugin-sdk/testing"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { beforeAll, beforeEach, describe, expect, it, vi, type Mock } from "vitest"; type UnknownMock = Mock<(...args: unknown[]) => unknown>; diff --git a/extensions/telegram/src/token.test.ts b/extensions/telegram/src/token.test.ts index 67b34073153..9c1e6d87a95 100644 --- a/extensions/telegram/src/token.test.ts +++ b/extensions/telegram/src/token.test.ts @@ -2,7 +2,7 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; -import { withStateDirEnv } from "openclaw/plugin-sdk/testing"; +import { withStateDirEnv } from "openclaw/plugin-sdk/test-env"; import { afterEach, describe, expect, it, vi } from "vitest"; import { resolveTelegramToken } from "./token.js"; import { readTelegramUpdateOffset, writeTelegramUpdateOffset } from "./update-offset-store.js"; diff --git a/extensions/telegram/src/update-offset-store.test.ts b/extensions/telegram/src/update-offset-store.test.ts index 03ebf7407f1..c7ca7d956dd 100644 --- a/extensions/telegram/src/update-offset-store.test.ts +++ b/extensions/telegram/src/update-offset-store.test.ts @@ -1,6 +1,6 @@ import fs from "node:fs/promises"; import path from "node:path"; -import { withStateDirEnv } from "openclaw/plugin-sdk/testing"; +import { withStateDirEnv } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import { deleteTelegramUpdateOffset, diff --git a/extensions/test-support/generation-live-test-helpers.ts b/extensions/test-support/generation-live-test-helpers.ts index 6539610d83a..c1cdfd54611 100644 --- a/extensions/test-support/generation-live-test-helpers.ts +++ b/extensions/test-support/generation-live-test-helpers.ts @@ -1 +1 @@ -export { maybeLoadShellEnvForGenerationProviders } from "openclaw/plugin-sdk/testing"; +export { maybeLoadShellEnvForGenerationProviders } from "openclaw/plugin-sdk/test-env"; diff --git a/extensions/tlon/src/core.test.ts b/extensions/tlon/src/core.test.ts index 1235c6a343b..2e8cb870a9f 100644 --- a/extensions/tlon/src/core.test.ts +++ b/extensions/tlon/src/core.test.ts @@ -3,8 +3,8 @@ import { createPluginSetupWizardStatus, createTestWizardPrompter, runSetupWizardConfigure, - type WizardPrompter, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import type { WizardPrompter } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../api.js"; import { TlonAuthorizationSchema, TlonConfigSchema } from "./config-schema.js"; diff --git a/extensions/venice/index.test.ts b/extensions/venice/index.test.ts index 62992657175..38ed662de5d 100644 --- a/extensions/venice/index.test.ts +++ b/extensions/venice/index.test.ts @@ -1,4 +1,4 @@ -import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; +import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; diff --git a/extensions/video-generation-providers.live.test.ts b/extensions/video-generation-providers.live.test.ts index 7bc2dc47edd..91ae29db3b8 100644 --- a/extensions/video-generation-providers.live.test.ts +++ b/extensions/video-generation-providers.live.test.ts @@ -3,6 +3,10 @@ import { resolveOpenClawAgentDir, } from "openclaw/plugin-sdk/agent-runtime"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; +import { + registerProviderPlugin, + requireRegisteredProvider, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { getRuntimeConfig } from "openclaw/plugin-sdk/runtime-config-snapshot"; import { DEFAULT_LIVE_VIDEO_MODELS, @@ -26,17 +30,17 @@ import { parseProviderModelMap, parseVideoGenerationModelRef, redactLiveApiKey, - registerProviderPlugin, - requireRegisteredProvider, resolveConfiguredLiveVideoModels, resolveLiveVideoAuthStore, resolveLiveVideoResolution, - type GeneratedVideoAsset, - type VideoGenerationMode, - type VideoGenerationModeCapabilities, - type VideoGenerationProvider, - type VideoGenerationRequest, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/test-env"; +import type { + GeneratedVideoAsset, + VideoGenerationMode, + VideoGenerationModeCapabilities, + VideoGenerationProvider, + VideoGenerationRequest, +} from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import alibabaPlugin from "./alibaba/index.js"; import byteplusPlugin from "./byteplus/index.js"; diff --git a/extensions/volcengine/index.test.ts b/extensions/volcengine/index.test.ts index 588d1bc3c7c..621b9b480bf 100644 --- a/extensions/volcengine/index.test.ts +++ b/extensions/volcengine/index.test.ts @@ -1,6 +1,6 @@ import { readFileSync } from "node:fs"; import { resolve } from "node:path"; -import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; +import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; import { DOUBAO_CODING_MODEL_CATALOG, DOUBAO_MODEL_CATALOG } from "./models.js"; diff --git a/extensions/vydra/image-generation-provider.test.ts b/extensions/vydra/image-generation-provider.test.ts index 2a54090f731..ad01b383f00 100644 --- a/extensions/vydra/image-generation-provider.test.ts +++ b/extensions/vydra/image-generation-provider.test.ts @@ -1,4 +1,4 @@ -import { installPinnedHostnameTestHooks } from "openclaw/plugin-sdk/testing"; +import { installPinnedHostnameTestHooks } from "openclaw/plugin-sdk/test-env"; import { afterEach, describe, expect, it, vi } from "vitest"; import { buildVydraImageGenerationProvider } from "./image-generation-provider.js"; import { diff --git a/extensions/vydra/speech-provider.test.ts b/extensions/vydra/speech-provider.test.ts index 4a0370ea996..8b0049f0d82 100644 --- a/extensions/vydra/speech-provider.test.ts +++ b/extensions/vydra/speech-provider.test.ts @@ -1,4 +1,4 @@ -import { installPinnedHostnameTestHooks } from "openclaw/plugin-sdk/testing"; +import { installPinnedHostnameTestHooks } from "openclaw/plugin-sdk/test-env"; import { afterEach, describe, expect, it, vi } from "vitest"; import { buildVydraSpeechProvider } from "./speech-provider.js"; diff --git a/extensions/vydra/video-generation-provider.test.ts b/extensions/vydra/video-generation-provider.test.ts index de8f54481a2..db8ac906f80 100644 --- a/extensions/vydra/video-generation-provider.test.ts +++ b/extensions/vydra/video-generation-provider.test.ts @@ -1,4 +1,4 @@ -import { installPinnedHostnameTestHooks } from "openclaw/plugin-sdk/testing"; +import { installPinnedHostnameTestHooks } from "openclaw/plugin-sdk/test-env"; import { afterEach, describe, expect, it, vi } from "vitest"; import { expectExplicitVideoGenerationCapabilities } from "../../test/helpers/media-generation/provider-capability-assertions.js"; import { diff --git a/extensions/vydra/vydra.live.test.ts b/extensions/vydra/vydra.live.test.ts index 2109b4875cc..9b4e933a2d9 100644 --- a/extensions/vydra/vydra.live.test.ts +++ b/extensions/vydra/vydra.live.test.ts @@ -1,8 +1,8 @@ import { - isLiveTestEnabled, registerProviderPlugin, requireRegisteredProvider, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import { isLiveTestEnabled } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; diff --git a/extensions/webhooks/src/http.test.ts b/extensions/webhooks/src/http.test.ts index 2af536874ba..2551acdfcdd 100644 --- a/extensions/webhooks/src/http.test.ts +++ b/extensions/webhooks/src/http.test.ts @@ -1,6 +1,7 @@ import { EventEmitter } from "node:events"; import type { IncomingMessage } from "node:http"; -import { createMockServerResponse, createRuntimeTaskFlow } from "openclaw/plugin-sdk/testing"; +import { createRuntimeTaskFlow } from "openclaw/plugin-sdk/plugin-test-runtime"; +import { createMockServerResponse } from "openclaw/plugin-sdk/test-env"; import { afterEach, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../runtime-api.js"; import { createTaskFlowWebhookRequestHandler, type TaskFlowWebhookTarget } from "./http.js"; diff --git a/extensions/whatsapp/src/accounts.whatsapp-auth.test.ts b/extensions/whatsapp/src/accounts.whatsapp-auth.test.ts index d676c4ed7aa..af67c8ea6be 100644 --- a/extensions/whatsapp/src/accounts.whatsapp-auth.test.ts +++ b/extensions/whatsapp/src/accounts.whatsapp-auth.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; -import { captureEnv } from "openclaw/plugin-sdk/testing"; +import { captureEnv } from "openclaw/plugin-sdk/test-env"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { hasAnyWhatsAppAuth, listWhatsAppAuthDirs } from "./accounts.js"; diff --git a/extensions/whatsapp/src/auto-reply.test-harness.ts b/extensions/whatsapp/src/auto-reply.test-harness.ts index efa957d8396..d0f0c7db76c 100644 --- a/extensions/whatsapp/src/auto-reply.test-harness.ts +++ b/extensions/whatsapp/src/auto-reply.test-harness.ts @@ -5,7 +5,7 @@ import os from "node:os"; import path from "node:path"; import { resetInboundDedupe } from "openclaw/plugin-sdk/reply-dedupe"; import { resetLogger, setLoggerOverride } from "openclaw/plugin-sdk/runtime-env"; -import { mockPinnedHostnameResolution } from "openclaw/plugin-sdk/testing"; +import { mockPinnedHostnameResolution } from "openclaw/plugin-sdk/test-env"; import { afterAll, afterEach, beforeAll, beforeEach, vi, type Mock } from "vitest"; import type { WebInboundMessage, WebListenerCloseReason } from "./inbound.js"; import { diff --git a/extensions/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts b/extensions/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts index 6d9986deaa2..0e1dd5b345b 100644 --- a/extensions/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts +++ b/extensions/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts @@ -3,7 +3,7 @@ import crypto from "node:crypto"; import fs from "node:fs/promises"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { setLoggerOverride } from "openclaw/plugin-sdk/runtime-env"; -import { withEnvAsync } from "openclaw/plugin-sdk/testing"; +import { withEnvAsync } from "openclaw/plugin-sdk/test-env"; import { beforeAll, describe, expect, it, vi } from "vitest"; import { escapeRegExp, formatEnvelopeTimestamp } from "../../../test/helpers/envelope-timestamp.js"; import { WhatsAppAuthUnstableError } from "./auth-store.js"; diff --git a/extensions/whatsapp/src/auto-reply/web-auto-reply-utils.test.ts b/extensions/whatsapp/src/auto-reply/web-auto-reply-utils.test.ts index 644cb14d013..06211c1a355 100644 --- a/extensions/whatsapp/src/auto-reply/web-auto-reply-utils.test.ts +++ b/extensions/whatsapp/src/auto-reply/web-auto-reply-utils.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; import { saveSessionStore } from "openclaw/plugin-sdk/session-store-runtime"; -import { withTempDir } from "openclaw/plugin-sdk/testing"; +import { withTempDir } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it, vi } from "vitest"; import { debugMention, diff --git a/extensions/whatsapp/src/channel.setup.test.ts b/extensions/whatsapp/src/channel.setup.test.ts index c083aea3623..77d75a77453 100644 --- a/extensions/whatsapp/src/channel.setup.test.ts +++ b/extensions/whatsapp/src/channel.setup.test.ts @@ -1,6 +1,6 @@ +import { createQueuedWizardPrompter } from "openclaw/plugin-sdk/plugin-test-runtime"; import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/routing"; import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; -import { createQueuedWizardPrompter } from "openclaw/plugin-sdk/testing"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { WHATSAPP_AUTH_UNSTABLE_CODE } from "./auth-store.js"; import { whatsappSetupPlugin } from "./channel.setup.js"; diff --git a/extensions/whatsapp/src/directory-contract.test.ts b/extensions/whatsapp/src/directory-contract.test.ts index 51e3b7cd689..7db7bb136db 100644 --- a/extensions/whatsapp/src/directory-contract.test.ts +++ b/extensions/whatsapp/src/directory-contract.test.ts @@ -1,4 +1,4 @@ -import type { OpenClawConfig } from "openclaw/plugin-sdk/testing"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { describe, expect, it } from "vitest"; import { listWhatsAppDirectoryGroupsFromConfig, diff --git a/extensions/whatsapp/src/media.test.ts b/extensions/whatsapp/src/media.test.ts index 91c3fcc41fe..a03edff1a84 100644 --- a/extensions/whatsapp/src/media.test.ts +++ b/extensions/whatsapp/src/media.test.ts @@ -3,8 +3,8 @@ import os from "node:os"; import path from "node:path"; import { resolveStateDir } from "openclaw/plugin-sdk/state-paths"; import { resolvePreferredOpenClawTmpDir } from "openclaw/plugin-sdk/temp-path"; -import { captureEnv } from "openclaw/plugin-sdk/testing"; -import { mockPinnedHostnameResolution } from "openclaw/plugin-sdk/testing"; +import { captureEnv } from "openclaw/plugin-sdk/test-env"; +import { mockPinnedHostnameResolution } from "openclaw/plugin-sdk/test-env"; import { optimizeImageToPng } from "openclaw/plugin-sdk/web-media"; import sharp from "sharp"; import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from "vitest"; diff --git a/extensions/whatsapp/src/setup-surface.test.ts b/extensions/whatsapp/src/setup-surface.test.ts index 188aa698b36..ba3d100fca0 100644 --- a/extensions/whatsapp/src/setup-surface.test.ts +++ b/extensions/whatsapp/src/setup-surface.test.ts @@ -1,10 +1,10 @@ -import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; -import { DEFAULT_ACCOUNT_ID, type OpenClawConfig } from "openclaw/plugin-sdk/setup"; import { createPluginSetupWizardStatus, createQueuedWizardPrompter, runSetupWizardFinalize, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; +import { DEFAULT_ACCOUNT_ID, type OpenClawConfig } from "openclaw/plugin-sdk/setup"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { whatsappSetupWizard } from "./setup-surface.js"; import { diff --git a/extensions/xai/code-execution.test.ts b/extensions/xai/code-execution.test.ts index 4810bebcc8a..aa10ac6050e 100644 --- a/extensions/xai/code-execution.test.ts +++ b/extensions/xai/code-execution.test.ts @@ -1,4 +1,4 @@ -import { withFetchPreconnect } from "openclaw/plugin-sdk/testing"; +import { withFetchPreconnect } from "openclaw/plugin-sdk/test-env"; import { afterEach, describe, expect, it, vi } from "vitest"; import { createCodeExecutionTool } from "./code-execution.js"; diff --git a/extensions/xai/index.test.ts b/extensions/xai/index.test.ts index 9fbe33cbe24..497c9c9ec8d 100644 --- a/extensions/xai/index.test.ts +++ b/extensions/xai/index.test.ts @@ -1,6 +1,9 @@ import type { OpenClawPluginApi } from "openclaw/plugin-sdk/plugin-entry"; import { createTestPluginApi } from "openclaw/plugin-sdk/plugin-test-api"; -import { registerProviderPlugin, registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; +import { + registerProviderPlugin, + registerSingleProviderPlugin, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; import setupPlugin from "./setup-api.js"; diff --git a/extensions/xai/web-search.test.ts b/extensions/xai/web-search.test.ts index 18176d6d235..8c47ed5edd7 100644 --- a/extensions/xai/web-search.test.ts +++ b/extensions/xai/web-search.test.ts @@ -1,6 +1,6 @@ import { NON_ENV_SECRETREF_MARKER } from "openclaw/plugin-sdk/provider-auth-runtime"; import { createNonExitingRuntime } from "openclaw/plugin-sdk/runtime-env"; -import { withEnv, withEnvAsync } from "openclaw/plugin-sdk/testing"; +import { withEnv, withEnvAsync } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it, vi } from "vitest"; import { createWizardPrompter } from "../../test/helpers/wizard-prompter.js"; import { resolveXaiCatalogEntry } from "./model-definitions.js"; diff --git a/extensions/xai/x-search.test.ts b/extensions/xai/x-search.test.ts index f6e57052abe..4ee60b2503a 100644 --- a/extensions/xai/x-search.test.ts +++ b/extensions/xai/x-search.test.ts @@ -1,4 +1,4 @@ -import { withFetchPreconnect } from "openclaw/plugin-sdk/testing"; +import { withFetchPreconnect } from "openclaw/plugin-sdk/test-env"; import { afterEach, describe, expect, it, vi } from "vitest"; import { createXSearchTool } from "./x-search.js"; diff --git a/extensions/xai/xai.live.test.ts b/extensions/xai/xai.live.test.ts index 22099794498..04b6e802efb 100644 --- a/extensions/xai/xai.live.test.ts +++ b/extensions/xai/xai.live.test.ts @@ -3,8 +3,11 @@ import os from "node:os"; import path from "node:path"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { encodePngRgba, fillPixel } from "openclaw/plugin-sdk/media-runtime"; +import { + registerProviderPlugin, + requireRegisteredProvider, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { getRuntimeConfig } from "openclaw/plugin-sdk/runtime-config-snapshot"; -import { registerProviderPlugin, requireRegisteredProvider } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; import { runRealtimeSttLiveTest } from "../../test/helpers/stt-live-audio.js"; import plugin from "./index.js"; diff --git a/extensions/xiaomi/xiaomi.live.test.ts b/extensions/xiaomi/xiaomi.live.test.ts index f0a5c42784b..aac129a360a 100644 --- a/extensions/xiaomi/xiaomi.live.test.ts +++ b/extensions/xiaomi/xiaomi.live.test.ts @@ -1,8 +1,8 @@ import { - isLiveTestEnabled, registerProviderPlugin, requireRegisteredProvider, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import { isLiveTestEnabled } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; diff --git a/extensions/zai/index.test.ts b/extensions/zai/index.test.ts index c37d7afd93e..d40ad05953f 100644 --- a/extensions/zai/index.test.ts +++ b/extensions/zai/index.test.ts @@ -1,7 +1,7 @@ import type { StreamFn } from "@mariozechner/pi-agent-core"; import type { Context, Model } from "@mariozechner/pi-ai"; +import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime"; import { buildOpenAICompletionsParams } from "openclaw/plugin-sdk/provider-transport-runtime"; -import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; import plugin from "./index.js"; diff --git a/extensions/zalo/src/monitor.image.polling.test.ts b/extensions/zalo/src/monitor.image.polling.test.ts index 12b9df5f94f..1122f692998 100644 --- a/extensions/zalo/src/monitor.image.polling.test.ts +++ b/extensions/zalo/src/monitor.image.polling.test.ts @@ -1,4 +1,4 @@ -import { createRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { createRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterAll, beforeEach, describe, expect, it } from "vitest"; import { createImageLifecycleCore, diff --git a/extensions/zalo/src/monitor.lifecycle.test.ts b/extensions/zalo/src/monitor.lifecycle.test.ts index eded1b29ad5..8b84780a4b6 100644 --- a/extensions/zalo/src/monitor.lifecycle.test.ts +++ b/extensions/zalo/src/monitor.lifecycle.test.ts @@ -2,7 +2,7 @@ import { createEmptyPluginRegistry, createRuntimeEnv, setActivePluginRegistry, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../runtime-api.js"; import type { ResolvedZaloAccount } from "./accounts.js"; diff --git a/extensions/zalo/src/monitor.polling.media-reply.test.ts b/extensions/zalo/src/monitor.polling.media-reply.test.ts index cbf01b45c26..ff2783dc8eb 100644 --- a/extensions/zalo/src/monitor.polling.media-reply.test.ts +++ b/extensions/zalo/src/monitor.polling.media-reply.test.ts @@ -2,7 +2,7 @@ import { createEmptyPluginRegistry, createRuntimeEnv, setActivePluginRegistry, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterAll, beforeEach, describe, expect, it, vi } from "vitest"; import type { PluginRuntime } from "../runtime-api.js"; import { diff --git a/extensions/zalo/src/monitor.webhook.test.ts b/extensions/zalo/src/monitor.webhook.test.ts index 3a8db757e84..bbc094ef1b7 100644 --- a/extensions/zalo/src/monitor.webhook.test.ts +++ b/extensions/zalo/src/monitor.webhook.test.ts @@ -1,5 +1,8 @@ import type { RequestListener } from "node:http"; -import { createEmptyPluginRegistry, setActivePluginRegistry } from "openclaw/plugin-sdk/testing"; +import { + createEmptyPluginRegistry, + setActivePluginRegistry, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterEach, describe, expect, it, vi } from "vitest"; import { withServer } from "../../../test/helpers/http-test-server.js"; import type { OpenClawConfig, PluginRuntime } from "../runtime-api.js"; diff --git a/extensions/zalo/src/setup-status.test.ts b/extensions/zalo/src/setup-status.test.ts index e2a2393806d..d7a84d46583 100644 --- a/extensions/zalo/src/setup-status.test.ts +++ b/extensions/zalo/src/setup-status.test.ts @@ -1,4 +1,4 @@ -import { createPluginSetupWizardStatus } from "openclaw/plugin-sdk/testing"; +import { createPluginSetupWizardStatus } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import type { OpenClawConfig } from "../runtime-api.js"; import { zaloSetupWizard } from "./setup-surface.js"; diff --git a/extensions/zalo/src/setup-surface.test.ts b/extensions/zalo/src/setup-surface.test.ts index 3f4706d91c1..baa75346eb1 100644 --- a/extensions/zalo/src/setup-surface.test.ts +++ b/extensions/zalo/src/setup-surface.test.ts @@ -3,8 +3,8 @@ import { createPluginSetupWizardConfigure, createTestWizardPrompter, runSetupWizardConfigure, - type WizardPrompter, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import type { WizardPrompter } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../runtime-api.js"; import { listZaloAccountIds, resolveDefaultZaloAccountId, resolveZaloAccount } from "./accounts.js"; diff --git a/extensions/zalo/test-support/monitor-mocks-test-support.ts b/extensions/zalo/test-support/monitor-mocks-test-support.ts index b8f5c5bcc95..8a03bbda993 100644 --- a/extensions/zalo/test-support/monitor-mocks-test-support.ts +++ b/extensions/zalo/test-support/monitor-mocks-test-support.ts @@ -3,7 +3,7 @@ import { createEmptyPluginRegistry, createRuntimeEnv, setActivePluginRegistry, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { vi, type Mock } from "vitest"; import type { OpenClawConfig } from "../runtime-api.js"; import type { ResolvedZaloAccount } from "../src/types.js"; diff --git a/extensions/zalouser/src/channel.setup.test.ts b/extensions/zalouser/src/channel.setup.test.ts index a0e846afc9d..127d5e0c67f 100644 --- a/extensions/zalouser/src/channel.setup.test.ts +++ b/extensions/zalouser/src/channel.setup.test.ts @@ -1,7 +1,8 @@ import { mkdtemp, rm } from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import { createPluginSetupWizardStatus, withEnvAsync } from "openclaw/plugin-sdk/testing"; +import { createPluginSetupWizardStatus } from "openclaw/plugin-sdk/plugin-test-runtime"; +import { withEnvAsync } from "openclaw/plugin-sdk/test-env"; import { describe, expect, it } from "vitest"; import "./zalo-js.test-mocks.js"; import { zalouserSetupPlugin } from "./setup-test-helpers.js"; diff --git a/extensions/zalouser/src/channel.test.ts b/extensions/zalouser/src/channel.test.ts index ab8df1c8cd8..c94bbf31963 100644 --- a/extensions/zalouser/src/channel.test.ts +++ b/extensions/zalouser/src/channel.test.ts @@ -1,4 +1,4 @@ -import { createNonExitingRuntimeEnv } from "openclaw/plugin-sdk/testing"; +import { createNonExitingRuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; import "./zalo-js.test-mocks.js"; import { diff --git a/extensions/zalouser/src/setup-surface.test.ts b/extensions/zalouser/src/setup-surface.test.ts index ad43d41fe21..846fd0a3f55 100644 --- a/extensions/zalouser/src/setup-surface.test.ts +++ b/extensions/zalouser/src/setup-surface.test.ts @@ -2,7 +2,7 @@ import { createPluginSetupWizardConfigure, createTestWizardPrompter, runSetupWizardConfigure, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../runtime-api.js"; import "./zalo-js.test-mocks.js"; diff --git a/package.json b/package.json index b6817924035..720c999f807 100644 --- a/package.json +++ b/package.json @@ -514,10 +514,18 @@ "types": "./dist/plugin-sdk/plugin-test-contracts.d.ts", "default": "./dist/plugin-sdk/plugin-test-contracts.js" }, + "./plugin-sdk/plugin-test-runtime": { + "types": "./dist/plugin-sdk/plugin-test-runtime.d.ts", + "default": "./dist/plugin-sdk/plugin-test-runtime.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/test-env": { + "types": "./dist/plugin-sdk/test-env.d.ts", + "default": "./dist/plugin-sdk/test-env.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 6a1b2c3ffde..2eae28bbb34 100644 --- a/scripts/check-no-extension-test-core-imports.ts +++ b/scripts/check-no-extension-test-core-imports.ts @@ -11,7 +11,7 @@ const FORBIDDEN_PATTERNS: Array<{ pattern: RegExp; hint: string }> = [ }, { pattern: /["']openclaw\/plugin-sdk\/test-utils["']/, - hint: "Use openclaw/plugin-sdk/testing for the public extension test surface.", + hint: "Use openclaw/plugin-sdk/testing or a focused plugin-sdk test subpath for the public extension test surface.", }, { pattern: /["']openclaw\/plugin-sdk\/compat["']/, @@ -35,7 +35,7 @@ const FORBIDDEN_PATTERNS: Array<{ pattern: RegExp; hint: string }> = [ }, { pattern: /["'](?:\.\.\/)+(?:src\/channels\/plugins\/contracts\/test-helpers\.js)["']/, - hint: "Use openclaw/plugin-sdk/testing for channel contract test helpers.", + hint: "Use openclaw/plugin-sdk/channel-contract-testing for channel contract test helpers.", }, ]; diff --git a/scripts/lib/plugin-sdk-doc-metadata.ts b/scripts/lib/plugin-sdk-doc-metadata.ts index a2aa593f65b..641669c2570 100644 --- a/scripts/lib/plugin-sdk-doc-metadata.ts +++ b/scripts/lib/plugin-sdk-doc-metadata.ts @@ -47,6 +47,9 @@ export const pluginSdkDocMetadata = { "plugin-test-contracts": { category: "utilities", }, + "plugin-test-runtime": { + category: "utilities", + }, "channel-actions": { category: "channel", }, @@ -113,6 +116,9 @@ export const pluginSdkDocMetadata = { "provider-test-contracts": { category: "utilities", }, + "test-env": { + 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 8871b45d3d8..6d86e51949f 100644 --- a/scripts/lib/plugin-sdk-entrypoints.json +++ b/scripts/lib/plugin-sdk-entrypoints.json @@ -112,7 +112,9 @@ "channel-test-helpers", "plugin-test-api", "plugin-test-contracts", + "plugin-test-runtime", "provider-test-contracts", + "test-env", "testing", "temp-path", "logging-core", diff --git a/src/channels/plugins/setup-wizard-helpers.test.ts b/src/channels/plugins/setup-wizard-helpers.test.ts index ad2c33200f1..9d20e79b6df 100644 --- a/src/channels/plugins/setup-wizard-helpers.test.ts +++ b/src/channels/plugins/setup-wizard-helpers.test.ts @@ -1,7 +1,7 @@ import { resolveSetupWizardAllowFromEntries, resolveSetupWizardGroupAllowlist, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { afterAll, beforeEach, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../../config/config.js"; import { resetPluginRuntimeStateForTest, setActivePluginRegistry } from "../../plugins/runtime.js"; diff --git a/src/channels/plugins/setup-wizard-proxy.test.ts b/src/channels/plugins/setup-wizard-proxy.test.ts index 4362bf5ef74..7d425237424 100644 --- a/src/channels/plugins/setup-wizard-proxy.test.ts +++ b/src/channels/plugins/setup-wizard-proxy.test.ts @@ -4,7 +4,7 @@ import { resolveSetupWizardGroupAllowlist, runSetupWizardFinalize, runSetupWizardPrepare, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it, vi } from "vitest"; import { createAllowlistSetupWizardProxy, diff --git a/src/plugin-sdk/channel-setup.test.ts b/src/plugin-sdk/channel-setup.test.ts index 23ab9e69c8d..5f170071cec 100644 --- a/src/plugin-sdk/channel-setup.test.ts +++ b/src/plugin-sdk/channel-setup.test.ts @@ -1,4 +1,4 @@ -import { runSetupWizardFinalize } from "openclaw/plugin-sdk/testing"; +import { runSetupWizardFinalize } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import { createOptionalChannelSetupSurface } from "./channel-setup.js"; diff --git a/src/plugin-sdk/plugin-test-runtime.ts b/src/plugin-sdk/plugin-test-runtime.ts new file mode 100644 index 00000000000..d21b96e4484 --- /dev/null +++ b/src/plugin-sdk/plugin-test-runtime.ts @@ -0,0 +1,87 @@ +// Focused public test helpers for plugin runtime, registry, and setup fixtures. + +export { setDefaultChannelPluginRegistryForTests } from "../commands/channel-test-registry.js"; +export { + createEmptyPluginRegistry, + createPluginRegistry, + type PluginRecord, +} from "../plugins/registry.js"; +export { + providerContractLoadError, + pluginRegistrationContractRegistry, + resolveProviderContractProvidersForPluginIds, + resolveWebFetchProviderContractEntriesForPluginId, + resolveWebSearchProviderContractEntriesForPluginId, +} from "../plugins/contracts/registry.js"; +export { loadPluginManifestRegistry } from "../plugins/manifest-registry.js"; +export { resolveBundledExplicitProviderContractsFromPublicArtifacts } from "../plugins/provider-contract-public-artifacts.js"; +export { + initializeGlobalHookRunner, + resetGlobalHookRunner, +} from "../plugins/hook-runner-global.js"; +export { addTestHook } from "../plugins/hooks.test-helpers.js"; +export { createPluginRecord } from "../plugins/status.test-helpers.js"; +export { + resolveBundledExplicitWebFetchProvidersFromPublicArtifacts, + resolveBundledExplicitWebSearchProvidersFromPublicArtifacts, +} from "../plugins/web-provider-public-artifacts.explicit.js"; +export { + getActivePluginRegistry, + releasePinnedPluginChannelRegistry, + resetPluginRuntimeStateForTest, + setActivePluginRegistry, +} from "../plugins/runtime.js"; +export { + listImportedBundledPluginFacadeIds, + resetFacadeRuntimeStateForTest, +} from "./facade-runtime.js"; +export { capturePluginRegistration } from "../plugins/captured-registration.js"; +export { runProviderCatalog } from "../plugins/provider-discovery.js"; +export { + buildProviderPluginMethodChoice, + resolveProviderModelPickerEntries, + resolveProviderWizardOptions, + setProviderWizardProvidersResolverForTest, +} from "../plugins/provider-wizard.js"; +export { resolveProviderPluginChoice } from "../plugins/provider-auth-choice.runtime.js"; +export type { PluginRuntime } from "../plugins/runtime/types.js"; +export type { PluginHookRegistration } from "../plugins/hook-types.js"; +export type { RuntimeEnv } from "../runtime.js"; +export type { MockFn } from "../test-utils/vitest-mock-fn.js"; +export { createOutboundTestPlugin, createTestRegistry } from "../test-utils/channel-plugins.js"; +export { + registerProviderPlugin, + registerProviderPlugins, + registerSingleProviderPlugin, + requireRegisteredProvider, + type RegisteredProviderCollections, +} from "../test-utils/plugin-registration.js"; +export { + createNonExitingRuntimeEnv, + createNonExitingTypedRuntimeEnv, + createRuntimeEnv, + createTypedRuntimeEnv, +} from "../test-utils/plugin-runtime-env.js"; +export { + createPluginSetupWizardAdapter, + createPluginSetupWizardConfigure, + createPluginSetupWizardStatus, + createQueuedWizardPrompter, + createSetupWizardAdapter, + createTestWizardPrompter, + promptSetupWizardAllowFrom, + resolveSetupWizardAllowFromEntries, + resolveSetupWizardGroupAllowlist, + runSetupWizardConfigure, + runSetupWizardFinalize, + runSetupWizardPrepare, + selectFirstWizardOption, + type WizardPrompter, +} from "../test-utils/plugin-setup-wizard.js"; +export { createMockPluginRegistry } from "../plugins/hooks.test-helpers.js"; +export { buildPluginApi } from "../plugins/api-builder.js"; +export { + createCapturedPluginRegistration, + type CapturedPluginRegistration, +} from "../plugins/captured-registration.js"; +export { createRuntimeTaskFlow } from "../plugins/runtime/runtime-taskflow.js"; diff --git a/src/plugin-sdk/test-env.ts b/src/plugin-sdk/test-env.ts new file mode 100644 index 00000000000..365e1a3ef3f --- /dev/null +++ b/src/plugin-sdk/test-env.ts @@ -0,0 +1,64 @@ +// Focused public test helpers for environment, network, and time fixtures. + +export { + createAuthCaptureJsonFetch, + createRequestCaptureJsonFetch, + installPinnedHostnameTestHooks, +} from "../media-understanding/audio.test-helpers.ts"; +export { + createSingleUserPromptMessage, + extractNonEmptyAssistantText, + isLiveProfileKeyModeEnabled, + isLiveTestEnabled, +} from "../agents/live-test-helpers.js"; +export { collectProviderApiKeys } from "../agents/live-auth-keys.js"; +export { isModelNotFoundErrorMessage } from "../agents/live-model-errors.js"; +export { + isAuthErrorMessage, + isBillingErrorMessage, + isOverloadedErrorMessage, + isServerErrorMessage, + isTimeoutErrorMessage, +} from "../agents/pi-embedded-helpers/failover-matches.js"; +export { maybeLoadShellEnvForGenerationProviders } from "../test-utils/generation-live-test-helpers.js"; +export { isTruthyEnvValue } from "../infra/env.js"; +export { getShellEnvAppliedKeys } from "../infra/shell-env.js"; +export { encodePngRgba, fillPixel } from "../media/png-encode.js"; +export { + parseLiveCsvFilter as parseCsvFilter, + parseProviderModelMap, + redactLiveApiKey, +} from "../media-generation/live-test-helpers.js"; +export { + DEFAULT_LIVE_MUSIC_MODELS, + resolveConfiguredLiveMusicModels, + resolveLiveMusicAuthStore, +} from "../music-generation/live-test-helpers.js"; +export { + canRunBufferBackedImageToVideoLiveLane, + canRunBufferBackedVideoToVideoLiveLane, + DEFAULT_LIVE_VIDEO_MODELS, + resolveConfiguredLiveVideoModels, + resolveLiveVideoAuthStore, + resolveLiveVideoResolution, +} from "../video-generation/live-test-helpers.js"; +export { normalizeVideoGenerationDuration } from "../video-generation/duration-support.js"; +export { parseVideoGenerationModelRef } from "../video-generation/model-ref.js"; +export type { + GeneratedVideoAsset, + VideoGenerationMode, + VideoGenerationModeCapabilities, + VideoGenerationProvider, + VideoGenerationRequest, +} from "../video-generation/types.js"; +export { jsonResponse, requestBodyText, requestUrl } from "../test-helpers/http.js"; +export { mockPinnedHostnameResolution } from "../test-helpers/ssrf.js"; +export { createWindowsCmdShimFixture } from "../test-helpers/windows-cmd-shim.js"; +export { createProviderUsageFetch, makeResponse } from "../test-utils/provider-usage-fetch.js"; +export { withStateDirEnv } from "../test-helpers/state-dir-env.js"; +export { captureEnv, withEnv, withEnvAsync } from "../test-utils/env.js"; +export { withFetchPreconnect, type FetchMock } from "../test-utils/fetch-mock.js"; +export { createMockServerResponse } from "../test-utils/mock-http-response.js"; +export { createTempHomeEnv, type TempHomeEnv } from "../test-utils/temp-home.js"; +export { withTempDir } from "../test-utils/temp-dir.js"; +export { useFrozenTime, useRealTime } from "../test-utils/frozen-time.js"; diff --git a/src/plugin-sdk/test-helpers/provider-runtime-contract.ts b/src/plugin-sdk/test-helpers/provider-runtime-contract.ts index 158e539f68a..c0d8f2d52bf 100644 --- a/src/plugin-sdk/test-helpers/provider-runtime-contract.ts +++ b/src/plugin-sdk/test-helpers/provider-runtime-contract.ts @@ -1,41 +1,44 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import type { ProviderRuntimeModel } from "../plugin-entry.js"; +import { registerProviderPlugin, requireRegisteredProvider } from "../plugin-test-runtime.js"; import type { ProviderPlugin } from "../provider-model-shared.js"; -import { - createProviderUsageFetch, - makeResponse, - registerProviderPlugin, - requireRegisteredProvider, -} from "../testing.js"; +import { createProviderUsageFetch, makeResponse } from "../test-env.js"; const CONTRACT_SETUP_TIMEOUT_MS = 300_000; -const refreshOpenAICodexTokenMock = vi.hoisted(() => vi.fn()); -const getOAuthProvidersMock = vi.hoisted(() => - vi.fn(() => [ - { id: "anthropic", envApiKey: "ANTHROPIC_API_KEY", oauthTokenEnv: "ANTHROPIC_OAUTH_TOKEN" }, - { id: "google", envApiKey: "GOOGLE_API_KEY", oauthTokenEnv: "GOOGLE_OAUTH_TOKEN" }, - { id: "openai-codex", envApiKey: "OPENAI_API_KEY", oauthTokenEnv: "OPENAI_OAUTH_TOKEN" }, - ]), -); +const OAUTH_MODULE_ID = "@mariozechner/pi-ai/oauth"; +const OPENAI_CODEX_PROVIDER_RUNTIME_MODULE_ID = + "../../../extensions/openai/openai-codex-provider.runtime.js"; +const refreshOpenAICodexTokenMock = vi.fn(); +const getOAuthProvidersMock = vi.fn(() => [ + { id: "anthropic", envApiKey: "ANTHROPIC_API_KEY", oauthTokenEnv: "ANTHROPIC_OAUTH_TOKEN" }, + { id: "google", envApiKey: "GOOGLE_API_KEY", oauthTokenEnv: "GOOGLE_OAUTH_TOKEN" }, + { id: "openai-codex", envApiKey: "OPENAI_API_KEY", oauthTokenEnv: "OPENAI_OAUTH_TOKEN" }, +]); -vi.mock("@mariozechner/pi-ai/oauth", async () => { - const actual = await vi.importActual( - "@mariozechner/pi-ai/oauth", - ); - return { - ...actual, +function installProviderRuntimeContractMocks() { + vi.doMock(OAUTH_MODULE_ID, async () => { + const actual = + await vi.importActual(OAUTH_MODULE_ID); + return { + ...actual, + refreshOpenAICodexToken: refreshOpenAICodexTokenMock, + getOAuthProviders: getOAuthProvidersMock, + }; + }); + + vi.doMock(OPENAI_CODEX_PROVIDER_RUNTIME_MODULE_ID, () => ({ refreshOpenAICodexToken: refreshOpenAICodexTokenMock, - getOAuthProviders: getOAuthProvidersMock, - }; -}); + })); +} -vi.mock("../../../extensions/openai/openai-codex-provider.runtime.js", () => ({ - refreshOpenAICodexToken: refreshOpenAICodexTokenMock, -})); +function removeProviderRuntimeContractMocks() { + vi.doUnmock(OAUTH_MODULE_ID); + vi.doUnmock(OPENAI_CODEX_PROVIDER_RUNTIME_MODULE_ID); +} function createModel(overrides: Partial & Pick) { return { @@ -109,9 +112,14 @@ function installRuntimeHooks(fixtures: readonly ProviderRuntimeContractFixture[] } beforeAll(async () => { + installProviderRuntimeContractMocks(); await ensureProvidersLoaded(); }, CONTRACT_SETUP_TIMEOUT_MS); + afterAll(() => { + removeProviderRuntimeContractMocks(); + }); + beforeEach(() => { refreshOpenAICodexTokenMock.mockReset(); getOAuthProvidersMock.mockClear(); diff --git a/src/plugins/contracts/plugin-sdk-subpaths.test.ts b/src/plugins/contracts/plugin-sdk-subpaths.test.ts index 455076dcfc2..dfc782f5ed2 100644 --- a/src/plugins/contracts/plugin-sdk-subpaths.test.ts +++ b/src/plugins/contracts/plugin-sdk-subpaths.test.ts @@ -21,6 +21,7 @@ import type { PluginRuntime as CorePluginRuntime, } from "openclaw/plugin-sdk/core"; import * as providerEntrySdk from "openclaw/plugin-sdk/provider-entry"; +import ts from "typescript"; import { describe, expect, expectTypeOf, it } from "vitest"; import type { ChannelMessageActionContext } from "../../channels/plugins/types.js"; import type { @@ -51,6 +52,15 @@ const PLUGIN_SDK_DIR = resolve(SRC_ROOT, "plugin-sdk"); const sourceCache = new Map(); const repoTsFilesCache = new Map(); const representativeRuntimeSmokeSubpaths = ["channel-runtime", "conversation-runtime"] as const; +const PUBLIC_SDK_TEST_HELPER_SUBPATHS = [ + "channel-contract-testing", + "channel-test-helpers", + "plugin-test-api", + "plugin-test-contracts", + "plugin-test-runtime", + "provider-test-contracts", + "test-env", +] as const; const importResolvedPluginSdkSubpath = async (specifier: string) => import(specifier); @@ -219,6 +229,81 @@ function collectNamedExportsFromRepoFile(relativePath: string): string[] { return collectNamedExportsFromSource(readRepoSource(relativePath)); } +function createSourceFile(absolutePath: string): ts.SourceFile { + return ts.createSourceFile( + absolutePath, + readCachedSource(absolutePath), + ts.ScriptTarget.Latest, + true, + ts.ScriptKind.TS, + ); +} + +function resolveTypeScriptModuleSource(fromFile: string, specifier: string): string | null { + if (!specifier.startsWith(".")) { + return null; + } + const resolved = resolve(dirname(fromFile), specifier); + if (resolved.endsWith(".js")) { + return `${resolved.slice(0, -3)}.ts`; + } + if (resolved.endsWith(".ts")) { + return resolved; + } + return `${resolved}.ts`; +} + +function collectReexportedSourceFiles(entrypointPath: string): string[] { + const visited = new Set(); + + function visit(filePath: string) { + if (visited.has(filePath)) { + return; + } + visited.add(filePath); + const sourceFile = createSourceFile(filePath); + for (const statement of sourceFile.statements) { + if ( + !ts.isExportDeclaration(statement) || + !statement.moduleSpecifier || + !ts.isStringLiteral(statement.moduleSpecifier) + ) { + continue; + } + const target = resolveTypeScriptModuleSource(filePath, statement.moduleSpecifier.text); + if (target) { + visit(target); + } + } + } + + visit(entrypointPath); + return [...visited].toSorted(); +} + +function topLevelVitestModuleMockLines(filePath: string): number[] { + const sourceFile = createSourceFile(filePath); + const lines: number[] = []; + for (const statement of sourceFile.statements) { + if (!ts.isExpressionStatement(statement) || !ts.isCallExpression(statement.expression)) { + continue; + } + const expression = statement.expression.expression; + if ( + !ts.isPropertyAccessExpression(expression) || + !ts.isIdentifier(expression.expression) || + expression.expression.text !== "vi" + ) { + continue; + } + if (!["mock", "doMock", "unmock", "doUnmock"].includes(expression.name.text)) { + continue; + } + lines.push(sourceFile.getLineAndCharacterOfPosition(statement.getStart(sourceFile)).line + 1); + } + return lines; +} + function expectNamedExportParity(params: BrowserHelperExportParityContract) { const coreExports = collectNamedExportsFromRepoFile(params.corePath); const extensionExports = collectNamedExportsFromRepoFile(params.extensionPath); @@ -648,6 +733,32 @@ describe("plugin-sdk subpath exports", () => { "memory-core-host-runtime-files", 'export * from "../memory-host-sdk/runtime-files.js";', ); + expectSourceMentions("plugin-test-runtime", [ + "registerSingleProviderPlugin", + "registerProviderPlugin", + "createRuntimeEnv", + "createPluginSetupWizardStatus", + "runProviderCatalog", + ]); + expectSourceMentions("test-env", [ + "withEnv", + "withFetchPreconnect", + "createRequestCaptureJsonFetch", + "installPinnedHostnameTestHooks", + "isLiveTestEnabled", + ]); + }); + + it("keeps public SDK test helper subpaths free of top-level Vitest module mocks", () => { + const violations = PUBLIC_SDK_TEST_HELPER_SUBPATHS.flatMap((subpath) => + collectReexportedSourceFiles(resolve(PLUGIN_SDK_DIR, `${subpath}.ts`)).flatMap((file) => + topLevelVitestModuleMockLines(file).map( + (line) => `${file.slice(REPO_ROOT.length + 1)}:${line}`, + ), + ), + ).toSorted(); + + expect(violations).toEqual([]); }); it("keeps the deprecated channel-runtime shim unused in repo imports", () => { diff --git a/src/plugins/contracts/tts-contract-suites.ts b/src/plugins/contracts/tts-contract-suites.ts index 2c07f48bd86..3acc7c7131e 100644 --- a/src/plugins/contracts/tts-contract-suites.ts +++ b/src/plugins/contracts/tts-contract-suites.ts @@ -1,14 +1,13 @@ import type { AssistantMessage } from "@mariozechner/pi-ai"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; 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 { createEmptyPluginRegistry, pluginRegistrationContractRegistry, setActivePluginRegistry, - withEnv, - withEnvAsync, -} from "openclaw/plugin-sdk/testing"; +} from "openclaw/plugin-sdk/plugin-test-runtime"; +import type { ResolvedTtsConfig, SpeechProviderPlugin } from "openclaw/plugin-sdk/speech-core"; +import { withEnv, withEnvAsync } from "openclaw/plugin-sdk/test-env"; import { beforeEach, describe, expect, it, vi } from "vitest"; type TtsRuntimeModule = typeof import("openclaw/plugin-sdk/tts-runtime"); diff --git a/test/helpers/channels/directory-ids.ts b/test/helpers/channels/directory-ids.ts index 19227fb4a97..a8500dd61e8 100644 --- a/test/helpers/channels/directory-ids.ts +++ b/test/helpers/channels/directory-ids.ts @@ -1,5 +1,5 @@ import type { ChannelDirectoryEntry } from "openclaw/plugin-sdk/channel-contract"; -import type { OpenClawConfig } from "openclaw/plugin-sdk/testing"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { expect } from "vitest"; export type DirectoryListFn = (params: { diff --git a/test/helpers/provider-replay-policy.ts b/test/helpers/provider-replay-policy.ts index d8d8a115d43..1d0902c1005 100644 --- a/test/helpers/provider-replay-policy.ts +++ b/test/helpers/provider-replay-policy.ts @@ -1,4 +1,4 @@ -import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/testing"; +import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime"; import { expect } from "vitest"; export async function expectPassthroughReplayPolicy(params: { diff --git a/test/image-generation.runtime.live.test.ts b/test/image-generation.runtime.live.test.ts index 66018d16536..b3f78f7673a 100644 --- a/test/image-generation.runtime.live.test.ts +++ b/test/image-generation.runtime.live.test.ts @@ -1,4 +1,7 @@ -import { registerProviderPlugin, requireRegisteredProvider } from "openclaw/plugin-sdk/testing"; +import { + registerProviderPlugin, + requireRegisteredProvider, +} from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import { resolveOpenClawAgentDir } from "../src/agents/agent-paths.js"; import { collectProviderApiKeys } from "../src/agents/live-auth-keys.js";