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) } }