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