Add HTTP /v1 MVC, TCP send path, groups with server-side member-avatar collage, object-storage upload, and friends/favorites around the architecture-v3 layout. Co-authored-by: Cursor <cursoragent@cursor.com>
69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
package entity
|
|
|
|
import (
|
|
"bytes"
|
|
"image/png"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestLetterAvatarPNG(t *testing.T) {
|
|
raw, err := LetterAvatarPNG("test01")
|
|
if err != nil || len(raw) == 0 {
|
|
t.Fatalf("%v %d", err, len(raw))
|
|
}
|
|
img, err := png.Decode(bytes.NewReader(raw))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if img.Bounds().Dx() != avatarSize || img.Bounds().Dy() != avatarSize {
|
|
t.Fatalf("size %+v", img.Bounds())
|
|
}
|
|
again, err := LetterAvatarPNG("test01")
|
|
if err != nil || !bytes.Equal(raw, again) {
|
|
t.Fatal("not stable")
|
|
}
|
|
other, err := LetterAvatarPNG("ada")
|
|
if err != nil || bytes.Equal(raw, other) {
|
|
t.Fatal("same png for different names")
|
|
}
|
|
cjk, err := LetterAvatarPNG("张三")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := png.Decode(bytes.NewReader(cjk)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func TestAvatarLetter(t *testing.T) {
|
|
if got := AvatarLetter("test01"); got != "T" {
|
|
t.Fatalf("got %q", got)
|
|
}
|
|
if got := AvatarLetter(" ada"); got != "A" {
|
|
t.Fatalf("got %q", got)
|
|
}
|
|
if got := AvatarLetter(""); got != "?" {
|
|
t.Fatalf("empty %q", got)
|
|
}
|
|
if got := AvatarLetter("张三"); got != "" {
|
|
t.Fatalf("cjk %q", got)
|
|
}
|
|
}
|
|
|
|
func TestLetterAvatarDataURIFitsColumn(t *testing.T) {
|
|
for _, name := range []string{"test01", "ada", "张三", ""} {
|
|
got := LetterAvatarDataURI(name)
|
|
if !strings.HasPrefix(got, avatarDataURIPrefix) {
|
|
t.Fatalf("%q prefix %s", name, got)
|
|
}
|
|
if len(got) == 0 || len(got) > 512 {
|
|
t.Fatalf("%q len %d", name, len(got))
|
|
}
|
|
}
|
|
a, b := LetterAvatarDataURI("test01"), LetterAvatarDataURI("ada")
|
|
if a == b {
|
|
t.Fatal("same uri")
|
|
}
|
|
}
|