using FluentAssertions; using IBKRTrader.Core.Logging; namespace IBKRTrader.Tests.Logging; [Trait("cat", "unit")] public class LogJsonTests { [Fact] public void RoundTrip_PreservesFields() { var ts = new DateTime(2026, 7, 30, 12, 34, 56, DateTimeKind.Utc); var line = LogJson.WriteLine(ts, AppLogLevel.Warn, "CT", "Kurs fehlt für AAPL", "sig-123"); var parsed = LogJson.ParseLine(line); parsed.Should().NotBeNull(); parsed!.Ts.Should().Be(ts); parsed.Level.Should().Be("Warn"); parsed.Source.Should().Be("CT"); parsed.Cid.Should().Be("sig-123"); parsed.Message.Should().Be("Kurs fehlt für AAPL"); } [Fact] public void WriteLine_OmitsCid_WhenNull() { var line = LogJson.WriteLine(DateTime.UtcNow, AppLogLevel.Info, "Core", "hello", null); line.Should().NotContain("cid"); LogJson.ParseLine(line)!.Cid.Should().BeNull(); } [Theory] [InlineData("")] [InlineData(" ")] [InlineData("nicht json")] [InlineData("{ kaputt")] public void ParseLine_ReturnsNull_OnGarbage(string input) { LogJson.ParseLine(input).Should().BeNull(); } }