import { describe, it, expect } from 'vitest'; import { changeNumToDefault, formatPhoneNumber, validatePhoneNumber, isValidIranNationalCode, getCleanNumberValue, imageUrl, QueryForDoctorsFilter, } from '@/helper'; describe('changeNumToDefault', () => { it('رقم فارسی و عربی → انگلیسی', () => { expect(changeNumToDefault('۰۹۱۲')).toBe('0912'); expect(changeNumToDefault('٠٩١٢')).toBe('0912'); }); it('ورودی falsy → رشته خالی', () => { expect(changeNumToDefault('')).toBe(''); expect(changeNumToDefault(null)).toBe(''); }); }); describe('formatPhoneNumber', () => { it('۹ رقم را به فرمت "## ### ####" در می‌آورد', () => { expect(formatPhoneNumber('912345678')).toBe('91 234 5678'); }); it('رقم فارسی را نرمال و به ۹ رقم محدود می‌کند', () => { expect(formatPhoneNumber('۰۹۱۲۳۴۵۶۷۸۹')).toBe('09 123 4567'); }); it('کاراکترهای غیررقمی را حذف می‌کند', () => { expect(formatPhoneNumber('912-345-678')).toBe('91 234 5678'); }); }); describe('validatePhoneNumber', () => { it.each([ ['09123456789', true], ['9123456789', false], ['08123456789', false], ['0912345678', false], ['', false], ])('%s → valid=%s', (input, valid) => { expect(validatePhoneNumber(input).valid).toBe(valid); }); it('رقم غیرانگلیسی → پیام مخصوص', () => { const r = validatePhoneNumber('۰۹۱۲۳۴۵۶۷۸۹'); expect(r.valid).toBe(false); expect(r.text).toBe('فقط از اعداد انگلیسی استفاده کنید.'); }); it('ورودی معتبر → text=null', () => { expect(validatePhoneNumber('09123456789')).toEqual({ valid: true, text: null }); }); }); describe('isValidIranNationalCode', () => { it('کدملی معتبر را می‌پذیرد', () => { expect(isValidIranNationalCode('0013542419')).toBe(true); }); it.each([ ['1111111111', false], // ارقام یکسان ['123', false], // طول نادرست ['0013542410', false], // رقم کنترلی غلط ['', false], ])('%s → %s', (input, expected) => { expect(isValidIranNationalCode(input)).toBe(expected); }); }); describe('getCleanNumberValue', () => { it('رقم فارسی + جداکننده → عدد', () => { expect(getCleanNumberValue('۱۲۳۴')).toBe(1234); }); it('اعشار را حفظ می‌کند', () => { expect(getCleanNumberValue('12.5')).toBe(12.5); }); it('ورودی نامعتبر → مقدار پیش‌فرض', () => { expect(getCleanNumberValue('abc')).toBe(0); expect(getCleanNumberValue('abc', 7)).toBe(7); }); }); describe('imageUrl', () => { it('URL مطلق دست‌نخورده', () => { expect(imageUrl('https://x.com/a.jpg')).toBe('https://x.com/a.jpg'); }); it('/uploads با NEXT_PUBLIC_API_URL پیشوند می‌گیرد', () => { expect(imageUrl('/uploads/a.jpg')).toBe('http://api.test.local/uploads/a.jpg'); }); it('مسیر /assets دست‌نخورده', () => { expect(imageUrl('/assets/images/x.png')).toBe('/assets/images/x.png'); }); it('خالی → fallback', () => { expect(imageUrl('')).toBe('/assets/images/user.png'); }); }); describe('QueryForDoctorsFilter', () => { it('فیلدهای معتبر را نگاشت و فیلدهای پیش‌فرض را حذف می‌کند', () => { const q = QueryForDoctorsFilter({ active: 1, specialty: { name: 'قلب' }, city: { name: 'یزد' }, gender: 'مرد', degree: 'همه موارد', // باید حذف شود name: ' ', // باید حذف شود sort: 4, }); expect(q).toEqual({ active: 1, specialty: 'قلب', city: 'یزد', gender: 'مرد', sort: 4 }); }); it('gender «هر دو» و sort خارج از 3..5 حذف می‌شوند', () => { const q = QueryForDoctorsFilter({ gender: 'هر دو', sort: 9 }); expect(q.gender).toBeUndefined(); expect(q.sort).toBeUndefined(); }); });