Files
JuYou/API/internal/modules/admin/service_test.go
T
2026-08-25 17:59:42 +08:00

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)
}
}