新增: - 书库导入导出(library_import/library_export)及测试 - 图片变体生成(image_variants)与响应式图片(responsiveImage) - 书籍搜索(bookSearch)+ BookSearch/LibrarySearchGrid 组件 - 小组件运行时(widgetRuntime)与静态检查(widgetLint) - 上传缓存中间件(upload_cache)与字体 CSS 提取脚本 其它: - 后端 handlers/services 全量调整 - 前端页面、组件、库函数与配置更新
119 lines
3.9 KiB
TypeScript
119 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" }
|
|
);
|
|
});
|
|
});
|
|
|