- 删除 ExpiryBaseOverrideSet 字段的 description 标签(json:"-" 内部字段不进文档) - ValidateExpiryBaseOverride 两处 CodeInvalidParam 补充中文错误消息 - 提取 initPackageExpiryBaseFields 消除 toResponse/toResponseWithAllocation 中的重复初始化 - 删除 order/service.go 中"行业卡永远直接激活"过时注释 - 补充 T01 系列授权 HTTP 集成测试(Create + ManagePackages 两个入口) - 补充 T03 C 端购买和平台代购(无分配)快照集成测试 - 补充 T04 from_purchase 默认值、卡未实名仍立即激活的自动购包测试 - 新增 testutil.NewRedisClient 供激活接续测试使用 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
64 lines
1.9 KiB
Go
64 lines
1.9 KiB
Go
// Package testutil 提供项目集成测试共用的真实基础设施连接。
|
||
package testutil
|
||
|
||
import (
|
||
"os"
|
||
"strconv"
|
||
"testing"
|
||
|
||
"github.com/break/junhong_cmp_fiber/pkg/config"
|
||
"github.com/break/junhong_cmp_fiber/pkg/database"
|
||
"github.com/redis/go-redis/v9"
|
||
"go.uber.org/zap"
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
// NewPostgresTransaction 创建自动回滚的 PostgreSQL 测试事务。
|
||
func NewPostgresTransaction(t *testing.T) *gorm.DB {
|
||
t.Helper()
|
||
if os.Getenv("JUNHONG_DATABASE_HOST") == "" {
|
||
t.Skip("未加载 .env.local,跳过依赖真实 PostgreSQL 的集成测试")
|
||
}
|
||
cfg, err := config.Load()
|
||
if err != nil {
|
||
t.Fatalf("加载测试配置失败:%v", err)
|
||
}
|
||
db, err := database.InitPostgreSQL(&cfg.Database, zap.NewNop())
|
||
if err != nil {
|
||
t.Fatalf("连接 PostgreSQL 失败:%v", err)
|
||
}
|
||
tx := db.Begin()
|
||
if tx.Error != nil {
|
||
t.Fatalf("开启测试事务失败:%v", tx.Error)
|
||
}
|
||
t.Cleanup(func() {
|
||
_ = tx.Rollback().Error
|
||
if sqlDB, dbErr := db.DB(); dbErr == nil {
|
||
_ = sqlDB.Close()
|
||
}
|
||
})
|
||
return tx
|
||
}
|
||
|
||
// NewRedisClient 创建真实 Redis 测试客户端并在测试结束时关闭。
|
||
func NewRedisClient(t *testing.T) *redis.Client {
|
||
t.Helper()
|
||
if os.Getenv("JUNHONG_REDIS_ADDRESS") == "" {
|
||
t.Skip("未加载 .env.local,跳过依赖真实 Redis 的集成测试")
|
||
}
|
||
cfg, err := config.Load()
|
||
if err != nil {
|
||
t.Fatalf("加载测试配置失败:%v", err)
|
||
}
|
||
client, err := database.NewRedisClient(database.RedisConfig{
|
||
Address: cfg.Redis.Address + ":" + strconv.Itoa(cfg.Redis.Port), Password: cfg.Redis.Password,
|
||
DB: cfg.Redis.DB, PoolSize: cfg.Redis.PoolSize, MinIdleConns: cfg.Redis.MinIdleConns,
|
||
DialTimeout: cfg.Redis.DialTimeout, ReadTimeout: cfg.Redis.ReadTimeout, WriteTimeout: cfg.Redis.WriteTimeout,
|
||
}, zap.NewNop())
|
||
if err != nil {
|
||
t.Fatalf("连接 Redis 失败:%v", err)
|
||
}
|
||
t.Cleanup(func() { _ = client.Close() })
|
||
return client
|
||
}
|