using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.DependencyInjection; using PolyTrader.Core.Analytics; using PolyTrader.Web.Endpoints; using PolyTraderSharp; using PolyTraderSharp.Models; using PolyTraderSharp.Services; using Xunit; namespace PolyTrader.Tests.WebUi { public class DashboardAndJobsEndpointsTests { [Fact] public void JobStatusRow_ToggleIsEnabled_WorksProperly() { var job = new JobStatusRow { JobName = "TestJob", IsEnabled = true }; job.IsEnabled = !job.IsEnabled; Assert.False(job.IsEnabled); job.IsEnabled = !job.IsEnabled; Assert.True(job.IsEnabled); } [Fact] public void AccountOverviewRow_CalculatesPerformanceCorrectly() { var trades = new List { new TradeRecord { AccountId = 1, ModuleName = "CopyTrading", MarketQuestion = "Test Market 1", RealizedPnl = 50m, ClosedAt = DateTime.UtcNow.AddDays(-1) }, new TradeRecord { AccountId = 1, ModuleName = "CopyTrading", MarketQuestion = "Test Market 2", RealizedPnl = -20m, ClosedAt = DateTime.UtcNow.AddDays(-2) }, new TradeRecord { AccountId = 1, ModuleName = "ResolutionFarming", MarketQuestion = "Old Market", RealizedPnl = 100m, ClosedAt = DateTime.UtcNow.AddDays(-10) } }; var since3d = DateTime.UtcNow.AddDays(-3); var (pnl3d, win3d, count3d) = TradeAnalytics.WindowSummary(trades.Where(t => t.ClosedAt >= since3d)); Assert.Equal(30m, pnl3d); Assert.Equal(50m, win3d); // 1 out of 2 trades won Assert.Equal(2, count3d); decimal overallPnl = trades.Sum(t => t.RealizedPnl); Assert.Equal(130m, overallPnl); string modules = trades .Select(t => t.ModuleName) .Where(m => !string.IsNullOrEmpty(m)) .Distinct().OrderBy(m => m) .Aggregate((a, b) => a + ", " + b); Assert.Equal("CopyTrading, ResolutionFarming", modules); } [Fact] public void TradeAnalytics_ComputeKpis_HandlesModuleSet() { var trades = new List { new TradeRecord { ModuleName = "CopyTrading", RealizedPnl = 25m, ClosedAt = DateTime.UtcNow.AddDays(-2) }, new TradeRecord { ModuleName = "CopyTrading", RealizedPnl = -10m, ClosedAt = DateTime.UtcNow.AddDays(-1) }, new TradeRecord { ModuleName = "CopyTrading", RealizedPnl = 15m, ClosedAt = DateTime.UtcNow.Date } }; var kpis = TradeAnalytics.ComputeKpis(trades); Assert.Equal(3, kpis.TradeCount); Assert.Equal(30m, kpis.NetPnl); Assert.True(kpis.WinRatePct > 60m); Assert.Equal(40m / 10m, kpis.ProfitFactor); // gross win 40 / gross loss 10 = 4.0 } } }