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.
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user