Files
jiang13-bbs/frontend/lib/siteUrl.test.ts
freefire 40bbad2c82 公开页补齐自引用 Canonical 与按类型的结构化数据,图片补上说明文字。
后台设置和内容编辑改成可导航布局;部署用访客 origin 生成 Canonical,避免落到容器地址。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-20 00:11:24 +08:00

118 lines
3.9 KiB
TypeScript

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" }
);
});
});