gongxiangp2/components/department-dashboard/BrandKnowledgeDetail.test.tsx
2026-09-14 16:45:42 +08:00

98 lines
4.4 KiB
TypeScript

import { fireEvent, render, screen, waitFor } from '@testing-library/react'
import BrandKnowledgeDetail from './BrandKnowledgeDetail'
const back = jest.fn()
const replace = jest.fn()
jest.mock('next/navigation', () => ({
useRouter: () => ({ back, replace }),
}))
jest.mock('next-auth/react', () => ({
useSession: () => ({ data: { user: { name: '本地超级管理员' } } }),
signOut: jest.fn(),
}))
const item = {
id: 'knowledge-1',
title: '索菲亚图像影像规范',
knowledgeType: '影像规范',
brand: '索菲亚',
productCategoryName: '衣柜',
fileName: '索菲亚图像影像规范.rar',
mimeType: 'application/vnd.rar',
fileSize: 668886630,
downloadCount: 4,
createdAt: '2026-09-12T10:38:00.000Z',
uploadedBy: '无邪',
downloadUrl: '/api/department-dashboard/brand-knowledge/knowledge-1/file',
previewUrl: '/api/department-dashboard/brand-knowledge/knowledge-1/preview',
previewImageName: 'preview.png',
likeCount: 2,
isLiked: false,
isFavorited: false,
}
describe('BrandKnowledgeDetail', () => {
beforeEach(() => {
jest.clearAllMocks()
window.history.pushState({}, '', '/workspaces/assets/brand-knowledge/knowledge-1')
Object.defineProperty(navigator, 'clipboard', {
configurable: true,
value: { writeText: jest.fn().mockResolvedValue(undefined) },
})
global.fetch = jest.fn().mockImplementation((input: RequestInfo | URL, init?: RequestInit) => {
const url = String(input)
if (url.endsWith('/like') && init?.method === 'PUT') {
return Promise.resolve({ ok: true, json: async () => ({ success: true, liked: true, likeCount: 3 }) } as Response)
}
if (url.endsWith('/favorite') && init?.method === 'PUT') {
return Promise.resolve({ ok: true, json: async () => ({ success: true, isFavorited: true }) } as Response)
}
return Promise.resolve({ ok: true, json: async () => ({ success: true, data: item }) } as Response)
})
})
afterEach(() => { jest.restoreAllMocks() })
test('shows the material-detail layout with the complete knowledge metadata', async () => {
render(<BrandKnowledgeDetail knowledgeId="knowledge-1" />)
expect(await screen.findByRole('heading', { level: 1, name: item.title })).toBeInTheDocument()
expect(screen.getByRole('img', { name: `预览图:${item.title}` })).toHaveClass('object-contain', 'object-center')
expect(screen.getByRole('complementary', { name: '知识文件信息' })).toHaveTextContent('索菲亚')
expect(screen.getByRole('complementary', { name: '知识文件信息' })).toHaveTextContent('衣柜')
expect(screen.getByRole('complementary', { name: '知识文件信息' })).toHaveTextContent('下载次数4')
expect(screen.getByRole('complementary', { name: '知识文件信息' })).toHaveTextContent('点赞数2')
expect(screen.getByRole('link', { name: `立即下载${item.title}` })).toHaveAttribute('href', item.downloadUrl)
})
test('copies the detail link and keeps like and favorite states in sync', async () => {
render(<BrandKnowledgeDetail knowledgeId="knowledge-1" />)
fireEvent.click(await screen.findByRole('button', { name: '分享' }))
await waitFor(() => expect(navigator.clipboard.writeText).toHaveBeenCalledWith(expect.stringMatching(/\/workspaces\/assets\/brand-knowledge\/knowledge-1$/)))
await waitFor(() => expect(screen.getByRole('status')).toHaveTextContent('分享链接已复制'))
fireEvent.click(screen.getByRole('button', { name: '点赞' }))
await waitFor(() => expect(screen.getByRole('button', { name: '已点赞' })).toHaveAttribute('aria-pressed', 'true'))
expect(screen.getByRole('complementary', { name: '知识文件信息' })).toHaveTextContent('点赞数3')
fireEvent.click(screen.getByRole('button', { name: '收藏' }))
await waitFor(() => expect(screen.getByRole('button', { name: '已收藏' })).toHaveAttribute('aria-pressed', 'true'))
})
test('shows a recoverable error state when the item cannot be loaded', async () => {
global.fetch = jest.fn().mockResolvedValue({
ok: false,
json: async () => ({ success: false, error: '知识内容不存在' }),
} as Response)
render(<BrandKnowledgeDetail knowledgeId="missing" />)
expect(await screen.findByRole('heading', { name: '无法打开品牌知识' })).toBeInTheDocument()
expect(screen.getByText('知识内容不存在')).toBeInTheDocument()
expect(screen.getByRole('button', { name: '返回品牌知识库' })).toBeInTheDocument()
})
})