using Application.Helpers; namespace Application.Tests; [TestClass] public sealed class SeibroQuotaTests { [TestMethod] public void TryConsume_WithinBudget_ConsumesAndReturnsTrue() { var quota = new SeibroQuota(() => new DateOnly(2026, 7, 7)); Assert.IsTrue(quota.TryConsume(SeibroCategory.Stock, 3, dailyBudget: 10)); Assert.IsTrue(quota.TryConsume(SeibroCategory.Stock, 7, dailyBudget: 10), "정확히 상한까지 소비 가능"); Assert.AreEqual(10, quota.Used(SeibroCategory.Stock)); Assert.AreEqual(0, quota.Remaining(SeibroCategory.Stock, dailyBudget: 10)); } [TestMethod] public void TryConsume_ExceedingBudget_RejectsWithoutPartialConsume() { var quota = new SeibroQuota(() => new DateOnly(2026, 7, 7)); Assert.IsTrue(quota.TryConsume(SeibroCategory.Corp, 9, dailyBudget: 10)); Assert.IsFalse(quota.TryConsume(SeibroCategory.Corp, 2, dailyBudget: 10), "상한 초과 소비는 거부"); Assert.AreEqual(9, quota.Used(SeibroCategory.Corp), "거부 시 부분 소비 없음"); Assert.AreEqual(1, quota.Remaining(SeibroCategory.Corp, dailyBudget: 10)); } [TestMethod] public void TryConsume_CategoriesAreIndependent() { var quota = new SeibroQuota(() => new DateOnly(2026, 7, 7)); Assert.IsTrue(quota.TryConsume(SeibroCategory.Stock, 10, dailyBudget: 10)); Assert.IsFalse(quota.TryConsume(SeibroCategory.Stock, 1, dailyBudget: 10)); Assert.IsTrue(quota.TryConsume(SeibroCategory.Deriv, 1, dailyBudget: 10), "카테고리별 독립 카운터"); Assert.AreEqual(1, quota.Used(SeibroCategory.Deriv)); } [TestMethod] public void TryConsume_KstDateRollover_ResetsCounters() { var today = new DateOnly(2026, 7, 7); // KST 날짜 공급자를 주입해 자정 롤오버를 시뮬레이션 var quota = new SeibroQuota(() => today); Assert.IsTrue(quota.TryConsume(SeibroCategory.Foreign, 10, dailyBudget: 10)); Assert.IsFalse(quota.TryConsume(SeibroCategory.Foreign, 1, dailyBudget: 10), "당일 예산 소진"); today = today.AddDays(1); Assert.AreEqual(0, quota.Used(SeibroCategory.Foreign), "KST 날짜 변경 시 카운터 리셋"); Assert.IsTrue(quota.TryConsume(SeibroCategory.Foreign, 10, dailyBudget: 10), "다음 날 예산 회복"); } [TestMethod] public void TryConsume_ZeroOrNegativeCount_AlwaysTrue_NoConsume() { var quota = new SeibroQuota(() => new DateOnly(2026, 7, 7)); Assert.IsTrue(quota.TryConsume(SeibroCategory.Bond, 0, dailyBudget: 0)); Assert.IsTrue(quota.TryConsume(SeibroCategory.Bond, -5, dailyBudget: 0)); Assert.AreEqual(0, quota.Used(SeibroCategory.Bond)); } }