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() }) })