Files
KArtSell.Aegis/tests/KArtSell.ModelOperations.UnitTests/ModelOperationRequestServiceTests.cs
T
kjh2064 d18f6a7a67 feat: preserve due operation provenance (AEG-V15-035)
Carries scheduledFor, catch-up policy, and maxCatchUp from the scheduler through the request model and transactional outbox. Evidence: targeted Release tests 5/5 passed; TRX SHA256 C1BF3EF274702305A29673D5B6A1C3A98D08B1716DA3CD8CB0EE710B5E6C12E6. Schedules remain disabled.
2026-08-09 02:04:26 +09:00

57 lines
2.1 KiB
C#

using KArtSell.BuildingBlocks.Time;
using KArtSell.BuildingBlocks.Versioning;
using KArtSell.Modules.ModelOperations.Application;
namespace KArtSell.ModelOperations.UnitTests;
public sealed class ModelOperationRequestServiceTests
{
[Fact]
public async Task Persists_the_scheduled_occurrence_and_catch_up_provenance()
{
var scheduledFor = new DateTimeOffset(2026, 8, 9, 1, 0, 0, TimeSpan.Zero);
var context = new ApprovedModelContext(
"GLOBAL",
new VersionSet("dataset", "data-hash", "model", "config", "code-sha", "contract"),
"APPROVED",
scheduledFor.AddDays(-1));
var repository = new CapturingRequestRepository();
var service = new ModelOperationRequestService(
new FixedContextReader(context),
repository,
new FixedClock(scheduledFor.AddHours(2)));
var request = await service.RequestAsync(
Guid.NewGuid(), "J31", "GLOBAL", "EVALUATION_ONLY", "J31:GLOBAL:1:20260809010000Z",
scheduledFor, "ALL_WITH_LIMIT", 2, "correlation", CancellationToken.None);
Assert.NotNull(request);
Assert.Same(request, repository.Request);
Assert.Equal(scheduledFor, request.ScheduledFor);
Assert.Equal("ALL_WITH_LIMIT", request.CatchUpPolicy);
Assert.Equal(2, request.MaxCatchUp);
}
private sealed class FixedContextReader(ApprovedModelContext context) : IApprovedModelContextReader
{
public Task<ApprovedModelContext?> ReadAsync(string scopeKey, DateTimeOffset asOf, CancellationToken cancellationToken)
=> Task.FromResult<ApprovedModelContext?>(context);
}
private sealed class CapturingRequestRepository : IModelOperationRequestRepository
{
public ModelOperationRequest? Request { get; private set; }
public Task<bool> AddAsync(ModelOperationRequest request, CancellationToken cancellationToken)
{
Request = request;
return Task.FromResult(true);
}
}
private sealed class FixedClock(DateTimeOffset utcNow) : IClock
{
public DateTimeOffset UtcNow => utcNow;
}
}