68 lines
2.0 KiB
TypeScript

import { fireEvent, render, screen, waitFor } from '@testing-library/react'
import { ReleaseNotesDialog } from '../ReleaseNotesDialog'
const pushMock = jest.fn()
jest.mock('next/navigation', () => ({
useRouter: () => ({ push: pushMock }),
}))
const unreadNote = {
id: 'release-1',
title: 'BOM 核算已更新',
summary: '现在可以直接查看自动形成的预估成本。',
audienceLabel: '全体用户',
publishedAt: '2026-08-04T00:00:00.000Z',
acknowledged: false,
}
describe('ReleaseNotesDialog', () => {
const originalFetch = global.fetch
beforeEach(() => {
pushMock.mockReset()
global.fetch = jest.fn(async () => ({
ok: true,
json: async () => ({
success: true,
data: { notes: [unreadNote] },
}),
})) as typeof fetch
})
afterEach(() => {
global.fetch = originalFetch
})
it('把未读更新作为可关闭提醒展示,不阻塞当前工作台', async () => {
render(<ReleaseNotesDialog userId="user-1" />)
const reminder = await screen.findByRole('complementary')
expect(reminder).toBeInTheDocument()
expect(reminder).not.toHaveClass('inset-0')
expect(screen.queryByRole('dialog')).not.toBeInTheDocument()
expect(screen.getByRole('button', { name: '暂不查看' })).toBeInTheDocument()
fireEvent.click(screen.getByRole('button', { name: '暂不查看' }))
await waitFor(() => {
expect(screen.queryByRole('complementary')).not.toBeInTheDocument()
})
})
it('支持用 Esc 暂时关闭提醒,并可跳转到更新页', async () => {
render(<ReleaseNotesDialog userId="user-1" />)
expect(await screen.findByRole('complementary')).toBeInTheDocument()
fireEvent.keyDown(window, { key: 'Escape' })
await waitFor(() => {
expect(screen.queryByRole('complementary')).not.toBeInTheDocument()
})
render(<ReleaseNotesDialog userId="user-2" />)
fireEvent.click(await screen.findByRole('button', { name: '查看更新' }))
expect(pushMock).toHaveBeenCalledWith('/release-notes')
})
})