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) } }