DET-004: Refactor more Policy Gates for determinism
- BudgetConstraintEnforcer: inject TimeProvider - EvidenceFreshnessGate: inject TimeProvider Replace DateTimeOffset.UtcNow with _timeProvider.GetUtcNow() Sprint: SPRINT_20260104_001_BE_determinism_timeprovider_injection
This commit is contained in:
@@ -11,14 +11,17 @@ public sealed class BudgetConstraintEnforcer : IBudgetConstraintEnforcer
|
||||
private readonly IBudgetLedger _ledger;
|
||||
private readonly IGateSelector _gateSelector;
|
||||
private readonly ILogger<BudgetConstraintEnforcer> _logger;
|
||||
private readonly TimeProvider _timeProvider;
|
||||
|
||||
public BudgetConstraintEnforcer(
|
||||
IBudgetLedger ledger,
|
||||
IGateSelector gateSelector,
|
||||
TimeProvider? timeProvider = null,
|
||||
ILogger<BudgetConstraintEnforcer>? logger = null)
|
||||
{
|
||||
_ledger = ledger ?? throw new ArgumentNullException(nameof(ledger));
|
||||
_gateSelector = gateSelector ?? throw new ArgumentNullException(nameof(gateSelector));
|
||||
_timeProvider = timeProvider ?? TimeProvider.System;
|
||||
_logger = logger ?? NullLogger<BudgetConstraintEnforcer>.Instance;
|
||||
}
|
||||
|
||||
@@ -134,7 +137,7 @@ public sealed class BudgetConstraintEnforcer : IBudgetConstraintEnforcer
|
||||
TotalRiskPoints = penaltyRiskPoints,
|
||||
Budget = consumeResult.Budget,
|
||||
FollowUpRequired = true,
|
||||
FollowUpDeadline = DateTimeOffset.UtcNow.AddDays(5)
|
||||
FollowUpDeadline = _timeProvider.GetUtcNow().AddDays(5)
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -13,13 +13,16 @@ public sealed class EvidenceFreshnessGate : IPolicyGate
|
||||
{
|
||||
private readonly IEvidenceTtlEnforcer _ttlEnforcer;
|
||||
private readonly ILogger<EvidenceFreshnessGate> _logger;
|
||||
private readonly TimeProvider _timeProvider;
|
||||
|
||||
public EvidenceFreshnessGate(
|
||||
IEvidenceTtlEnforcer ttlEnforcer,
|
||||
ILogger<EvidenceFreshnessGate> logger)
|
||||
ILogger<EvidenceFreshnessGate> logger,
|
||||
TimeProvider? timeProvider = null)
|
||||
{
|
||||
_ttlEnforcer = ttlEnforcer;
|
||||
_logger = logger;
|
||||
_timeProvider = timeProvider ?? TimeProvider.System;
|
||||
}
|
||||
|
||||
public Task<GateResult> EvaluateAsync(
|
||||
@@ -30,7 +33,7 @@ public sealed class EvidenceFreshnessGate : IPolicyGate
|
||||
// Build evidence bundle from context
|
||||
var evidenceBundle = BuildEvidenceBundleFromContext(context);
|
||||
|
||||
var freshnessResult = _ttlEnforcer.CheckFreshness(evidenceBundle, DateTimeOffset.UtcNow);
|
||||
var freshnessResult = _ttlEnforcer.CheckFreshness(evidenceBundle, _timeProvider.GetUtcNow());
|
||||
|
||||
var details = ImmutableDictionary.CreateBuilder<string, object>();
|
||||
details.Add("overall_status", freshnessResult.OverallStatus.ToString());
|
||||
|
||||
Reference in New Issue
Block a user