import { describe, it, expect } from 'vitest'; import { SETTINGS_GROUPS, SETTINGS_MENU, groupMenu, groupedMenuForRole, menuForRole, } from './settingsMenu'; /** * منو یک فهرست تختِ ۱۶ ردیفی بود که ترتیبش از تاریخِ اضافه‌شدنِ آیتم‌ها می‌آمد: * «خرید اشتراک» — کم‌مصرف‌ترین — ردیف اول بود و «مدیریت پرداخت» وسط آیتم‌های * نوبت‌دهی. این تست‌ها همان چیدمان تازه را قفل می‌کنند. */ describe('گروه‌بندی منوی تنظیمات', () => { it('هر آیتم منو دقیقاً به یکی از گروه‌های تعریف‌شده تعلق دارد', () => { const known = new Set(SETTINGS_GROUPS.map((g) => g.key)); for (const item of SETTINGS_MENU) { expect(known.has(item.group), `${item.key} گروه نامعتبر دارد`).toBe(true); } }); it('گروه‌ها به ترتیب تعریف‌شده برمی‌گردند', () => { const keys = groupedMenuForRole('clinic').map((g) => g.key); expect(keys).toEqual(['practice', 'scheduling', 'patients', 'finance', 'account']); }); it('خرید اشتراک در گروه آخر است، نه ردیف اول', () => { const groups = groupedMenuForRole('doctor'); const last = groups[groups.length - 1]; expect(last.key).toBe('account'); expect(last.items.map((i) => i.key)).toEqual(['subscription', 'account']); expect(menuForRole('doctor')[0].key).not.toBe('subscription'); }); it('مدیریت پرداخت کنار بیمه و تخفیف است، نه وسط نوبت‌دهی', () => { const finance = groupedMenuForRole('doctor').find((g) => g.key === 'finance'); expect(finance?.items.map((i) => i.key)).toEqual(['payment', 'insurance', 'discounts', 'sms']); }); it('گروه خالی برنمی‌گردد', () => { // منشیِ فقط-با-مجوزِ پرداخت: نباید تیتر «نوبت‌دهی» بالای فضای خالی ببیند. const can = (resource: string) => resource === 'payments'; const groups = groupedMenuForRole('secretary', can); expect(groups.map((g) => g.key)).toEqual(['finance', 'account']); for (const group of groups) { expect(group.items.length).toBeGreaterThan(0); } }); it('فیلترِ جستجو گروه بی‌نتیجه را حذف می‌کند', () => { const filtered = groupMenu(menuForRole('doctor').filter((i) => i.label.includes('بیمه'))); expect(filtered).toHaveLength(1); expect(filtered[0].key).toBe('finance'); expect(filtered[0].items.map((i) => i.key)).toEqual(['insurance']); }); it('گروه‌بندی هیچ آیتمی را نمی‌اندازد و تکراری نمی‌سازد', () => { for (const role of ['doctor', 'clinic']) { const flat = menuForRole(role); const grouped = groupedMenuForRole(role).flatMap((g) => g.items); expect(grouped).toHaveLength(flat.length); expect(new Set(grouped.map((i) => i.to)).size).toBe(flat.length); } }); it('گِیت نقشی بعد از گروه‌بندی هم برقرار است', () => { const practice = groupedMenuForRole('doctor').find((g) => g.key === 'practice'); expect(practice?.items.map((i) => i.key)).not.toContain('clinic-doctors'); expect(practice?.items.map((i) => i.key)).toContain('doctor'); }); });