Extract admin dashboard from ghabilee-frontend2 into a dedicated Next.js app for backoffice.ghabilee.ir (no SEO indexing / Clarity).
63 lines
2.0 KiB
TypeScript
63 lines
2.0 KiB
TypeScript
import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react'
|
|
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
|
|
import OrganizerReviewsSection from '@/components/reviews/OrganizerReviewsSection'
|
|
import type * as ReviewsService from '@/services/reviews'
|
|
import type { OrganizerReview } from '@/services/reviews'
|
|
|
|
const listPage = vi.fn()
|
|
|
|
vi.mock('@/services/reviews', async (importOriginal) => {
|
|
const original = await importOriginal<typeof ReviewsService>()
|
|
|
|
return {
|
|
...original,
|
|
LIST_ORGANIZER_REVIEWS_PAGE: (...args: unknown[]) => listPage(...args),
|
|
}
|
|
})
|
|
vi.mock('@/components/reviews/ReviewCard', () => ({
|
|
default: ({ body }: { body: string | null }) => <li>{body}</li>,
|
|
}))
|
|
vi.mock('@/components/reviews/StarRating', () => ({ default: () => <span /> }))
|
|
|
|
const review = (id: string): OrganizerReview =>
|
|
({
|
|
id,
|
|
body: `review-${id}`,
|
|
eventSlug: 'event',
|
|
eventTitle: 'Event',
|
|
}) as OrganizerReview
|
|
|
|
describe('OrganizerReviewsSection', () => {
|
|
afterEach(() => {
|
|
cleanup()
|
|
vi.clearAllMocks()
|
|
})
|
|
|
|
it('uses SSR reviews without a hydration request and appends only the next page', async () => {
|
|
const initialReviews = Array.from({ length: 10 }, (_, index) => review(String(index + 1)))
|
|
|
|
listPage.mockResolvedValue({
|
|
ok: true,
|
|
data: { items: [review('11'), review('12')], page: 2, totalItemsCount: 12, totalPages: 2 },
|
|
})
|
|
|
|
render(
|
|
<OrganizerReviewsSection
|
|
initialReviews={initialReviews}
|
|
organizerId="organizer-1"
|
|
reviewsCount={12}
|
|
/>
|
|
)
|
|
|
|
expect(listPage).not.toHaveBeenCalled()
|
|
fireEvent.click(screen.getByRole('button', { name: 'نمایش نظرات بیشتر' }))
|
|
|
|
await waitFor(() => {
|
|
expect(listPage).toHaveBeenCalledWith('organizer-1', 2, 10, expect.objectContaining({ errorMode: 'silent' }))
|
|
})
|
|
expect(await screen.findByText('review-12')).toBeInTheDocument()
|
|
expect(screen.queryByRole('button', { name: 'نمایش نظرات بیشتر' })).not.toBeInTheDocument()
|
|
})
|
|
})
|