feat: Add unit tests for backend validators and configure Jest.
This commit is contained in:
parent
ebcae0b3e7
commit
9bb941b45e
16 changed files with 2071 additions and 381 deletions
100
Backend/tests/unit/validators/user.validator.test.ts
Normal file
100
Backend/tests/unit/validators/user.validator.test.ts
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
import {
|
||||
profileUpdateSchema,
|
||||
changePasswordSchema,
|
||||
} from '@/validators/user.validator';
|
||||
|
||||
describe('profileUpdateSchema', () => {
|
||||
it('should pass with empty object (all optional)', () => {
|
||||
const { error } = profileUpdateSchema.validate({});
|
||||
expect(error).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should pass with all fields', () => {
|
||||
const { error } = profileUpdateSchema.validate({
|
||||
prefix: { th: 'นาย', en: 'Mr.' },
|
||||
first_name: 'John',
|
||||
last_name: 'Doe',
|
||||
phone: '0812345678',
|
||||
avatar_url: 'https://example.com/avatar.jpg',
|
||||
birth_date: new Date('1990-01-01'),
|
||||
});
|
||||
expect(error).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should pass with partial update (first_name only)', () => {
|
||||
const { error } = profileUpdateSchema.validate({ first_name: 'Jane' });
|
||||
expect(error).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should fail if first_name is empty string', () => {
|
||||
const { error } = profileUpdateSchema.validate({ first_name: '' });
|
||||
expect(error).toBeDefined();
|
||||
});
|
||||
|
||||
it('should fail if first_name exceeds 100 characters', () => {
|
||||
const { error } = profileUpdateSchema.validate({ first_name: 'a'.repeat(101) });
|
||||
expect(error).toBeDefined();
|
||||
});
|
||||
|
||||
it('should fail if phone is too short (< 10 chars)', () => {
|
||||
const { error } = profileUpdateSchema.validate({ phone: '081234' });
|
||||
expect(error).toBeDefined();
|
||||
});
|
||||
|
||||
it('should fail if phone exceeds 15 characters', () => {
|
||||
const { error } = profileUpdateSchema.validate({ phone: '1'.repeat(16) });
|
||||
expect(error).toBeDefined();
|
||||
});
|
||||
|
||||
it('should pass with valid birth_date', () => {
|
||||
const { error } = profileUpdateSchema.validate({ birth_date: new Date('2000-06-15') });
|
||||
expect(error).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe('changePasswordSchema (user.validator)', () => {
|
||||
it('should pass with valid old and new passwords', () => {
|
||||
const { error } = changePasswordSchema.validate({
|
||||
oldPassword: 'oldpass123',
|
||||
newPassword: 'newpass456',
|
||||
});
|
||||
expect(error).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should fail without oldPassword', () => {
|
||||
const { error } = changePasswordSchema.validate({ newPassword: 'newpass456' });
|
||||
expect(error).toBeDefined();
|
||||
expect(error?.details[0].message).toMatch(/Old password is required/i);
|
||||
});
|
||||
|
||||
it('should fail without newPassword', () => {
|
||||
const { error } = changePasswordSchema.validate({ oldPassword: 'oldpass123' });
|
||||
expect(error).toBeDefined();
|
||||
expect(error?.details[0].message).toMatch(/New password is required/i);
|
||||
});
|
||||
|
||||
it('should fail if oldPassword is shorter than 6 chars', () => {
|
||||
const { error } = changePasswordSchema.validate({
|
||||
oldPassword: '12345',
|
||||
newPassword: 'newpass456',
|
||||
});
|
||||
expect(error).toBeDefined();
|
||||
expect(error?.details[0].message).toMatch(/at least 6 characters/i);
|
||||
});
|
||||
|
||||
it('should fail if newPassword is shorter than 6 chars', () => {
|
||||
const { error } = changePasswordSchema.validate({
|
||||
oldPassword: 'oldpass123',
|
||||
newPassword: '123',
|
||||
});
|
||||
expect(error).toBeDefined();
|
||||
});
|
||||
|
||||
it('should fail if oldPassword exceeds 100 characters', () => {
|
||||
const { error } = changePasswordSchema.validate({
|
||||
oldPassword: 'a'.repeat(101),
|
||||
newPassword: 'newpass456',
|
||||
});
|
||||
expect(error).toBeDefined();
|
||||
});
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue