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" "spark-server/internal/module/user/logictest" ) 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, _ := logictest.UsersAndSMS(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) } ann := authJSON(t, h, &a, http.MethodPatch, fmt.Sprintf("/v1/groups/%d", g.ID), `{"announcement":"今晚九点","name":"周末局"}`) if ann.Code != "0" { t.Fatalf("announce %+v", ann) } denied := authJSON(t, h, &b, http.MethodPatch, fmt.Sprintf("/v1/groups/%d", g.ID), `{"announcement":"x"}`) if denied.Code == "0" { t.Fatal("member announcement") } role := authJSON(t, h, &a, http.MethodPatch, fmt.Sprintf("/v1/groups/%d/members/%d", g.ID, b.UserID), `{"role":2}`) if role.Code != "0" { t.Fatalf("admin %+v", role) } self := authJSON(t, h, &b, http.MethodPatch, fmt.Sprintf("/v1/groups/%d/members/%d", g.ID, b.UserID), `{"nickname":"球","remark":"球友群"}`) if self.Code != "0" { t.Fatalf("self card %+v", self) } card := authJSON(t, h, &b, http.MethodGet, fmt.Sprintf("/v1/groups/%d", g.ID), "") if card.Code != "0" { t.Fatalf("get card %+v", card) } var view grouplogic.View if err := json.Unmarshal(card.Data, &view); err != nil || view.Announcement != "今晚九点" || view.Remark != "球友群" || view.GroupNickname != "球" || view.Role != 2 { t.Fatalf("card %+v %v", view, err) } }