Files
lms-sb/src/lib/__tests__/utm-cookie.test.ts
T
adminsandClaude Opus 5.5 651a115ab7 Регистрация: utm с лендинга из cookie sb_utm, если в адресе меток нет
Кнопки лендингов ведут на /register без меток, поэтому utmCampaign не был
записан ни у одного пользователя. Caddy кладёт строку запроса с utm_* в cookie
sb_utm на .second-brain.ru; страница регистрации берёт метки из адреса, а если
их нет — из cookie. Значения: [A-Za-z0-9._-], до 100 символов.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 15:16:09 +05:00

41 lines
1.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, it, expect } from "vitest";
import { cleanUtm, parseUtmCookie, pickUtm } from "../utm-cookie";
describe("utm-cookie", () => {
it("разбирает сырую строку запроса из cookie", () => {
expect(parseUtmCookie("utm_source=youtube&utm_medium=video&utm_campaign=test-20261103&fbclid=x")).toEqual({
utmSource: "youtube",
utmMedium: "video",
utmCampaign: "test-20261103",
});
});
it("понимает percent-кодирование", () => {
expect(parseUtmCookie("utm_campaign=a%2Db_c.d").utmCampaign).toBe("a-b_c.d");
});
it("пустая и битая cookie — пустые метки", () => {
expect(parseUtmCookie(undefined)).toEqual({ utmSource: "", utmMedium: "", utmCampaign: "" });
expect(parseUtmCookie("")).toEqual({ utmSource: "", utmMedium: "", utmCampaign: "" });
expect(parseUtmCookie("%%%")).toEqual({ utmSource: "", utmMedium: "", utmCampaign: "" });
});
it("отбрасывает значения не из белого списка символов и слишком длинные", () => {
expect(cleanUtm("ok-1")).toBe("ok-1");
expect(cleanUtm("<script>")).toBe("");
expect(cleanUtm("с пробелом")).toBe("");
expect(cleanUtm("a".repeat(150))).toBe("a".repeat(100));
expect(parseUtmCookie("utm_source=x;Domain=evil").utmSource).toBe("");
});
it("метки из адреса важнее cookie, поля не смешиваются", () => {
const cookie = { utmSource: "vk", utmMedium: "video", utmCampaign: "old" };
expect(pickUtm({ utmSource: "", utmMedium: "", utmCampaign: "new" }, cookie)).toEqual({
utmSource: "",
utmMedium: "",
utmCampaign: "new",
});
expect(pickUtm({ utmSource: "", utmMedium: "", utmCampaign: "" }, cookie)).toEqual(cookie);
});
});