import { describe, it, expect } from 'vitest'; import { tsToDateStr, dateStrToTs, profileToFormValues, formValuesToPayload, } from '@/lib/patientForm'; import type { PatientProfile } from '@/types'; import type { PatientFormValues } from '@/components/PatientRecordInfoForm'; describe('date helpers', () => { // مبنا نیمه‌شبِ تهران است (نه UTC)، چون بک‌اند هم تاریخ‌های روزمحور را با // strtotime در تایم‌زون سرور (Asia/Tehran) ذخیره می‌کند. it('timestamp ↔ YYYY-MM-DD رفت‌وبرگشت روی نیمه‌شبِ تهران', () => { const ts = dateStrToTs('2025-01-07'); expect(ts).toBe(Math.floor(Date.UTC(2025, 0, 6, 20, 30, 0) / 1000)); expect(tsToDateStr(ts)).toBe('2025-01-07'); }); it('timestampهای ساخته‌شده توسط سرور یک روز عقب نمی‌روند', () => { expect(tsToDateStr(Math.floor(Date.UTC(2026, 6, 28, 20, 30, 0) / 1000))).toBe('2026-07-29'); }); it('خالی/نامعتبر → مقدار تهی', () => { expect(tsToDateStr(null)).toBe(''); expect(tsToDateStr(0)).toBe(''); expect(dateStrToTs('')).toBeNull(); }); }); describe('profileToFormValues', () => { it('فیلدهای جدید و تاریخ را درست مپ می‌کند', () => { const p: PatientProfile = { name: 'ساغر', fathers_name: 'رضا', national_code: '0012345678', date_of_birth: dateStrToTs('2000-05-10')!, field_of_study: 'نرم‌افزار', province_id: 8, city_id: 42, postal_code: '8913746351', referral_source: 'اینستاگرام', description: 'توضیح', mobile: '09131234567', }; const v = profileToFormValues(p); expect(v.name).toBe('ساغر'); expect(v.fathers_name).toBe('رضا'); expect(v.birth_date).toBe('2000-05-10'); expect(v.province_id).toBe(8); expect(v.city_id).toBe(42); expect(v.referral_source).toBe('اینستاگرام'); }); it('پروفایل تهی → مقادیر پیش‌فرض امن', () => { const v = profileToFormValues(null); expect(v.name).toBe(''); expect(v.birth_date).toBe(''); expect(v.province_id).toBeNull(); }); }); describe('formValuesToPayload', () => { const base: PatientFormValues = { name: 'ساغر', mobile: '', national_code: '0012345678', gender: 'female', birth_date: '2000-05-10', fathers_name: 'رضا', marital_status: 'single', basic_insurance_id: '3', supplementary_insurance_id: '5', field_of_study: 'نرم‌افزار', education: 'کارشناسی', job: 'مهندس', province_id: 8, city_id: '42', home_phone: '', address: 'یزد', postal_code: '8913746351', referral_source: 'اینستاگرام', description: '', }; it('تاریخ به timestamp و idها به عدد تبدیل می‌شوند', () => { const out = formValuesToPayload(base); expect(out.date_of_birth).toBe(dateStrToTs('2000-05-10')); expect(out.basic_insurance_id).toBe(3); expect(out.supplementary_insurance_id).toBe(5); expect(out.province_id).toBe(8); expect(out.city_id).toBe(42); }); it('موبایل خالی ارسال نمی‌شود؛ موبایل پرشده ارسال می‌شود', () => { expect('mobile' in formValuesToPayload(base)).toBe(false); const withMobile = formValuesToPayload({ ...base, mobile: '09131234567' }); expect(withMobile.mobile).toBe('09131234567'); }); it('id خالی → null', () => { const out = formValuesToPayload({ ...base, basic_insurance_id: null, province_id: '' }); expect(out.basic_insurance_id).toBeNull(); expect(out.province_id).toBeNull(); }); });