task-147: downloadUrl 永不过期验证(result/ 走下载域名、无签名参数、bucket 前缀、null/空白安全、输出稳定)+ 8 条测试
This commit is contained in:
+97
@@ -0,0 +1,97 @@
|
|||||||
|
package com.nanri.aiimage.modules.file.service.oss;
|
||||||
|
|
||||||
|
import com.nanri.aiimage.config.OssProperties;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* task-147:downloadUrl 永不过期验证(plan 08)。
|
||||||
|
* generateFreshDownloadUrl:result/ 前缀走下载域名、非 result/ 走公开端点、
|
||||||
|
* URL 无签名(不含 X-Amz 系列 / Expires / Signature 等过期参数)、bucket 前缀正确、
|
||||||
|
* null/空白安全、同输入同输出稳定。
|
||||||
|
*/
|
||||||
|
class DownloadUrlNonExpiringTest {
|
||||||
|
|
||||||
|
private OssProperties properties;
|
||||||
|
private OssStorageService storageService;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() {
|
||||||
|
properties = new OssProperties();
|
||||||
|
properties.setEndpoint("https://oss.aishufu.top");
|
||||||
|
properties.setPublicEndpoint("https://oss.aishufu.top");
|
||||||
|
properties.setDownloadEndpoint("https://download.aishufu.top");
|
||||||
|
properties.setBucket("nanri-ai-images");
|
||||||
|
properties.setImageVideoBucket("shufu-video");
|
||||||
|
properties.setDigitalHumanBucket("nanri-ai-digital-human");
|
||||||
|
properties.setTemplateBucket("aiimage-templates");
|
||||||
|
properties.setAccessKeyId("test-access-key");
|
||||||
|
properties.setAccessKeySecret("test-secret-key");
|
||||||
|
storageService = new OssStorageService(properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void resultPrefixUsesDownloadEndpoint() {
|
||||||
|
assertEquals(
|
||||||
|
"https://download.aishufu.top/nanri-ai-images/result/publish/1/result.xlsx",
|
||||||
|
storageService.generateFreshDownloadUrl("result/publish/1/result.xlsx"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void nonResultPrefixUsesPublicEndpoint() {
|
||||||
|
assertEquals(
|
||||||
|
"https://oss.aishufu.top/nanri-ai-images/supply_images/main.jpg",
|
||||||
|
storageService.generateFreshDownloadUrl("supply_images/main.jpg"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void urlHasNoExpiringSignatureParameters() {
|
||||||
|
String url = storageService.generateFreshDownloadUrl("result/publish/1/result.xlsx");
|
||||||
|
assertFalse(url.contains("X-Amz-"), "不得包含 AWS 签名参数: " + url);
|
||||||
|
assertFalse(url.contains("Signature"), "不得包含签名: " + url);
|
||||||
|
assertFalse(url.contains("Expires"), "不得包含过期时间: " + url);
|
||||||
|
assertFalse(url.contains("?") || url.contains("&"), "不得携带任何查询参数: " + url);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void bucketPrefixIsCorrect() {
|
||||||
|
String url = storageService.generateFreshDownloadUrl("result/collect_data/2/data.xlsx");
|
||||||
|
assertTrue(url.contains("/nanri-ai-images/result/collect_data/2/data.xlsx"),
|
||||||
|
"主 bucket 前缀正确: " + url);
|
||||||
|
String imageUrl = storageService.generateFreshDownloadUrl("shufu-video/result/image_video/demo.mp4");
|
||||||
|
assertTrue(imageUrl.contains("/shufu-video/result/image_video/demo.mp4"),
|
||||||
|
"image-video bucket 前缀正确: " + imageUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void nullUrlIsSafe() {
|
||||||
|
assertNull(storageService.generateFreshDownloadUrl(null), "null 输入返回 null 不抛错");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void blankUrlIsSafe() {
|
||||||
|
assertNull(storageService.generateFreshDownloadUrl(" "), "空白输入返回 null 不抛错");
|
||||||
|
assertNull(storageService.generateFreshDownloadUrl(""), "空串返回 null 不抛错");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void generatedUrlIsStable() {
|
||||||
|
String first = storageService.generateFreshDownloadUrl("result/similar_asin/3/re.xlsx");
|
||||||
|
String second = storageService.generateFreshDownloadUrl("result/similar_asin/3/re.xlsx");
|
||||||
|
assertEquals(first, second, "同输入同输出(无随机签名)");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void contractFrozen() {
|
||||||
|
String url = storageService.generateFreshDownloadUrl("result/similar_asin/3/re.xlsx");
|
||||||
|
assertNotNull(url);
|
||||||
|
// 快照:https://{download-endpoint}/{bucket}/{objectKey},纯路径无签名
|
||||||
|
assertEquals("https://download.aishufu.top/nanri-ai-images/result/similar_asin/3/re.xlsx", url);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user