spark-server/internal/transport/http/group_test.go
zhr ae9a71034d feat: implement Spark IM V3 modular monolith
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>
2026-09-17 19:52:11 +08:00

86 lines
2.9 KiB
Go

package httpx
import (
"encoding/json"
"fmt"
"net/http"
"testing"
"go.uber.org/zap"
"spark-server/internal/infrastructure/id"
authlogic "spark-server/internal/module/auth/logic"
convlogic "spark-server/internal/module/conversation/logic"
convmodel "spark-server/internal/module/conversation/model"
delivermodel "spark-server/internal/module/deliver/model"
friendlogic "spark-server/internal/module/friend/logic"
friendmodel "spark-server/internal/module/friend/model"
grouplogic "spark-server/internal/module/group/logic"
groupmodel "spark-server/internal/module/group/model"
msgmodel "spark-server/internal/module/message/model"
userlogic "spark-server/internal/module/user/logic"
usermodel "spark-server/internal/module/user/model"
)
func testGroupEngine(t *testing.T) *ginEngineBundle {
t.Helper()
j, err := authlogic.NewJWT(&authlogic.Options{Secret: "test-secret-test-secret", Issuer: "spark-im"})
if err != nil {
t.Fatal(err)
}
ids, err := id.New(1)
if err != nil {
t.Fatal(err)
}
users := userlogic.NewService(usermodel.NewMemoryRepo(), usermodel.NewMemoryCodes(), ids, nil)
friends := friendlogic.NewService(
friendmodel.NewMemoryRepo(), users, ids,
friendlogic.NewGreeter(convlogic.NewP2PService(convmodel.NewMemoryP2P(), ids), msgmodel.NewMemoryRepo(), ids, delivermodel.NewMemoryQueue()),
)
groups := grouplogic.NewService(groupmodel.NewMemoryRepo(), users, friends, ids, msgmodel.NewMemoryRepo(), delivermodel.NewMemoryQueue(), nil)
r := NewEngine(zap.NewNop(), &EngineDeps{
Auth: j,
Login: authlogic.NewLoginService(j, users),
Users: users,
Friends: friends,
Groups: groups,
})
return &ginEngineBundle{engine: r}
}
func TestGroupCreateHTTP(t *testing.T) {
h := testGroupEngine(t).engine
a := loginUser(t, h, "test01@spark.com", 1)
b := loginUser(t, h, "test02@spark.com", 2)
apply := authJSON(t, h, &a, http.MethodPost, "/v1/friends/requests", `{"email":"test02@spark.com"}`)
var applied friendlogic.ApplyResult
if err := json.Unmarshal(apply.Data, &applied); err != nil {
t.Fatal(err)
}
acc := authJSON(t, h, &b, http.MethodPost, "/v1/friends", fmt.Sprintf(`{"request_id":%d}`, applied.RequestID))
if acc.Code != "0" {
t.Fatalf("accept %+v", acc)
}
created := authJSON(t, h, &a, http.MethodPost, "/v1/groups", fmt.Sprintf(`{"name":"周末局","member_uids":[%d]}`, b.UserID))
if created.Code != "0" {
t.Fatalf("create %+v", created)
}
var g grouplogic.View
if err := json.Unmarshal(created.Data, &g); err != nil {
t.Fatal(err)
}
if g.ID != 1 || g.ConversationID == 0 || g.ConversationID == g.ID || g.Name != "周末局" {
t.Fatalf("%+v", g)
}
got := authJSON(t, h, &b, http.MethodGet, fmt.Sprintf("/v1/groups/%d", g.ID), "")
if got.Code != "0" {
t.Fatalf("get %+v", got)
}
members := authJSON(t, h, &b, http.MethodGet, fmt.Sprintf("/v1/groups/%d/members", g.ID), "")
if members.Code != "0" {
t.Fatalf("members %+v", members)
}
}