package com.yunhai.svchall.utils; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; /** * 文件 URL 拼接契约单测(2026-09-20 封面裂图修复): * 生产 public-base-url 以 /upload/ 结尾(https://base.yunhaixingtong.com/svc-hall/upload/), * 而库内相对值以 /upload/ 开头——拼接必须不产生 /upload/upload/ 叠加, * 且对历史已叠加损伤值(/upload/upload/…,实测库里叠了三层导致门户裂图)具备折叠自愈能力。 * 不变式:存储布局 /upload/{image|file}/uuid.ext,upload 不是合法类型名,/upload/upload/ 永远非法。 */ @DisplayName("FileUtil - 文件 URL 拼接与 /upload/ 段折叠") class FileUtilTest { /** 生产形态:带 ctx 且以 /upload/ 结尾 */ private static final String PROD_BASE = "http://base.yunhaixingtong.com/svc-hall/upload/"; /** 本地形态:裸 host 以 /upload/ 结尾 */ private static final String LOCAL_BASE = "http://localhost:8086/upload/"; @AfterEach void reset() { FileUtil.init("target/test-fileutil-root", "http://localhost:8086/upload/"); } @Test @DisplayName("buildUrl:生产 base+/upload/ 结尾,干净相对值不叠加") void buildUrlProdBaseNoDouble() { FileUtil.init("target/test-fileutil-root", PROD_BASE); assertThat(FileUtil.buildUrl("/upload/image/e7df.png")) .isEqualTo("http://base.yunhaixingtong.com/svc-hall/upload/image/e7df.png"); } @Test @DisplayName("buildUrl:本地 base+/upload/ 结尾,干净相对值不叠加") void buildUrlLocalBaseNoDouble() { FileUtil.init("target/test-fileutil-root", LOCAL_BASE); assertThat(FileUtil.buildUrl("/upload/file/abc.pdf")) .isEqualTo("http://localhost:8086/upload/file/abc.pdf"); } @Test @DisplayName("buildUrl:base 不带 /upload/ 尾时行为不变") void buildUrlBaseWithoutUploadTail() { FileUtil.init("target/test-fileutil-root", "http://localhost:8086"); assertThat(FileUtil.buildUrl("/upload/image/a.png")) .isEqualTo("http://localhost:8086/upload/image/a.png"); } @Test @DisplayName("buildUrl:历史损伤相对值(叠三层)出口折叠自愈——部署态门户裂图修复点") void buildUrlSquashesCorruptedRelative() { FileUtil.init("target/test-fileutil-root", PROD_BASE); assertThat(FileUtil.buildUrl("/upload/upload/upload/image/e7df.png")) .isEqualTo("http://base.yunhaixingtong.com/svc-hall/upload/image/e7df.png"); } @Test @DisplayName("absolutizePlain:绝对地址原样返回(含历史损伤值,不篡改外链)") void absolutizePlainPassthrough() { FileUtil.init("target/test-fileutil-root", PROD_BASE); String external = "https://cdn.example.com/pic.png"; assertThat(FileUtil.absolutizePlain(external)).isEqualTo(external); } @Test @DisplayName("absolutize:富文本内链绝对化不叠加 /upload/") void absolutizeHtmlNoDouble() { FileUtil.init("target/test-fileutil-root", PROD_BASE); String html = "
§附件