合并 origin/main 设备注册后,纳入本地 music 模块、seed 命令与 popadmin 相关路由/文档;music migration 编号为 0020 以避免与 0019_devices 冲突。 Co-authored-by: Cursor <cursoragent@cursor.com>
114 lines
3.2 KiB
Go
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)
|
|
}
|
|
}
|