service_tier_billing_test.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package service
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/require"
  5. )
  6. func TestResolveBillingServiceTier(t *testing.T) {
  7. tests := []struct {
  8. name string
  9. requested string
  10. observed string
  11. billing string
  12. downgraded bool
  13. }{
  14. {name: "openai priority served as default", requested: "priority", observed: "default", billing: "default", downgraded: true},
  15. {name: "anthropic fast served as standard", requested: "fast", observed: "standard", billing: "standard", downgraded: true},
  16. {name: "priority honoured", requested: "priority", observed: "priority", billing: "priority"},
  17. {name: "no declaration keeps request", requested: "priority", observed: "", billing: "priority"},
  18. {name: "no request no declaration", requested: "", observed: "", billing: ""},
  19. {name: "response never raises the tier", requested: "", observed: "priority", billing: ""},
  20. {name: "flex never raised to default", requested: "flex", observed: "default", billing: "flex"},
  21. {name: "default echoed for untiered request", requested: "", observed: "default", billing: ""},
  22. {name: "unknown response tier ignored", requested: "priority", observed: "turbo", billing: "priority"},
  23. {name: "case and whitespace normalised", requested: " Priority ", observed: "DEFAULT", billing: "default", downgraded: true},
  24. }
  25. for _, tt := range tests {
  26. t.Run(tt.name, func(t *testing.T) {
  27. got := ResolveBillingServiceTier(tt.requested, tt.observed)
  28. require.Equal(t, tt.billing, got.Billing)
  29. require.Equal(t, tt.downgraded, got.Downgraded)
  30. })
  31. }
  32. }
  33. func TestApplyServiceTierBillingResolutionOnlyRewritesDowngrades(t *testing.T) {
  34. t.Run("codex exception only covers OpenAI default", func(t *testing.T) {
  35. require.True(t, codexOAuthResponseTierIsNonAuthoritative("default"))
  36. require.False(t, codexOAuthResponseTierIsNonAuthoritative("standard"))
  37. require.False(t, codexOAuthResponseTierIsNonAuthoritative("flex"))
  38. })
  39. t.Run("openai downgrade rewrites tier", func(t *testing.T) {
  40. requested := "priority"
  41. result := &OpenAIForwardResult{ServiceTier: &requested, UpstreamResponseServiceTier: "default"}
  42. resolution := ApplyOpenAIServiceTierBillingResolution(&Account{Platform: PlatformOpenAI, Type: AccountTypeAPIKey}, result)
  43. require.True(t, resolution.Downgraded)
  44. require.NotNil(t, result.ServiceTier)
  45. require.Equal(t, "default", *result.ServiceTier)
  46. })
  47. t.Run("openai honoured tier keeps pointer", func(t *testing.T) {
  48. requested := "priority"
  49. result := &OpenAIForwardResult{ServiceTier: &requested, UpstreamResponseServiceTier: "priority"}
  50. require.False(t, ApplyOpenAIServiceTierBillingResolution(&Account{Platform: PlatformOpenAI, Type: AccountTypeAPIKey}, result).Downgraded)
  51. require.Same(t, &requested, result.ServiceTier)
  52. })
  53. t.Run("openai untiered request stays nil", func(t *testing.T) {
  54. result := &OpenAIForwardResult{UpstreamResponseServiceTier: "priority"}
  55. require.False(t, ApplyOpenAIServiceTierBillingResolution(&Account{Platform: PlatformOpenAI, Type: AccountTypeAPIKey}, result).Downgraded)
  56. require.Nil(t, result.ServiceTier)
  57. })
  58. for _, accountType := range []string{AccountTypeOAuth, AccountTypeSetupToken} {
  59. t.Run("codex "+accountType+" keeps outbound priority despite default echo", func(t *testing.T) {
  60. requested := "priority"
  61. result := &OpenAIForwardResult{ServiceTier: &requested, UpstreamResponseServiceTier: "default"}
  62. resolution := ApplyOpenAIServiceTierBillingResolution(
  63. &Account{Platform: PlatformOpenAI, Type: accountType},
  64. result,
  65. )
  66. require.False(t, resolution.Downgraded)
  67. require.Equal(t, "priority", resolution.Requested)
  68. require.Equal(t, "default", resolution.Observed)
  69. require.Equal(t, "priority", resolution.Billing)
  70. require.Same(t, &requested, result.ServiceTier)
  71. })
  72. t.Run("codex "+accountType+" still accepts an explicit flex downgrade", func(t *testing.T) {
  73. requested := "priority"
  74. result := &OpenAIForwardResult{ServiceTier: &requested, UpstreamResponseServiceTier: "flex"}
  75. resolution := ApplyOpenAIServiceTierBillingResolution(
  76. &Account{Platform: PlatformOpenAI, Type: accountType},
  77. result,
  78. )
  79. require.True(t, resolution.Downgraded)
  80. require.Equal(t, "flex", resolution.Billing)
  81. require.Equal(t, "flex", *result.ServiceTier)
  82. })
  83. t.Run("codex "+accountType+" response never promotes an untiered request", func(t *testing.T) {
  84. result := &OpenAIForwardResult{UpstreamResponseServiceTier: "priority"}
  85. resolution := ApplyOpenAIServiceTierBillingResolution(
  86. &Account{Platform: PlatformOpenAI, Type: accountType},
  87. result,
  88. )
  89. require.False(t, resolution.Downgraded)
  90. require.Empty(t, resolution.Billing)
  91. require.Nil(t, result.ServiceTier)
  92. })
  93. }
  94. t.Run("non-openai oauth still uses the generic response contract", func(t *testing.T) {
  95. requested := "priority"
  96. result := &OpenAIForwardResult{ServiceTier: &requested, UpstreamResponseServiceTier: "default"}
  97. resolution := ApplyOpenAIServiceTierBillingResolution(
  98. &Account{Platform: PlatformGrok, Type: AccountTypeOAuth},
  99. result,
  100. )
  101. require.True(t, resolution.Downgraded)
  102. require.Equal(t, "default", resolution.Billing)
  103. require.Equal(t, "default", *result.ServiceTier)
  104. })
  105. t.Run("anthropic standard speed rewrites fast", func(t *testing.T) {
  106. requested := "fast"
  107. result := &ForwardResult{ServiceTier: &requested, UpstreamResponseServiceTier: "standard"}
  108. require.True(t, ApplyForwardServiceTierBillingResolution(result).Downgraded)
  109. require.Equal(t, "standard", *result.ServiceTier)
  110. })
  111. t.Run("nil results are ignored", func(t *testing.T) {
  112. require.False(t, ApplyOpenAIServiceTierBillingResolution(nil, nil).Downgraded)
  113. require.False(t, ApplyForwardServiceTierBillingResolution(nil).Downgraded)
  114. })
  115. }