Add test for executor

This commit is contained in:
2025-11-11 02:15:57 +07:00
parent d02a07f86b
commit e8e2ec5a43
18 changed files with 81418 additions and 170 deletions

View File

@@ -30,42 +30,42 @@ public class BacktestTests : BaseTests
// Setup mock dependencies for BacktestTradingBotGrain
var backtestRepository = new Mock<IBacktestRepository>().Object;
var grainLogger = new Mock<ILogger<BacktestTradingBotGrain>>().Object;
// Setup service scope factory to return ALL TradingBotBase dependencies
_scopeFactory = new Mock<IServiceScopeFactory>();
var mockScope = new Mock<IServiceScope>();
var mockServiceProvider = new Mock<IServiceProvider>();
// Setup TradingBotBase logger
var tradingBotLogger = TradingBaseTests.CreateTradingBotLogger();
mockServiceProvider.Setup(x => x.GetService(typeof(ILogger<TradingBotBase>)))
.Returns(tradingBotLogger);
// Setup all services that TradingBotBase might need
mockServiceProvider.Setup(x => x.GetService(typeof(IExchangeService)))
.Returns(_exchangeService);
mockServiceProvider.Setup(x => x.GetService(typeof(IAccountService)))
.Returns(_accountService.Object);
mockServiceProvider.Setup(x => x.GetService(typeof(ITradingService)))
.Returns(_tradingService.Object);
mockServiceProvider.Setup(x => x.GetService(typeof(IMoneyManagementService)))
.Returns(_moneyManagementService.Object);
// Setup additional services that might be needed
var mockBotService = new Mock<IBotService>();
mockServiceProvider.Setup(x => x.GetService(typeof(IBotService)))
.Returns(mockBotService.Object);
var mockMessengerService = new Mock<IMessengerService>();
mockServiceProvider.Setup(x => x.GetService(typeof(IMessengerService)))
.Returns(mockMessengerService.Object);
mockScope.Setup(x => x.ServiceProvider).Returns(mockServiceProvider.Object);
_scopeFactory.Setup(x => x.CreateScope()).Returns(mockScope.Object);
// Create test user with account
_testUser = new User
{
@@ -73,7 +73,7 @@ public class BacktestTests : BaseTests
Name = "Test User",
Accounts = new List<Account> { _account }
};
// Create BacktestTradingBotGrain instance directly
_backtestGrain = new BacktestTradingBotGrain(grainLogger, _scopeFactory.Object, backtestRepository);
}
@@ -89,7 +89,7 @@ public class BacktestTests : BaseTests
// Arrange
var ticker = Ticker.ETH;
var timeframe = Timeframe.FifteenMinutes;
var daysBack = -10; // Fetch last 30 days of data
var daysBack = -30; // Fetch last 30 days of data
var startDate = DateTime.UtcNow.AddDays(daysBack);
var endDate = DateTime.UtcNow;
@@ -117,7 +117,7 @@ public class BacktestTests : BaseTests
Directory.CreateDirectory(dataDirectory);
}
var fileName = $"{ticker}-{timeframe}-candles.json";
var fileName = $"{ticker}-{timeframe}-candles-{DateTime.UtcNow:HH:m:s zzz}-.json";
var filePath = Path.Combine(dataDirectory, fileName);
// Save to file
@@ -181,10 +181,10 @@ public class BacktestTests : BaseTests
// Act - Call BacktestTradingBotGrain directly (no Orleans needed)
var backtestResult = await _backtestGrain.RunBacktestAsync(
config,
candles.ToHashSet(),
_testUser,
save: false,
config,
candles.ToHashSet(),
_testUser,
save: false,
withCandles: false);
// Output the result to console for review
@@ -210,29 +210,29 @@ public class BacktestTests : BaseTests
// Assert - Verify consistent backtest behavior
// These values ensure that changes to TradingBotBase don't break the backtest logic
Assert.NotNull(backtestResult);
// Financial metrics - using decimal precision
Assert.Equal(-106.56m, Math.Round(backtestResult.FinalPnl, 2));
Assert.Equal(-187.36m, Math.Round(backtestResult.NetPnl, 2));
Assert.Equal(80.80m, Math.Round(backtestResult.Fees, 2));
Assert.Equal(1000.0m, backtestResult.InitialBalance);
// Performance metrics
Assert.Equal(31, backtestResult.WinRate);
Assert.Equal(-10.66m, Math.Round(backtestResult.GrowthPercentage, 2));
Assert.Equal(-0.67m, Math.Round(backtestResult.HodlPercentage, 2));
// Risk metrics
Assert.Equal(247.62m, Math.Round(backtestResult.MaxDrawdown.Value, 2));
Assert.Equal(-0.021, Math.Round(backtestResult.SharpeRatio.Value, 3));
Assert.Equal(0.0, backtestResult.Score);
// Date range validation
Assert.Equal(new DateTime(2025, 10, 14, 12, 0, 0), backtestResult.StartDate);
Assert.Equal(new DateTime(2025, 10, 24, 11, 45, 0), backtestResult.EndDate);
// Additional validation - strategy didn't outperform HODL
Assert.True(backtestResult.GrowthPercentage < backtestResult.HodlPercentage,
Assert.True(backtestResult.GrowthPercentage < backtestResult.HodlPercentage,
"Strategy underperformed HODL as expected for this test scenario");
}
}