| 1 | using System.Collections.Frozen; |
| 2 | using System.Text.Json; |
| 3 | using OpenAgentRegistry.Mcp; |
| 4 | using OpenAgentRegistry.Tests; |
| 5 | |
| 6 | namespace OpenAgentRegistry.Mcp.Tests; |
| 7 | |
| 8 | public sealed class McpToolTests(RegistryWebApplicationFactory factory) : IClassFixture<RegistryWebApplicationFactory> |
| 9 | { |
| 10 | [Fact] |
| 11 | public async Task Register_and_search_via_mcp_handlers() |
| 12 | { |
| 13 | using var http = factory.CreateClient(); |
| 14 | var client = new RegistryApiClient(http); |
| 15 | |
| 16 | var registerArgs = FrozenDictionary<string, JsonElement>.Empty |
| 17 | .AppendPair("name", JsonSerializer.SerializeToElement("McpLine")) |
| 18 | .AppendPair("description", JsonSerializer.SerializeToElement("MCP integration test")) |
| 19 | .AppendPair("logical_line_id", JsonSerializer.SerializeToElement("line-mcp-test")); |
| 20 | |
| 21 | var register = await ToolHandlers.HandleAsync("register_agent", client, registerArgs, CancellationToken.None); |
| 22 | Assert.True(register.IsSuccess); |
| 23 | using var regDoc = JsonDocument.Parse(register.Body); |
| 24 | Assert.True(regDoc.RootElement.TryGetProperty("apiKey", out var apiKey)); |
| 25 | Assert.StartsWith("oar_", apiKey.GetString()); |
| 26 | |
| 27 | var searchArgs = FrozenDictionary<string, JsonElement>.Empty |
| 28 | .AppendPair("logical_line_id", JsonSerializer.SerializeToElement("line-mcp-test")) |
| 29 | .AppendPair("claimed_only", JsonSerializer.SerializeToElement(false)); |
| 30 | |
| 31 | var search = await ToolHandlers.HandleAsync("search_agents", client, searchArgs, CancellationToken.None); |
| 32 | Assert.True(search.IsSuccess); |
| 33 | using var searchDoc = JsonDocument.Parse(search.Body); |
| 34 | Assert.Equal(1, searchDoc.RootElement.GetProperty("total").GetInt32()); |
| 35 | } |
| 36 | |
| 37 | [Fact] |
| 38 | public async Task Get_agent_returns_not_found_for_missing() |
| 39 | { |
| 40 | using var http = factory.CreateClient(); |
| 41 | var client = new RegistryApiClient(http); |
| 42 | var args = FrozenDictionary<string, JsonElement>.Empty |
| 43 | .AppendPair("name", JsonSerializer.SerializeToElement("no-such-agent")); |
| 44 | |
| 45 | var result = await ToolHandlers.HandleAsync("get_agent", client, args, CancellationToken.None); |
| 46 | Assert.False(result.IsSuccess); |
| 47 | Assert.Contains("not found", result.Body, StringComparison.OrdinalIgnoreCase); |
| 48 | } |
| 49 | } |
| 50 | |
| 51 | file static class FrozenDictionaryExtensions |
| 52 | { |
| 53 | internal static FrozenDictionary<string, JsonElement> AppendPair( |
| 54 | this FrozenDictionary<string, JsonElement> source, |
| 55 | string key, |
| 56 | JsonElement value) |
| 57 | { |
| 58 | var dict = source.ToDictionary(static pair => pair.Key, static pair => pair.Value); |
| 59 | dict[key] = value; |
| 60 | return dict.ToFrozenDictionary(); |
| 61 | } |
| 62 | } |
| 63 | |