Files
junhong_cmp_fiber/tests/testutils/setup.go
huang a36e4a79c0 实现用户和组织模型(店铺、企业、个人客户)
核心功能:
- 实现 7 级店铺层级体系(Shop 模型 + 层级校验)
- 实现企业管理模型(Enterprise 模型)
- 实现个人客户管理模型(PersonalCustomer 模型)
- 重构 Account 模型关联关系(基于 EnterpriseID 而非 ParentID)
- 完整的 Store 层和 Service 层实现
- 递归查询下级店铺功能(含 Redis 缓存)
- 全面的单元测试覆盖(Shop/Enterprise/PersonalCustomer Store + Shop Service)

技术要点:
- 显式指定所有 GORM 模型的数据库字段名(column: 标签)
- 统一的字段命名规范(数据库用 snake_case,Go 用 PascalCase)
- 完整的中文字段注释和业务逻辑说明
- 100% 测试覆盖(20+ 测试用例全部通过)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-09 18:02:46 +08:00

108 lines
2.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package testutils
import (
"context"
"fmt"
"testing"
"time"
"github.com/redis/go-redis/v9"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"github.com/break/junhong_cmp_fiber/internal/model"
)
// SetupTestDB 设置测试数据库和 Redis
func SetupTestDB(t *testing.T) (*gorm.DB, *redis.Client) {
t.Helper()
// 连接测试数据库(使用远程数据库)
dsn := "host=cxd.whcxd.cn port=16159 user=erp_pgsql password=erp_2025 dbname=junhong_cmp_test sslmode=disable TimeZone=Asia/Shanghai"
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
})
if err != nil {
t.Skipf("跳过测试:无法连接测试数据库: %v", err)
}
// 自动迁移测试表
err = db.AutoMigrate(
&model.Account{},
&model.Role{},
&model.Permission{},
&model.AccountRole{},
&model.RolePermission{},
&model.Shop{},
&model.Enterprise{},
&model.PersonalCustomer{},
)
if err != nil {
t.Fatalf("数据库迁移失败: %v", err)
}
// 连接测试 Redis使用远程 Redis
redisClient := redis.NewClient(&redis.Options{
Addr: "cxd.whcxd.cn:16299",
Password: "cpNbWtAaqgo1YJmbMp3h",
DB: 15, // 使用测试数据库
})
ctx := context.Background()
if err := redisClient.Ping(ctx).Err(); err != nil {
t.Skipf("跳过测试:无法连接 Redis: %v", err)
}
// 清空 Redis 测试数据库
redisClient.FlushDB(ctx)
return db, redisClient
}
// TeardownTestDB 清理测试数据库
func TeardownTestDB(t *testing.T, db *gorm.DB, redisClient *redis.Client) {
t.Helper()
// 清空测试数据
ctx := context.Background()
db.Exec("TRUNCATE TABLE tb_account_role CASCADE")
db.Exec("TRUNCATE TABLE tb_role_permission CASCADE")
db.Exec("TRUNCATE TABLE tb_account CASCADE")
db.Exec("TRUNCATE TABLE tb_role CASCADE")
db.Exec("TRUNCATE TABLE tb_permission CASCADE")
db.Exec("TRUNCATE TABLE tb_shop CASCADE")
db.Exec("TRUNCATE TABLE tb_enterprise CASCADE")
db.Exec("TRUNCATE TABLE tb_personal_customer CASCADE")
// 清空 Redis
redisClient.FlushDB(ctx)
// 关闭连接
sqlDB, _ := db.DB()
if sqlDB != nil {
_ = sqlDB.Close()
}
_ = redisClient.Close()
}
// GenerateUsername 生成测试用户名
func GenerateUsername(prefix string, index int) string {
return fmt.Sprintf("%s_%d", prefix, index)
}
// GeneratePhone 生成测试手机号
func GeneratePhone(prefix string, index int) string {
return fmt.Sprintf("%s%08d", prefix, index)
}
// Now 返回当前时间
func Now() time.Time {
return time.Now()
}
// Since 返回从指定时间到现在的持续时间
func Since(t time.Time) time.Duration {
return time.Since(t)
}