feat: backend core - auth, user, role, permission, device, webhook, monitoring, cache, repository, service, middleware, API handlers
This commit is contained in:
47
internal/testdb/testdb.go
Normal file
47
internal/testdb/testdb.go
Normal file
@@ -0,0 +1,47 @@
|
||||
// Package testdb provides a pure-Go SQLite helper for tests.
|
||||
// It uses modernc.org/sqlite (CGO-free) via gorm.io/driver/sqlite's DriverName override.
|
||||
package testdb
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
_ "modernc.org/sqlite" // 注册纯Go SQLite驱动,驱动名 "sqlite"
|
||||
gormsqlite "gorm.io/driver/sqlite"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/logger"
|
||||
)
|
||||
|
||||
// Open 使用 modernc.org/sqlite(纯Go,无需CGO)打开内存测试数据库。
|
||||
// 驱动名必须是 "sqlite"(modernc 注册),而非 gorm 默认的 "sqlite3"(mattn/CGO)。
|
||||
func Open(t testing.TB) *gorm.DB {
|
||||
t.Helper()
|
||||
|
||||
db, err := gorm.Open(gormsqlite.New(gormsqlite.Config{
|
||||
DriverName: "sqlite",
|
||||
DSN: "file::memory:?cache=shared&mode=memory",
|
||||
}), &gorm.Config{
|
||||
Logger: logger.Default.LogMode(logger.Silent),
|
||||
})
|
||||
if err != nil {
|
||||
t.Skipf("跳过数据库测试(SQLite不可用): %v", err)
|
||||
}
|
||||
|
||||
return db
|
||||
}
|
||||
|
||||
// OpenWith 使用自定义DSN
|
||||
func OpenWith(t testing.TB, dsn string) *gorm.DB {
|
||||
t.Helper()
|
||||
|
||||
db, err := gorm.Open(gormsqlite.New(gormsqlite.Config{
|
||||
DriverName: "sqlite",
|
||||
DSN: dsn,
|
||||
}), &gorm.Config{
|
||||
Logger: logger.Default.LogMode(logger.Silent),
|
||||
})
|
||||
if err != nil {
|
||||
t.Skipf("跳过数据库测试(SQLite不可用): %v", err)
|
||||
}
|
||||
|
||||
return db
|
||||
}
|
||||
34
internal/testdb/testdb_test.go
Normal file
34
internal/testdb/testdb_test.go
Normal file
@@ -0,0 +1,34 @@
|
||||
package testdb
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/user-management-system/internal/domain"
|
||||
)
|
||||
|
||||
func TestOpen_WorksWithModernc(t *testing.T) {
|
||||
db := Open(t)
|
||||
|
||||
// 迁移 user 表
|
||||
if err := db.AutoMigrate(&domain.User{}); err != nil {
|
||||
t.Fatalf("AutoMigrate 失败: %v", err)
|
||||
}
|
||||
|
||||
// 插入一条记录
|
||||
user := &domain.User{Username: "testuser", Status: domain.UserStatusActive}
|
||||
if err := db.Create(user).Error; err != nil {
|
||||
t.Fatalf("Create 失败: %v", err)
|
||||
}
|
||||
if user.ID == 0 {
|
||||
t.Error("期望 ID > 0")
|
||||
}
|
||||
|
||||
// 查询
|
||||
var found domain.User
|
||||
if err := db.First(&found, "username = ?", "testuser").Error; err != nil {
|
||||
t.Fatalf("查询失败: %v", err)
|
||||
}
|
||||
if found.Username != "testuser" {
|
||||
t.Errorf("期望 username=testuser, 实际 %s", found.Username)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user