68 lines
2.0 KiB
TypeScript
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')
|
|
})
|
|
})
|