diff --git a/src/dotnet/QuantEngine.Core.Tests/BffApiTests.cs b/src/dotnet/QuantEngine.Core.Tests/BffApiTests.cs new file mode 100644 index 00000000..69b15bee --- /dev/null +++ b/src/dotnet/QuantEngine.Core.Tests/BffApiTests.cs @@ -0,0 +1,62 @@ +using System; +using System.IO; +using System.Text; +using System.Text.Json; +using Xunit; + +namespace QuantEngine.Core.Tests +{ + public class BffApiTests + { + [Fact] + public void UpdateFactorThreshold_ValidJson_ParsesCorrectly() + { + // Arrange + var jsonString = "{\"momentum_lookback\": 20, \"volatility_cap\": 0.05}"; + + // Act + using var doc = JsonDocument.Parse(jsonString); + var root = doc.RootElement; + var lookback = root.GetProperty("momentum_lookback").GetInt32(); + var cap = root.GetProperty("volatility_cap").GetDouble(); + + // Assert + Assert.Equal(20, lookback); + Assert.Equal(0.05, cap); + } + + [Fact] + public void ExportStreamingFactorOlap_WriteCsvRow_MatchesExpectedFormat() + { + // Arrange + var sb = new StringBuilder(); + var headers = new[] { "ticker", "as_of_date", "close_price", "nav_price" }; + sb.AppendLine(string.Join(",", headers)); + + var row = new object[] { "123456", "2026-07-25", 50000, 49800 }; + sb.AppendLine(string.Join(",", row)); + + // Act + var output = sb.ToString(); + + // Assert + Assert.Contains("ticker,as_of_date,close_price,nav_price", output); + Assert.Contains("123456,2026-07-25,50000,49800", output); + } + + [Fact] + public void BulkInsertMarketExcel_EmptyCellValidation_DetectsNull() + { + // Arrange + string? ticker = null; + double? price = null; + + + // Act + bool isInvalid = string.IsNullOrEmpty(ticker) || !price.HasValue; + + // Assert + Assert.True(isInvalid); + } + } +}