test/openagents/modules/discovery_test.exs

58e6347eeb72 · 3 KB

defmodule OpenAgents.Modules.DiscoveryTest do
  use ExUnit.Case, async: true
  alias OpenAgents.Modules.Discovery
  alias OpenAgents.Tools.{ExecutionContext, Registry, Runner}

  test "search is bounded, policy-filtered, and excludes executable detail" do
    snapshot = Registry.current!()

    assert {:ok, result} =
             Discovery.search(snapshot, %{
               "capability" => "conversation.read",
               "data_scope" => "browser_conversation",
               "publisher" => "OpenAgentsInc",
               "compatibility" => 1,
               "first" => 1
             })

    assert result["registry_digest"] == snapshot.digest
    assert length(result["matches"]) == 1
    assert result["truncated"]

    [projection] = result["matches"]
    assert projection["artifact_digest"] =~ ~r/^[0-9a-f]{64}$/
    refute Map.has_key?(projection, "input_schema")
    refute Map.has_key?(projection, "output_schema")
    refute Map.has_key?(projection, "executor")
    refute Map.has_key?(projection, "provenance")
  end

  test "unknown filters and unbounded result requests fail closed" do
    snapshot = Registry.current!()

    assert {:error, :module_discovery_filter_unknown} =
             Discovery.search(snapshot, %{"secret" => "x"})

    assert {:error, :module_discovery_limit_invalid} =
             Discovery.search(snapshot, %{"first" => 21})

    assert {:error, :module_discovery_query_invalid} =
             Discovery.search(snapshot, %{"query" => ""})
  end

  test "discovery references are non-authorizing and stale references are rejected" do
    snapshot = Registry.current!()
    assert {:ok, result} = Discovery.search(snapshot, %{"first" => 1})
    [reference] = result["matches"]
    assert {:ok, artifact} = Discovery.revalidate(snapshot, reference)
    assert artifact.module_id == reference["module_id"]

    stale_registry = Map.put(reference, "registry_digest", String.duplicate("0", 64))
    assert {:error, :stale_module_registry} = Discovery.revalidate(snapshot, stale_registry)

    stale_artifact = Map.put(reference, "artifact_digest", String.duplicate("0", 64))
    assert {:error, :stale_module_artifact} = Discovery.revalidate(snapshot, stale_artifact)
  end

  test "the model-facing tool searches only its turn-captured registry" do
    snapshot = Registry.current!()
    handler_id = "discovery-telemetry-#{System.unique_integer([:positive])}"
    test_pid = self()

    :ok =
      :telemetry.attach(
        handler_id,
        OpenAgents.Observability.event_name(),
        fn _event, measurements, metadata, _config ->
          send(test_pid, {:operation, measurements, metadata})
        end,
        nil
      )

    on_exit(fn -> :telemetry.detach(handler_id) end)

    context = %ExecutionContext{
      scope: "browser_conversation",
      scope_ref: "conversation:test",
      authorities: MapSet.new(["module.discover"]),
      module_registry_snapshot: snapshot
    }

    call = %{
      call_id: "call-discover",
      name: "module_discover",
      version: 1,
      raw_arguments: Jason.encode!(%{"publisher" => "OpenAgentsInc", "first" => 2})
    }

    assert {:ok, outcome} = Runner.run(snapshot, call, context)
    assert outcome["status"] == "succeeded"
    assert outcome["result"]["registry_digest"] == snapshot.digest
    assert Enum.all?(outcome["result"]["matches"], &(&1["state"] == "admitted"))
    assert length(outcome["result"]["matches"]) <= 2

    assert_receive {:operation, %{count: 1},
                    %{plane: "tool", operation: "execute", status: "succeeded"}}
  end
end