import { describe, it, expect, beforeEach } from 'vitest';
import { screen } from '@testing-library/react';
import { Routes, Route } from 'react-router';
import { renderWithProviders } from './test/utils';
import { useAuthStore } from './stores/authStore';
import { RoleRoute } from './App';
/**
* گِیتِ نقشیِ صفحات پنل — با تمرکز روی پزشکِ عضو در محیط کلینیک.
*
* پیش از این `settingsMenu` و `RoleRoute` دو قاعدهٔ متفاوت داشتند: منو واریانتِ
* `clinic` را به پزشکِ scope=clinic نشان میداد و route با `primaryRole === 'doctor'`
* ردش میکرد. نتیجه یک آیتم منوی مرده بود که به داشبورد میپرید.
*/
function renderGate(node: React.ReactNode) {
return renderWithProviders(
داشبورد} />
,
{ route: '/admin/page' },
);
}
function setUser(opts: {
role: string;
scope?: string | null;
permissions?: Record>;
}) {
useAuthStore.setState({
primaryRole: opts.role,
context: {
type: opts.scope === 'clinic' ? 'clinic' : 'doctor',
db_uuid: 'x',
name: 'محیط',
scope: opts.scope ?? null,
permissions: opts.permissions ? { resources: opts.permissions } : null,
},
} as any);
}
describe('RoleRoute', () => {
beforeEach(() => useAuthStore.setState({ primaryRole: null, context: null } as any));
it('نقشِ مجاز عبور میکند', () => {
setUser({ role: 'clinic' });
renderGate(محتوا
);
expect(screen.getByText('محتوا')).toBeInTheDocument();
});
it('نقشِ غیرمجاز به داشبورد میرود', () => {
setUser({ role: 'doctor' });
renderGate(محتوا
);
expect(screen.getByText('داشبورد')).toBeInTheDocument();
});
it('پزشکِ عضو با مجوزِ همان صفحه، به واریانتِ clinic راه دارد', () => {
setUser({ role: 'doctor', scope: 'clinic', permissions: { clinic_info: { view: true } } });
renderGate(
محتوا
,
);
expect(screen.getByText('محتوا')).toBeInTheDocument();
});
it('پزشکِ عضو بدون آن مجوز، راه ندارد', () => {
setUser({ role: 'doctor', scope: 'clinic', permissions: { clinic_info: { view: false } } });
renderGate(
محتوا
,
);
expect(screen.getByText('داشبورد')).toBeInTheDocument();
});
it('صفحهٔ بدون اعلامِ مجوز برای پزشکِ عضو باز نمیشود', () => {
// وگرنه هر صفحهٔ مخصوصِ مالک برای هر پزشکِ عضو باز میشد.
setUser({ role: 'doctor', scope: 'clinic', permissions: { clinic_info: { view: true } } });
renderGate(محتوا
);
expect(screen.getByText('داشبورد')).toBeInTheDocument();
});
it('پزشکِ مطب شخصی از واریانتِ clinic رد میشود، حتی با مجوزِ باز', () => {
// محیط شخصی permissions ندارد و `can` آزاد برمیگردد؛ scope باید جلویش را بگیرد.
setUser({ role: 'doctor', scope: null });
renderGate(
محتوا
,
);
expect(screen.getByText('داشبورد')).toBeInTheDocument();
});
});