You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

368 lines
9.1 KiB

package model
import (
"context"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// setupUserModelTestDB 创建测试数据库(使用MySQL)
func setupUserModelTestDB(t *testing.T) *gorm.DB {
t.Helper()
// 使用 MySQL 进行测试
dsn := "root:dev123456@tcp(219.159.132.177:17173)/base?charset=utf8mb4&parseTime=true&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
require.NoError(t, err)
err = db.AutoMigrate(&User{}, &Profile{})
require.NoError(t, err)
// 清理所有测试数据(TRUNCATE)
db.Exec("SET FOREIGN_KEY_CHECKS = 0")
db.Exec("TRUNCATE TABLE profile")
db.Exec("TRUNCATE TABLE user")
db.Exec("SET FOREIGN_KEY_CHECKS = 1")
return db
}
// createTestUser 创建测试用户
func createTestUserModel(t *testing.T, db *gorm.DB) *User {
t.Helper()
now := time.Now()
user := &User{
Username: "testuser",
Email: "test@example.com",
Password: "encryptedpassword",
Phone: "13800138000",
Status: 1,
CreatedAt: now,
UpdatedAt: now,
}
err := db.Create(user).Error
require.NoError(t, err)
return user
}
// TestInsertUser 测试插入用户
func TestInsertUser(t *testing.T) {
db := setupUserModelTestDB(t)
ctx := context.Background()
user := &User{
Username: "newuser",
Email: "new@example.com",
Password: "encryptedpassword",
Phone: "13900139000",
Status: 1,
}
id, err := Insert(ctx, db, user)
require.NoError(t, err)
assert.Greater(t, id, int64(0))
assert.Equal(t, id, user.Id)
// 验证数据已保存
saved, err := FindOne(ctx, db, id)
require.NoError(t, err)
assert.Equal(t, "newuser", saved.Username)
assert.Equal(t, "new@example.com", saved.Email)
}
// TestFindOneUser 测试根据ID查询用户
func TestFindOneUser(t *testing.T) {
db := setupUserModelTestDB(t)
// 创建测试用户
user := createTestUserModel(t, db)
ctx := context.Background()
// 查询用户
found, err := FindOne(ctx, db, user.Id)
require.NoError(t, err)
require.NotNil(t, found)
assert.Equal(t, user.Id, found.Id)
assert.Equal(t, "testuser", found.Username)
assert.Equal(t, "test@example.com", found.Email)
}
// TestFindOneUser_NotFound 测试查询不存在的用户
func TestFindOneUser_NotFound(t *testing.T) {
db := setupUserModelTestDB(t)
ctx := context.Background()
found, err := FindOne(ctx, db, 99999)
require.Error(t, err)
require.Nil(t, found)
assert.Equal(t, ErrNotFound, err)
}
// TestFindOneByEmail 测试根据邮箱查询用户
func TestFindOneByEmail(t *testing.T) {
db := setupUserModelTestDB(t)
// 创建测试用户
user := createTestUserModel(t, db)
ctx := context.Background()
// 根据邮箱查询
found, err := FindOneByEmail(ctx, db, "test@example.com")
require.NoError(t, err)
require.NotNil(t, found)
assert.Equal(t, user.Id, found.Id)
assert.Equal(t, "testuser", found.Username)
}
// TestFindOneByEmail_NotFound 测试查询不存在的邮箱
func TestFindOneByEmail_NotFound(t *testing.T) {
db := setupUserModelTestDB(t)
ctx := context.Background()
found, err := FindOneByEmail(ctx, db, "nonexistent@example.com")
require.Error(t, err)
require.Nil(t, found)
assert.Equal(t, ErrNotFound, err)
}
// TestUpdateUser 测试更新用户
func TestUpdateUser(t *testing.T) {
db := setupUserModelTestDB(t)
// 创建测试用户
user := createTestUserModel(t, db)
ctx := context.Background()
// 修改用户数据
user.Username = "updateduser"
user.Phone = "13900139000"
// 更新
err := Update(ctx, db, user)
require.NoError(t, err)
// 验证更新结果
updated, err := FindOne(ctx, db, user.Id)
require.NoError(t, err)
assert.Equal(t, "updateduser", updated.Username)
assert.Equal(t, "13900139000", updated.Phone)
}
// TestDeleteUser 测试删除用户
func TestDeleteUser(t *testing.T) {
db := setupUserModelTestDB(t)
// 创建测试用户
user := createTestUserModel(t, db)
userId := user.Id
ctx := context.Background()
// 删除用户
err := Delete(ctx, db, userId)
require.NoError(t, err)
// 验证用户已被删除
_, err = FindOne(ctx, db, userId)
require.Error(t, err)
assert.Equal(t, ErrNotFound, err)
}
// TestFindList 测试查询用户列表
func TestFindList(t *testing.T) {
db := setupUserModelTestDB(t)
ctx := context.Background()
// 创建多个测试用户
now := time.Now()
users := []User{
{Username: "user1", Email: "user1@example.com", Password: "pass", Phone: "13800000001", Status: 1, CreatedAt: now, UpdatedAt: now},
{Username: "user2", Email: "user2@example.com", Password: "pass", Phone: "13800000002", Status: 1, CreatedAt: now, UpdatedAt: now},
{Username: "user3", Email: "user3@example.com", Password: "pass", Phone: "13800000003", Status: 2, CreatedAt: now, UpdatedAt: now},
{Username: "user4", Email: "user4@example.com", Password: "pass", Phone: "13800000004", Status: 2, CreatedAt: now, UpdatedAt: now},
{Username: "user5", Email: "user5@example.com", Password: "pass", Phone: "13800000005", Status: 1, CreatedAt: now, UpdatedAt: now},
}
for _, u := range users {
err := db.Create(&u).Error
require.NoError(t, err)
}
// 测试分页查询
list, total, err := FindList(ctx, db, 1, 2, "", 0)
require.NoError(t, err)
assert.Equal(t, int64(5), total)
assert.Len(t, list, 2)
// 测试状态筛选
list, total, err = FindList(ctx, db, 1, 10, "", 1)
require.NoError(t, err)
assert.Equal(t, int64(3), total)
// 测试关键词搜索
list, total, err = FindList(ctx, db, 1, 10, "user1", 0)
require.NoError(t, err)
assert.Equal(t, int64(1), total)
assert.Equal(t, "user1", list[0].Username)
// 测试第二页
list, total, err = FindList(ctx, db, 2, 2, "", 0)
require.NoError(t, err)
assert.Equal(t, int64(5), total)
assert.Len(t, list, 2)
assert.Equal(t, "user3", list[0].Username)
}
// TestFindList_EmptyResult 测试查询空列表
func TestFindList_EmptyResult(t *testing.T) {
db := setupUserModelTestDB(t)
ctx := context.Background()
list, total, err := FindList(ctx, db, 1, 10, "", 0)
require.NoError(t, err)
assert.Equal(t, int64(0), total)
assert.Empty(t, list)
}
// TestFindList_WithPhoneSearch 测试通过手机号搜索
func TestFindList_WithPhoneSearch(t *testing.T) {
db := setupUserModelTestDB(t)
ctx := context.Background()
// 创建测试用户
now := time.Now()
user1 := &User{Username: "user1", Email: "user1@example.com", Password: "pass", Phone: "13812345678", Status: 1, CreatedAt: now, UpdatedAt: now}
user2 := &User{Username: "user2", Email: "user2@example.com", Password: "pass", Phone: "13887654321", Status: 1, CreatedAt: now, UpdatedAt: now}
err := db.Create(user1).Error
require.NoError(t, err)
err = db.Create(user2).Error
require.NoError(t, err)
// 搜索手机号
list, total, err := FindList(ctx, db, 1, 10, "138123", 0)
require.NoError(t, err)
assert.Equal(t, int64(1), total)
assert.Equal(t, "user1", list[0].Username)
}
// TestFindList_WithEmailSearch 测试通过邮箱搜索
func TestFindList_WithEmailSearch(t *testing.T) {
db := setupUserModelTestDB(t)
ctx := context.Background()
// 创建测试用户
now := time.Now()
user1 := &User{Username: "user1", Email: "test@company.com", Password: "pass", Phone: "13800000001", Status: 1, CreatedAt: now, UpdatedAt: now}
user2 := &User{Username: "user2", Email: "other@company.com", Password: "pass", Phone: "13800000002", Status: 1, CreatedAt: now, UpdatedAt: now}
err := db.Create(user1).Error
require.NoError(t, err)
err = db.Create(user2).Error
require.NoError(t, err)
// 搜索邮箱
_, total, err := FindList(ctx, db, 1, 10, "@company.com", 0)
require.NoError(t, err)
assert.Equal(t, int64(2), total)
}
// BenchmarkInsertUser 性能测试
func BenchmarkInsertUser(b *testing.B) {
db := setupUserModelTestDB(&testing.T{})
ctx := context.Background()
b.ResetTimer()
for i := 0; i < b.N; i++ {
user := &User{
Username: "testuser",
Email: "test@example.com",
Password: "encryptedpassword",
Phone: "13800138000",
Status: 1,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
_, _ = Insert(ctx, db, user)
}
}
// BenchmarkFindOneUser 性能测试
func BenchmarkFindOneUser(b *testing.B) {
db := setupUserModelTestDB(&testing.T{})
ctx := context.Background()
// 创建测试用户
now := time.Now()
user := &User{
Username: "testuser",
Email: "test@example.com",
Password: "encryptedpassword",
Phone: "13800138000",
Status: 1,
CreatedAt: now,
UpdatedAt: now,
}
err := db.Create(user).Error
if err != nil {
b.Fatal(err)
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, _ = FindOne(ctx, db, user.Id)
}
}
// BenchmarkFindList 性能测试
func BenchmarkFindList(b *testing.B) {
db := setupUserModelTestDB(&testing.T{})
ctx := context.Background()
// 创建100个测试用户
now := time.Now()
for i := 0; i < 100; i++ {
user := &User{
Username: "testuser",
Email: "test@example.com",
Password: "encryptedpassword",
Phone: "13800138000",
Status: 1,
CreatedAt: now,
UpdatedAt: now,
}
err := db.Create(user).Error
if err != nil {
b.Fatal(err)
}
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, _, _ = FindList(ctx, db, 1, 10, "", 0)
}
}