Files
clinicpro/assets/admin/components/layout/settingsMenu.test.ts
T

77 lines
3.4 KiB
TypeScript

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');
});
});