import { BadRequestException } from '@nestjs/common'; import { PhoneService } from './phone.service'; describe('PhoneService — تطبيع أرقام الهاتف (docs/17 D1)', () => { let phones: PhoneService; beforeEach(() => { phones = new PhoneService(); }); describe('الأردن (jo)', () => { it('الصيغة المحلية بالصفر', () => { expect(phones.normalize('0790000000', 'jo')).toBe('962790000000'); }); it('الصيغة الدولية بالفعل', () => { expect(phones.normalize('962790000000', 'jo')).toBe('962790000000'); }); it('بادئة + دولية', () => { expect(phones.normalize('+962790000000', 'jo')).toBe('962790000000'); }); it('بادئة 00 بدل +', () => { expect(phones.normalize('00962790000000', 'jo')).toBe('962790000000'); }); it('فراغات وشرطات لا تؤثر', () => { expect(phones.normalize('+962 79-000-0000', 'jo')).toBe('962790000000'); }); it('محلي بلا صفر بادئ', () => { expect(phones.normalize('790000000', 'jo')).toBe('962790000000'); }); }); describe('مصر (eg) — لبس المالك: "01" يُظنّ مفتاحاً وهو ليس كذلك', () => { it('الصيغة المحلية بالصفر (11 رقماً) تُحسب بمفتاح 20 الصحيح لا "2"', () => { const r = phones.normalize('01012345678', 'eg'); expect(r).toBe('201012345678'); expect(r.startsWith('20')).toBe(true); // لا "2" فقط }); it('الصيغة الدولية بالفعل', () => { expect(phones.normalize('201012345678', 'eg')).toBe('201012345678'); }); it('بادئة +', () => { expect(phones.normalize('+201012345678', 'eg')).toBe('201012345678'); }); }); describe('سوريا (sy)', () => { it('الصيغة المحلية بالصفر', () => { expect(phones.normalize('0944000000', 'sy')).toBe('963944000000'); }); }); describe('نفس الرقم الحقيقي بصيغ مختلفة → مفتاح واحد فقط', () => { it('لا يتعدد الحساب لنفس الرقم', () => { const variants = ['0790000000', '962790000000', '+962790000000', '00962790000000']; const results = new Set(variants.map((v) => phones.normalize(v, 'jo'))); expect(results.size).toBe(1); }); }); describe('مدخلات غير صالحة', () => { it('طول خاطئ يُرفض لا يُخمَّن', () => { expect(() => phones.normalize('12345', 'jo')).toThrow(BadRequestException); }); it('نص فارغ يُرفض', () => { expect(() => phones.normalize('', 'jo')).toThrow(BadRequestException); }); it('حروف بلا أرقام تُرفض', () => { expect(() => phones.normalize('abc-def', 'jo')).toThrow(BadRequestException); }); }); it('دولة غير معروفة تسقط لخطة افتراضية بلا انهيار', () => { expect(() => phones.normalize('0790000000', 'xx')).not.toThrow(); }); });