- 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)
251 lines
6.0 KiB
Go
251 lines
6.0 KiB
Go
package service_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/user-management-system/internal/domain"
|
|
"github.com/user-management-system/internal/service"
|
|
)
|
|
|
|
// =============================================================================
|
|
// Auth Login Tests - Phase 1
|
|
// =============================================================================
|
|
|
|
func TestAuthService_Login(t *testing.T) {
|
|
env := setupAuthTestEnv(t)
|
|
if env == nil {
|
|
return
|
|
}
|
|
ctx := context.Background()
|
|
|
|
t.Run("Login success", func(t *testing.T) {
|
|
// Register user first
|
|
req := &service.RegisterRequest{
|
|
Username: "loginuser",
|
|
Password: "Test123!",
|
|
Email: "login@test.com",
|
|
}
|
|
_, err := env.authSvc.Register(ctx, req)
|
|
if err != nil {
|
|
t.Fatalf("Register failed: %v", err)
|
|
}
|
|
|
|
// Login
|
|
resp, err := env.authSvc.Login(ctx, &service.LoginRequest{
|
|
Username: "loginuser",
|
|
Password: "Test123!",
|
|
}, "127.0.0.1")
|
|
if err != nil {
|
|
t.Fatalf("Login failed: %v", err)
|
|
}
|
|
if resp.AccessToken == "" {
|
|
t.Error("Expected access token")
|
|
}
|
|
if resp.User.Username != "loginuser" {
|
|
t.Errorf("Expected username 'loginuser', got %s", resp.User.Username)
|
|
}
|
|
})
|
|
|
|
t.Run("Login with wrong password", func(t *testing.T) {
|
|
_, err := env.authSvc.Login(ctx, &service.LoginRequest{
|
|
Username: "loginuser",
|
|
Password: "wrongpassword",
|
|
}, "127.0.0.1")
|
|
if err == nil {
|
|
t.Error("Expected error for wrong password")
|
|
}
|
|
})
|
|
|
|
t.Run("Login with non-existent user", func(t *testing.T) {
|
|
_, err := env.authSvc.Login(ctx, &service.LoginRequest{
|
|
Username: "nonexistent",
|
|
Password: "Test123!",
|
|
}, "127.0.0.1")
|
|
if err == nil {
|
|
t.Error("Expected error for non-existent user")
|
|
}
|
|
})
|
|
|
|
t.Run("Login with empty username", func(t *testing.T) {
|
|
_, err := env.authSvc.Login(ctx, &service.LoginRequest{
|
|
Username: "",
|
|
Password: "Test123!",
|
|
}, "127.0.0.1")
|
|
if err == nil {
|
|
t.Error("Expected error for empty username")
|
|
}
|
|
})
|
|
|
|
t.Run("Login with empty password", func(t *testing.T) {
|
|
_, err := env.authSvc.Login(ctx, &service.LoginRequest{
|
|
Username: "loginuser",
|
|
Password: "",
|
|
}, "127.0.0.1")
|
|
if err == nil {
|
|
t.Error("Expected error for empty password")
|
|
}
|
|
})
|
|
|
|
t.Run("Login with nil request", func(t *testing.T) {
|
|
_, err := env.authSvc.Login(ctx, nil, "127.0.0.1")
|
|
if err == nil {
|
|
t.Error("Expected error for nil request")
|
|
}
|
|
})
|
|
|
|
t.Run("Login for locked user", func(t *testing.T) {
|
|
// Register and lock user
|
|
req := &service.RegisterRequest{
|
|
Username: "lockeduser",
|
|
Password: "Test123!",
|
|
}
|
|
resp, _ := env.authSvc.Register(ctx, req)
|
|
env.userSvc.UpdateStatus(ctx, resp.ID, domain.UserStatusLocked)
|
|
|
|
// Try to login
|
|
_, err := env.authSvc.Login(ctx, &service.LoginRequest{
|
|
Username: "lockeduser",
|
|
Password: "Test123!",
|
|
}, "127.0.0.1")
|
|
if err == nil {
|
|
t.Error("Expected error for locked user")
|
|
}
|
|
})
|
|
|
|
t.Run("Login for disabled user", func(t *testing.T) {
|
|
req := &service.RegisterRequest{
|
|
Username: "disableduser",
|
|
Password: "Test123!",
|
|
}
|
|
resp, _ := env.authSvc.Register(ctx, req)
|
|
env.userSvc.UpdateStatus(ctx, resp.ID, domain.UserStatusDisabled)
|
|
|
|
_, err := env.authSvc.Login(ctx, &service.LoginRequest{
|
|
Username: "disableduser",
|
|
Password: "Test123!",
|
|
}, "127.0.0.1")
|
|
if err == nil {
|
|
t.Error("Expected error for disabled user")
|
|
}
|
|
})
|
|
|
|
t.Run("Login for inactive user", func(t *testing.T) {
|
|
req := &service.RegisterRequest{
|
|
Username: "inactiveuser",
|
|
Password: "Test123!",
|
|
}
|
|
resp, _ := env.authSvc.Register(ctx, req)
|
|
env.userSvc.UpdateStatus(ctx, resp.ID, domain.UserStatusInactive)
|
|
|
|
_, err := env.authSvc.Login(ctx, &service.LoginRequest{
|
|
Username: "inactiveuser",
|
|
Password: "Test123!",
|
|
}, "127.0.0.1")
|
|
if err == nil {
|
|
t.Error("Expected error for inactive user")
|
|
}
|
|
})
|
|
|
|
t.Run("nil service Login", func(t *testing.T) {
|
|
var nilSvc *service.AuthService
|
|
_, err := nilSvc.Login(ctx, &service.LoginRequest{
|
|
Username: "test",
|
|
Password: "test",
|
|
}, "127.0.0.1")
|
|
if err == nil {
|
|
t.Error("nil service should return error")
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestAuthService_Register(t *testing.T) {
|
|
env := setupAuthTestEnv(t)
|
|
if env == nil {
|
|
return
|
|
}
|
|
ctx := context.Background()
|
|
|
|
t.Run("Register success", func(t *testing.T) {
|
|
req := &service.RegisterRequest{
|
|
Username: "newuser",
|
|
Password: "Test123!",
|
|
Email: "new@test.com",
|
|
Nickname: "New User",
|
|
}
|
|
resp, err := env.authSvc.Register(ctx, req)
|
|
if err != nil {
|
|
t.Fatalf("Register failed: %v", err)
|
|
}
|
|
if resp.Username != "newuser" {
|
|
t.Errorf("Expected username 'newuser', got %s", resp.Username)
|
|
}
|
|
})
|
|
|
|
t.Run("Register with duplicate username", func(t *testing.T) {
|
|
req := &service.RegisterRequest{
|
|
Username: "dupuser",
|
|
Password: "Test123!",
|
|
}
|
|
env.authSvc.Register(ctx, req)
|
|
|
|
// Try again
|
|
_, err := env.authSvc.Register(ctx, req)
|
|
if err == nil {
|
|
t.Error("Expected error for duplicate username")
|
|
}
|
|
})
|
|
|
|
t.Run("Register with empty username", func(t *testing.T) {
|
|
req := &service.RegisterRequest{
|
|
Username: "",
|
|
Password: "Test123!",
|
|
}
|
|
_, err := env.authSvc.Register(ctx, req)
|
|
if err == nil {
|
|
t.Error("Expected error for empty username")
|
|
}
|
|
})
|
|
|
|
t.Run("Register with empty password", func(t *testing.T) {
|
|
req := &service.RegisterRequest{
|
|
Username: "nopass",
|
|
Password: "",
|
|
}
|
|
_, err := env.authSvc.Register(ctx, req)
|
|
if err == nil {
|
|
t.Error("Expected error for empty password")
|
|
}
|
|
})
|
|
|
|
t.Run("Register with weak password", func(t *testing.T) {
|
|
req := &service.RegisterRequest{
|
|
Username: "weakpass",
|
|
Password: "123",
|
|
}
|
|
_, err := env.authSvc.Register(ctx, req)
|
|
if err == nil {
|
|
t.Error("Expected error for weak password")
|
|
}
|
|
})
|
|
|
|
t.Run("Register with nil request", func(t *testing.T) {
|
|
_, err := env.authSvc.Register(ctx, nil)
|
|
if err == nil {
|
|
t.Error("Expected error for nil request")
|
|
}
|
|
})
|
|
|
|
t.Run("nil service Register", func(t *testing.T) {
|
|
var nilSvc *service.AuthService
|
|
req := &service.RegisterRequest{
|
|
Username: "test",
|
|
Password: "Test123!",
|
|
}
|
|
_, err := nilSvc.Register(ctx, req)
|
|
if err == nil {
|
|
t.Error("nil service should return error")
|
|
}
|
|
})
|
|
}
|