package core import ( "strings" "testing" ) // ★ 本文件把「上游客观缺口」写成**可执行的判据**,而不是只留在文档里。 // // 为什么需要:这些能力缺口多次被误判成"我们漏实现了"(我自己就误判了两轮), // 于是反复派人去"补"。判据在此把事实钉住: // // - qoder 加密端点(agent_chat_generation)需要 `qoder-auth-wasm.wasm` // —— 该二进制**在参考仓库里也不存在**(参考自己也是 readFileSync 一个 // 它不提供的文件)。故我们走明文端点 `/model/v1/chat/completions`, // **不经过信封** ⇒ qoder-envelope 的解包能力在明文路径上无从生效。 // - TRAE 的 PKCE 分支参考**明确不支持**(只有"探测并拒绝",无 code→token // 交换端点)⇒ 我们报"暂不支持"是与参考对齐的正确行为。 // // 判据的作用是**防止误判**:任何人(包括未来的我)想"补"这些能力时, // 必须先让这个测试失败 —— 也就是先推翻事实,再动手。 func TestUpstreamGapsAreDocumented(t *testing.T) { src, err := readBundledChannels(t) if err != nil { t.Fatal(err) } s := string(src) t.Run("qoder 走明文端点且不经过信封", func(t *testing.T) { // 明文端点(OpenAI 兼容):参考 QODER_CHAT_PATH if !strings.Contains(s, "https://api2-v2.qoder.sh/model/v1/chat/completions") { t.Fatal("qoder 的 chat 端点变了 —— 若改成加密端点 agent_chat_generation," + "则**必须**同时实现信封解包(qoder-envelope)与 WASM 签名," + "否则响应会被当成畸形数据") } // 明文端点没有信封层,故解包**不该**存在(存在反而是死代码) if strings.Contains(s, "unwrapQoderEnvelope") { t.Fatal("出现了 qoder 信封解包 —— 明文端点没有信封层。" + "要么端点已换成加密端点(那需要 wasm),要么这是死代码") } }) t.Run("TRAE PKCE 明确报不支持(与参考一致)", func(t *testing.T) { if !strings.Contains(s, "本实现暂不支持该流程") { t.Fatal("TRAE 的 PKCE 分支必须明确报出「暂不支持」—— " + "参考 trae-oauth.ts 也只做探测+拒绝,没有 code→token 交换端点。" + "若改为尝试交换,会拿 code 去打要 RefreshToken 的 ExchangeToken(必然 400)") } }) t.Run("codearts 目录打两个签名端点(本轮补上)", func(t *testing.T) { for _, want := range []string{ "opengw.developer.huaweicloud.com/api/v1/gateway/config", "snap-access.cn-north-4.myhuaweicloud.com/v1/model/builtin", `sign = "codearts"`, } { if !strings.Contains(s, want) { t.Fatalf("codearts 目录缺 %q —— 参考 fetchCodeArtsRemoteModels 打两个"+ "**必须 AK/SK 签名**的端点,只打一个会少一半模型", want) } } }) }