feat(settings): implement grouped menu structure and update related components
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
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');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user