init local code

This commit is contained in:
chenxing
2026-09-07 09:09:39 +08:00
commit 99cd26b3d2
259 changed files with 20554 additions and 0 deletions
@@ -0,0 +1,185 @@
package com.yunhai.cms.utils;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import static org.assertj.core.api.Assertions.assertThat;
/**
* 门户 URL 生成器单测(方案 §8.6 前置约定2:所有链接经 PortalUrlHelper 生成)。
* 覆盖:请求派生形态、public_base_url 学校域形态、各 URL 段拼接、编码与边界;
* 资产 URL 主题段(B-3)、上传地址补基准与正文重写(B-1)。
*/
@DisplayName("PortalUrlHelper - 门户 URL 生成")
class PortalUrlHelperTest {
private static MockHttpServletRequest request(String scheme, String server, int port,
String contextPath) {
MockHttpServletRequest request = new MockHttpServletRequest();
request.setScheme(scheme);
request.setServerName(server);
request.setServerPort(port);
request.setContextPath(contextPath);
return request;
}
// ===== 请求派生形态(public_base_url 未配置,预览/平台内形态)=====
@Test
@DisplayName("从请求派生基地址:非默认端口 + contextPath 均保留")
void fromRequest_keepsNonDefaultPortAndContext() {
PortalUrlHelper url = PortalUrlHelper.fromRequest(
request("http", "localhost", 8072, "/cms"), "demo", "default");
assertThat(url.getBaseUrl()).isEqualTo("http://localhost:8072/cms/portal/demo");
assertThat(url.home()).isEqualTo("http://localhost:8072/cms/portal/demo/");
assertThat(url.category(5)).isEqualTo("http://localhost:8072/cms/portal/demo/c/5");
assertThat(url.article(9)).isEqualTo("http://localhost:8072/cms/portal/demo/a/9");
}
@Test
@DisplayName("http:80 / https:443 默认端口省略")
void fromRequest_omitsDefaultPorts() {
assertThat(PortalUrlHelper.fromRequest(request("http", "a.com", 80, ""), "s1", "default").home())
.isEqualTo("http://a.com/portal/s1/");
assertThat(PortalUrlHelper.fromRequest(request("https", "a.com", 443, ""), "s1", "default").home())
.isEqualTo("https://a.com/portal/s1/");
}
@Test
@DisplayName("search:关键词 URL 编码(UTF-8),page=1 不带页码、page>1 追加")
void search_encodesKeywordAndAppendsPageOnlyWhenBeyondFirst() throws Exception {
PortalUrlHelper url = new PortalUrlHelper("https://base.example.com/cms/portal/demo", "demo", "default");
assertThat(url.search("开学 典礼", 1))
.isEqualTo("https://base.example.com/cms/portal/demo/search?q="
+ java.net.URLEncoder.encode("开学 典礼", "UTF-8"));
assertThat(url.search("x", 3))
.isEqualTo("https://base.example.com/cms/portal/demo/search?q=x&page=3");
assertThat(url.search(null, null))
.isEqualTo("https://base.example.com/cms/portal/demo/search?q=");
}
// ===== 学校独立域名形态(config_json.public_base_url)=====
@Test
@DisplayName("public_base_url 形态:站点路径段被剥离,直接以学校域为基准")
void publicBaseUrl_formUsesSchoolDomainAsBase() {
PortalUrlHelper url = new PortalUrlHelper("https://www.xxx.edu.cn/", "demo", "classic-red");
assertThat(url.home()).isEqualTo("https://www.xxx.edu.cn/");
assertThat(url.category(3)).isEqualTo("https://www.xxx.edu.cn/c/3");
assertThat(url.article(7)).isEqualTo("https://www.xxx.edu.cn/a/7");
assertThat(url.getSiteCode()).isEqualTo("demo");
}
@Test
@DisplayName("asset 入参前导斜杠兼容,重复尾斜杠的 base 归一")
void assetAndBaseTrimming() {
PortalUrlHelper url = new PortalUrlHelper("https://www.xxx.edu.cn///", "demo", "default");
assertThat(url.getBaseUrl()).isEqualTo("https://www.xxx.edu.cn");
assertThat(url.asset("/css/a.css")).isEqualTo("https://www.xxx.edu.cn/assets/default/css/a.css");
assertThat(url.asset("css/a.css")).isEqualTo("https://www.xxx.edu.cn/assets/default/css/a.css");
}
@Test
@DisplayName("blank base 容错:不因空白 base 抛异常,路径仍以 / 起头")
void blankBaseTolerated() {
PortalUrlHelper url = new PortalUrlHelper(null, "demo", "default");
assertThat(url.home()).isEqualTo("/");
assertThat(url.article(1)).isEqualTo("/a/1");
}
// ===== 资产 URL 主题段(B-3:换肤即换 URL,浏览器/CDN 缓存天然失效)=====
@Test
@DisplayName("asset 含主题段:theme=default 与 classic-red 生成不同 URL")
void asset_urlCarriesThemeSegment() {
PortalUrlHelper url = new PortalUrlHelper("http://localhost:8072/cms/portal/demo", "demo", "default");
assertThat(url.asset("css/main.css"))
.isEqualTo("http://localhost:8072/cms/portal/demo/assets/default/css/main.css");
PortalUrlHelper switched = new PortalUrlHelper("http://localhost:8072/cms/portal/demo", "demo", "classic-red");
assertThat(switched.asset("css/main.css"))
.isEqualTo("http://localhost:8072/cms/portal/demo/assets/classic-red/css/main.css");
}
@Test
@DisplayName("asset 主题段空值回退 default(防御:theme 字段异常不致 404)")
void asset_blankThemeFallsBackToDefault() {
PortalUrlHelper url = new PortalUrlHelper("https://www.xxx.edu.cn", "demo", null);
assertThat(url.asset("css/main.css")).isEqualTo("https://www.xxx.edu.cn/assets/default/css/main.css");
}
// ===== 上传地址补基准(B-1:webUrl 只存相对路径,渲染期补全)=====
@Test
@DisplayName("upload:相对路径按基准 origin 补全(base 域形态 / 学校域形态)")
void upload_relativePathPrefixedWithOrigin() {
PortalUrlHelper base = new PortalUrlHelper("http://localhost:8072/cms/portal/demo", "demo", "default");
assertThat(base.upload("/cms/upload/cms/demo/202609/abc.jpg"))
.isEqualTo("http://localhost:8072/cms/upload/cms/demo/202609/abc.jpg");
PortalUrlHelper school = new PortalUrlHelper("https://www.xxx.edu.cn", "demo", "default");
assertThat(school.upload("/cms/upload/cms/demo/202609/abc.jpg"))
.isEqualTo("https://www.xxx.edu.cn/cms/upload/cms/demo/202609/abc.jpg");
}
@Test
@DisplayName("upload:已是完整 http(s) 地址原样返回(外链图不误改);空值原样返回")
void upload_absoluteAndBlankUntouched() {
PortalUrlHelper url = new PortalUrlHelper("https://www.xxx.edu.cn", "demo", "default");
assertThat(url.upload("https://cdn.example.com/img.png")).isEqualTo("https://cdn.example.com/img.png");
assertThat(url.upload("http://otherhost:8080/cms/upload/a.jpg")).isEqualTo("http://otherhost:8080/cms/upload/a.jpg");
assertThat(url.upload(null)).isNull();
assertThat(url.upload("")).isEqualTo("");
assertThat(url.upload(" ")).isEqualTo(" ");
}
@Test
@DisplayName("rewriteUploadUrls:正文内相对/历史绝对上传地址统一重写为当前基准,外链不动")
void rewriteUploadUrls_normalizesLegacyAndRelative() {
PortalUrlHelper url = new PortalUrlHelper("https://www.xxx.edu.cn", "demo", "default");
String html = "<p><img src=\"/cms/upload/cms/demo/202609/a.jpg\"></p>"
+ "<p><img src=\"http://localhost:8072/cms/upload/cms/demo/202609/b.jpg\"></p>"
+ "<p><img src=\"https://cdn.example.com/x.png\"></p>";
String rewritten = url.rewriteUploadUrls(html);
assertThat(rewritten).contains("src=\"https://www.xxx.edu.cn/cms/upload/cms/demo/202609/a.jpg\"");
assertThat(rewritten).contains("src=\"https://www.xxx.edu.cn/cms/upload/cms/demo/202609/b.jpg\"");
assertThat(rewritten).doesNotContain("localhost:8072");
assertThat(rewritten).contains("src=\"https://cdn.example.com/x.png\"");
assertThat(url.rewriteUploadUrls(null)).isNull();
}
// ===== siteHome 分支(B-4:学校域形态下未配域子站不再退化为 "/")=====
@Test
@DisplayName("siteHome 四分支:目标配域 / base域替换站点段 / 学校域退化 base 域规范路径 / 无配置回 /")
void siteHome_branches() {
PortalUrlHelper url = new PortalUrlHelper("https://www.xxx.edu.cn", "main", "default",
"https://base.yunhaixingtong.com/cms");
// ① 目标站配置 public_base_url:以它为准(空白视同未配)
assertThat(url.siteHome("jdx", "https://jdx.xxx.edu.cn")).isEqualTo("https://jdx.xxx.edu.cn/");
assertThat(url.siteHome("jdx", " ")).isEqualTo("https://base.yunhaixingtong.com/cms/portal/jdx/");
// ② 学校域形态(当前基准无 /portal/ 段)+ 目标未配域 → base 域规范路径(B-4 修复)
assertThat(url.siteHome("jdx", null)).isEqualTo("https://base.yunhaixingtong.com/cms/portal/jdx/");
// ③ base 域子路径形态:替换站点段(既有行为不变)
PortalUrlHelper sub = new PortalUrlHelper("https://base.yunhaixingtong.com/cms/portal/main", "main",
"default", "https://base.yunhaixingtong.com/cms");
assertThat(sub.siteHome("jdx", null)).isEqualTo("https://base.yunhaixingtong.com/cms/portal/jdx/");
// ④ 学校域形态 + base-origin 未配置 → 退回 "/"(现状兜底)
PortalUrlHelper noBase = new PortalUrlHelper("https://www.xxx.edu.cn", "main", "default", null);
assertThat(noBase.siteHome("jdx", null)).isEqualTo("/");
}
@Test
@DisplayName("fromBaseOrigin:C-6 未配 public_base_url 时派生 base 域规范路径")
void fromBaseOrigin_derivesCanonicalBaseDomainPath() {
PortalUrlHelper url = PortalUrlHelper.fromBaseOrigin(
"https://base.yunhaixingtong.com/cms/", "demo", "default");
assertThat(url.home()).isEqualTo("https://base.yunhaixingtong.com/cms/portal/demo/");
assertThat(url.category(3)).isEqualTo("https://base.yunhaixingtong.com/cms/portal/demo/c/3");
assertThat(url.asset("css/main.css"))
.isEqualTo("https://base.yunhaixingtong.com/cms/portal/demo/assets/default/css/main.css");
}
}