98 lines
4.4 KiB
TypeScript
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()
|
|
})
|
|
})
|