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" authlogictest "spark-server/internal/module/auth/logictest" 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" msgmodel "spark-server/internal/module/message/model" momentlogic "spark-server/internal/module/moment/logic" momentmodel "spark-server/internal/module/moment/model" uploadlogic "spark-server/internal/module/upload/logic" "spark-server/internal/module/user/logictest" "spark-server/internal/pkg/errs" ) func testMomentEngine(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()), ) moments := momentlogic.NewService(momentmodel.NewMemoryRepo(), friends, users, nil, ids) files := uploadlogic.NewService(&stubPresign{}, uploadlogic.Options{}) r := NewEngine(zap.NewNop(), &EngineDeps{ Auth: j, Login: authlogictest.LoginService(j, users), Users: users, Friends: friends, Moments: moments, Files: files, }) return &ginEngineBundle{engine: r} } func TestMomentPublishFeedLikeHTTP(t *testing.T) { h := testMomentEngine(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"}`) if apply.Code != "0" { t.Fatalf("apply %+v", apply) } 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) } pub := authJSON(t, h, &a, http.MethodPost, "/v1/moments", `{"text":"hello moments"}`) if pub.Code != "0" { t.Fatalf("publish %+v", pub) } var post momentlogic.View if err := json.Unmarshal(pub.Data, &post); err != nil || post.Text != "hello moments" || post.ID == 0 { t.Fatalf("post %s %v", pub.Data, err) } feed := authJSON(t, h, &b, http.MethodGet, "/v1/moments", "") if feed.Code != "0" { t.Fatalf("feed %+v", feed) } like := authJSON(t, h, &b, http.MethodPut, fmt.Sprintf("/v1/moments/%d/like", post.ID), "") if like.Code != "0" { t.Fatalf("like %+v", like) } cred := authJSON(t, h, &a, http.MethodPost, "/v1/files", `{"purpose":"moment_image","mime":"image/jpeg","size":1024}`) if cred.Code != "0" { t.Fatalf("cred %+v", cred) } stranger := loginUser(t, h, "test03@spark.com", 3) album := authJSON(t, h, &stranger, http.MethodGet, fmt.Sprintf("/v1/moments/users/%d", a.UserID), "") if album.Code != errs.ErrNotFound.Code { t.Fatalf("stranger album %+v", album) } }