68 lines
2.4 KiB
Go
68 lines
2.4 KiB
Go
// 管理后台模块单元测试,验证模型计费、兑换码批次和审计搜索的纯业务规则。
|
|
package admin
|
|
|
|
import (
|
|
"slices"
|
|
"testing"
|
|
)
|
|
|
|
// TestNormalizeModelPrices 验证按 Token 计费时价格键、单位和金额标准化。
|
|
func TestNormalizeModelPrices(t *testing.T) {
|
|
input := ModelInput{
|
|
ModelType: "text",
|
|
TextBillingMode: "per_token",
|
|
Prices: []ModelPriceInput{
|
|
{PriceKey: " INPUT ", Price: "1.236"},
|
|
{PriceKey: "output", Price: 2},
|
|
},
|
|
}
|
|
if err := normalizeModelPrices(&input); err != nil {
|
|
t.Fatalf("normalize model prices: %v", err)
|
|
}
|
|
if input.Prices[0].PriceKey != "input" || input.Prices[0].Unit != "M Token" || input.Prices[0].Price != 1.24 {
|
|
t.Fatalf("unexpected normalized input price: %#v", input.Prices[0])
|
|
}
|
|
}
|
|
|
|
// TestNormalizeModelPricesRejectsIncompleteConfig 验证文本模型缺少价格项时拒绝保存。
|
|
func TestNormalizeModelPricesRejectsIncompleteConfig(t *testing.T) {
|
|
input := ModelInput{ModelType: "text", TextBillingMode: "per_token", Prices: []ModelPriceInput{{PriceKey: "input", Price: 1}}}
|
|
if err := normalizeModelPrices(&input); err == nil {
|
|
t.Fatal("expected incomplete token prices to be rejected")
|
|
}
|
|
}
|
|
|
|
// TestValidateRedemptionBatchLimits 验证兑换码单码积分与批次数量边界。
|
|
func TestValidateRedemptionBatchLimits(t *testing.T) {
|
|
if points, err := ValidateRedemptionBatchLimits("10.5", 10); err != nil || points != "10.5" {
|
|
t.Fatalf("expected valid redemption limits, points=%q err=%v", points, err)
|
|
}
|
|
for _, test := range []struct {
|
|
points any
|
|
quantity int
|
|
}{{0, 1}, {101, 1}, {10, 0}, {10, 11}} {
|
|
if _, err := ValidateRedemptionBatchLimits(test.points, test.quantity); err == nil {
|
|
t.Fatalf("expected limits to be rejected: %#v", test)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestMatchingAuditResourceTypes 验证中文资源名称可转换为审计记录使用的内部代码。
|
|
func TestMatchingAuditResourceTypes(t *testing.T) {
|
|
for _, test := range []struct {
|
|
keyword string
|
|
want string
|
|
}{
|
|
{keyword: "渠道", want: "channels"},
|
|
{keyword: "兑换", want: "redemption-codes"},
|
|
{keyword: "管理员账号", want: "admin-auth"},
|
|
} {
|
|
if got := matchingAuditResourceTypes(test.keyword); !slices.Contains(got, test.want) {
|
|
t.Fatalf("keyword %q matched %v, want %q", test.keyword, got, test.want)
|
|
}
|
|
}
|
|
if got := matchingAuditResourceTypes("不存在的资源"); len(got) != 0 {
|
|
t.Fatalf("unexpected resource matches: %v", got)
|
|
}
|
|
}
|