Files
sub2api/backend/internal/service/service_tier_billing_test.go
T

134 lines
6.2 KiB
Go

package service
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestResolveBillingServiceTier(t *testing.T) {
tests := []struct {
name string
requested string
observed string
billing string
downgraded bool
}{
{name: "openai priority served as default", requested: "priority", observed: "default", billing: "default", downgraded: true},
{name: "anthropic fast served as standard", requested: "fast", observed: "standard", billing: "standard", downgraded: true},
{name: "ultrafast served as priority", requested: "ultrafast", observed: "priority", billing: "priority", downgraded: true},
{name: "ultrafast served as default", requested: "ultrafast", observed: "default", billing: "default", downgraded: true},
{name: "ultrafast honoured", requested: "ultrafast", observed: "ultrafast", billing: "ultrafast"},
{name: "ultrafast missing declaration", requested: "ultrafast", billing: "ultrafast"},
{name: "response cannot upgrade to ultrafast", requested: "priority", observed: "ultrafast", billing: "priority"},
{name: "priority honoured", requested: "priority", observed: "priority", billing: "priority"},
{name: "no declaration keeps request", requested: "priority", observed: "", billing: "priority"},
{name: "no request no declaration", requested: "", observed: "", billing: ""},
{name: "response never raises the tier", requested: "", observed: "priority", billing: ""},
{name: "flex never raised to default", requested: "flex", observed: "default", billing: "flex"},
{name: "default echoed for untiered request", requested: "", observed: "default", billing: ""},
{name: "unknown response tier ignored", requested: "priority", observed: "turbo", billing: "priority"},
{name: "case and whitespace normalised", requested: " Priority ", observed: "DEFAULT", billing: "default", downgraded: true},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := ResolveBillingServiceTier(tt.requested, tt.observed)
require.Equal(t, tt.billing, got.Billing)
require.Equal(t, tt.downgraded, got.Downgraded)
})
}
}
func TestApplyServiceTierBillingResolutionOnlyRewritesDowngrades(t *testing.T) {
t.Run("codex exception only covers OpenAI default", func(t *testing.T) {
require.True(t, codexOAuthResponseTierIsNonAuthoritative("default"))
require.False(t, codexOAuthResponseTierIsNonAuthoritative("standard"))
require.False(t, codexOAuthResponseTierIsNonAuthoritative("flex"))
})
t.Run("openai downgrade rewrites tier", func(t *testing.T) {
requested := "priority"
result := &OpenAIForwardResult{ServiceTier: &requested, UpstreamResponseServiceTier: "default"}
resolution := ApplyOpenAIServiceTierBillingResolution(&Account{Platform: PlatformOpenAI, Type: AccountTypeAPIKey}, result)
require.True(t, resolution.Downgraded)
require.NotNil(t, result.ServiceTier)
require.Equal(t, "default", *result.ServiceTier)
})
t.Run("openai honoured tier keeps pointer", func(t *testing.T) {
requested := "priority"
result := &OpenAIForwardResult{ServiceTier: &requested, UpstreamResponseServiceTier: "priority"}
require.False(t, ApplyOpenAIServiceTierBillingResolution(&Account{Platform: PlatformOpenAI, Type: AccountTypeAPIKey}, result).Downgraded)
require.Same(t, &requested, result.ServiceTier)
})
t.Run("openai untiered request stays nil", func(t *testing.T) {
result := &OpenAIForwardResult{UpstreamResponseServiceTier: "priority"}
require.False(t, ApplyOpenAIServiceTierBillingResolution(&Account{Platform: PlatformOpenAI, Type: AccountTypeAPIKey}, result).Downgraded)
require.Nil(t, result.ServiceTier)
})
for _, accountType := range []string{AccountTypeOAuth, AccountTypeSetupToken} {
t.Run("codex "+accountType+" keeps outbound priority despite default echo", func(t *testing.T) {
requested := "priority"
result := &OpenAIForwardResult{ServiceTier: &requested, UpstreamResponseServiceTier: "default"}
resolution := ApplyOpenAIServiceTierBillingResolution(
&Account{Platform: PlatformOpenAI, Type: accountType},
result,
)
require.False(t, resolution.Downgraded)
require.Equal(t, "priority", resolution.Requested)
require.Equal(t, "default", resolution.Observed)
require.Equal(t, "priority", resolution.Billing)
require.Same(t, &requested, result.ServiceTier)
})
t.Run("codex "+accountType+" still accepts an explicit flex downgrade", func(t *testing.T) {
requested := "priority"
result := &OpenAIForwardResult{ServiceTier: &requested, UpstreamResponseServiceTier: "flex"}
resolution := ApplyOpenAIServiceTierBillingResolution(
&Account{Platform: PlatformOpenAI, Type: accountType},
result,
)
require.True(t, resolution.Downgraded)
require.Equal(t, "flex", resolution.Billing)
require.Equal(t, "flex", *result.ServiceTier)
})
t.Run("codex "+accountType+" response never promotes an untiered request", func(t *testing.T) {
result := &OpenAIForwardResult{UpstreamResponseServiceTier: "priority"}
resolution := ApplyOpenAIServiceTierBillingResolution(
&Account{Platform: PlatformOpenAI, Type: accountType},
result,
)
require.False(t, resolution.Downgraded)
require.Empty(t, resolution.Billing)
require.Nil(t, result.ServiceTier)
})
}
t.Run("non-openai oauth still uses the generic response contract", func(t *testing.T) {
requested := "priority"
result := &OpenAIForwardResult{ServiceTier: &requested, UpstreamResponseServiceTier: "default"}
resolution := ApplyOpenAIServiceTierBillingResolution(
&Account{Platform: PlatformGrok, Type: AccountTypeOAuth},
result,
)
require.True(t, resolution.Downgraded)
require.Equal(t, "default", resolution.Billing)
require.Equal(t, "default", *result.ServiceTier)
})
t.Run("anthropic standard speed rewrites fast", func(t *testing.T) {
requested := "fast"
result := &ForwardResult{ServiceTier: &requested, UpstreamResponseServiceTier: "standard"}
require.True(t, ApplyForwardServiceTierBillingResolution(result).Downgraded)
require.Equal(t, "standard", *result.ServiceTier)
})
t.Run("nil results are ignored", func(t *testing.T) {
require.False(t, ApplyOpenAIServiceTierBillingResolution(nil, nil).Downgraded)
require.False(t, ApplyForwardServiceTierBillingResolution(nil).Downgraded)
})
}