package main import ( "context" "encoding/json" "net/http" "net/http/httptest" "path/filepath" "testing" "github.com/gin-gonic/gin" "github.com/glebarez/sqlite" "gorm.io/gorm" businessbiz "kra/internal/biz/business" "kra/internal/biz/system" businessdata "kra/internal/data/business" systemdata "kra/internal/data/system" "kra/internal/server/handler" "kra/internal/server/router" businessservice "kra/internal/service/business" ) type businessHTTPData struct{ db *gorm.DB } func (d businessHTTPData) DB() *gorm.DB { return d.db } func TestBusinessHTTPListWithSystemOnlyAndCompleteDatabase(t *testing.T) { db, err := gorm.Open(sqlite.Open(filepath.Join(t.TempDir(), "http.db")), &gorm.Config{}) if err != nil { t.Fatal(err) } sqlDB, err := db.DB() if err != nil { t.Fatal(err) } t.Cleanup(func() { _ = sqlDB.Close() }) for _, step := range append(systemdata.Migrations(), businessdata.Migrations()...) { if err := step.Migrate(db); err != nil { t.Fatal(err) } } for _, statement := range []string{ "INSERT INTO sys_users(id,uuid,username,authority_id,level,id_path) VALUES (1,'admin','admin',888,0,'0'),(2,'child','child',901,1,'0'),(3,'empty','empty',901,1,'0')", "INSERT INTO sys_user_bind_platform(user_id,source_db,platform_busier_id,status) VALUES (2,'lx',9,'0')", } { if err := db.Exec(statement).Error; err != nil { t.Fatal(err) } } provider := businessHTTPData{db} accounts := businessservice.NewAccountService(businessbiz.NewAccountUsecase(businessdata.NewAccountRepo(provider))) prefs := businessservice.NewUserPreferenceService(businessbiz.NewUserPreferenceUsecase(businessdata.NewUserPreferenceRepo(provider))) engine := gin.New() // 此契约测试固定已认证身份;真实登录另通过运行实例验证。 engine.Use(func(c *gin.Context) { c.Request = c.Request.WithContext(system.NewActorContext(c.Request.Context(), system.Actor{UserID: 1, AuthorityID: 888})) c.Next() }) router.RegisterBusiness(engine.Group(""), handler.NewBusiness(prefs, accounts)) server := httptest.NewServer(engine) defer server.Close() requestList := func() map[string]any { t.Helper() req, _ := http.NewRequestWithContext(context.Background(), http.MethodGet, server.URL+"/sw/business/list?pageNum=1&pageSize=10", nil) response, err := server.Client().Do(req) if err != nil { t.Fatal(err) } defer response.Body.Close() var body map[string]any if err := json.NewDecoder(response.Body).Decode(&body); err != nil { t.Fatal(err) } if response.StatusCode != 200 || body["code"] != float64(0) { t.Fatalf("真实 HTTP 列表请求失败: %+v", body) } return body["data"].(map[string]any) } data := requestList() rows := data["rows"].([]any) if data["total"] != float64(3) || len(rows) != 3 { t.Fatalf("系统数据未完整返回: %+v", data) } child := rows[1].(map[string]any) if child["promoteCount"] != nil || child["bindCount"] != float64(1) { t.Fatalf("未接入统计不能伪装为零: %+v", child) } if rows[2].(map[string]any)["promoteCount"] != float64(0) { t.Fatal("无绑定账号的直属渠道应明确为零") } if err := db.Exec("CREATE TABLE tab_promote(id INTEGER,source_db TEXT,busier_id INTEGER,promote_level INTEGER)").Error; err != nil { t.Fatal(err) } if err := db.Exec("INSERT INTO tab_promote VALUES(1,'lx',9,1),(2,'lx',9,2),(1,'hw',9,1)").Error; err != nil { t.Fatal(err) } data = requestList() child = data["rows"].([]any)[1].(map[string]any) if child["promoteCount"] != float64(1) { t.Fatalf("完整数据应恢复真实且按平台隔离的渠道数: %+v", child) } }