fix: 修复缺少渠道表时商务列表失败并补充接口实测

This commit is contained in:
Yvan
2026-11-03 18:10:59 +08:00
parent 794001dfbe
commit 43f0ec1b15
8 changed files with 224 additions and 13 deletions
+102
View File
@@ -0,0 +1,102 @@
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)
}
}