import { describe, it, expect, beforeEach, vi } from 'vitest'; import { screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { renderWithProviders } from '@/test/utils'; vi.mock('@/lib/api', () => ({ api: { get: vi.fn(), post: vi.fn(), patch: vi.fn(), put: vi.fn(), delete: vi.fn() }, ApiError: class extends Error {}, })); const drive = vi.fn(); vi.mock('driver.js', () => ({ driver: vi.fn(() => ({ drive })) })); vi.mock('driver.js/dist/driver.css', () => ({})); import { api } from '@/lib/api'; import TourButton from './TourButton'; import PageHeader from './PageHeader'; import { appointmentsTour } from '@/lib/tour/tours/appointments'; const get = api.get as ReturnType; beforeEach(() => { get.mockReset(); get.mockResolvedValue({ data: { seen: {} } }); drive.mockReset(); document.body.innerHTML = ''; }); describe('TourButton', () => { it('برای تور ثبت‌شده دکمهٔ راهنما می‌آورد', () => { renderWithProviders(); expect(screen.getByRole('button', { name: 'راهنمای این صفحه' })).toBeInTheDocument(); }); it('برای شناسهٔ ناشناس یا بدون شناسه چیزی رندر نمی‌کند', () => { const { container } = renderWithProviders(); expect(container).toBeEmptyDOMElement(); const { container: bare } = renderWithProviders(); expect(bare).toBeEmptyDOMElement(); }); it('کلیک، تور را روی المان‌های موجود اجرا می‌کند', async () => { const user = userEvent.setup(); renderWithProviders( <> {appointmentsTour.steps.map((s) => (
))} , ); await user.click(screen.getByRole('button', { name: 'راهنمای این صفحه' })); expect(drive).toHaveBeenCalledTimes(1); }); }); describe('PageHeader', () => { it('با tourId دکمهٔ راهنما را کنار عنوان می‌گذارد', () => { renderWithProviders(); expect(screen.getByRole('heading', { name: 'نوبت‌ها' })).toBeInTheDocument(); expect(screen.getByRole('button', { name: 'راهنمای این صفحه' })).toBeInTheDocument(); }); it('بدون tourId هیچ دکمهٔ راهنمایی ندارد', () => { renderWithProviders(); expect(screen.queryByRole('button', { name: 'راهنمای این صفحه' })).toBeNull(); }); it('صفحهٔ بدون تور هیچ درخواستی برای وضعیت تورها نمی‌فرستد', () => { renderWithProviders(); expect(get).not.toHaveBeenCalled(); }); });