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