228 lines
6.3 KiB
TypeScript
228 lines
6.3 KiB
TypeScript
/**
|
|
* Tests for API Request Schemas
|
|
* FE-TYPE-003: Test Zod schema validation for API requests
|
|
*/
|
|
|
|
import { describe, it, expect } from 'vitest';
|
|
import {
|
|
loginRequestSchema,
|
|
registerRequestSchema,
|
|
sendMessageRequestSchema,
|
|
createConversationRequestSchema,
|
|
updateProfileRequestSchema,
|
|
validateApiRequest,
|
|
safeValidateApiRequest,
|
|
} from './apiRequestSchemas';
|
|
|
|
describe('apiRequestSchemas', () => {
|
|
describe('loginRequestSchema', () => {
|
|
it('should validate valid login request', () => {
|
|
const validRequest = {
|
|
email: 'test@example.com',
|
|
password: 'password123',
|
|
};
|
|
|
|
const result = loginRequestSchema.safeParse(validRequest);
|
|
expect(result.success).toBe(true);
|
|
});
|
|
|
|
it('should reject invalid email', () => {
|
|
const invalidRequest = {
|
|
email: 'not-an-email',
|
|
password: 'password123',
|
|
};
|
|
|
|
const result = loginRequestSchema.safeParse(invalidRequest);
|
|
expect(result.success).toBe(false);
|
|
});
|
|
|
|
it('should reject empty password', () => {
|
|
const invalidRequest = {
|
|
email: 'test@example.com',
|
|
password: '',
|
|
};
|
|
|
|
const result = loginRequestSchema.safeParse(invalidRequest);
|
|
expect(result.success).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('registerRequestSchema', () => {
|
|
it('should validate valid register request', () => {
|
|
const validRequest = {
|
|
username: 'testuser',
|
|
email: 'test@example.com',
|
|
password: 'password123',
|
|
};
|
|
|
|
const result = registerRequestSchema.safeParse(validRequest);
|
|
expect(result.success).toBe(true);
|
|
});
|
|
|
|
it('should reject short password', () => {
|
|
const invalidRequest = {
|
|
username: 'testuser',
|
|
email: 'test@example.com',
|
|
password: 'short',
|
|
};
|
|
|
|
const result = registerRequestSchema.safeParse(invalidRequest);
|
|
expect(result.success).toBe(false);
|
|
});
|
|
|
|
it('should reject invalid username', () => {
|
|
const invalidRequest = {
|
|
username: 'ab', // Too short
|
|
email: 'test@example.com',
|
|
password: 'password123',
|
|
};
|
|
|
|
const result = registerRequestSchema.safeParse(invalidRequest);
|
|
expect(result.success).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('sendMessageRequestSchema', () => {
|
|
it('should validate valid message request', () => {
|
|
const validRequest = {
|
|
conversation_id: '123e4567-e89b-12d3-a456-426614174000',
|
|
content: 'Hello, world!',
|
|
};
|
|
|
|
const result = sendMessageRequestSchema.safeParse(validRequest);
|
|
expect(result.success).toBe(true);
|
|
});
|
|
|
|
it('should reject invalid UUID', () => {
|
|
const invalidRequest = {
|
|
conversation_id: 'not-a-uuid',
|
|
content: 'Hello, world!',
|
|
};
|
|
|
|
const result = sendMessageRequestSchema.safeParse(invalidRequest);
|
|
expect(result.success).toBe(false);
|
|
});
|
|
|
|
it('should reject empty content', () => {
|
|
const invalidRequest = {
|
|
conversation_id: '123e4567-e89b-12d3-a456-426614174000',
|
|
content: '',
|
|
};
|
|
|
|
const result = sendMessageRequestSchema.safeParse(invalidRequest);
|
|
expect(result.success).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('createConversationRequestSchema', () => {
|
|
it('should validate valid conversation request', () => {
|
|
const validRequest = {
|
|
name: 'Test Conversation',
|
|
type: 'group',
|
|
participant_ids: ['123e4567-e89b-12d3-a456-426614174000'],
|
|
};
|
|
|
|
const result = createConversationRequestSchema.safeParse(validRequest);
|
|
expect(result.success).toBe(true);
|
|
});
|
|
|
|
it('should reject empty participant list', () => {
|
|
const invalidRequest = {
|
|
name: 'Test Conversation',
|
|
type: 'group',
|
|
participant_ids: [],
|
|
};
|
|
|
|
const result = createConversationRequestSchema.safeParse(invalidRequest);
|
|
expect(result.success).toBe(false);
|
|
});
|
|
|
|
it('should reject empty name', () => {
|
|
const invalidRequest = {
|
|
name: '',
|
|
type: 'group',
|
|
participant_ids: ['123e4567-e89b-12d3-a456-426614174000'],
|
|
};
|
|
|
|
const result = createConversationRequestSchema.safeParse(invalidRequest);
|
|
expect(result.success).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('updateProfileRequestSchema', () => {
|
|
it('should validate valid profile update', () => {
|
|
const validRequest = {
|
|
first_name: 'John',
|
|
last_name: 'Doe',
|
|
bio: 'Test bio',
|
|
};
|
|
|
|
const result = updateProfileRequestSchema.safeParse(validRequest);
|
|
expect(result.success).toBe(true);
|
|
});
|
|
|
|
it('should validate empty request (all optional)', () => {
|
|
const validRequest = {};
|
|
|
|
const result = updateProfileRequestSchema.safeParse(validRequest);
|
|
expect(result.success).toBe(true);
|
|
});
|
|
|
|
it('should reject invalid date format', () => {
|
|
const invalidRequest = {
|
|
birthdate: '2024/01/01', // Wrong format
|
|
};
|
|
|
|
const result = updateProfileRequestSchema.safeParse(invalidRequest);
|
|
expect(result.success).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('validateApiRequest', () => {
|
|
it('should validate and return data', () => {
|
|
const validRequest = {
|
|
email: 'test@example.com',
|
|
password: 'password123',
|
|
};
|
|
|
|
const result = validateApiRequest(loginRequestSchema, validRequest);
|
|
expect(result.email).toBe(validRequest.email);
|
|
expect(result.password).toBe(validRequest.password);
|
|
});
|
|
|
|
it('should throw on invalid data', () => {
|
|
const invalidRequest = {
|
|
email: 'not-an-email',
|
|
password: 'password123',
|
|
};
|
|
|
|
expect(() =>
|
|
validateApiRequest(loginRequestSchema, invalidRequest),
|
|
).toThrow();
|
|
});
|
|
});
|
|
|
|
describe('safeValidateApiRequest', () => {
|
|
it('should return success for valid data', () => {
|
|
const validRequest = {
|
|
email: 'test@example.com',
|
|
password: 'password123',
|
|
};
|
|
|
|
const result = safeValidateApiRequest(loginRequestSchema, validRequest);
|
|
expect(result.success).toBe(true);
|
|
expect(result.data).toBeDefined();
|
|
});
|
|
|
|
it('should return error for invalid data', () => {
|
|
const invalidRequest = {
|
|
email: 'not-an-email',
|
|
password: 'password123',
|
|
};
|
|
|
|
const result = safeValidateApiRequest(loginRequestSchema, invalidRequest);
|
|
expect(result.success).toBe(false);
|
|
expect(result.error).toBeDefined();
|
|
});
|
|
});
|
|
});
|