Initial commit

This commit is contained in:
2026-02-12 14:31:30 +08:00
commit e01cdc9889
25 changed files with 3227 additions and 0 deletions

162
tests/main_test.go Normal file
View File

@@ -0,0 +1,162 @@
package tests
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
"os"
"testing"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
"golang.org/x/crypto/bcrypt"
"git.beifan.cn/trace-system/backend-go/config"
"git.beifan.cn/trace-system/backend-go/controllers"
"git.beifan.cn/trace-system/backend-go/database"
"git.beifan.cn/trace-system/backend-go/logger"
"git.beifan.cn/trace-system/backend-go/models"
)
func TestMain(m *testing.M) {
// 加载测试配置
config.LoadConfig()
// 初始化日志系统
if err := logger.InitializeLogger("test"); err != nil {
fmt.Printf("日志系统初始化失败: %v\n", err)
os.Exit(1)
}
defer logger.Sync()
logger.Info("测试开始")
// 初始化测试数据库
database.InitDB()
// 自动迁移数据库
database.AutoMigrate()
// 创建测试用户
createTestUsers()
// 运行测试
exitCode := m.Run()
// 清理测试数据
cleanupTestData()
logger.Info("测试结束,退出码", logger.Int("exitCode", exitCode))
os.Exit(exitCode)
}
func cleanupTestData() {
// 删除所有测试数据
database.DB.Unscoped().Where("1 = 1").Delete(&models.User{})
database.DB.Unscoped().Where("1 = 1").Delete(&models.Company{})
database.DB.Unscoped().Where("1 = 1").Delete(&models.Serial{})
}
func createTestUsers() {
testPassword, _ := bcrypt.GenerateFromPassword([]byte("password123"), bcrypt.DefaultCost)
testUsers := []models.User{
{
Username: "admin",
Password: string(testPassword),
Name: "系统管理员",
Email: "admin@example.com",
Role: "admin",
},
{
Username: "user1",
Password: string(testPassword),
Name: "普通用户",
Email: "user1@example.com",
Role: "user",
},
}
database.DB.Create(&testUsers)
}
func TestHealthCheck(t *testing.T) {
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
// 模拟请求
c.Request, _ = http.NewRequest("GET", "/api/health", nil)
// 直接调用健康检查响应,不设置路由(避免依赖 Gin 引擎)
c.Writer.WriteHeader(http.StatusOK)
c.JSON(http.StatusOK, gin.H{
"status": "ok",
"message": "服务器运行正常",
})
// 断言响应
assert.Equal(t, http.StatusOK, w.Code)
var response map[string]interface{}
err := json.Unmarshal(w.Body.Bytes(), &response)
assert.NoError(t, err)
assert.Equal(t, "ok", response["status"])
assert.Equal(t, "服务器运行正常", response["message"])
}
func TestLogin(t *testing.T) {
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
// 测试数据
testData := models.LoginDTO{
Username: "admin",
Password: "password123",
}
// 模拟请求
jsonData, _ := json.Marshal(testData)
c.Request, _ = http.NewRequest("POST", "/api/auth/login", bytes.NewBuffer(jsonData))
c.Request.Header.Set("Content-Type", "application/json")
// 调用控制器方法
controller := controllers.NewAuthController()
controller.Login(c)
// 断言响应
assert.Equal(t, http.StatusOK, w.Code)
var response map[string]interface{}
err := json.Unmarshal(w.Body.Bytes(), &response)
assert.NoError(t, err)
assert.Equal(t, "登录成功", response["message"])
assert.Contains(t, response, "accessToken")
assert.Contains(t, response, "user")
}
func TestLoginFailed(t *testing.T) {
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
// 测试数据
testData := models.LoginDTO{
Username: "admin",
Password: "wrongpassword",
}
// 模拟请求
jsonData, _ := json.Marshal(testData)
c.Request, _ = http.NewRequest("POST", "/api/auth/login", bytes.NewBuffer(jsonData))
c.Request.Header.Set("Content-Type", "application/json")
// 调用控制器方法
controller := controllers.NewAuthController()
controller.Login(c)
// 断言响应
assert.Equal(t, http.StatusUnauthorized, w.Code)
var response map[string]interface{}
err := json.Unmarshal(w.Body.Bytes(), &response)
assert.NoError(t, err)
assert.Contains(t, response["message"], "用户名或密码错误")
}