SeibroQuotaTests.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. using Application.Helpers;
  2. namespace Application.Tests;
  3. [TestClass]
  4. public sealed class SeibroQuotaTests
  5. {
  6. [TestMethod]
  7. public void TryConsume_WithinBudget_ConsumesAndReturnsTrue()
  8. {
  9. var quota = new SeibroQuota(() => new DateOnly(2026, 7, 7));
  10. Assert.IsTrue(quota.TryConsume(SeibroCategory.Stock, 3, dailyBudget: 10));
  11. Assert.IsTrue(quota.TryConsume(SeibroCategory.Stock, 7, dailyBudget: 10), "정확히 상한까지 소비 가능");
  12. Assert.AreEqual(10, quota.Used(SeibroCategory.Stock));
  13. Assert.AreEqual(0, quota.Remaining(SeibroCategory.Stock, dailyBudget: 10));
  14. }
  15. [TestMethod]
  16. public void TryConsume_ExceedingBudget_RejectsWithoutPartialConsume()
  17. {
  18. var quota = new SeibroQuota(() => new DateOnly(2026, 7, 7));
  19. Assert.IsTrue(quota.TryConsume(SeibroCategory.Corp, 9, dailyBudget: 10));
  20. Assert.IsFalse(quota.TryConsume(SeibroCategory.Corp, 2, dailyBudget: 10), "상한 초과 소비는 거부");
  21. Assert.AreEqual(9, quota.Used(SeibroCategory.Corp), "거부 시 부분 소비 없음");
  22. Assert.AreEqual(1, quota.Remaining(SeibroCategory.Corp, dailyBudget: 10));
  23. }
  24. [TestMethod]
  25. public void TryConsume_CategoriesAreIndependent()
  26. {
  27. var quota = new SeibroQuota(() => new DateOnly(2026, 7, 7));
  28. Assert.IsTrue(quota.TryConsume(SeibroCategory.Stock, 10, dailyBudget: 10));
  29. Assert.IsFalse(quota.TryConsume(SeibroCategory.Stock, 1, dailyBudget: 10));
  30. Assert.IsTrue(quota.TryConsume(SeibroCategory.Deriv, 1, dailyBudget: 10), "카테고리별 독립 카운터");
  31. Assert.AreEqual(1, quota.Used(SeibroCategory.Deriv));
  32. }
  33. [TestMethod]
  34. public void TryConsume_KstDateRollover_ResetsCounters()
  35. {
  36. var today = new DateOnly(2026, 7, 7);
  37. // KST 날짜 공급자를 주입해 자정 롤오버를 시뮬레이션
  38. var quota = new SeibroQuota(() => today);
  39. Assert.IsTrue(quota.TryConsume(SeibroCategory.Foreign, 10, dailyBudget: 10));
  40. Assert.IsFalse(quota.TryConsume(SeibroCategory.Foreign, 1, dailyBudget: 10), "당일 예산 소진");
  41. today = today.AddDays(1);
  42. Assert.AreEqual(0, quota.Used(SeibroCategory.Foreign), "KST 날짜 변경 시 카운터 리셋");
  43. Assert.IsTrue(quota.TryConsume(SeibroCategory.Foreign, 10, dailyBudget: 10), "다음 날 예산 회복");
  44. }
  45. [TestMethod]
  46. public void TryConsume_ZeroOrNegativeCount_AlwaysTrue_NoConsume()
  47. {
  48. var quota = new SeibroQuota(() => new DateOnly(2026, 7, 7));
  49. Assert.IsTrue(quota.TryConsume(SeibroCategory.Bond, 0, dailyBudget: 0));
  50. Assert.IsTrue(quota.TryConsume(SeibroCategory.Bond, -5, dailyBudget: 0));
  51. Assert.AreEqual(0, quota.Used(SeibroCategory.Bond));
  52. }
  53. }