168 lines
4.6 KiB
TypeScript
168 lines
4.6 KiB
TypeScript
import { registerUser } from '@/services/auth.service';
|
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
import { POST } from '../route';
|
|
|
|
// Mock the auth service
|
|
vi.mock('@/services/auth.service', () => ({
|
|
registerUser: vi.fn(),
|
|
}));
|
|
|
|
describe('POST /api/auth/register', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
it('should register a new user successfully', async () => {
|
|
const mockUser = {
|
|
id: 'user-123',
|
|
email: 'test@example.com',
|
|
fullName: 'Test User',
|
|
role: 'user',
|
|
emailVerified: false,
|
|
};
|
|
|
|
vi.mocked(registerUser).mockResolvedValue({
|
|
success: true,
|
|
user: mockUser,
|
|
});
|
|
|
|
const request = new Request('http://localhost:3000/api/auth/register', {
|
|
method: 'POST',
|
|
body: JSON.stringify({
|
|
email: 'test@example.com',
|
|
password: 'TestPassword123!',
|
|
fullName: 'Test User',
|
|
}),
|
|
});
|
|
|
|
const response = await POST(request as any);
|
|
const data = await response.json();
|
|
|
|
expect(response.status).toBe(201);
|
|
expect(data.success).toBe(true);
|
|
expect(data.user).toEqual(mockUser);
|
|
expect(data.message).toContain('Registration successful');
|
|
expect(registerUser).toHaveBeenCalledWith({
|
|
email: 'test@example.com',
|
|
password: 'TestPassword123!',
|
|
fullName: 'Test User',
|
|
});
|
|
});
|
|
|
|
it('should return validation error for invalid email', async () => {
|
|
const request = new Request('http://localhost:3000/api/auth/register', {
|
|
method: 'POST',
|
|
body: JSON.stringify({
|
|
email: 'invalid-email',
|
|
password: 'TestPassword123!',
|
|
}),
|
|
});
|
|
|
|
const response = await POST(request as any);
|
|
const data = await response.json();
|
|
|
|
expect(response.status).toBe(400);
|
|
expect(data.error).toBe('Validation failed');
|
|
expect(data.details).toBeDefined();
|
|
expect(registerUser).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('should return validation error for short password', async () => {
|
|
const request = new Request('http://localhost:3000/api/auth/register', {
|
|
method: 'POST',
|
|
body: JSON.stringify({
|
|
email: 'test@example.com',
|
|
password: 'short',
|
|
}),
|
|
});
|
|
|
|
const response = await POST(request as any);
|
|
const data = await response.json();
|
|
|
|
expect(response.status).toBe(400);
|
|
expect(data.error).toBe('Validation failed');
|
|
expect(data.details).toBeDefined();
|
|
expect(registerUser).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('should return error when registration fails', async () => {
|
|
vi.mocked(registerUser).mockResolvedValue({
|
|
success: false,
|
|
error: 'Email already registered',
|
|
});
|
|
|
|
const request = new Request('http://localhost:3000/api/auth/register', {
|
|
method: 'POST',
|
|
body: JSON.stringify({
|
|
email: 'test@example.com',
|
|
password: 'TestPassword123!',
|
|
}),
|
|
});
|
|
|
|
const response = await POST(request as any);
|
|
const data = await response.json();
|
|
|
|
expect(response.status).toBe(400);
|
|
expect(data.error).toBe('Email already registered');
|
|
});
|
|
|
|
it('should handle missing required fields', async () => {
|
|
const request = new Request('http://localhost:3000/api/auth/register', {
|
|
method: 'POST',
|
|
body: JSON.stringify({
|
|
email: 'test@example.com',
|
|
// password missing
|
|
}),
|
|
});
|
|
|
|
const response = await POST(request as any);
|
|
const data = await response.json();
|
|
|
|
expect(response.status).toBe(400);
|
|
expect(data.error).toBe('Validation failed');
|
|
expect(registerUser).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('should handle invalid JSON', async () => {
|
|
const request = new Request('http://localhost:3000/api/auth/register', {
|
|
method: 'POST',
|
|
body: 'invalid json',
|
|
});
|
|
|
|
const response = await POST(request as any);
|
|
const data = await response.json();
|
|
|
|
expect(response.status).toBe(500);
|
|
expect(data.error).toBe('Internal server error');
|
|
});
|
|
|
|
it('should allow registration without fullName', async () => {
|
|
const mockUser = {
|
|
id: 'user-123',
|
|
email: 'test@example.com',
|
|
role: 'user',
|
|
emailVerified: false,
|
|
};
|
|
|
|
vi.mocked(registerUser).mockResolvedValue({
|
|
success: true,
|
|
user: mockUser,
|
|
});
|
|
|
|
const request = new Request('http://localhost:3000/api/auth/register', {
|
|
method: 'POST',
|
|
body: JSON.stringify({
|
|
email: 'test@example.com',
|
|
password: 'TestPassword123!',
|
|
}),
|
|
});
|
|
|
|
const response = await POST(request as any);
|
|
const data = await response.json();
|
|
|
|
expect(response.status).toBe(201);
|
|
expect(data.success).toBe(true);
|
|
expect(data.user).toEqual(mockUser);
|
|
});
|
|
});
|