//go:build llm_script package main import ( "bytes" "os" "path/filepath" "strings" "testing" ) func TestParseBytedanceArkPricingCatalogBuildsRecords(t *testing.T) { raw, err := os.ReadFile(filepath.Join("testdata", "bytedance_ark_pricing_sample.txt")) if err != nil { t.Fatalf("读取 fixture 失败: %v", err) } records, err := parseBytedanceArkPricingCatalog(string(raw)) if err != nil { t.Fatalf("parseBytedanceArkPricingCatalog 返回错误: %v", err) } if len(records) != 20 { t.Fatalf("期望 20 条火山方舟价格记录,实际 %d", len(records)) } recordMap := make(map[string]officialPricingRecord, len(records)) for _, record := range records { recordMap[record.ModelID] = record } if recordMap["bytedance-doubao-seed-2-0-pro"].InputPrice != 3.2 || recordMap["bytedance-doubao-seed-2-0-pro"].OutputPrice != 16.0 { t.Fatalf("doubao-seed-2.0-pro 基线价格错误: %+v", recordMap["bytedance-doubao-seed-2-0-pro"]) } if recordMap["bytedance-doubao-seed-1-8"].OutputPrice != 2.0 { t.Fatalf("doubao-seed-1.8 应取首个阶梯输出价 2.0,实际 %v", recordMap["bytedance-doubao-seed-1-8"].OutputPrice) } if recordMap["bytedance-glm-4-7"].ProviderName != "Zhipu AI" || recordMap["bytedance-glm-4-7"].InputPrice != 2.0 || recordMap["bytedance-glm-4-7"].OutputPrice != 8.0 { t.Fatalf("glm-4.7 解析错误: %+v", recordMap["bytedance-glm-4-7"]) } if recordMap["bytedance-deepseek-v3-2"].ProviderName != "DeepSeek" { t.Fatalf("deepseek-v3.2 provider 归一化错误: %+v", recordMap["bytedance-deepseek-v3-2"]) } if recordMap["bytedance-doubao-1-5-vision-pro"].Modality != "multimodal" { t.Fatalf("doubao-1.5-vision-pro modality 错误: %+v", recordMap["bytedance-doubao-1-5-vision-pro"]) } if _, ok := recordMap["bytedance-doubao-embedding-vision"]; ok { t.Fatalf("当前 schema 不支持仅输入计费的向量模型,不应误入库") } } func TestExtractBytedanceArkPricingMarkdownFromRouterData(t *testing.T) { html := `` markdown, err := extractBytedanceArkPricingMarkdown(html) if err != nil { t.Fatalf("extractBytedanceArkPricingMarkdown 返回错误: %v", err) } if !strings.Contains(markdown, "doubao\\-seed\\-2.0\\-mini") { t.Fatalf("提取后的 markdown 缺少模型行: %q", markdown) } } func TestRunBytedanceArkPricingImportDryRunPrintsSummary(t *testing.T) { var out bytes.Buffer err := runBytedanceArkPricingImport(bytedanceArkPricingImportConfig{ URL: defaultBytedanceArkPricingURL, Fixture: filepath.Join("testdata", "bytedance_ark_pricing_sample.txt"), DryRun: true, }, nil, &out) if err != nil { t.Fatalf("runBytedanceArkPricingImport 返回错误: %v", err) } output := out.String() for _, want := range []string{ "source=bytedance-pricing-import", "models=20", "operator=ByteDance Volcano", "dry_run=true", } { if !strings.Contains(output, want) { t.Fatalf("输出缺少 %q,实际: %q", want, output) } } }