using FluentAssertions; using IBKRTrader.Core.Analytics; using IBKRTrader.Core.Logging; using IBKRTrader.Core.Persistence.Entities; namespace IBKRTrader.Tests.Analytics; [Trait("cat", "unit")] public class DossierBuilderTests { [Fact] public void Build_OrdersEverythingChronologically() { var decisions = new[] { new CoreDecisionRecord { SignalId = "s", Timestamp = new DateTime(2026,1,1,0,2,0,DateTimeKind.Utc), Decision = TradeDecision.Executed }, new CoreDecisionRecord { SignalId = "s", Timestamp = new DateTime(2026,1,1,0,1,0,DateTimeKind.Utc), Decision = TradeDecision.Skipped } }; var dossier = DossierBuilder.Build("s", decisions, Array.Empty(), Array.Empty(), Array.Empty()); dossier.Decisions[0].Decision.Should().Be(TradeDecision.Skipped); // frühester zuerst dossier.Decisions[1].Decision.Should().Be(TradeDecision.Executed); } [Fact] public void ToMarkdown_And_ToJson_ContainSignalId_AndData() { var decisions = new[] { new CoreDecisionRecord { SignalId = "sig-9", Module = "CT", Symbol = "AAPL", Side = "BUY", Decision = TradeDecision.Rejected, Reason = DecisionReason.RiskRejected, Message = "Limit überschritten" } }; var dossier = DossierBuilder.Build("sig-9", decisions, Array.Empty(), Array.Empty(), Array.Empty()); var md = DossierBuilder.ToMarkdown(dossier); md.Should().Contain("sig-9").And.Contain("RiskRejected").And.Contain("Limit überschritten"); var json = DossierBuilder.ToJson(dossier); json.Should().Contain("sig-9").And.Contain("RiskRejected"); } }