初始化
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
// 管理后台模块单元测试,验证模型计费、兑换码批次和审计搜索的纯业务规则。
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user