import assert from "node:assert/strict"; import { afterEach, describe, it } from "node:test"; import { absoluteCanonical, canonicalPage, canonicalPath, homeCanonicalQuery, isTrackingParam, parseSiteOrigin, resolveSiteOrigin, } from "./siteUrl.ts"; const prev = { SITE_URL: process.env.SITE_URL, NODE_ENV: process.env.NODE_ENV, }; afterEach(() => { if (prev.SITE_URL === undefined) delete process.env.SITE_URL; else process.env.SITE_URL = prev.SITE_URL; process.env.NODE_ENV = prev.NODE_ENV; }); describe("parseSiteOrigin", () => { it("去掉尾斜杠并保留端口", () => { assert.equal(parseSiteOrigin("https://bbs.example.com/"), "https://bbs.example.com"); assert.equal(parseSiteOrigin("http://localhost:3000/"), "http://localhost:3000"); }); it("拒绝 API / 容器名 / 带路径 / 非 http", () => { assert.equal(parseSiteOrigin("http://api:3001"), null); assert.equal(parseSiteOrigin("https://bbs.example.com/forum"), null); assert.equal(parseSiteOrigin("ftp://bbs.example.com"), null); assert.equal(parseSiteOrigin("not-a-url"), null); assert.equal(parseSiteOrigin(""), null); }); it("生产态把容器 API 地址视为非法", () => { process.env.SITE_URL = "http://api:3001"; process.env.NODE_ENV = "production"; assert.equal(resolveSiteOrigin(), null); }); }); describe("resolveSiteOrigin", () => { it("开发态无配置回退 localhost:3000", () => { delete process.env.SITE_URL; process.env.NODE_ENV = "development"; assert.equal(resolveSiteOrigin(), "http://localhost:3000"); }); it("生产态缺失不回退 localhost", () => { delete process.env.SITE_URL; process.env.NODE_ENV = "production"; assert.equal(resolveSiteOrigin(), null); }); it("生产态使用 SITE_URL", () => { process.env.SITE_URL = "https://bbs.example.com/"; process.env.NODE_ENV = "production"; assert.equal(resolveSiteOrigin(), "https://bbs.example.com"); }); }); describe("canonicalPath", () => { it("首页无尾斜杠参数", () => { assert.equal(canonicalPath("/"), "/"); assert.equal(canonicalPath("/post/12/"), "/post/12"); }); it("省略空值并丢掉追踪参数", () => { assert.equal( canonicalPath("/post/12", { utm_source: "x", fbclid: "1", page: 2, q: "" }), "/post/12?page=2" ); }); it("保留内容参数", () => { assert.equal(canonicalPath("/", { board: 3, sort: "new", page: 2 }), "/?board=3&page=2&sort=new"); }); }); describe("canonicalPage", () => { it("第一页与非法页码省略", () => { assert.equal(canonicalPage(undefined), undefined); assert.equal(canonicalPage("1"), undefined); assert.equal(canonicalPage("0"), undefined); assert.equal(canonicalPage("foo"), undefined); assert.equal(canonicalPage("2"), 2); }); }); describe("isTrackingParam", () => { it("识别 utm 与常见点击 id", () => { assert.equal(isTrackingParam("utm_source"), true); assert.equal(isTrackingParam("gclid"), true); assert.equal(isTrackingParam("page"), false); }); }); describe("absoluteCanonical", () => { it("拼出绝对地址", () => { process.env.SITE_URL = "https://bbs.example.com"; process.env.NODE_ENV = "production"; assert.equal(absoluteCanonical("/post/9", { page: 2 }), "https://bbs.example.com/post/9?page=2"); }); }); describe("homeCanonicalQuery", () => { it("默认排序与第一页省略;搜索丢掉 board", () => { assert.deepEqual(homeCanonicalQuery({}, true), {}); assert.deepEqual(homeCanonicalQuery({ sort: "latest", page: "1" }, true), {}); assert.deepEqual(homeCanonicalQuery({ sort: "new" }, false), {}); assert.deepEqual( homeCanonicalQuery({ q: " go ", board: "3", page: "2" }, true), { q: "go", page: 2 } ); assert.deepEqual( homeCanonicalQuery({ board: "3", sort: "new", page: "2" }, true), { board: 3, page: 2, sort: "new" } ); }); });