195 lines
5.1 KiB
JavaScript
195 lines
5.1 KiB
JavaScript
const AuthController = require('../../../src/api/controllers/AuthController');
|
|
const RegisterUserCommand = require('../../../src/application/auth/commands/RegisterUserCommand');
|
|
const LoginUserCommand = require('../../../src/application/auth/commands/LoginUserCommand');
|
|
|
|
describe('AuthController', () => {
|
|
let controller;
|
|
let mockRegisterHandler;
|
|
let mockLoginHandler;
|
|
let mockReq;
|
|
let mockRes;
|
|
|
|
beforeEach(() => {
|
|
// Mock handlers
|
|
mockRegisterHandler = {
|
|
handle: jest.fn()
|
|
};
|
|
mockLoginHandler = {
|
|
handle: jest.fn()
|
|
};
|
|
|
|
controller = new AuthController(mockRegisterHandler, mockLoginHandler);
|
|
|
|
// Mock Express req/res
|
|
mockReq = {
|
|
body: {}
|
|
};
|
|
mockRes = {
|
|
status: jest.fn().mockReturnThis(),
|
|
json: jest.fn()
|
|
};
|
|
|
|
// Reset all mocks
|
|
jest.clearAllMocks();
|
|
});
|
|
|
|
describe('register', () => {
|
|
it('should register user successfully and return 201', async () => {
|
|
// Arrange
|
|
mockReq.body = {
|
|
name: 'John Doe',
|
|
email: 'john@example.com',
|
|
password: 'password123'
|
|
};
|
|
|
|
const mockResult = {
|
|
user: { id: 1, name: 'John Doe', email: 'john@example.com' },
|
|
token: 'mock_jwt_token'
|
|
};
|
|
|
|
mockRegisterHandler.handle.mockResolvedValue(mockResult);
|
|
|
|
// Act
|
|
await controller.register(mockReq, mockRes);
|
|
|
|
// Assert
|
|
expect(mockRegisterHandler.handle).toHaveBeenCalledWith(
|
|
expect.any(RegisterUserCommand)
|
|
);
|
|
expect(mockRes.status).toHaveBeenCalledWith(201);
|
|
expect(mockRes.json).toHaveBeenCalledWith({
|
|
message: 'User registered successfully',
|
|
data: mockResult
|
|
});
|
|
});
|
|
|
|
it('should return 400 for validation errors', async () => {
|
|
// Arrange
|
|
mockReq.body = {
|
|
name: '',
|
|
email: 'john@example.com',
|
|
password: 'password123'
|
|
};
|
|
|
|
mockRegisterHandler.handle.mockRejectedValue(new Error('Name, email and password are required'));
|
|
|
|
// Act
|
|
await controller.register(mockReq, mockRes);
|
|
|
|
// Assert
|
|
expect(mockRes.status).toHaveBeenCalledWith(400);
|
|
expect(mockRes.json).toHaveBeenCalledWith({
|
|
error: 'Name, email and password are required'
|
|
});
|
|
});
|
|
|
|
it('should return 400 if user already exists', async () => {
|
|
// Arrange
|
|
mockReq.body = {
|
|
name: 'John Doe',
|
|
email: 'john@example.com',
|
|
password: 'password123'
|
|
};
|
|
|
|
mockRegisterHandler.handle.mockRejectedValue(new Error('User with this email already exists'));
|
|
|
|
// Act
|
|
await controller.register(mockReq, mockRes);
|
|
|
|
// Assert
|
|
expect(mockRes.status).toHaveBeenCalledWith(400);
|
|
expect(mockRes.json).toHaveBeenCalledWith({
|
|
error: 'User with this email already exists'
|
|
});
|
|
});
|
|
|
|
it('should return 500 for unexpected errors', async () => {
|
|
// Arrange
|
|
mockReq.body = {
|
|
name: 'John Doe',
|
|
email: 'john@example.com',
|
|
password: 'password123'
|
|
};
|
|
|
|
mockRegisterHandler.handle.mockRejectedValue(new Error('Database connection failed'));
|
|
|
|
// Act
|
|
await controller.register(mockReq, mockRes);
|
|
|
|
// Assert
|
|
expect(mockRes.status).toHaveBeenCalledWith(500);
|
|
expect(mockRes.json).toHaveBeenCalledWith({
|
|
error: 'Database connection failed'
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('login', () => {
|
|
it('should login user successfully and return 200', async () => {
|
|
// Arrange
|
|
mockReq.body = {
|
|
email: 'john@example.com',
|
|
password: 'password123'
|
|
};
|
|
|
|
const mockResult = {
|
|
user: { id: 1, name: 'John Doe', email: 'john@example.com' },
|
|
token: 'mock_jwt_token'
|
|
};
|
|
|
|
mockLoginHandler.handle.mockResolvedValue(mockResult);
|
|
|
|
// Act
|
|
await controller.login(mockReq, mockRes);
|
|
|
|
// Assert
|
|
expect(mockLoginHandler.handle).toHaveBeenCalledWith(
|
|
expect.any(LoginUserCommand)
|
|
);
|
|
expect(mockRes.status).toHaveBeenCalledWith(200);
|
|
expect(mockRes.json).toHaveBeenCalledWith({
|
|
message: 'Login successful',
|
|
data: mockResult
|
|
});
|
|
});
|
|
|
|
it('should return 401 for invalid credentials', async () => {
|
|
// Arrange
|
|
mockReq.body = {
|
|
email: 'john@example.com',
|
|
password: 'wrongpassword'
|
|
};
|
|
|
|
mockLoginHandler.handle.mockRejectedValue(new Error('Invalid email or password'));
|
|
|
|
// Act
|
|
await controller.login(mockReq, mockRes);
|
|
|
|
// Assert
|
|
expect(mockRes.status).toHaveBeenCalledWith(401);
|
|
expect(mockRes.json).toHaveBeenCalledWith({
|
|
error: 'Invalid email or password'
|
|
});
|
|
});
|
|
|
|
it('should return 401 for missing credentials', async () => {
|
|
// Arrange
|
|
mockReq.body = {
|
|
email: '',
|
|
password: ''
|
|
};
|
|
|
|
mockLoginHandler.handle.mockRejectedValue(new Error('Email and password are required'));
|
|
|
|
// Act
|
|
await controller.login(mockReq, mockRes);
|
|
|
|
// Assert
|
|
expect(mockRes.status).toHaveBeenCalledWith(401);
|
|
expect(mockRes.json).toHaveBeenCalledWith({
|
|
error: 'Email and password are required'
|
|
});
|
|
});
|
|
});
|
|
});
|