feat(knowledge): 图片上传接口(S3 存储,限 5MB jpg/png/webp)
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestValidateImageFileRejectsOversize(t *testing.T) {
|
||||
if err := validateImageFile("a.png", maxImageSize+1); err == nil {
|
||||
t.Error("超过 5MB 的图片应被拒绝")
|
||||
}
|
||||
}
|
||||
|
||||
func TestValidateImageFileRejectsEmptyAndBadExt(t *testing.T) {
|
||||
if err := validateImageFile("a.png", 0); err == nil {
|
||||
t.Error("空文件应被拒绝")
|
||||
}
|
||||
if err := validateImageFile("a.txt", 1024); err == nil {
|
||||
t.Error("非图片扩展名应被拒绝")
|
||||
}
|
||||
}
|
||||
|
||||
func TestValidateImageFileAcceptsAllowed(t *testing.T) {
|
||||
for _, name := range []string{"a.jpg", "a.jpeg", "a.png", "a.webp"} {
|
||||
if err := validateImageFile(name, 1024); err != nil {
|
||||
t.Errorf("%s 应被允许: %v", name, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestImageContentType(t *testing.T) {
|
||||
cases := map[string]string{
|
||||
".jpg": "image/jpeg",
|
||||
".jpeg": "image/jpeg",
|
||||
".png": "image/png",
|
||||
".webp": "image/webp",
|
||||
}
|
||||
for ext, want := range cases {
|
||||
got, ok := imageContentType(ext)
|
||||
if !ok || got != want {
|
||||
t.Errorf("imageContentType(%s) = %q, %v; want %q", ext, got, ok, want)
|
||||
}
|
||||
}
|
||||
if _, ok := imageContentType(".gif"); ok {
|
||||
t.Error(".gif 不应被支持")
|
||||
}
|
||||
}
|
||||
|
||||
func TestBuildImageKey(t *testing.T) {
|
||||
key, ext, err := buildImageKey("病蚕照片.PNG")
|
||||
if err != nil {
|
||||
t.Fatalf("buildImageKey 失败: %v", err)
|
||||
}
|
||||
if !strings.HasPrefix(key, "knowledge/") {
|
||||
t.Errorf("key 应以 knowledge/ 开头: %s", key)
|
||||
}
|
||||
if !strings.HasSuffix(key, ".png") {
|
||||
t.Errorf("key 应以 .png 结尾: %s", key)
|
||||
}
|
||||
if ext != ".png" {
|
||||
t.Errorf("ext = %s, want .png", ext)
|
||||
}
|
||||
if len(key) <= len("knowledge/")+8 {
|
||||
t.Errorf("key 应包含日期与随机部分: %s", key)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user