公开页补齐自引用 Canonical 与按类型的结构化数据,图片补上说明文字。
后台设置和内容编辑改成可导航布局;部署用访客 origin 生成 Canonical,避免落到容器地址。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
117
frontend/lib/siteUrl.test.ts
Normal file
117
frontend/lib/siteUrl.test.ts
Normal file
@@ -0,0 +1,117 @@
|
||||
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" }
|
||||
);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user