| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- 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));
- }
- }
|