Files
veilix.app/src/payload/hooks/revalidateSite.test.ts
T

44 lines
2.1 KiB
TypeScript
Raw Normal View History

2026-10-22 04:53:15 +02:00
import { revalidatePath } from 'next/cache'
import type { PayloadRequest } from 'payload'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { revalidateAfterChange, revalidateAfterDelete, SKIP_REVALIDATE } from './revalidateSite'
vi.mock('next/cache', () => ({ revalidatePath: vi.fn() }))
const req = { payload: { logger: { debug: vi.fn() } } } as unknown as PayloadRequest
// хукам нужны только doc, previousDoc, req и context
const change = (doc: object, previousDoc: object = {}, context: object = {}) =>
revalidateAfterChange({ doc, previousDoc, req, context } as never)
describe('пересборка маркетинговых страниц', () => {
beforeEach(() => vi.mocked(revalidatePath).mockReset())
it('правка без черновиков пересобирает layout всех маркетинговых страниц', () => {
change({ id: '1' })
expect(revalidatePath).toHaveBeenCalledWith('/(front)/m/[host]/[locale]/[currency]', 'layout')
})
it('черновик страницы не пересобирает, публикация и снятие с публикации — да', () => {
change({ _status: 'draft' }, { _status: 'draft' })
expect(revalidatePath).not.toHaveBeenCalled()
change({ _status: 'published' }, { _status: 'draft' })
change({ _status: 'draft' }, { _status: 'published' })
expect(revalidatePath).toHaveBeenCalledTimes(2)
})
it('seed и пакетные правки пропускают пересборку', () => {
change({ id: '1' }, {}, { [SKIP_REVALIDATE]: true })
revalidateAfterDelete({ doc: { id: '1' }, req, context: { [SKIP_REVALIDATE]: true } } as never)
expect(revalidatePath).not.toHaveBeenCalled()
})
it('вне запроса Next ошибка пересборки не мешает сохранению', () => {
vi.mocked(revalidatePath).mockImplementationOnce(() => {
throw new Error('static generation store missing')
})
expect(() => change({ id: '1' })).not.toThrow()
expect(req.payload.logger.debug).toHaveBeenCalled()
})
})