feat: backend core - auth, user, role, permission, device, webhook, monitoring, cache, repository, service, middleware, API handlers

This commit is contained in:
2026-04-02 11:19:50 +08:00
parent e59a77bc49
commit dcc1f186f8
298 changed files with 62603 additions and 0 deletions

47
internal/testdb/testdb.go Normal file
View 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
}

View 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)
}
}