mirror of
https://wget.la/https://github.com/Wxw-Gu/WechatExplorer
synced 2026-10-03 18:33:14 +08:00
chore: 提升版本 整理文档
整理档案首页按钮
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
import { render, screen, waitFor } from '@testing-library/react'
|
||||
import { render, screen } from '@testing-library/react'
|
||||
import userEvent from '@testing-library/user-event'
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
import { ChatHeader } from '../../src/renderer/src/components/chat/ChatHeader'
|
||||
import { TooltipProvider } from '../../src/renderer/src/components/ui'
|
||||
import { type GroupMemberStatsResult } from '../../src/shared/group-stats'
|
||||
import type { Contact } from '../../src/shared/types'
|
||||
|
||||
const groupContact: Contact = {
|
||||
@@ -19,9 +20,38 @@ const userContact: Contact = {
|
||||
type: 'user'
|
||||
}
|
||||
|
||||
/** 时区无关:用本地字段构造,别写死 UTC 偏移。 */
|
||||
const at = (year: number, month: number, day: number): number =>
|
||||
new Date(year, month - 1, day).getTime()
|
||||
|
||||
const statsResult = (): GroupMemberStatsResult => ({
|
||||
conversationId: groupContact.md5,
|
||||
startTime: at(2026, 6, 15),
|
||||
endTime: at(2026, 9, 4),
|
||||
freshness: 'fresh',
|
||||
complete: true,
|
||||
memberCount: 2,
|
||||
activeMemberCount: 1,
|
||||
silentMemberCount: 1,
|
||||
activeMembers: [
|
||||
{
|
||||
senderId: 'wxid_a',
|
||||
displayName: '张三',
|
||||
groupNickname: '老张',
|
||||
messageCount: 12,
|
||||
lastMessageTime: at(2026, 9, 1)
|
||||
}
|
||||
],
|
||||
silentMembers: [{ senderId: 'wxid_b', displayName: '李四', groupNickname: '' }],
|
||||
unattributedMessages: 0,
|
||||
excludedSystemMessages: 0,
|
||||
firstMessageTime: at(2026, 6, 15),
|
||||
limitations: []
|
||||
})
|
||||
|
||||
beforeEach(() => {
|
||||
;(window as unknown as { api: Record<string, unknown> }).api = {
|
||||
getGroupMemberStats: vi.fn(),
|
||||
getGroupMemberStats: vi.fn().mockResolvedValue(statsResult()),
|
||||
getPersonalWechatSenderStatus: vi.fn().mockResolvedValue({ canSendText: false })
|
||||
}
|
||||
})
|
||||
@@ -44,22 +74,30 @@ function renderHeader(contact: Contact, isGroupChat: boolean): void {
|
||||
)
|
||||
}
|
||||
|
||||
async function openMoreMenu(): Promise<void> {
|
||||
const user = userEvent.setup()
|
||||
await user.click(screen.getByRole('button', { name: '更多功能' }))
|
||||
await waitFor(() => expect(screen.getByText('刷新数据')).toBeTruthy())
|
||||
}
|
||||
|
||||
describe('ChatHeader · 群发言统计入口', () => {
|
||||
it('群聊显示「群发言统计」入口', async () => {
|
||||
it('群聊把「群发言统计」做成直接按钮,不再藏在「更多功能」下拉里', () => {
|
||||
renderHeader(groupContact, true)
|
||||
await openMoreMenu()
|
||||
expect(screen.getByText('群发言统计')).toBeTruthy()
|
||||
|
||||
// 旧入口连同「刷新数据」一起下线,不能再回来。
|
||||
expect(screen.queryByRole('button', { name: '更多功能' })).toBeNull()
|
||||
expect(screen.queryByRole('menuitem', { name: '刷新数据' })).toBeNull()
|
||||
|
||||
// 是普通按钮,不是菜单触发器 —— 点了就该开面板,不该弹下拉。
|
||||
expect(screen.getByRole('button', { name: '群发言统计' })).not.toHaveAttribute('aria-haspopup')
|
||||
})
|
||||
|
||||
it('非群聊不显示「群发言统计」入口', async () => {
|
||||
it('点击入口直接打开群发言统计面板', async () => {
|
||||
const user = userEvent.setup()
|
||||
renderHeader(groupContact, true)
|
||||
|
||||
await user.click(screen.getByRole('button', { name: '群发言统计' }))
|
||||
|
||||
expect(await screen.findByRole('dialog', { name: '群发言统计 · 研发群' })).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('非群聊不显示「群发言统计」入口', () => {
|
||||
renderHeader(userContact, false)
|
||||
await openMoreMenu()
|
||||
expect(screen.queryByText('群发言统计')).toBeNull()
|
||||
|
||||
expect(screen.queryByRole('button', { name: '群发言统计' })).toBeNull()
|
||||
})
|
||||
})
|
||||
|
||||
@@ -34,37 +34,6 @@ describe('chat menus', () => {
|
||||
expect(trigger).toHaveFocus()
|
||||
})
|
||||
|
||||
it('closes the chat More menu with Escape and invokes refresh data once', async () => {
|
||||
const user = userEvent.setup()
|
||||
const onRefreshData = vi.fn()
|
||||
renderWithTooltip(
|
||||
<ChatHeader
|
||||
contact={contact}
|
||||
isGroupChat
|
||||
loadedCount={3}
|
||||
filteredCount={3}
|
||||
contentFilter=""
|
||||
isAiLoading={false}
|
||||
onContentFilterChange={vi.fn()}
|
||||
onRefresh={vi.fn()}
|
||||
onRefreshData={onRefreshData}
|
||||
onTestSend={vi.fn()}
|
||||
onOpenAiSettings={vi.fn()}
|
||||
/>
|
||||
)
|
||||
|
||||
const trigger = screen.getByRole('button', { name: '更多功能' })
|
||||
await user.click(trigger)
|
||||
expect(screen.getByRole('menuitem', { name: '刷新数据' })).toBeVisible()
|
||||
await user.keyboard('{Escape}')
|
||||
expect(screen.queryByRole('menuitem', { name: '刷新数据' })).not.toBeInTheDocument()
|
||||
expect(trigger).toHaveFocus()
|
||||
|
||||
await user.click(trigger)
|
||||
await user.click(screen.getByRole('menuitem', { name: '刷新数据' }))
|
||||
expect(onRefreshData).toHaveBeenCalledOnce()
|
||||
})
|
||||
|
||||
it('keeps header search and actions wired to their existing callbacks', async () => {
|
||||
const user = userEvent.setup()
|
||||
const onContentFilterChange = vi.fn()
|
||||
@@ -80,7 +49,6 @@ describe('chat menus', () => {
|
||||
isAiLoading={false}
|
||||
onContentFilterChange={onContentFilterChange}
|
||||
onRefresh={onRefresh}
|
||||
onRefreshData={vi.fn()}
|
||||
onTestSend={vi.fn()}
|
||||
onOpenAiSettings={onOpenAiSettings}
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user