defmodule CMDCTest do @moduledoc """ CMDC Test — 集成方 / 第三方 plugin 作者 / cmdc 子库测试 helpers 一站式包。 cmdc 主库自身的 `test/support/` 目录在 hex 发布时不会打包,导致 Studio / Hive 等集成方写 contract test 时各自重写 mock provider / plugin runner / 事件断言族。本子库把这些常见测试基础设施统一发布到 hex.pm,**4 大模块**: | 模块 | 用途 | |---|---| | `CMDCTest.MockProvider` | Builder 式 mock LLM provider,配合 `CMDC.Config.provider_fn` 注入 | | `CMDCTest.Plugin` | `run_hook/4` 单元测 Plugin;`with_mock_plugin/3` macro 集成路径测试 | | `CMDCTest.EventCapture` | EventBus 订阅 + 收集 | | `CMDCTest.Assertions` | `assert_event_emitted` / `assert_event_count` / `refute_event_emitted` | ## Quick Start # mix.exs defp deps do [ {:cmdc, "~> 0.5"}, {:cmdc_test, "~> 0.1", only: :test} ] end # test/my_agent_test.exs defmodule MyAgentTest do use ExUnit.Case, async: true import CMDCTest.Assertions test "Agent 调用 shell 工具触发 SecurityGuard block_tool" do provider = CMDCTest.MockProvider.new() |> CMDCTest.MockProvider.respond_tool_call("shell", %{"cmd" => "rm -rf /"}) {:ok, session} = CMDC.create_agent( model: "mock:test", config: %{provider_fn: CMDCTest.MockProvider.to_provider_fn(provider)}, plugins: [CMDC.Plugin.Builtin.SecurityGuard] ) CMDCTest.EventCapture.start_capture(session) CMDC.prompt(session, "请删根目录") assert_event_emitted(session, :block_tool, timeout: 500) end end 详见各子模块 moduledoc。 """ @doc "返回 cmdc_test 当前版本号。" @spec version() :: String.t() def version, do: Mix.Project.config()[:version] || "0.1.0" end