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.
211 lines
5.1 KiB
211 lines
5.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"
|
|
)
|
|
|
|
// setupRoleTestDB 创建角色测试数据库(使用MySQL)
|
|
func setupRoleTestDB(t *testing.T) *gorm.DB {
|
|
t.Helper()
|
|
|
|
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(&Role{})
|
|
require.NoError(t, err)
|
|
|
|
// 清理所有数据确保测试隔离(运行后需重启后端以恢复种子数据)
|
|
db.Exec("SET FOREIGN_KEY_CHECKS = 0")
|
|
db.Exec("TRUNCATE TABLE role")
|
|
db.Exec("SET FOREIGN_KEY_CHECKS = 1")
|
|
|
|
return db
|
|
}
|
|
|
|
// createTestRole 创建测试角色
|
|
func createTestRole(t *testing.T, db *gorm.DB) *Role {
|
|
t.Helper()
|
|
|
|
now := time.Now()
|
|
role := &Role{
|
|
Name: "测试角色",
|
|
Code: "test_role",
|
|
Description: "测试用",
|
|
IsSystem: false,
|
|
SortOrder: 10,
|
|
Status: 1,
|
|
CreatedAt: now,
|
|
UpdatedAt: now,
|
|
}
|
|
|
|
err := db.Create(role).Error
|
|
require.NoError(t, err)
|
|
|
|
return role
|
|
}
|
|
|
|
// TestRoleInsert 测试插入角色
|
|
func TestRoleInsert(t *testing.T) {
|
|
db := setupRoleTestDB(t)
|
|
|
|
ctx := context.Background()
|
|
role := &Role{
|
|
Name: "新角色",
|
|
Code: "new_role",
|
|
Description: "新建的角色",
|
|
IsSystem: false,
|
|
SortOrder: 5,
|
|
Status: 1,
|
|
}
|
|
|
|
id, err := RoleInsert(ctx, db, role)
|
|
|
|
require.NoError(t, err)
|
|
assert.Greater(t, id, int64(0))
|
|
assert.Equal(t, id, role.Id)
|
|
|
|
// 验证数据已保存
|
|
saved, err := RoleFindOne(ctx, db, id)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "新角色", saved.Name)
|
|
assert.Equal(t, "new_role", saved.Code)
|
|
assert.Equal(t, "新建的角色", saved.Description)
|
|
}
|
|
|
|
// TestRoleFindOne 测试根据ID查询角色
|
|
func TestRoleFindOne(t *testing.T) {
|
|
db := setupRoleTestDB(t)
|
|
|
|
role := createTestRole(t, db)
|
|
ctx := context.Background()
|
|
|
|
found, err := RoleFindOne(ctx, db, role.Id)
|
|
|
|
require.NoError(t, err)
|
|
require.NotNil(t, found)
|
|
assert.Equal(t, role.Id, found.Id)
|
|
assert.Equal(t, "测试角色", found.Name)
|
|
assert.Equal(t, "test_role", found.Code)
|
|
}
|
|
|
|
// TestRoleFindOne_NotFound 测试查询不存在的角色
|
|
func TestRoleFindOne_NotFound(t *testing.T) {
|
|
db := setupRoleTestDB(t)
|
|
|
|
ctx := context.Background()
|
|
|
|
found, err := RoleFindOne(ctx, db, 99999)
|
|
|
|
require.Error(t, err)
|
|
require.Nil(t, found)
|
|
assert.Equal(t, ErrNotFound, err)
|
|
}
|
|
|
|
// TestRoleFindOneByCode 测试根据编码查询角色
|
|
func TestRoleFindOneByCode(t *testing.T) {
|
|
db := setupRoleTestDB(t)
|
|
|
|
role := createTestRole(t, db)
|
|
ctx := context.Background()
|
|
|
|
found, err := RoleFindOneByCode(ctx, db, "test_role")
|
|
|
|
require.NoError(t, err)
|
|
require.NotNil(t, found)
|
|
assert.Equal(t, role.Id, found.Id)
|
|
assert.Equal(t, "测试角色", found.Name)
|
|
assert.Equal(t, "test_role", found.Code)
|
|
}
|
|
|
|
// TestRoleFindOneByCode_NotFound 测试查询不存在的角色编码
|
|
func TestRoleFindOneByCode_NotFound(t *testing.T) {
|
|
db := setupRoleTestDB(t)
|
|
|
|
ctx := context.Background()
|
|
|
|
found, err := RoleFindOneByCode(ctx, db, "nonexistent_code")
|
|
|
|
require.Error(t, err)
|
|
require.Nil(t, found)
|
|
assert.Equal(t, ErrNotFound, err)
|
|
}
|
|
|
|
// TestRoleFindAll 测试查询所有启用的角色
|
|
func TestRoleFindAll(t *testing.T) {
|
|
db := setupRoleTestDB(t)
|
|
ctx := context.Background()
|
|
|
|
// 创建3个角色:2个启用,1个禁用
|
|
now := time.Now()
|
|
roles := []Role{
|
|
{Name: "角色A", Code: "role_a", SortOrder: 2, Status: 1, CreatedAt: now, UpdatedAt: now},
|
|
{Name: "角色B", Code: "role_b", SortOrder: 1, Status: 1, CreatedAt: now, UpdatedAt: now},
|
|
{Name: "角色C", Code: "role_c", SortOrder: 3, Status: 1, CreatedAt: now, UpdatedAt: now},
|
|
}
|
|
|
|
for i := range roles {
|
|
err := db.Create(&roles[i]).Error
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
// 将角色C设为禁用(status=0是零值,GORM Create时会使用default:1,需要单独更新)
|
|
db.Model(&roles[2]).Update("status", 0)
|
|
|
|
// 查询所有启用的角色
|
|
result, err := RoleFindAll(ctx, db)
|
|
|
|
require.NoError(t, err)
|
|
assert.Len(t, result, 2)
|
|
|
|
// 验证按 sort_order 排序
|
|
assert.Equal(t, "角色B", result[0].Name) // sort_order=1
|
|
assert.Equal(t, "角色A", result[1].Name) // sort_order=2
|
|
}
|
|
|
|
// TestRoleUpdate 测试更新角色
|
|
func TestRoleUpdate(t *testing.T) {
|
|
db := setupRoleTestDB(t)
|
|
|
|
role := createTestRole(t, db)
|
|
ctx := context.Background()
|
|
|
|
// 修改角色数据
|
|
role.Name = "更新后的角色"
|
|
role.Description = "更新后的描述"
|
|
|
|
err := RoleUpdate(ctx, db, role)
|
|
|
|
require.NoError(t, err)
|
|
|
|
// 验证更新结果
|
|
updated, err := RoleFindOne(ctx, db, role.Id)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "更新后的角色", updated.Name)
|
|
assert.Equal(t, "更新后的描述", updated.Description)
|
|
}
|
|
|
|
// TestRoleDelete 测试删除角色
|
|
func TestRoleDelete(t *testing.T) {
|
|
db := setupRoleTestDB(t)
|
|
|
|
role := createTestRole(t, db)
|
|
roleId := role.Id
|
|
ctx := context.Background()
|
|
|
|
err := RoleDelete(ctx, db, roleId)
|
|
|
|
require.NoError(t, err)
|
|
|
|
// 验证角色已被删除
|
|
_, err = RoleFindOne(ctx, db, roleId)
|
|
require.Error(t, err)
|
|
assert.Equal(t, ErrNotFound, err)
|
|
}
|
|
|