feat(sdk): 入队前清洗三轨制对齐服务端(共享向量)

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-18 14:37:23 +08:00
parent 08495bc365
commit 2a9c98c993
3 changed files with 127 additions and 15 deletions
+10 -2
View File
@@ -1,4 +1,5 @@
import { describe, it, expect, afterEach, vi } from "vitest";
import vectors from "../../server/tracker/tests/fixtures/sanitize_vectors.json";
import {
buildEnvContext,
collectHighEntropyHints,
@@ -58,14 +59,21 @@ describe("parseUtm", () => {
});
describe("sanitizeUrl", () => {
// 共享向量(T1 落地):server/tracker/tests/fixtures/sanitize_vectors.json 是双侧唯一契约
// ——SDK 与 server/tracker/services/validation.py 的 sanitize_url 必须逐字节同输出。
// `in` 是保留字不能作解构绑定名,用整对象参数 v 取属性。
it.each(vectors.vectors)("共享向量: $in", (v) => {
expect(sanitizeUrl(v.in)).toBe(v.out);
});
it("删除黑名单参数,保留其余(含空值),不误伤 monkey", () => {
expect(sanitizeUrl("/p?email=a@b.com&token=x&id=3&utm_source=g&monkey=1")).toBe(
"/p?id=3&utm_source=g&monkey=1",
);
});
it("空值参数保留", () => {
expect(sanitizeUrl("/p?empty=&id=1")).toBe("/p?empty=&id=1");
it("空值参数按值判别删(_SAFE_VALUE 不匹配空串,对齐服务端)", () => {
expect(sanitizeUrl("/p?empty=&id=1")).toBe("/p?id=1");
});
it("黑名单整键精确匹配(大小写不敏感),子串参数不删", () => {