小程序一些功能更新

This commit is contained in:
李琦
2026-09-29 10:57:01 +08:00
parent 0cb70a7618
commit 3bb7fa8db3
96 changed files with 13890 additions and 213 deletions

View File

@@ -0,0 +1,91 @@
package logic
import (
"testing"
"tool-api/internal/consts"
)
// ============================================================================
// 头像上传校验单测(T02.4)
//
// 覆盖:体积 / 扩展名 / 内容魔数校验分支不依赖 DB;4017 必带可读中文提示。
// ============================================================================
func pngBytes() []byte {
b := make([]byte, 16)
copy(b, []byte{0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A})
return b
}
func jpgBytes() []byte {
b := make([]byte, 16)
copy(b, []byte{0xFF, 0xD8, 0xFF, 0xE0})
return b
}
func webpBytes() []byte {
b := make([]byte, 16)
copy(b[0:4], []byte("RIFF"))
copy(b[8:12], []byte("WEBP"))
return b
}
func TestIsImageBytes(t *testing.T) {
cases := []struct {
name string
data []byte
want bool
}{
{"png", pngBytes(), true},
{"jpg", jpgBytes(), true},
{"webp", webpBytes(), true},
{"纯文本", []byte("hello world!!!"), false},
{"过短", []byte{0xFF, 0xD8}, false},
{"空", []byte{}, false},
}
for _, c := range cases {
if got := isImageBytes(c.data); got != c.want {
t.Errorf("%s: isImageBytes=%v want %v", c.name, got, c.want)
}
}
}
func TestValidateAvatarUpload(t *testing.T) {
big := make([]byte, AvatarMaxBytes+1)
copy(big, pngBytes())
cases := []struct {
name string
file string
data []byte
wantCode int // 0 = 通过
}{
{"合法 png", "a.png", pngBytes(), 0},
{"合法 jpg(大写扩展名)", "a.JPG", jpgBytes(), 0},
{"合法 jpeg", "a.jpeg", jpgBytes(), 0},
{"合法 webp", "a.webp", webpBytes(), 0},
{"空内容", "a.png", []byte{}, consts.CodeUploadInvalid},
{"超 5MB", "a.png", big, consts.CodeUploadInvalid},
{"扩展名不支持", "a.gif", pngBytes(), consts.CodeUploadInvalid},
{"无扩展名", "a", pngBytes(), consts.CodeUploadInvalid},
{"内容非图片", "a.jpg", []byte("not an image at all"), consts.CodeUploadInvalid},
}
for _, c := range cases {
err := validateAvatarUpload(c.file, c.data)
if got := codeOf(err); got != c.wantCode {
t.Errorf("%s: code=%d want %d (err=%v)", c.name, got, c.wantCode, err)
}
}
}
// TestUploadFailedReadable 4017 必须是可读中文提示、不得静默失败(U1)。
func TestUploadFailedReadable(t *testing.T) {
err := errUploadFailed("头像上传失败,请重试")
if codeOf(err) != consts.CodeUploadFailed {
t.Fatalf("上传失败应返回 4017,实得 code=%d", codeOf(err))
}
if err.Error() == "" {
t.Fatalf("4017 必须带可读提示,不得为空")
}
}