refactor(dotnet): normalize collection read model inputs
This commit is contained in:
@@ -13,9 +13,31 @@ public sealed class CollectionReadModelService : ICollectionReadModelService
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Task<CollectionDashboardStateRecord> GetDashboardStateAsync() => _repository.GetDashboardStateAsync();
|
public Task<CollectionDashboardStateRecord> GetDashboardStateAsync() => _repository.GetDashboardStateAsync();
|
||||||
public Task<List<CollectionRunRecord>> GetRecentRunsAsync(int limit = 20) => _repository.GetRecentRunsAsync(limit);
|
|
||||||
public Task<List<CollectionSnapshotRecord>> GetRunSnapshotsAsync(string runId) => _repository.GetRunSnapshotsAsync(runId);
|
public Task<List<CollectionRunRecord>> GetRecentRunsAsync(int limit = 20)
|
||||||
public Task<List<CollectionErrorRecord>> GetRunErrorsAsync(string runId, int limit = 50) => _repository.GetRunErrorsAsync(runId, limit);
|
=> _repository.GetRecentRunsAsync(NormalizeLimit(limit, 1, 200));
|
||||||
public Task<List<CollectionSnapshotRecord>> GetLatestSnapshotsForTickerAsync(string ticker, int limit = 10) => _repository.GetLatestSnapshotsForTickerAsync(ticker, limit);
|
|
||||||
|
public Task<List<CollectionSnapshotRecord>> GetRunSnapshotsAsync(string runId)
|
||||||
|
=> _repository.GetRunSnapshotsAsync(RequireValue(runId, nameof(runId)));
|
||||||
|
|
||||||
|
public Task<List<CollectionErrorRecord>> GetRunErrorsAsync(string runId, int limit = 50)
|
||||||
|
=> _repository.GetRunErrorsAsync(RequireValue(runId, nameof(runId)), NormalizeLimit(limit, 1, 200));
|
||||||
|
|
||||||
|
public Task<List<CollectionSnapshotRecord>> GetLatestSnapshotsForTickerAsync(string ticker, int limit = 10)
|
||||||
|
=> _repository.GetLatestSnapshotsForTickerAsync(RequireValue(ticker, nameof(ticker)), NormalizeLimit(limit, 1, 100));
|
||||||
|
|
||||||
public Task<List<PriceHistorySummaryRecord>> GetPriceHistorySummaryAsync() => _repository.GetPriceHistorySummaryAsync();
|
public Task<List<PriceHistorySummaryRecord>> GetPriceHistorySummaryAsync() => _repository.GetPriceHistorySummaryAsync();
|
||||||
|
|
||||||
|
private static string RequireValue(string value, string parameterName)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(value))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Value is required.", parameterName);
|
||||||
|
}
|
||||||
|
|
||||||
|
return value.Trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int NormalizeLimit(int limit, int min, int max)
|
||||||
|
=> Math.Clamp(limit, min, max);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
using Moq;
|
||||||
|
using QuantEngine.Application.Services;
|
||||||
|
using QuantEngine.Core.Interfaces;
|
||||||
|
|
||||||
|
namespace QuantEngine.Core.Tests;
|
||||||
|
|
||||||
|
public class CollectionReadModelServiceTests
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public async Task GetRecentRunsAsync_ClampsLimitToUpperBound()
|
||||||
|
{
|
||||||
|
var repo = new Mock<ICollectionReadRepository>(MockBehavior.Strict);
|
||||||
|
repo.Setup(r => r.GetRecentRunsAsync(200)).ReturnsAsync([]);
|
||||||
|
|
||||||
|
var service = new CollectionReadModelService(repo.Object);
|
||||||
|
|
||||||
|
var result = await service.GetRecentRunsAsync(999);
|
||||||
|
|
||||||
|
Assert.Empty(result);
|
||||||
|
repo.VerifyAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task GetLatestSnapshotsForTickerAsync_TrimsTickerAndClampsLimit()
|
||||||
|
{
|
||||||
|
var repo = new Mock<ICollectionReadRepository>(MockBehavior.Strict);
|
||||||
|
repo.Setup(r => r.GetLatestSnapshotsForTickerAsync("005930", 100)).ReturnsAsync([]);
|
||||||
|
|
||||||
|
var service = new CollectionReadModelService(repo.Object);
|
||||||
|
|
||||||
|
var result = await service.GetLatestSnapshotsForTickerAsync(" 005930 ", 999);
|
||||||
|
|
||||||
|
Assert.Empty(result);
|
||||||
|
repo.VerifyAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task GetRunErrorsAsync_RejectsEmptyRunId()
|
||||||
|
{
|
||||||
|
var service = new CollectionReadModelService(new Mock<ICollectionReadRepository>().Object);
|
||||||
|
|
||||||
|
await Assert.ThrowsAsync<ArgumentException>(() => service.GetRunErrorsAsync(" ", 10));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user