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