Files
digital-psychology/apps/api/internal/integration/synastry_test.go
T
jackyu66gitandCursor 7ab9add5dd
ci / h5 (push) Canceled after 0s
ci / api (push) Canceled after 0s
ci / ess-docs (push) Canceled after 0s
feat(ops): ECR-007 行为分析与 ECR-008 内容运营后台
落地埋点 ingest/数据看板、首页宫格 CMS 与测评上下架;含账号引导、问答流式与免责声明去重,以及 review P1 审计同事务修复。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 02:26:16 +08:00

87 lines
2.5 KiB
Go

package integration_test
import (
"net/http"
"testing"
)
func TestFlowSynastryMultiChartsAndInvite(t *testing.T) {
r, _ := setupAPI(t)
key := mustRegister(t, r)
env, key := doJSON(t, r, http.MethodPost, "/api/v1/profiles", map[string]any{
"relation": "self", "birth_date": "1990-05-12", "display_name": "我",
"birth_time": "10:30", "birth_place": "上海",
}, key)
pa := decodeData[map[string]any](t, env.Data)
idA, _ := pa["id"].(string)
env, key = doJSON(t, r, http.MethodPost, "/api/v1/profiles", map[string]any{
"relation": "other", "birth_date": "1992-08-20", "display_name": "TA",
"birth_time": "08:00", "birth_place": "北京",
}, key)
pb := decodeData[map[string]any](t, env.Data)
idB, _ := pb["id"].(string)
env, key = doJSON(t, r, http.MethodPost, "/api/v1/reports/synastry", map[string]any{
"profile_id_a": idA, "profile_id_b": idB, "as_of": "2026-08-02",
}, key)
rep := decodeData[map[string]any](t, env.Data)
if rep["type"] != "synastry" {
t.Fatalf("type=%v", rep["type"])
}
sum, _ := rep["summary"].(map[string]any)
if sum == nil {
t.Fatal("summary nil")
}
if sum["as_of"] != "2026-08-02" {
t.Fatalf("as_of=%v", sum["as_of"])
}
charts, _ := sum["charts"].(map[string]any)
if charts == nil {
t.Fatal("charts missing")
}
for _, k := range []string{
"compare", "composite", "davison", "marks_me", "marks_other", "overlay",
"composite_progressed", "davison_progressed", "marks_progressed",
} {
if charts[k] == nil {
t.Fatalf("missing charts.%s", k)
}
}
// no deep access → detail stripped
if rep["has_deep_access"] == true {
t.Fatal("expected no deep access")
}
if rep["detail"] != nil {
t.Fatalf("detail should be stripped, got %#v", rep["detail"])
}
// invite flow: second device accepts
env, key = doJSON(t, r, http.MethodPost, "/api/v1/synastry/invites", map[string]any{
"profile_id": idA,
}, key)
inv := decodeData[map[string]any](t, env.Data)
token, _ := inv["token"].(string)
if token == "" {
t.Fatal("empty token")
}
env2Key := mustRegister(t, r)
env2, key2 := doJSON(t, r, http.MethodGet, "/api/v1/synastry/invites/"+token, nil, env2Key)
meta := decodeData[map[string]any](t, env2.Data)
if meta["host_name"] == nil {
t.Fatal("host_name missing")
}
env2, key2 = doJSON(t, r, http.MethodPost, "/api/v1/synastry/invites/"+token+"/accept", map[string]any{
"display_name": "好友", "birth_date": "1995-03-03",
}, key2)
acc := decodeData[map[string]any](t, env2.Data)
if acc["type"] != "synastry" {
t.Fatalf("accept type=%v", acc["type"])
}
_ = key
_ = key2
}