BuildingBlocks.Time, sistem saatini soyutlar. Kodun her yerinde DateTime.UtcNow çağırmak yerine IClock (veya statik Time fasadı) kullanılır; böylece zamana bağlı mantık (OTP süresi, TOTP pencere hesabı, token expiry) deterministik şekilde test edilebilir olur.
Neden zaman soyutlanır?
DateTime.UtcNow global ve kontrol edilemez bir bağımlılıktır. Soyutlama olmadan şu testler kararsız (flaky) olur:
- OTP’nin 3 dakika sonra süresinin dolması
- TOTP’nin ±1 zaman penceresinde doğrulanması
- Refresh token’ın geçerlilik kontrolü
IClock/FakeClock ile zaman sabitlenir ve “tam sınırda ne olur?” senaryoları net biçimde sınanır.
Arayüz ve implementasyonlar
| Tip | Üye | Açıklama |
|---|---|---|
IClock | DateTime UtcNow { get; } | Soyut sistem saati |
SystemClock : IClock | static SystemClock Instance · UtcNow => DateTime.UtcNow | Prod — singleton |
FakeClock : IClock | FakeClock(DateTime utc) · UtcNow => _utc | Test — sabit zaman |
Statik Time fasadı
DI gerektirmeyen, async-flow güvenli statik bir giriş noktası da vardır. AsyncLocal tabanlı scoped override ile testte zamanı geçici olarak değiştirir; ayrıca Türkiye yerel saatini sağlar.
| Üye | Döner |
|---|---|
Time.UtcNow | Override-aware UTC (yoksa SystemClock) |
Time.Now | Europe/Istanbul yerel saati |
Time.Today | Türkiye tarihi |
Time.Override(IClock) | IDisposable Scope — dispose’da önceki saate döner |
DI kaydı
IClock singleton olarak kaydedilir (prod’da SystemClock).
Test — sabit zaman
FakeClock ile “şimdi”yi sabitleyip sınır koşullarını deterministik test edin:
Time kullanan kod için scoped override:
Time fasadı yerel saat için Europe/Istanbul’u (yoksa “Turkey Standard Time”) çözer. Kalıcı veriyi daima UTC saklayın; yerelleştirmeyi yalnızca görüntüleme katmanında yapın.İlgili
OTP
Kod süresi ve throttle hesapları.
Authenticator (TOTP)
RFC6238 zaman penceresi doğrulaması.
JWT
Token expiry ve clock skew.
Domain
Aggregate’lerde zamana bağlı kurallar.