2025-11-28 23:30:49 +08:00
|
|
|
|
package database
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"carrotskin/pkg/config"
|
|
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
|
|
"go.uber.org/zap/zaptest"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// TestGetDB_NotInitialized 测试未初始化时获取数据库实例
|
|
|
|
|
|
func TestGetDB_NotInitialized(t *testing.T) {
|
2025-12-24 16:03:46 +08:00
|
|
|
|
dbInstance = nil
|
2025-11-28 23:30:49 +08:00
|
|
|
|
_, err := GetDB()
|
|
|
|
|
|
if err == nil {
|
|
|
|
|
|
t.Error("未初始化时应该返回错误")
|
|
|
|
|
|
}
|
2025-12-24 16:03:46 +08:00
|
|
|
|
|
2025-11-28 23:30:49 +08:00
|
|
|
|
expectedError := "数据库未初始化,请先调用 database.Init()"
|
|
|
|
|
|
if err.Error() != expectedError {
|
|
|
|
|
|
t.Errorf("错误消息 = %q, want %q", err.Error(), expectedError)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// TestMustGetDB_Panic 测试MustGetDB在未初始化时panic
|
|
|
|
|
|
func TestMustGetDB_Panic(t *testing.T) {
|
2025-12-24 16:03:46 +08:00
|
|
|
|
dbInstance = nil
|
2025-11-28 23:30:49 +08:00
|
|
|
|
defer func() {
|
|
|
|
|
|
if r := recover(); r == nil {
|
|
|
|
|
|
t.Error("MustGetDB 应该在未初始化时panic")
|
|
|
|
|
|
}
|
|
|
|
|
|
}()
|
2025-12-24 16:03:46 +08:00
|
|
|
|
|
2025-11-28 23:30:49 +08:00
|
|
|
|
_ = MustGetDB()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// TestInit_Database 测试数据库初始化逻辑
|
|
|
|
|
|
func TestInit_Database(t *testing.T) {
|
2025-12-24 16:03:46 +08:00
|
|
|
|
dbInstance = nil
|
2025-11-28 23:30:49 +08:00
|
|
|
|
cfg := config.DatabaseConfig{
|
|
|
|
|
|
Driver: "postgres",
|
|
|
|
|
|
Host: "localhost",
|
|
|
|
|
|
Port: 5432,
|
|
|
|
|
|
Username: "postgres",
|
|
|
|
|
|
Password: "password",
|
|
|
|
|
|
Database: "testdb",
|
|
|
|
|
|
SSLMode: "disable",
|
|
|
|
|
|
Timezone: "Asia/Shanghai",
|
|
|
|
|
|
MaxIdleConns: 10,
|
|
|
|
|
|
MaxOpenConns: 100,
|
|
|
|
|
|
ConnMaxLifetime: 0,
|
|
|
|
|
|
}
|
2025-12-24 16:03:46 +08:00
|
|
|
|
|
2025-11-28 23:30:49 +08:00
|
|
|
|
logger := zaptest.NewLogger(t)
|
2025-12-24 16:03:46 +08:00
|
|
|
|
|
2025-11-28 23:30:49 +08:00
|
|
|
|
// 验证Init函数存在且可调用
|
|
|
|
|
|
// 注意:实际连接可能失败,这是可以接受的
|
|
|
|
|
|
err := Init(cfg, logger)
|
|
|
|
|
|
if err != nil {
|
2025-12-24 16:03:46 +08:00
|
|
|
|
t.Skipf("数据库未运行,跳过连接测试: %v", err)
|
2025-11-28 23:30:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// TestAutoMigrate_ErrorHandling 测试AutoMigrate的错误处理逻辑
|
|
|
|
|
|
func TestAutoMigrate_ErrorHandling(t *testing.T) {
|
|
|
|
|
|
logger := zaptest.NewLogger(t)
|
2025-12-24 16:03:46 +08:00
|
|
|
|
|
2025-11-28 23:30:49 +08:00
|
|
|
|
// 测试未初始化时的错误处理
|
|
|
|
|
|
err := AutoMigrate(logger)
|
|
|
|
|
|
if err == nil {
|
|
|
|
|
|
// 如果数据库已初始化,这是正常的
|
|
|
|
|
|
t.Log("AutoMigrate() 成功(数据库可能已初始化)")
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 如果数据库未初始化,应该返回错误
|
|
|
|
|
|
if err.Error() == "" {
|
|
|
|
|
|
t.Error("AutoMigrate() 应该返回有意义的错误消息")
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// TestClose_NotInitialized 测试未初始化时关闭数据库
|
|
|
|
|
|
func TestClose_NotInitialized(t *testing.T) {
|
|
|
|
|
|
// 未初始化时关闭应该不返回错误
|
|
|
|
|
|
err := Close()
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
t.Errorf("Close() 在未初始化时应该返回nil,实际返回: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|