routing_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package routing
  2. import (
  3. "testing"
  4. "time"
  5. )
  6. func TestInQuietHours(t *testing.T) {
  7. mkTime := func(h, m int) time.Time {
  8. return time.Date(0, 1, 1, h, m, 0, 0, time.UTC)
  9. }
  10. mkNow := func(h, m int) time.Time {
  11. // 2026-06-13 — a Saturday, in UTC.
  12. return time.Date(2026, 6, 13, h, m, 0, 0, time.UTC)
  13. }
  14. cases := []struct {
  15. name string
  16. now time.Time
  17. quietStart time.Time
  18. quietEnd time.Time
  19. tz string
  20. want bool
  21. }{
  22. {
  23. name: "same-day window: 09:00-17:00, now=12:00",
  24. now: mkNow(12, 0),
  25. quietStart: mkTime(9, 0),
  26. quietEnd: mkTime(17, 0),
  27. tz: "UTC",
  28. want: true,
  29. },
  30. {
  31. name: "same-day window: 09:00-17:00, now=08:00 (before)",
  32. now: mkNow(8, 0),
  33. quietStart: mkTime(9, 0),
  34. quietEnd: mkTime(17, 0),
  35. tz: "UTC",
  36. want: false,
  37. },
  38. {
  39. name: "same-day window: 09:00-17:00, now=18:00 (after)",
  40. now: mkNow(18, 0),
  41. quietStart: mkTime(9, 0),
  42. quietEnd: mkTime(17, 0),
  43. tz: "UTC",
  44. want: false,
  45. },
  46. {
  47. name: "wrap-around: 22:00-06:00, now=23:00 (in)",
  48. now: mkNow(23, 0),
  49. quietStart: mkTime(22, 0),
  50. quietEnd: mkTime(6, 0),
  51. tz: "UTC",
  52. want: true,
  53. },
  54. {
  55. name: "wrap-around: 22:00-06:00, now=03:00 (in)",
  56. now: mkNow(3, 0),
  57. quietStart: mkTime(22, 0),
  58. quietEnd: mkTime(6, 0),
  59. tz: "UTC",
  60. want: true,
  61. },
  62. {
  63. name: "wrap-around: 22:00-06:00, now=12:00 (out)",
  64. now: mkNow(12, 0),
  65. quietStart: mkTime(22, 0),
  66. quietEnd: mkTime(6, 0),
  67. tz: "UTC",
  68. want: false,
  69. },
  70. {
  71. name: "always quiet: 00:00-00:00 (Carol's seed)",
  72. now: mkNow(15, 0),
  73. quietStart: mkTime(0, 0),
  74. quietEnd: mkTime(0, 0),
  75. tz: "UTC",
  76. want: true,
  77. },
  78. {
  79. name: "never quiet: 12:00-12:00",
  80. now: mkNow(15, 0),
  81. quietStart: mkTime(12, 0),
  82. quietEnd: mkTime(12, 0),
  83. tz: "UTC",
  84. want: false,
  85. },
  86. {
  87. name: "edge: same-day window, now exactly at start (in)",
  88. now: mkNow(9, 0),
  89. quietStart: mkTime(9, 0),
  90. quietEnd: mkTime(17, 0),
  91. tz: "UTC",
  92. want: true,
  93. },
  94. {
  95. name: "edge: same-day window, now exactly at end (out)",
  96. now: mkNow(17, 0),
  97. quietStart: mkTime(9, 0),
  98. quietEnd: mkTime(17, 0),
  99. tz: "UTC",
  100. want: false,
  101. },
  102. }
  103. for _, tc := range cases {
  104. t.Run(tc.name, func(t *testing.T) {
  105. got := inQuietHours(tc.now, tc.quietStart, tc.quietEnd, tc.tz)
  106. if got != tc.want {
  107. t.Errorf("inQuietHours(now=%v, start=%v, end=%v, tz=%q) = %v, want %v",
  108. tc.now.Format("15:04"), tc.quietStart.Format("15:04"), tc.quietEnd.Format("15:04"),
  109. tc.tz, got, tc.want)
  110. }
  111. })
  112. }
  113. }