account_scheduling_threshold_reason_test.go 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. //go:build unit
  2. package service
  3. import (
  4. "encoding/json"
  5. "testing"
  6. "time"
  7. "github.com/stretchr/testify/require"
  8. )
  9. func TestBuildAccountSchedulingThresholdReason_UsesSourceAndFallbackMessage(t *testing.T) {
  10. raw := BuildAccountSchedulingThresholdReason(" \t ")
  11. var payload map[string]string
  12. require.NoError(t, json.Unmarshal([]byte(raw), &payload))
  13. require.Equal(t, AccountSchedulingThresholdReasonSource, payload["source"])
  14. require.Equal(t, defaultAccountSchedulingThresholdErrorMessage, payload["error_message"])
  15. require.True(t, IsAccountSchedulingThresholdReason(raw))
  16. }
  17. func TestIsAccountSchedulingThresholdReason(t *testing.T) {
  18. require.True(t, IsAccountSchedulingThresholdReason(BuildAccountSchedulingThresholdReason("threshold reached")))
  19. require.False(t, IsAccountSchedulingThresholdReason(BuildTempUnschedReasonPayload("", "temporary block")))
  20. require.False(t, IsAccountSchedulingThresholdReason("plain text reason"))
  21. }
  22. func TestTempUnschedStateFromStoredReason_EmptyReasonUsesFallbackErrorMessage(t *testing.T) {
  23. state := tempUnschedStateFromStoredReason(" \n ", 1735689600)
  24. require.NotNil(t, state)
  25. require.Equal(t, int64(1735689600), state.UntilUnix)
  26. require.Equal(t, defaultTempUnschedReasonErrorMessage, state.ErrorMessage)
  27. }
  28. func TestTempUnschedStateFromStoredReason_MissingRuleIndexIsSystemRule(t *testing.T) {
  29. state := tempUnschedStateFromStoredReason(`{"error_message":"system cooldown"}`, 123)
  30. require.Equal(t, -1, state.RuleIndex)
  31. }
  32. func TestTempUnschedStateFromStoredReason_SchedulingThresholdJSONWithoutMessageUsesThresholdFallback(t *testing.T) {
  33. raw := `{"source":"` + AccountSchedulingThresholdReasonSource + `"}`
  34. state := tempUnschedStateFromStoredReason(raw, 1735689600)
  35. require.NotNil(t, state)
  36. require.Equal(t, int64(1735689600), state.UntilUnix)
  37. require.Equal(t, defaultAccountSchedulingThresholdErrorMessage, state.ErrorMessage)
  38. }
  39. func TestBuildDetailedAccountSchedulingThresholdReason_IncludesReadableFields(t *testing.T) {
  40. now := time.Unix(1735689600, 0).UTC()
  41. until := now.Add(5 * time.Hour)
  42. raw := BuildDetailedAccountSchedulingThresholdReason(AccountSchedulingThresholdReasonInput{
  43. Platform: PlatformOpenAI,
  44. Window: "7d",
  45. ThresholdPercent: 90,
  46. UsedPercent: 92.5,
  47. Until: until,
  48. Now: now,
  49. })
  50. var payload map[string]any
  51. require.NoError(t, json.Unmarshal([]byte(raw), &payload))
  52. require.Equal(t, AccountSchedulingThresholdReasonSource, payload["source"])
  53. require.Equal(t, PlatformOpenAI, payload["platform"])
  54. require.Equal(t, "7d", payload["window"])
  55. require.Equal(t, float64(90), payload["threshold_percent"])
  56. require.Equal(t, float64(92.5), payload["used_percent"])
  57. require.Equal(t, float64(until.Unix()), payload["until_unix"])
  58. require.Equal(t, float64(now.Unix()), payload["triggered_at_unix"])
  59. require.Contains(t, payload["error_message"], "openai scheduling threshold reached")
  60. require.Contains(t, payload["error_message"], "92.5% used >= 90%")
  61. }