Skip to main content

lib/cmdc_test.ex

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