Files
user-system/internal/service/permission_service_test.go
long-agent 582ad7a069 test: add comprehensive test coverage and improve code quality
- Add new test files for auth, service, and handler modules
- Improve test organization and coverage
- Refactor code for better maintainability
- Add captcha, settings, stats, and theme handler tests
- Add auth module tests (CAS, OAuth, password, SSO, state)
- Add service layer tests for auth, export, permissions, roles
- All Go tests pass (exit code 0)
- All frontend tests pass (325 tests in 59 files)
2026-04-17 20:43:50 +08:00

335 lines
8.8 KiB
Go

package service_test
import (
"context"
"testing"
"github.com/user-management-system/internal/domain"
"github.com/user-management-system/internal/repository"
"github.com/user-management-system/internal/service"
gormsqlite "gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
// =============================================================================
// Permission Service Tests
// =============================================================================
func setupPermissionTestEnv(t *testing.T) (*service.PermissionService, *gorm.DB) {
t.Helper()
db, err := gorm.Open(gormsqlite.New(gormsqlite.Config{
DriverName: "sqlite",
DSN: "file:perm_test?mode=memory&cache=shared",
}), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
})
if err != nil {
t.Fatalf("failed to connect database: %v", err)
}
if err := db.AutoMigrate(&domain.Permission{}); err != nil {
t.Fatalf("failed to migrate: %v", err)
}
permissionRepo := repository.NewPermissionRepository(db)
permSvc := service.NewPermissionService(permissionRepo)
return permSvc, db
}
func TestPermissionService_CreatePermission(t *testing.T) {
svc, _ := setupPermissionTestEnv(t)
ctx := context.Background()
t.Run("Create permission success", func(t *testing.T) {
req := &service.CreatePermissionRequest{
Name: "测试权限",
Code: "test_perm",
Type: int(domain.PermissionTypeMenu),
Description: "测试权限描述",
}
perm, err := svc.CreatePermission(ctx, req)
if err != nil {
t.Fatalf("CreatePermission failed: %v", err)
}
if perm.Code != "test_perm" {
t.Errorf("Expected code 'test_perm', got %s", perm.Code)
}
if perm.Level != 1 {
t.Errorf("Expected level 1, got %d", perm.Level)
}
})
t.Run("Create permission with duplicate code", func(t *testing.T) {
req := &service.CreatePermissionRequest{
Name: "重复权限",
Code: "test_perm", // duplicate
Type: int(domain.PermissionTypeMenu),
}
_, err := svc.CreatePermission(ctx, req)
if err == nil {
t.Error("Expected error for duplicate code")
}
})
t.Run("Create permission with parent", func(t *testing.T) {
// Create parent first
parentReq := &service.CreatePermissionRequest{
Name: "父权限",
Code: "parent_perm",
Type: int(domain.PermissionTypeMenu),
}
parent, _ := svc.CreatePermission(ctx, parentReq)
// Create child
childReq := &service.CreatePermissionRequest{
Name: "子权限",
Code: "child_perm",
Type: int(domain.PermissionTypeButton),
ParentID: &parent.ID,
}
child, err := svc.CreatePermission(ctx, childReq)
if err != nil {
t.Fatalf("CreatePermission with parent failed: %v", err)
}
if child.Level != 2 {
t.Errorf("Expected level 2, got %d", child.Level)
}
})
t.Run("Create permission with non-existent parent", func(t *testing.T) {
nonExistentID := int64(9999)
req := &service.CreatePermissionRequest{
Name: "孤儿权限",
Code: "orphan_perm",
Type: int(domain.PermissionTypeMenu),
ParentID: &nonExistentID,
}
_, err := svc.CreatePermission(ctx, req)
if err == nil {
t.Error("Expected error for non-existent parent")
}
})
}
func TestPermissionService_UpdatePermission(t *testing.T) {
svc, _ := setupPermissionTestEnv(t)
ctx := context.Background()
// Create test permission
req := &service.CreatePermissionRequest{
Name: "更新测试",
Code: "update_perm",
Type: int(domain.PermissionTypeMenu),
}
perm, _ := svc.CreatePermission(ctx, req)
t.Run("Update permission name", func(t *testing.T) {
updateReq := &service.UpdatePermissionRequest{
Name: "更新后名称",
}
updated, err := svc.UpdatePermission(ctx, perm.ID, updateReq)
if err != nil {
t.Fatalf("UpdatePermission failed: %v", err)
}
if updated.Name != "更新后名称" {
t.Errorf("Expected name '更新后名称', got %s", updated.Name)
}
})
t.Run("Update permission path and method", func(t *testing.T) {
updateReq := &service.UpdatePermissionRequest{
Path: "/api/test",
Method: "GET",
}
updated, err := svc.UpdatePermission(ctx, perm.ID, updateReq)
if err != nil {
t.Fatalf("UpdatePermission failed: %v", err)
}
if updated.Path != "/api/test" {
t.Errorf("Expected path '/api/test', got %s", updated.Path)
}
})
t.Run("Update non-existent permission", func(t *testing.T) {
updateReq := &service.UpdatePermissionRequest{
Name: "不存在",
}
_, err := svc.UpdatePermission(ctx, 9999, updateReq)
if err == nil {
t.Error("Expected error for non-existent permission")
}
})
t.Run("Update permission with self as parent", func(t *testing.T) {
updateReq := &service.UpdatePermissionRequest{
ParentID: &perm.ID,
}
_, err := svc.UpdatePermission(ctx, perm.ID, updateReq)
if err == nil {
t.Error("Expected error for self-parent")
}
})
}
func TestPermissionService_DeletePermission(t *testing.T) {
svc, _ := setupPermissionTestEnv(t)
ctx := context.Background()
t.Run("Delete permission success", func(t *testing.T) {
req := &service.CreatePermissionRequest{
Name: "待删除权限",
Code: "delete_perm",
Type: int(domain.PermissionTypeMenu),
}
perm, _ := svc.CreatePermission(ctx, req)
err := svc.DeletePermission(ctx, perm.ID)
if err != nil {
t.Fatalf("DeletePermission failed: %v", err)
}
})
t.Run("Delete non-existent permission", func(t *testing.T) {
err := svc.DeletePermission(ctx, 9999)
if err == nil {
t.Error("Expected error for non-existent permission")
}
})
}
func TestPermissionService_GetPermission(t *testing.T) {
svc, _ := setupPermissionTestEnv(t)
ctx := context.Background()
req := &service.CreatePermissionRequest{
Name: "获取测试",
Code: "get_perm",
Type: int(domain.PermissionTypeMenu),
}
created, _ := svc.CreatePermission(ctx, req)
t.Run("Get permission success", func(t *testing.T) {
perm, err := svc.GetPermission(ctx, created.ID)
if err != nil {
t.Fatalf("GetPermission failed: %v", err)
}
if perm.Code != "get_perm" {
t.Errorf("Expected code 'get_perm', got %s", perm.Code)
}
})
t.Run("Get non-existent permission", func(t *testing.T) {
_, err := svc.GetPermission(ctx, 9999)
if err == nil {
t.Error("Expected error for non-existent permission")
}
})
}
func TestPermissionService_ListPermissions(t *testing.T) {
svc, _ := setupPermissionTestEnv(t)
ctx := context.Background()
// Create test permissions
for i := 0; i < 5; i++ {
req := &service.CreatePermissionRequest{
Name: "列表权限",
Code: string(rune('a' + i)),
Type: int(domain.PermissionTypeMenu),
}
svc.CreatePermission(ctx, req)
}
t.Run("List permissions with pagination", func(t *testing.T) {
req := &service.ListPermissionRequest{
Page: 1,
PageSize: 3,
}
perms, total, err := svc.ListPermissions(ctx, req)
if err != nil {
t.Fatalf("ListPermissions failed: %v", err)
}
if len(perms) > 3 {
t.Errorf("Expected max 3 permissions, got %d", len(perms))
}
if total < 5 {
t.Errorf("Expected total >= 5, got %d", total)
}
})
t.Run("List permissions with default pagination", func(t *testing.T) {
req := &service.ListPermissionRequest{}
_, _, err := svc.ListPermissions(ctx, req)
if err != nil {
t.Fatalf("ListPermissions failed: %v", err)
}
})
t.Run("List permissions with keyword", func(t *testing.T) {
req := &service.ListPermissionRequest{
Keyword: "列表",
}
perms, _, err := svc.ListPermissions(ctx, req)
if err != nil {
t.Fatalf("ListPermissions failed: %v", err)
}
if len(perms) == 0 {
t.Error("Expected permissions with keyword")
}
})
}
func TestPermissionService_GetPermissionTree(t *testing.T) {
svc, _ := setupPermissionTestEnv(t)
ctx := context.Background()
// Create parent permission
parentReq := &service.CreatePermissionRequest{
Name: "父权限",
Code: "tree_parent",
Type: int(domain.PermissionTypeMenu),
}
parent, _ := svc.CreatePermission(ctx, parentReq)
// Create child permission
childReq := &service.CreatePermissionRequest{
Name: "子权限",
Code: "tree_child",
Type: int(domain.PermissionTypeButton),
ParentID: &parent.ID,
}
svc.CreatePermission(ctx, childReq)
t.Run("Get permission tree", func(t *testing.T) {
tree, err := svc.GetPermissionTree(ctx)
if err != nil {
t.Fatalf("GetPermissionTree failed: %v", err)
}
if len(tree) == 0 {
t.Error("Expected permission tree")
}
})
}
func TestPermissionService_UpdatePermissionStatus(t *testing.T) {
svc, _ := setupPermissionTestEnv(t)
ctx := context.Background()
req := &service.CreatePermissionRequest{
Name: "状态测试",
Code: "status_perm",
Type: int(domain.PermissionTypeMenu),
}
perm, _ := svc.CreatePermission(ctx, req)
t.Run("Update status success", func(t *testing.T) {
err := svc.UpdatePermissionStatus(ctx, perm.ID, domain.PermissionStatusDisabled)
if err != nil {
t.Fatalf("UpdatePermissionStatus failed: %v", err)
}
})
}