spark-server/internal/module/seed/logic/service_test.go
DESKTOP-L8OUL9F\gfl0034 ce2cdf6bf3 feat: music 运营曲目、seed 机器人欢迎消息,并补充 novels/music OpenAPI
合并 origin/main 设备注册后,纳入本地 music 模块、seed 命令与 popadmin 相关路由/文档;music migration 编号为 0020 以避免与 0019_devices 冲突。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-23 16:07:05 +08:00

114 lines
3.2 KiB
Go

package logic
import (
"context"
"errors"
"strconv"
"testing"
"spark-server/internal/infrastructure/id"
convlogic "spark-server/internal/module/conversation/logic"
convmodel "spark-server/internal/module/conversation/model"
friendmodel "spark-server/internal/module/friend/model"
groupmodel "spark-server/internal/module/group/model"
msgentity "spark-server/internal/module/message/entity"
msgmodel "spark-server/internal/module/message/model"
userentity "spark-server/internal/module/user/entity"
usermodel "spark-server/internal/module/user/model"
"spark-server/internal/pkg/errs"
)
type seedHarness struct {
*Service
msgs *msgmodel.MemoryRepo
}
func testSeed(t *testing.T) *seedHarness {
t.Helper()
ids, err := id.New(1)
if err != nil {
t.Fatal(err)
}
users := usermodel.NewMemoryRepo()
friends := friendmodel.NewMemoryRepo()
chats := convlogic.NewP2PService(convmodel.NewMemoryP2P(), ids)
msgs := msgmodel.NewMemoryRepo()
groups := groupmodel.NewMemoryRepo()
return &seedHarness{
Service: NewService(users, friends, chats, msgs, groups, ids),
msgs: msgs,
}
}
func TestSeedRunIdempotent(t *testing.T) {
h := testSeed(t)
ctx := context.Background()
first, err := h.Run(ctx)
if err != nil {
t.Fatal(err)
}
if first.Bots != userentity.BotCount || first.Targets != 10 || first.GroupID <= 0 || first.SampleMsgs != 9 {
t.Fatalf("first %+v", first)
}
again, err := h.Run(ctx)
if err != nil {
t.Fatal(err)
}
if again.Bots != first.Bots || again.Targets != first.Targets || again.GroupID != first.GroupID || again.SampleMsgs != first.SampleMsgs {
t.Fatalf("again %+v want %+v", again, first)
}
bot, err := h.users.GetByEmail(ctx, userentity.BotEmail(1))
if err != nil {
t.Fatal(err)
}
if bot.Nickname != "Spark Assistant" || bot.Avatar == "" {
t.Fatalf("welcome bot %+v", bot)
}
other, err := h.users.GetByEmail(ctx, userentity.BotEmail(50))
if err != nil || other.Nickname == "" || other.Avatar == "" {
t.Fatalf("random bot %+v %v", other, err)
}
u, err := h.users.GetByEmail(ctx, "test01@spark.com")
if err != nil {
t.Fatal(err)
}
rel, err := h.friends.GetRelation(ctx, u.ID, bot.ID)
if err != nil || !rel.Active() {
t.Fatalf("friend %+v %v", rel, err)
}
convID, err := h.chats.EnsureP2P(ctx, u.ID, bot.ID)
if err != nil {
t.Fatal(err)
}
greetID := "seed:greet:" + strconv.FormatInt(u.ID, 10)
greet, err := h.msgs.GetByClientMsgID(ctx, bot.ID, convID, greetID)
if err != nil || greet.Type != msgentity.TypeText {
t.Fatalf("greet %+v %v", greet, err)
}
welcomeID := "seed:welcome:" + strconv.FormatInt(u.ID, 10)
list, err := h.msgs.ListByConversation(ctx, convID, u.ID, 0, 50)
if err != nil {
t.Fatal(err)
}
foundWelcome := false
for _, m := range list {
if m.ClientMsgID != welcomeID {
continue
}
foundWelcome = true
payload, perr := m.Payload()
if perr != nil || payload.System == nil || payload.System.Kind != userentity.SystemKindWelcome {
t.Fatalf("welcome payload %+v %v", payload, perr)
}
}
if !foundWelcome {
t.Fatal("welcome missing")
}
}
func TestSeedNilService(t *testing.T) {
if _, err := (*Service)(nil).Run(context.Background()); !errors.Is(err, errs.ErrAvailable) {
t.Fatalf("got %v", err)
}
}