Extract admin dashboard from ghabilee-frontend2 into a dedicated Next.js app for backoffice.ghabilee.ir (no SEO indexing / Clarity).
46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
|
|
import { fetchAllSeoDiscoveryEvents } from '@/lib/seo/serverApi'
|
|
|
|
describe('fetchAllSeoDiscoveryEvents', () => {
|
|
afterEach(() => {
|
|
vi.unstubAllEnvs()
|
|
vi.unstubAllGlobals()
|
|
})
|
|
|
|
it('loads every API page while excluding seed placeholders', async () => {
|
|
vi.stubEnv('NEXT_PUBLIC_API_URL', 'https://example.test/api/v1')
|
|
|
|
const fetchMock = vi.fn(async (input: string | URL | Request) => {
|
|
const url = new URL(String(input))
|
|
const page = Number(url.searchParams.get('page'))
|
|
const items =
|
|
page === 1
|
|
? [
|
|
{ slug: 'real-event-one', title: 'رویداد اول' },
|
|
{ slug: 'generated-seed123', title: 'Seed event' },
|
|
]
|
|
: [{ slug: 'real-event-two', title: 'رویداد دوم' }]
|
|
|
|
return {
|
|
ok: true,
|
|
status: 200,
|
|
json: async () => ({
|
|
success: true,
|
|
data: {
|
|
items,
|
|
response: { totalItemsCount: 3 },
|
|
},
|
|
}),
|
|
} as Response
|
|
})
|
|
|
|
vi.stubGlobal('fetch', fetchMock)
|
|
|
|
const events = await fetchAllSeoDiscoveryEvents(2)
|
|
|
|
expect(fetchMock).toHaveBeenCalledTimes(2)
|
|
expect(events.map((event) => event.slug)).toEqual(['real-event-one', 'real-event-two'])
|
|
})
|
|
})
|