rwadurian/backend/services/identity-service/src/domain/value-objects/phone-number.vo.spec.ts

91 lines
2.5 KiB
TypeScript

import { PhoneNumber } from './index';
import { DomainError } from '@/shared/exceptions/domain.exception';
describe('PhoneNumber ValueObject', () => {
describe('create', () => {
it('应该接受有效的中国手机号', () => {
const validPhones = [
'13800138000',
'13912345678',
'15800001111',
'18600002222',
'19900003333',
];
validPhones.forEach(phone => {
const phoneNumber = PhoneNumber.create(phone);
expect(phoneNumber.value).toBe(phone);
});
});
it('应该拒绝无效的手机号格式', () => {
const invalidPhones = [
'12800138000', // 不是1开头
'1380013800', // 少于11位
'138001380000', // 多于11位
'10800138000', // 第二位不是3-9
'abcdefghijk', // 非数字
'', // 空字符串
];
invalidPhones.forEach(phone => {
expect(() => {
PhoneNumber.create(phone);
}).toThrow(DomainError);
});
});
it('应该拒绝包含特殊字符的手机号', () => {
const invalidPhones = [
'138-0013-8000',
'138 0013 8000',
'+8613800138000',
];
invalidPhones.forEach(phone => {
expect(() => {
PhoneNumber.create(phone);
}).toThrow(DomainError);
});
});
});
describe('masked', () => {
it('应该正确掩码手机号', () => {
const phoneNumber = PhoneNumber.create('13800138000');
const masked = phoneNumber.masked();
expect(masked).toBe('138****8000');
});
it('掩码后应该隐藏中间4位', () => {
const testCases = [
{ input: '13912345678', expected: '139****5678' },
{ input: '15800001111', expected: '158****1111' },
{ input: '18600002222', expected: '186****2222' },
];
testCases.forEach(({ input, expected }) => {
const phoneNumber = PhoneNumber.create(input);
expect(phoneNumber.masked()).toBe(expected);
});
});
});
describe('equals', () => {
it('相同的手机号应该相等', () => {
const phone1 = PhoneNumber.create('13800138000');
const phone2 = PhoneNumber.create('13800138000');
expect(phone1.equals(phone2)).toBe(true);
});
it('不同的手机号应该不相等', () => {
const phone1 = PhoneNumber.create('13800138000');
const phone2 = PhoneNumber.create('13912345678');
expect(phone1.equals(phone2)).toBe(false);
});
});
});