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.

typescript
   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:

typescript
   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:

typescript
  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

typescript
 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

typescript
 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:

typescript
  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:

typescript
// 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:

bash
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:

bash
pnpm test <bundled-plugin-root>/my-channel/

Solo para las pruebas de contratos:

bash
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.ts

Aplicació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:

bash
# 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:coverage

Si las ejecuciones locales causan presión de memoria:

bash
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test

Contenido relacionado

Was this useful?
On this page

On this page