spark-server/internal/transport/http/moment_test.go
2026-09-18 17:51:42 +08:00

93 lines
3.3 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"
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"
userlogic "spark-server/internal/module/user/logic"
usermodel "spark-server/internal/module/user/model"
"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 := 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()),
)
moments := momentlogic.NewService(momentmodel.NewMemoryRepo(), friends, users, nil, ids)
files := uploadlogic.NewService(&stubPresign{}, uploadlogic.Options{})
r := NewEngine(zap.NewNop(), &EngineDeps{
Auth: j, Login: authlogic.NewLoginService(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)
}
}