using FluentAssertions; using IBKRTrader.Modules.Supervisor.Agent; namespace IBKRTrader.Tests.Modules.Supervisor; [Trait("cat", "unit")] public class OpenRouterClientTests { private static SupervisorTool Tool() => new( "get_kpis", "KPIs", """{"type":"object","properties":{"module":{"type":"string"}}}""", _ => "{}"); [Fact] public void BuildRequestBody_IncludesModelMessagesAndTools() { var messages = new[] { ChatMessage.System("sys"), ChatMessage.User("frage?") }; var body = OpenRouterClient.BuildRequestBody("openrouter/auto", messages, new[] { Tool() }); body.Should().Contain("\"model\":\"openrouter/auto\""); body.Should().Contain("\"role\":\"system\""); body.Should().Contain("frage?"); body.Should().Contain("\"name\":\"get_kpis\""); body.Should().Contain("\"parameters\""); } [Fact] public void ParseResponse_ExtractsContentAndUsage() { const string json = """ {"choices":[{"message":{"content":"Antwort","role":"assistant"}}], "usage":{"prompt_tokens":12,"completion_tokens":3}} """; var r = OpenRouterClient.ParseResponse(json); r.Content.Should().Be("Antwort"); r.ToolCalls.Should().BeEmpty(); r.PromptTokens.Should().Be(12); r.CompletionTokens.Should().Be(3); } [Fact] public void ParseResponse_ExtractsToolCalls() { const string json = """ {"choices":[{"message":{"role":"assistant","content":null, "tool_calls":[{"id":"call_1","type":"function","function":{"name":"get_kpis","arguments":"{\"module\":\"CT\"}"}}]}}]} """; var r = OpenRouterClient.ParseResponse(json); r.ToolCalls.Should().HaveCount(1); r.ToolCalls[0].Name.Should().Be("get_kpis"); r.ToolCalls[0].ArgumentsJson.Should().Contain("CT"); } }