77 lines
3.4 KiB
TypeScript
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');
|
|
});
|
|
});
|