sub2api/backend/internal/service/image_billing_size_test.go
2026-05-12 15:21:31 +08:00

111 lines
3.1 KiB
Go

package service
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestClassifyImageBillingTier(t *testing.T) {
tests := []struct {
name string
size string
wantTier string
wantOK bool
}{
{name: "explicit 2k square", size: "2048x2048", wantTier: "2K", wantOK: true},
{name: "explicit 2k landscape", size: "2048x1152", wantTier: "2K", wantOK: true},
{name: "explicit 4k landscape", size: "3840x2160", wantTier: "4K", wantOK: true},
{name: "explicit 4k portrait", size: "2160x3840", wantTier: "4K", wantOK: true},
{name: "long edge 1k", size: "1024X768", wantTier: "1K", wantOK: true},
{name: "long edge 2k", size: "1280x768", wantTier: "2K", wantOK: true},
{name: "long edge 4k", size: "2560x1600", wantTier: "4K", wantOK: true},
{name: "tier string 1k", size: "1k", wantTier: "1K", wantOK: true},
{name: "empty", size: "", wantOK: false},
{name: "auto", size: "auto", wantOK: false},
{name: "invalid", size: "not-a-size", wantOK: false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
gotTier, gotOK := ClassifyImageBillingTier(tt.size)
require.Equal(t, tt.wantOK, gotOK)
require.Equal(t, tt.wantTier, gotTier)
})
}
}
func TestResolveImageBillingSize(t *testing.T) {
tests := []struct {
name string
inputSize string
outputSizes []string
wantBilling string
wantOutput string
wantSource string
wantBreakdown map[string]int
}{
{
name: "output wins over input",
inputSize: "1024x1024",
outputSizes: []string{"3840x2160"},
wantBilling: "4K",
wantOutput: "3840x2160",
wantSource: ImageSizeSourceOutput,
wantBreakdown: map[string]int{"4K": 1},
},
{
name: "input fallback",
inputSize: "1024x1024",
wantBilling: "1K",
wantSource: ImageSizeSourceInput,
},
{
name: "auto defaults",
inputSize: "auto",
wantBilling: "2K",
wantSource: ImageSizeSourceDefault,
},
{
name: "empty defaults",
inputSize: "",
wantBilling: "2K",
wantSource: ImageSizeSourceDefault,
},
{
name: "invalid defaults",
inputSize: "largest",
wantBilling: "2K",
wantSource: ImageSizeSourceDefault,
},
{
name: "mixed output chooses highest tier",
inputSize: "1024x1024",
outputSizes: []string{"1024x1024", "3840x2160", "1280x720"},
wantBilling: "4K",
wantOutput: "1024x1024",
wantSource: ImageSizeSourceOutput,
wantBreakdown: map[string]int{"1K": 1, "2K": 1, "4K": 1},
},
{
name: "unparseable output falls back to parseable input",
inputSize: "2048x1152",
outputSizes: []string{"auto"},
wantBilling: "2K",
wantOutput: "auto",
wantSource: ImageSizeSourceInput,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := ResolveImageBillingSize(tt.inputSize, tt.outputSizes)
require.Equal(t, tt.wantBilling, got.BillingSize)
require.Equal(t, tt.inputSize, got.InputSize)
require.Equal(t, tt.wantOutput, got.OutputSize)
require.Equal(t, tt.wantSource, got.Source)
require.Equal(t, tt.wantBreakdown, got.Breakdown)
})
}
}