teqo-backup/tests/unit/refreshRouteOnSave.unit.spec.tsx
fsolla 18ec5454fa fix(live-preview): gate do bridge pelo contexto de preview — desbloqueia o verify (hash #novidades)
O bridge do Payload live preview montava em toda página pública e disparava
router.refresh() no mount; quando o RSC chegava depois do clique no CTA do
hero, o HistoryUpdater do App Router regravava a URL canônica sem hash.
Agora o bridge só monta em iframe/popup (window.parent/opener), com unit de
regressão, e2e determinístico (segura o _rsc e libera depois do clique) e
entrada no manifesto de afetados.
2026-10-01 19:38:07 -03:00

50 lines
1.3 KiB
TypeScript

import { cleanup, render } from '@testing-library/react'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
const router = vi.hoisted(() => ({ refresh: vi.fn() }))
vi.mock('next/navigation.js', () => ({ useRouter: () => router }))
const livePreview = vi.hoisted(() => ({ mounts: 0 }))
vi.mock('@payloadcms/live-preview-react', () => ({
RefreshRouteOnSave: ({ refresh }: { refresh: () => void }) => {
livePreview.mounts += 1
refresh()
return null
},
}))
import { RefreshRouteOnSave } from '@/components/RefreshRouteOnSave'
const setParentWindow = (value: Window) => {
Object.defineProperty(window, 'parent', { configurable: true, value })
}
afterEach(() => {
cleanup()
setParentWindow(window)
})
beforeEach(() => {
router.refresh.mockReset()
livePreview.mounts = 0
})
describe('RefreshRouteOnSave', () => {
it('does not mount the preview bridge (nor refresh) on a standalone public load', () => {
render(<RefreshRouteOnSave />)
expect(livePreview.mounts).toBe(0)
expect(router.refresh).not.toHaveBeenCalled()
})
it('mounts the bridge and refreshes inside the admin preview iframe', () => {
setParentWindow({} as Window)
render(<RefreshRouteOnSave />)
expect(livePreview.mounts).toBe(1)
expect(router.refresh).toHaveBeenCalledTimes(1)
})
})