- 新增 6 个测试场景 (config load pipe, handler errors, service aggregation, engine degradation, openai decoder edges, negative tests) - 更新测试工具规格 (mockgen, in-memory SQLite) - 覆盖率目标从 >80% 提升至 >85% - 新增 test-unit 和 test-integration Makefile 命令 - 新增死代码清理和 mockgen 需求 - 归档变更至 openspec/changes/archive/2026-04-22-improve-backend-testing/
74 lines
1.6 KiB
Go
74 lines
1.6 KiB
Go
package tests
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
|
|
"nex/backend/internal/config"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func SetupTestDB(t *testing.T) *gorm.DB {
|
|
t.Helper()
|
|
|
|
db, err := gorm.Open(sqlite.Open(":memory:?_foreign_keys=on"), &gorm.Config{})
|
|
require.NoError(t, err, "failed to open test database")
|
|
|
|
sqlDB, err := db.DB()
|
|
require.NoError(t, err, "failed to get underlying sql.DB")
|
|
sqlDB.SetMaxOpenConns(1)
|
|
sqlDB.SetConnMaxLifetime(0)
|
|
|
|
err = db.AutoMigrate(&config.Provider{}, &config.Model{}, &config.UsageStats{})
|
|
require.NoError(t, err, "failed to auto-migrate test database")
|
|
|
|
return db
|
|
}
|
|
|
|
func CleanupTestDB(t *testing.T, db *gorm.DB) {
|
|
t.Helper()
|
|
|
|
time.Sleep(50 * time.Millisecond)
|
|
|
|
sqlDB, err := db.DB()
|
|
require.NoError(t, err, "failed to get underlying sql.DB")
|
|
|
|
err = sqlDB.Close()
|
|
require.NoError(t, err, "failed to close test database")
|
|
}
|
|
|
|
func CreateTestProvider(t *testing.T, db *gorm.DB, id string) config.Provider {
|
|
t.Helper()
|
|
|
|
provider := config.Provider{
|
|
ID: id,
|
|
Name: fmt.Sprintf("test-provider-%s", id),
|
|
APIKey: fmt.Sprintf("test-api-key-%s", id),
|
|
BaseURL: fmt.Sprintf("https://api.test-%s.com", id),
|
|
Enabled: true,
|
|
}
|
|
|
|
err := db.Create(&provider).Error
|
|
require.NoError(t, err, "failed to create test provider")
|
|
|
|
return provider
|
|
}
|
|
|
|
func CreateTestModel(t *testing.T, db *gorm.DB, id string, providerID string, modelName string) (config.Model, error) {
|
|
t.Helper()
|
|
|
|
model := config.Model{
|
|
ID: id,
|
|
ProviderID: providerID,
|
|
ModelName: modelName,
|
|
Enabled: true,
|
|
}
|
|
|
|
err := db.Create(&model).Error
|
|
return model, err
|
|
}
|