using FluentAssertions; using Marathon.Application.Abstractions; using Marathon.Application.UseCases; using Marathon.Domain.Backtesting; using Marathon.Domain.Entities; using Microsoft.Extensions.Logging.Abstractions; using NSubstitute; namespace Marathon.Application.Tests.UseCases; public sealed class CompareStrategiesUseCaseTests { private readonly ISavedStrategyRepository _strategies = Substitute.For(); private readonly IAnomalyRepository _anomalies = Substitute.For(); private readonly IEventRepository _events = Substitute.For(); private readonly IResultRepository _results = Substitute.For(); private CompareStrategiesUseCase CreateSut() { var backtest = new RunBacktestUseCase(_anomalies, _events, _results, NullLogger.Instance); return new CompareStrategiesUseCase(_strategies, backtest, NullLogger.Instance); } [Fact] public async Task Empty_When_NoPresets() { _strategies.ListAsync(Arg.Any()).Returns(Array.Empty()); (await CreateSut().ExecuteAsync(null)).Should().BeEmpty(); } [Fact] public async Task RunsEachPreset_PreservingNameAndOrder() { _strategies.ListAsync(Arg.Any()).Returns(new[] { SavedStrategy.Create("Alpha", BacktestStrategy.Default), SavedStrategy.Create("Beta", BacktestStrategy.Default), }); // No anomalies → each backtest returns a 0-bet result; events/results are never queried. _anomalies.ListAsync(Arg.Any()).Returns(Array.Empty()); var rows = await CreateSut().ExecuteAsync(null); rows.Select(r => r.Name).Should().ContainInOrder("Alpha", "Beta"); rows.Should().OnlyContain(r => r.Result.BetsPlaced == 0); } }