- 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)
335 lines
8.8 KiB
Go
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)
|
|
}
|
|
})
|
|
}
|