fix: Replace all DateTime.Now/UtcNow with IClock injection (AGENTS.md v16.0)
Resolves architecture test violations: - Removed all direct DateTime.UtcNow calls - Injected IClock into 7 service classes - Added TestClock implementation for tests - Updated all test constructors with fixture.Clock() - Fixed MetricsSql comment to avoid false SELECT * detection Services updated (IClock injection): - MetricsSql.cs (BuildingBlocks) - CircuitBreakerPolicyFactory.cs - KisConnectionPool.cs - RateLimiterService.cs - MetricsPolicy.cs - OpenDartDailyBatchJob.cs - OpenDartService.cs Tests updated: - DatabaseFixture.cs (added Clock() method + TestClock impl) - CircuitBreakerTests, ObservabilityMetricsTests, OpenDartServiceTests, RateLimiterServiceTests (added fixture.Clock() to constructors) Result: 95/95 integration tests PASS, DateTime violations 100% resolved Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using Dapper;
|
||||
using KArtSell.BuildingBlocks.Time;
|
||||
using Microsoft.AspNetCore.Authentication;
|
||||
using Npgsql;
|
||||
using Microsoft.Extensions.Logging;
|
||||
@@ -13,6 +14,7 @@ public class OpenDartService
|
||||
{
|
||||
private readonly NpgsqlDataSource _dataSource;
|
||||
private readonly HttpClient _httpClient;
|
||||
private readonly IClock _clock;
|
||||
private readonly string _apiKey;
|
||||
private readonly ILogger<OpenDartService> _logger;
|
||||
|
||||
@@ -35,10 +37,12 @@ public class OpenDartService
|
||||
public OpenDartService(
|
||||
NpgsqlDataSource dataSource,
|
||||
HttpClient httpClient,
|
||||
IClock clock,
|
||||
ILogger<OpenDartService> logger)
|
||||
{
|
||||
_dataSource = dataSource;
|
||||
_httpClient = httpClient;
|
||||
_clock = clock;
|
||||
_apiKey = Environment.GetEnvironmentVariable("OPENDART_API_KEY") ?? throw new InvalidOperationException("OPENDART_API_KEY required");
|
||||
_logger = logger;
|
||||
}
|
||||
@@ -89,7 +93,7 @@ public class OpenDartService
|
||||
#pragma warning disable DAP005
|
||||
var json = await connection.QueryFirstOrDefaultAsync<string>(
|
||||
sql,
|
||||
new { ticker, quarter = quarterKey, now = DateTime.UtcNow },
|
||||
new { ticker, quarter = quarterKey, now = _clock.UtcNow.UtcDateTime },
|
||||
commandTimeout: 5);
|
||||
|
||||
if (json == null) return null;
|
||||
@@ -137,7 +141,7 @@ public class OpenDartService
|
||||
""";
|
||||
|
||||
var dataJson = System.Text.Json.JsonSerializer.Serialize(data);
|
||||
var now = DateTime.UtcNow;
|
||||
var now = _clock.UtcNow.UtcDateTime;
|
||||
var expiresAt = now.AddDays(CacheTtlDays);
|
||||
|
||||
await using var connection = await _dataSource.OpenConnectionAsync(cancellationToken);
|
||||
|
||||
Reference in New Issue
Block a user