import { describe, it, expect, beforeEach, vi } from 'vitest'; import { screen } from '@testing-library/react'; import { renderWithProviders } from '@/test/utils'; vi.mock('sonner', () => ({ toast: { success: vi.fn(), error: vi.fn() } })); vi.mock('@/lib/api', () => ({ api: { get: vi.fn(), post: vi.fn(), patch: vi.fn(), put: vi.fn(), delete: vi.fn() }, ApiError: class extends Error {}, })); import { api } from '@/lib/api'; import BlogsPage from '@/pages/BlogsPage'; const get = api.get as ReturnType; beforeEach(() => { get.mockReset(); }); describe('BlogsPage — قرارداد PaginatedResponse', () => { it('ردیف‌ها از data.data و تعداد از meta.totalRecords می‌آیند', async () => { get.mockResolvedValue({ success: true, data: [ { uuid: 'b1', title: 'مقاله اول', status: 'published', tags: [], created_at: 1700000000 }, { uuid: 'b2', title: 'مقاله دوم', status: 'draft', tags: [], created_at: 1700000000 }, ], meta: { totalRecords: 2, totalPages: 1, currentPage: 1 }, errors: [], }); renderWithProviders(, { route: '/admin/blogs' }); expect(await screen.findByText('مقاله اول')).toBeInTheDocument(); expect(screen.getByText('مقاله دوم')).toBeInTheDocument(); expect(get).toHaveBeenCalledWith(expect.stringContaining('/api/v1/blogs')); }); it('پاسخ خالی → پیام «هیچ مقاله‌ای یافت نشد»', async () => { get.mockResolvedValue({ success: true, data: [], meta: { totalRecords: 0, totalPages: 0, currentPage: 1 }, errors: [], }); renderWithProviders(, { route: '/admin/blogs' }); expect(await screen.findByText('هیچ مقاله‌ای یافت نشد')).toBeInTheDocument(); }); });