import { describe, it, expect, vi, beforeEach } from 'vitest'; import { screen, fireEvent, render } from '@testing-library/react'; import { MemoryRouter, Route, Routes, Link } from 'react-router'; import BackButton from './BackButton'; import PageHeader from './PageHeader'; /** * رفتار «بازگشت» باید در همهٔ صفحات یکی باشد: یک قدم عقب در تاریخچهٔ پنل، و وقتی * صفحه مستقیم باز شده (تاریخچه‌ای نیست) رفتن به صفحهٔ والد. */ function Detail({ fallback = '/admin/clinic-services' }: { fallback?: string }) { return ( <> صفحهٔ جزئیات ); } function List() { return ( <> صفحهٔ لیست باز کردن جزئیات ); } function renderAt(initialEntries: string[]) { return render( } /> } /> , ); } beforeEach(() => vi.clearAllMocks()); describe('BackButton', () => { it('ظاهر یکسان دارد: همان دکمهٔ بازگشتِ صفحهٔ سرویس‌ها', () => { renderAt(['/admin/clinic-services/x1']); const btn = screen.getByRole('button', { name: /بازگشت/ }); expect(btn).toHaveClass('cp-btn-secondary'); expect(btn).toHaveAttribute('type', 'button'); }); it('وقتی از صفحهٔ دیگری آمده‌ایم، یک قدم به همان صفحه برمی‌گردد', () => { renderAt(['/admin/clinic-services']); fireEvent.click(screen.getByText('باز کردن جزئیات')); expect(screen.getByText('صفحهٔ جزئیات')).toBeInTheDocument(); fireEvent.click(screen.getByRole('button', { name: /بازگشت/ })); expect(screen.getByText('صفحهٔ لیست')).toBeInTheDocument(); }); it('در ورود مستقیم (بدون تاریخچه) به صفحهٔ والد می‌رود', () => { renderAt(['/admin/clinic-services/x1']); fireEvent.click(screen.getByRole('button', { name: /بازگشت/ })); expect(screen.getByText('صفحهٔ لیست')).toBeInTheDocument(); }); }); describe('PageHeader — backTo', () => { it('با backTo دکمهٔ بازگشت را نشان می‌دهد', () => { render( , ); expect(screen.getByRole('button', { name: /بازگشت/ })).toBeInTheDocument(); }); it('بدون backTo دکمه‌ای رندر نمی‌شود (صفحات سطح‌اول)', () => { render( , ); expect(screen.queryByRole('button', { name: /بازگشت/ })).not.toBeInTheDocument(); }); });