96 lines
3.1 KiB
Go
96 lines
3.1 KiB
Go
|
|
//go:build llm_script
|
|||
|
|
|
|||
|
|
package main
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"bytes"
|
|||
|
|
"os"
|
|||
|
|
"path/filepath"
|
|||
|
|
"strings"
|
|||
|
|
"testing"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
func TestParseCUCloudPricingBuildsBlendedRecords(t *testing.T) {
|
|||
|
|
raw, err := os.ReadFile(filepath.Join("testdata", "cucloud_pricing_sample.html"))
|
|||
|
|
if err != nil {
|
|||
|
|
t.Fatalf("读取 fixture 失败: %v", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
records, summary, err := parseCUCloudPricingCatalog(string(raw), defaultCUCloudPricingURL)
|
|||
|
|
if err != nil {
|
|||
|
|
t.Fatalf("parseCUCloudPricingCatalog 返回错误: %v", err)
|
|||
|
|
}
|
|||
|
|
if len(records) != 4 {
|
|||
|
|
t.Fatalf("期望 4 条联通云价格记录,实际 %d", len(records))
|
|||
|
|
}
|
|||
|
|
if summary.Models != 3 || summary.Records != 4 || summary.Regions != 2 {
|
|||
|
|
t.Fatalf("summary 计数错误: %+v", summary)
|
|||
|
|
}
|
|||
|
|
if !summary.PaygModeConfirmed || summary.PaygPriceTablePublic {
|
|||
|
|
t.Fatalf("payg 摘要错误: %+v", summary)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
recordMap := make(map[string]officialPricingRecord, len(records))
|
|||
|
|
for _, record := range records {
|
|||
|
|
recordMap[record.ModelName+"|"+record.Region] = record
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
pro := recordMap["DeepSeek-V4-Pro|贵阳基地二区"]
|
|||
|
|
if pro.InputPrice != 9.3 || pro.OutputPrice != 9.3 || pro.ProviderName != "DeepSeek" {
|
|||
|
|
t.Fatalf("DeepSeek-V4-Pro 记录错误: %+v", pro)
|
|||
|
|
}
|
|||
|
|
flash := recordMap["DeepSeek-V4-Flash|贵阳基地二区"]
|
|||
|
|
if flash.InputPrice != 0.7 || flash.OutputPrice != 0.7 || flash.ProviderName != "DeepSeek" {
|
|||
|
|
t.Fatalf("DeepSeek-V4-Flash 记录错误: %+v", flash)
|
|||
|
|
}
|
|||
|
|
miniWuhan := recordMap["MiniMax-M2.5|武汉四区"]
|
|||
|
|
if miniWuhan.InputPrice != 1.1 || miniWuhan.OutputPrice != 1.1 || miniWuhan.ProviderName != "MiniMax" {
|
|||
|
|
t.Fatalf("MiniMax-M2.5 武汉记录错误: %+v", miniWuhan)
|
|||
|
|
}
|
|||
|
|
miniGuiyang := recordMap["MiniMax-M2.5|贵阳基地二区"]
|
|||
|
|
if miniGuiyang.InputPrice != 1.1 || miniGuiyang.OutputPrice != 1.1 {
|
|||
|
|
t.Fatalf("MiniMax-M2.5 贵阳记录错误: %+v", miniGuiyang)
|
|||
|
|
}
|
|||
|
|
if _, ok := recordMap["MiniMax-M2.5|上海二十二区"]; ok {
|
|||
|
|
t.Fatalf("不支持的区域不应生成记录")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func TestParseCUCloudPricingRequiresBlendedPriceTable(t *testing.T) {
|
|||
|
|
raw, err := os.ReadFile(filepath.Join("testdata", "cucloud_pricing_sample.html"))
|
|||
|
|
if err != nil {
|
|||
|
|
t.Fatalf("读取 fixture 失败: %v", err)
|
|||
|
|
}
|
|||
|
|
broken := strings.Replace(string(raw), "综合单价9.30元/百万tokens", "综合单价元/百万tokens", 1)
|
|||
|
|
if _, _, err := parseCUCloudPricingCatalog(broken, defaultCUCloudPricingURL); err == nil {
|
|||
|
|
t.Fatalf("缺少 blended 价格时应返回错误")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func TestRunCUCloudPricingImportDryRunPrintsSummary(t *testing.T) {
|
|||
|
|
var out bytes.Buffer
|
|||
|
|
err := runCUCloudPricingImport(cucloudPricingImportConfig{
|
|||
|
|
URL: defaultCUCloudPricingURL,
|
|||
|
|
Fixture: filepath.Join("testdata", "cucloud_pricing_sample.html"),
|
|||
|
|
DryRun: true,
|
|||
|
|
}, nil, &out)
|
|||
|
|
if err != nil {
|
|||
|
|
t.Fatalf("runCUCloudPricingImport 返回错误: %v", err)
|
|||
|
|
}
|
|||
|
|
output := out.String()
|
|||
|
|
for _, want := range []string{
|
|||
|
|
"source=cucloud-pricing-import",
|
|||
|
|
"models=3",
|
|||
|
|
"records=4",
|
|||
|
|
"regions=2",
|
|||
|
|
"operator=Unicom AISP",
|
|||
|
|
"payg_mode_confirmed=true",
|
|||
|
|
"payg_price_table_public=false",
|
|||
|
|
"dry_run=true",
|
|||
|
|
} {
|
|||
|
|
if !strings.Contains(output, want) {
|
|||
|
|
t.Fatalf("输出缺少 %q,实际: %q", want, output)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|