spark-server/internal/module/squarebot/logic/attach_test.go
2026-09-29 10:22:28 +08:00

69 lines
1.8 KiB
Go

package logic
import (
"bytes"
"context"
"fmt"
"image"
"image/color"
"image/png"
"net/http"
"net/http/httptest"
"testing"
"time"
userentity "spark-server/internal/module/user/entity"
pkgmedia "spark-server/internal/pkg/media"
)
type memObjectStore struct {
puts int
}
func (m *memObjectStore) Put(context.Context, string, []byte, string) error {
m.puts++
return nil
}
func (m *memObjectStore) PutLarge(context.Context, string, []byte, string, int) error {
m.puts++
return nil
}
func TestBindMediaAttachOnTick(t *testing.T) {
img := image.NewRGBA(image.Rect(0, 0, 4, 4))
img.Set(0, 0, color.White)
var buf bytes.Buffer
if err := png.Encode(&buf, img); err != nil {
t.Fatal(err)
}
imgSrv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
_, _ = w.Write(buf.Bytes())
}))
defer imgSrv.Close()
rss := fmt.Sprintf(`<?xml version="1.0"?><rss version="2.0"><channel><title>T</title>
<item><title>Hi</title><link>https://example.com/p</link>
<enclosure url="%s" type="image/png"/>
</item></channel></rss>`, imgSrv.URL)
feedSrv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
_, _ = w.Write([]byte(rss))
}))
defer feedSrv.Close()
sq := &stubSquare{}
store := &memObjectStore{}
comp := NewMediaCompressor(pkgmedia.DefaultLimits(), 80, 28, "")
comp.Client = imgSrv.Client()
svc := NewService(nil, sq, stubUsers{u: &userentity.User{ID: 7, Nickname: "Bot"}}, nil, &Options{
Enabled: true, Feeds: []string{feedSrv.URL}, BotIndexes: []int{1}, TTL: time.Hour,
})
svc.client = feedSrv.Client()
svc.BindMedia(comp, store, true)
if err := svc.Tick(t.Context()); err != nil {
t.Fatal(err)
}
if sq.published != 1 || store.puts != 1 {
t.Fatalf("published=%d puts=%d", sq.published, store.puts)
}
}