Plugin SDK reference
Pruebas de plugins
Referencia de utilidades, patrones y aplicación de reglas de lint para los plugins de OpenClaw.
Utilidades de prueba
Estas subrutas son puntos de entrada de código fuente locales del repositorio para las pruebas de
los plugins incluidos de OpenClaw. No son exportaciones package.json publicadas para plugins
de terceros y pueden importar Vitest u otras dependencias de prueba exclusivas del repositorio.
shouldAckReaction, removeAckReactionAfterReply,} from "openclaw/plugin-sdk/channel-feedback"; bundledPluginRoot, createCliRuntimeCapture, typedCases,} from "openclaw/plugin-sdk/test-fixtures"; Utilice estas subrutas específicas para las pruebas de plugins incluidos. El antiguo
barrel openclaw/plugin-sdk/testing era local del repositorio, estaba excluido de los
paquetes distribuidos y se ha eliminado. El antiguo alias openclaw/plugin-sdk/test-utils
se eliminó junto con él. pnpm run lint:plugins:no-extension-test-core-imports
(scripts/check-no-extension-test-core-imports.ts) mantiene las pruebas de extensiones en
las subrutas de prueba específicas anteriores.
Exportaciones disponibles
| Exportación | Propósito |
|---|---|
createTestPluginApi |
Crear un simulacro mínimo de la API de plugins para pruebas unitarias de registro directo. Importar desde plugin-sdk/plugin-test-api |
AUTH_PROFILE_RUNTIME_CONTRACT |
Fixture compartido del contrato de perfiles de autenticación para adaptadores nativos del entorno de ejecución de agentes. Importar desde plugin-sdk/agent-runtime-test-contracts |
DELIVERY_NO_REPLY_RUNTIME_CONTRACT |
Fixture compartido del contrato de supresión de entregas para adaptadores nativos del entorno de ejecución de agentes. Importar desde plugin-sdk/agent-runtime-test-contracts |
OUTCOME_FALLBACK_RUNTIME_CONTRACT |
Fixture compartido del contrato de clasificación de mecanismos alternativos para adaptadores nativos del entorno de ejecución de agentes. Importar desde plugin-sdk/agent-runtime-test-contracts |
createParameterFreeTool |
Crear fixtures de esquemas de herramientas dinámicas para pruebas de contratos del entorno de ejecución nativo. Importar desde plugin-sdk/agent-runtime-test-contracts |
expectChannelInboundContextContract |
Verificar la estructura del contexto entrante del canal. Importar desde plugin-sdk/channel-contract-testing |
installChannelOutboundPayloadContractSuite |
Instalar casos de contratos de cargas útiles salientes del canal. Importar desde plugin-sdk/channel-contract-testing |
createStartAccountContext |
Crear contextos del ciclo de vida de las cuentas de canal. Importar desde plugin-sdk/channel-test-helpers |
installChannelActionsContractSuite |
Instalar casos genéricos de contratos de acciones de mensajes de canal. Importar desde plugin-sdk/channel-test-helpers |
installChannelSetupContractSuite |
Instalar casos genéricos de contratos de configuración de canales. Importar desde plugin-sdk/channel-test-helpers |
installChannelStatusContractSuite |
Instalar casos genéricos de contratos de estado de canales. Importar desde plugin-sdk/channel-test-helpers |
expectDirectoryIds |
Verificar los identificadores del directorio de canales obtenidos mediante una función de listado de directorios. Importar desde plugin-sdk/channel-test-helpers |
assertBundledChannelEntries |
Verificar que los puntos de entrada de los canales incluidos expongan el contrato público esperado. Importar desde plugin-sdk/channel-test-helpers |
formatEnvelopeTimestamp |
Formatear marcas de tiempo deterministas de sobres. Importar desde plugin-sdk/channel-test-helpers |
expectPairingReplyText |
Verificar el texto de respuesta de emparejamiento del canal y extraer su código. Importar desde plugin-sdk/channel-test-helpers |
describePluginRegistrationContract |
Instalar comprobaciones del contrato de registro de plugins. Importar desde plugin-sdk/plugin-test-contracts |
registerSingleProviderPlugin |
Registrar un plugin de proveedor en las pruebas de humo del cargador. Importar desde plugin-sdk/plugin-test-runtime |
registerProviderPlugin |
Capturar todos los tipos de proveedores de un plugin. Importar desde plugin-sdk/plugin-test-runtime |
registerProviderPlugins |
Capturar registros de proveedores de varios plugins. Importar desde plugin-sdk/plugin-test-runtime |
requireRegisteredProvider |
Verificar que una colección de proveedores contenga un identificador. Importar desde plugin-sdk/plugin-test-runtime |
createRuntimeEnv |
Crear un entorno simulado de ejecución de la CLI y plugins. Importar desde plugin-sdk/plugin-test-runtime |
createPluginRuntimeMock |
Crear una superficie simulada del entorno de ejecución de plugins. Importar desde plugin-sdk/plugin-test-runtime |
createPluginSetupWizardStatus |
Crear auxiliares del estado de configuración para plugins de canal. Importar desde plugin-sdk/plugin-test-runtime |
createTestWizardPrompter |
Crear un solicitante simulado para el asistente de configuración. Importar desde plugin-sdk/plugin-test-runtime |
createRuntimeTaskFlow |
Crear un estado aislado del flujo de tareas del entorno de ejecución. Importar desde plugin-sdk/plugin-test-runtime |
runProviderCatalog |
Ejecutar un hook del catálogo de proveedores con dependencias de prueba. Importar desde plugin-sdk/plugin-test-runtime |
resolveProviderWizardOptions |
Resolver las opciones del asistente de configuración de proveedores en pruebas de contratos. Importar desde plugin-sdk/plugin-test-runtime |
resolveProviderModelPickerEntries |
Resolver las entradas del selector de modelos de proveedor en pruebas de contratos. Importar desde plugin-sdk/plugin-test-runtime |
buildProviderPluginMethodChoice |
Crear identificadores de opciones del asistente de proveedores para verificaciones. Importar desde plugin-sdk/plugin-test-runtime |
setProviderWizardProvidersResolverForTest |
Inyectar proveedores del asistente de proveedores para pruebas aisladas. Importar desde plugin-sdk/plugin-test-runtime |
describeOpenAIProviderRuntimeContract |
Instalar comprobaciones de contratos del entorno de ejecución de familias de proveedores. Importar desde plugin-sdk/provider-test-contracts |
expectPassthroughReplayPolicy |
Verificar que las políticas de reproducción de proveedores se transmitan mediante herramientas y metadatos propiedad del proveedor. Importar desde plugin-sdk/provider-test-contracts |
runRealtimeSttLiveTest |
Ejecutar una prueba en vivo de un proveedor de conversión de voz a texto en tiempo real con fixtures de audio compartidos. Importar desde plugin-sdk/provider-test-contracts |
normalizeTranscriptForMatch |
Normalizar la salida de la transcripción en vivo antes de las verificaciones aproximadas. Importar desde plugin-sdk/provider-test-contracts |
expectExplicitVideoGenerationCapabilities |
Verificar que los proveedores de vídeo declaren capacidades explícitas del modo de generación. Importar desde plugin-sdk/provider-test-contracts |
expectExplicitMusicGenerationCapabilities |
Verificar que los proveedores de música declaren capacidades explícitas de generación y edición. Importar desde plugin-sdk/provider-test-contracts |
mockSuccessfulDashscopeVideoTask |
Instalar una respuesta correcta de tarea de vídeo compatible con DashScope. Importar desde plugin-sdk/provider-test-contracts |
getProviderHttpMocks |
Acceder a simulacros Vitest opcionales de HTTP y autenticación de proveedores. Importar desde plugin-sdk/provider-http-test-mocks |
installProviderHttpMockCleanup |
Restablecer los simulacros de HTTP y autenticación de proveedores después de cada prueba. Importar desde plugin-sdk/provider-http-test-mocks |
installCommonResolveTargetErrorCases |
Casos de prueba compartidos para la gestión de errores de resolución de destinos. Importar desde plugin-sdk/channel-target-testing |
shouldAckReaction |
Comprobar si un canal debe añadir una reacción de confirmación. Importar desde plugin-sdk/channel-feedback |
removeAckReactionAfterReply |
Eliminar la reacción de confirmación después de entregar la respuesta. Importar desde plugin-sdk/channel-feedback |
createTestRegistry |
Crear un fixture de registro de plugins de canal. Importar desde plugin-sdk/plugin-test-runtime o plugin-sdk/channel-test-helpers |
createEmptyPluginRegistry |
Crear un fixture de registro de plugins vacío. Importar desde plugin-sdk/plugin-test-runtime o plugin-sdk/channel-test-helpers |
setActivePluginRegistry |
Instalar un fixture de registro para pruebas del entorno de ejecución de plugins. Importar desde plugin-sdk/plugin-test-runtime o plugin-sdk/channel-test-helpers |
createRequestCaptureJsonFetch |
Capturar solicitudes de obtención de JSON en pruebas de auxiliares multimedia. Importar desde plugin-sdk/test-media-understanding |
isLiveTestEnabled |
Controlar la ejecución opcional de pruebas en vivo de proveedores. Importar desde plugin-sdk/test-live |
collectProviderApiKeys |
Detectar credenciales para pruebas en vivo de proveedores. Importar desde plugin-sdk/test-live-auth |
parseProviderModelMap |
Analizar las anulaciones de modelos para pruebas en vivo de música y vídeo. Importar desde plugin-sdk/test-media-generation |
withServer |
Ejecutar pruebas en un servidor HTTP local desechable. Importar desde plugin-sdk/test-env |
createMockIncomingRequest |
Crear un objeto mínimo de solicitud HTTP entrante. Importar desde plugin-sdk/test-env |
withFetchPreconnect |
Ejecutar pruebas de obtención con hooks de conexión previa instalados. Importar desde plugin-sdk/test-env |
withEnv / withEnvAsync |
Modificar temporalmente variables de entorno. Importar desde plugin-sdk/test-env |
createTempHomeEnv / withTempHome / withTempDir |
Crear fixtures aislados del sistema de archivos para pruebas. Importar desde plugin-sdk/test-env |
createMockServerResponse |
Crear un simulacro mínimo de respuesta de servidor HTTP. Importar desde plugin-sdk/test-env |
createProviderUsageFetch |
Crear fixtures de obtención de uso de proveedores. Importar desde plugin-sdk/test-env |
useFrozenTime / useRealTime |
Congelar y restaurar temporizadores para pruebas sensibles al tiempo. Importar desde plugin-sdk/test-env |
createCliRuntimeCapture |
Capturar la salida del entorno de ejecución de la CLI en las pruebas. Importar desde plugin-sdk/test-fixtures |
importFreshModule |
Importar un módulo ESM con un token de consulta nuevo para omitir la caché de módulos. Importar desde plugin-sdk/test-fixtures |
bundledPluginRoot / bundledPluginFile |
Resolver las rutas de fixtures de código fuente o distribución de plugins incluidos. Importar desde plugin-sdk/test-fixtures |
mockNodeBuiltinModule |
Instalar simulacros Vitest específicos de módulos integrados de Node. Importar desde plugin-sdk/test-node-mocks |
createSandboxTestContext |
Crear contextos de prueba de entornos aislados. Importar desde plugin-sdk/test-fixtures |
writeSkill |
Escribir fixtures de Skills. Importar desde plugin-sdk/test-fixtures |
makeAgentAssistantMessage |
Crear fixtures de mensajes de transcripciones de agentes. Importar desde plugin-sdk/test-fixtures |
peekSystemEvents / resetSystemEventsForTest |
Inspeccionar y restablecer fixtures de eventos del sistema. Importar desde plugin-sdk/test-fixtures |
sanitizeTerminalText |
Saneear la salida del terminal para las verificaciones. Importar desde plugin-sdk/test-fixtures |
countLines / hasBalancedFences |
Verifica la estructura de salida de la fragmentación. Importar desde plugin-sdk/test-fixtures |
typedCases |
Conserva los tipos literales para las pruebas basadas en tablas. Importar desde plugin-sdk/test-fixtures |
Las suites de contratos de plugins incluidos también usan estas subrutas de pruebas del SDK para
los auxiliares de registro, manifiesto, artefactos públicos y fixtures de runtime exclusivos de pruebas.
Las suites exclusivas del núcleo que dependen del inventario incluido de OpenClaw permanecen en
src/plugins/contracts.
Tipos
Las subrutas de pruebas específicas también reexportan tipos útiles en los archivos de pruebas:
ChannelAccountSnapshot, ChannelGatewayContext,} from "openclaw/plugin-sdk/channel-contract"; Pruebas de resolución de destinos
Use installCommonResolveTargetErrorCases para añadir casos de error estándar para la
resolución de destinos de canales:
describe("resolución de destinos de my-channel", () => { installCommonResolveTargetErrorCases({ resolveTarget: ({ to, mode, allowFrom }) => { // Lógica de resolución de destinos de su canal return myChannelResolveTarget({ to, mode, allowFrom }); }, implicitAllowFrom: ["user1", "user2"], }); // Añada casos de prueba específicos del canal it("debería resolver destinos @username", () => { // ... });});Patrones de pruebas
Pruebas de contratos de registro
Las pruebas unitarias que pasan un mock de api escrito manualmente a register(api) no
ejercitan las puertas de aceptación del cargador de OpenClaw. Añada al menos una
prueba de humo respaldada por el cargador para cada superficie de registro de la que dependa el plugin,
especialmente los hooks y las capacidades exclusivas, como la memoria.
El cargador real rechaza el registro del plugin cuando faltan metadatos obligatorios o
un plugin llama a una API de capacidad que no le pertenece. Por ejemplo,
api.registerHook(...) requiere un nombre de hook, y
api.registerMemoryCapability(...) requiere que el manifiesto del plugin o la
entrada exportada declare kind: "memory".
Pruebas de acceso a la configuración del runtime
Es preferible usar el mock compartido del runtime del plugin de
openclaw/plugin-sdk/plugin-test-runtime. Sus auxiliares de configuración del runtime modelan las
API actuales de instantáneas y mutación.
Pruebas unitarias de un plugin de canal
describe("plugin my-channel", () => { it("debería resolver la cuenta desde la configuración", () => { const cfg = { channels: { "my-channel": { token: "test-token", allowFrom: ["user1"], }, }, }; const account = myPlugin.setup.resolveAccount(cfg, undefined); expect(account.token).toBe("test-token"); }); it("debería inspeccionar la cuenta sin materializar secretos", () => { const cfg = { channels: { "my-channel": { token: "test-token" }, }, }; const inspection = myPlugin.setup.inspectAccount(cfg, undefined); expect(inspection.configured).toBe(true); expect(inspection.tokenStatus).toBe("available"); // No se expone el valor del token expect(inspection).not.toHaveProperty("token"); });});Pruebas unitarias de un plugin de proveedor
describe("plugin my-provider", () => { it("debería resolver modelos dinámicos", () => { const model = myProvider.resolveDynamicModel({ modelId: "custom-model-v2", // ... contexto }); expect(model.id).toBe("custom-model-v2"); expect(model.provider).toBe("my-provider"); expect(model.api).toBe("openai-completions"); }); it("debería devolver el catálogo cuando la clave de API esté disponible", async () => { const result = await myProvider.catalog.run({ resolveProviderApiKey: () => ({ apiKey: "test-key" }), // ... contexto }); expect(result?.provider?.models).toHaveLength(2); });});Simulación del runtime del plugin
Para el código que usa createPluginRuntimeStore, simule el runtime en las pruebas:
const store = createPluginRuntimeStore<PluginRuntime>({ pluginId: "test-plugin", errorMessage: "runtime de prueba no establecido",}); // En la configuración de las pruebasconst mockRuntime = { agent: { resolveAgentDir: vi.fn().mockReturnValue("/tmp/agent"), // ... otros mocks }, config: { current: vi.fn(() => ({}) as const), mutateConfigFile: vi.fn(), replaceConfigFile: vi.fn(), }, // ... otros espacios de nombres} as unknown as PluginRuntime; store.setRuntime(mockRuntime); // Después de las pruebasstore.clearRuntime();Pruebas con stubs por instancia
Es preferible usar stubs por instancia en lugar de modificar el prototipo:
// Preferido: stub por instanciaconst client = new MyChannelClient();client.sendMessage = vi.fn().mockResolvedValue({ id: "msg-1" }); // Evitar: modificación del prototipo// MyChannelClient.prototype.sendMessage = vi.fn();Pruebas de contratos (plugins del repositorio)
Los plugins incluidos tienen pruebas de contratos que verifican la propiedad del registro:
pnpm test src/plugins/contracts/Estas pruebas verifican:
- Qué plugins registran qué proveedores
- Qué plugins registran qué proveedores de voz
- Corrección de la estructura de registro
- Cumplimiento del contrato del runtime
Ejecución de pruebas específicas
Para un plugin específico:
pnpm test <bundled-plugin-root>/my-channel/Solo para las pruebas de contratos:
pnpm test src/plugins/contracts/shape.contract.test.tspnpm test src/plugins/contracts/auth-choice.contract.test.tspnpm test src/plugins/contracts/runtime-seams.contract.test.tsAplicación del lint (plugins del repositorio)
scripts/run-additional-boundary-checks.mjs ejecuta un conjunto de comprobaciones de límites de importación de
lint:plugins:* en la CI; cada una también puede ejecutarse localmente de forma independiente:
| Comando | Aplica |
|---|---|
pnpm run lint:plugins:no-monolithic-plugin-sdk-entry-imports |
Los plugins incluidos no pueden importar el barrel raíz monolítico openclaw/plugin-sdk. |
pnpm run lint:plugins:no-extension-src-imports |
Los archivos de extensiones de producción no pueden importar directamente el árbol src/** del repositorio (../../src/...). |
pnpm run lint:plugins:no-extension-test-core-imports |
Los archivos de pruebas de extensiones no pueden importar alias de pruebas eliminados del SDK ni otros auxiliares de pruebas exclusivos del núcleo. |
Los plugins externos no están sujetos a estas reglas de lint, pero se recomienda seguir los mismos patrones.
Configuración de las pruebas
OpenClaw usa Vitest 4 con informes informativos de cobertura V8. Para las pruebas de plugins:
# Ejecutar todas las pruebaspnpm test # Ejecutar pruebas de un plugin específicopnpm test <bundled-plugin-root>/my-channel/src/channel.test.ts # Ejecutar con un filtro de nombre de prueba específicopnpm test <bundled-plugin-root>/my-channel/ -t "resolves account" # Ejecutar con coberturapnpm test:coverageSi las ejecuciones locales causan presión de memoria:
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testContenido relacionado
- Descripción general del SDK -- convenciones de importación
- Plugins de canal del SDK -- interfaz de plugins de canal
- Plugins de proveedor del SDK -- hooks de plugins de proveedor
- Creación de plugins -- guía de introducción