- 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)
197 lines
4.7 KiB
Go
197 lines
4.7 KiB
Go
package service_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/user-management-system/internal/domain"
|
|
"github.com/user-management-system/internal/service"
|
|
)
|
|
|
|
// =============================================================================
|
|
// UserService Roles Tests
|
|
// =============================================================================
|
|
|
|
func TestUserService_GetUserRoles(t *testing.T) {
|
|
env := setupAuthTestEnv(t)
|
|
if env == nil {
|
|
return
|
|
}
|
|
ctx := context.Background()
|
|
|
|
// Create test user
|
|
user := &domain.User{
|
|
Username: "userroles",
|
|
Password: "$2a$10$hash",
|
|
Status: domain.UserStatusActive,
|
|
}
|
|
env.userSvc.Create(ctx, user)
|
|
|
|
t.Run("Get user roles for existing user", func(t *testing.T) {
|
|
roles, err := env.userSvc.GetUserRoles(ctx, user.ID)
|
|
if err != nil {
|
|
t.Fatalf("GetUserRoles failed: %v", err)
|
|
}
|
|
// User may have no roles initially
|
|
_ = roles
|
|
})
|
|
|
|
t.Run("Get user roles for non-existent user", func(t *testing.T) {
|
|
_, err := env.userSvc.GetUserRoles(ctx, 99999)
|
|
if err == nil {
|
|
t.Error("Expected error for non-existent user")
|
|
}
|
|
})
|
|
|
|
t.Run("Get user roles with zero ID", func(t *testing.T) {
|
|
_, err := env.userSvc.GetUserRoles(ctx, 0)
|
|
if err == nil {
|
|
t.Error("Expected error for zero user ID")
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestUserService_AssignRoles(t *testing.T) {
|
|
env := setupAuthTestEnv(t)
|
|
if env == nil {
|
|
return
|
|
}
|
|
ctx := context.Background()
|
|
|
|
// Create test user
|
|
user := &domain.User{
|
|
Username: "assignroles",
|
|
Password: "$2a$10$hash",
|
|
Status: domain.UserStatusActive,
|
|
}
|
|
env.userSvc.Create(ctx, user)
|
|
|
|
t.Run("Assign roles to user", func(t *testing.T) {
|
|
err := env.userSvc.AssignRoles(ctx, user.ID, []int64{1, 2})
|
|
// May fail if roles don't exist, but should not panic
|
|
_ = err
|
|
t.Logf("AssignRoles returned: %v", err)
|
|
})
|
|
|
|
t.Run("Assign empty roles", func(t *testing.T) {
|
|
err := env.userSvc.AssignRoles(ctx, user.ID, []int64{})
|
|
_ = err
|
|
t.Logf("Assign empty roles returned: %v", err)
|
|
})
|
|
|
|
t.Run("Assign roles to non-existent user", func(t *testing.T) {
|
|
err := env.userSvc.AssignRoles(ctx, 99999, []int64{1})
|
|
if err == nil {
|
|
t.Error("Expected error for non-existent user")
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestUserService_ListAdmins(t *testing.T) {
|
|
env := setupAuthTestEnv(t)
|
|
if env == nil {
|
|
return
|
|
}
|
|
ctx := context.Background()
|
|
|
|
t.Run("List admins", func(t *testing.T) {
|
|
admins, err := env.userSvc.ListAdmins(ctx)
|
|
if err != nil {
|
|
t.Fatalf("ListAdmins failed: %v", err)
|
|
}
|
|
// May return empty list
|
|
_ = admins
|
|
})
|
|
}
|
|
|
|
func TestUserService_BatchDelete(t *testing.T) {
|
|
env := setupAuthTestEnv(t)
|
|
if env == nil {
|
|
return
|
|
}
|
|
ctx := context.Background()
|
|
|
|
// Create test users
|
|
user1 := &domain.User{
|
|
Username: "batchdel1",
|
|
Password: "$2a$10$hash",
|
|
Status: domain.UserStatusActive,
|
|
}
|
|
user2 := &domain.User{
|
|
Username: "batchdel2",
|
|
Password: "$2a$10$hash",
|
|
Status: domain.UserStatusActive,
|
|
}
|
|
env.userSvc.Create(ctx, user1)
|
|
env.userSvc.Create(ctx, user2)
|
|
|
|
t.Run("Batch delete users", func(t *testing.T) {
|
|
_, err := env.userSvc.BatchDelete(ctx, &service.BatchDeleteRequest{IDs: []int64{user1.ID, user2.ID}})
|
|
if err != nil {
|
|
t.Fatalf("BatchDelete failed: %v", err)
|
|
}
|
|
|
|
// Verify deletion
|
|
_, err1 := env.userSvc.GetByID(ctx, user1.ID)
|
|
_, err2 := env.userSvc.GetByID(ctx, user2.ID)
|
|
if err1 == nil || err2 == nil {
|
|
t.Error("Expected users to be deleted")
|
|
}
|
|
})
|
|
|
|
t.Run("Batch delete empty list", func(t *testing.T) {
|
|
_, err := env.userSvc.BatchDelete(ctx, &service.BatchDeleteRequest{IDs: []int64{}})
|
|
_ = err
|
|
t.Logf("BatchDelete empty list returned: %v", err)
|
|
})
|
|
}
|
|
|
|
func TestUserService_ListCursor(t *testing.T) {
|
|
env := setupAuthTestEnv(t)
|
|
if env == nil {
|
|
return
|
|
}
|
|
ctx := context.Background()
|
|
|
|
// Create test users
|
|
for i := 0; i < 5; i++ {
|
|
user := &domain.User{
|
|
Username: "cursoruser_" + string(rune('a'+i)),
|
|
Password: "$2a$10$hash",
|
|
Status: domain.UserStatusActive,
|
|
}
|
|
env.userSvc.Create(ctx, user)
|
|
}
|
|
|
|
t.Run("List users with cursor", func(t *testing.T) {
|
|
req := &service.ListCursorRequest{
|
|
Cursor: "",
|
|
Size: 10,
|
|
SortBy: "id",
|
|
SortOrder: "asc",
|
|
}
|
|
resp, err := env.userSvc.ListCursor(ctx, req)
|
|
if err != nil {
|
|
t.Fatalf("ListCursor failed: %v", err)
|
|
}
|
|
// Check that we got a valid response
|
|
if resp == nil {
|
|
t.Error("Expected response to not be nil")
|
|
}
|
|
// Items may be empty if no users match
|
|
t.Logf("ListCursor returned %d items", len(resp.Items))
|
|
})
|
|
|
|
t.Run("List users with cursor invalid size", func(t *testing.T) {
|
|
req := &service.ListCursorRequest{
|
|
Cursor: "",
|
|
Size: 0,
|
|
SortBy: "id",
|
|
SortOrder: "asc",
|
|
}
|
|
_, err := env.userSvc.ListCursor(ctx, req)
|
|
_ = err
|
|
t.Logf("ListCursor with zero size returned: %v", err)
|
|
})
|
|
}
|