mirror of
https://wget.la/https://github.com/Wxw-Gu/WechatExplorer
synced 2026-10-03 18:33:14 +08:00
feat: 修复定时日报错误通知微信机器人功能
增加定时日报debug 修复定时日报历史头像显示并区分定时日报标题
This commit is contained in:
@@ -782,6 +782,41 @@ describe('daily report controls', () => {
|
||||
expect(deleteTrigger).toHaveFocus()
|
||||
})
|
||||
|
||||
it('labels scheduled reports and uses the hydrated contact avatar as a fallback', () => {
|
||||
const report: GeneratedReportRecord = {
|
||||
id: 'scheduled-report-history',
|
||||
contactId: groupContact.md5,
|
||||
contactName: groupContact.m_nsNickName,
|
||||
source: 'scheduled',
|
||||
dateRange: '昨日',
|
||||
messageCount: 10,
|
||||
generatedAt: '2026-08-17T10:00:00.000Z',
|
||||
reportDate: '2026-08-16',
|
||||
htmlStatus: 'ready',
|
||||
pngStatus: 'ready'
|
||||
}
|
||||
|
||||
render(
|
||||
<ReportHistorySidebar
|
||||
reports={[report]}
|
||||
contacts={[{ ...groupContact, avatar: 'data:image/png;base64,avatar' }]}
|
||||
selectedReportId={report.id}
|
||||
selfInfo={null}
|
||||
dbReady
|
||||
onSelectReport={vi.fn()}
|
||||
onCreateReport={vi.fn()}
|
||||
onDeleteReport={vi.fn(async () => ({ success: true }))}
|
||||
onOpenSettings={vi.fn()}
|
||||
/>
|
||||
)
|
||||
|
||||
expect(screen.getByText('测试群的定时日报')).toBeVisible()
|
||||
expect(screen.getByRole('img', { name: '测试群的定时日报' })).toHaveAttribute(
|
||||
'src',
|
||||
'data:image/png;base64,avatar'
|
||||
)
|
||||
})
|
||||
|
||||
it('prevents duplicate report deletion, keeps failures open, and closes after success', async () => {
|
||||
const user = userEvent.setup()
|
||||
const report: GeneratedReportRecord = {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { fireEvent, render, screen, waitFor, within } from '@testing-library/react'
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
import { ScheduledReportsWorkspace } from '../../src/renderer/src/components/reports/ScheduledReportsWorkspace'
|
||||
import type { Contact } from '../../src/shared/types'
|
||||
import type { PersonalWechatSendCapability } from '../../src/shared/personal-wechat'
|
||||
@@ -38,6 +38,7 @@ const task = {
|
||||
describe('ScheduledReportsWorkspace', () => {
|
||||
const onNotice = vi.fn()
|
||||
const onOpenWechatSettings = vi.fn()
|
||||
const onOpenAgentHub = vi.fn()
|
||||
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks()
|
||||
@@ -45,23 +46,37 @@ describe('ScheduledReportsWorkspace', () => {
|
||||
configurable: true,
|
||||
value: {
|
||||
getPersonalWechatSendCapability: vi.fn(async () => capability('ready')),
|
||||
getScheduledReportNotificationSettings: vi.fn(async () => ({ enabled: false })),
|
||||
setScheduledReportNotificationEnabled: vi.fn(async (enabled: boolean) => ({
|
||||
success: true,
|
||||
data: { enabled }
|
||||
})),
|
||||
listScheduledReports: vi.fn(async () => [task]),
|
||||
listScheduledReportExecutions: vi.fn(async () => []),
|
||||
createScheduledReport: vi.fn(async () => ({ success: true, data: task })),
|
||||
updateScheduledReport: vi.fn(async () => ({ success: true, data: task })),
|
||||
deleteScheduledReport: vi.fn(async () => ({ success: true, data: { deletedId: task.id } })),
|
||||
setScheduledReportEnabled: vi.fn(async () => ({ success: true, data: task })),
|
||||
runScheduledReportNow: vi.fn(async () => ({ success: true, data: { status: 'success' } }))
|
||||
runScheduledReportNow: vi.fn(async () => ({ success: true, data: { status: 'success' } })),
|
||||
testScheduledReportErrorNotification: vi.fn(async () => ({
|
||||
success: true,
|
||||
data: { status: 'failed', notificationStatus: 'sent' }
|
||||
}))
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
afterEach(() => {
|
||||
vi.unstubAllEnvs()
|
||||
})
|
||||
|
||||
it('loads capability and renders a scheduled report task', async () => {
|
||||
render(
|
||||
<ScheduledReportsWorkspace
|
||||
contacts={[group]}
|
||||
onNotice={onNotice}
|
||||
onOpenWechatSettings={onOpenWechatSettings}
|
||||
onOpenAgentHub={onOpenAgentHub}
|
||||
/>
|
||||
)
|
||||
expect(screen.getByText('正在检查微信发送能力…')).toBeInTheDocument()
|
||||
@@ -70,7 +85,7 @@ describe('ScheduledReportsWorkspace', () => {
|
||||
expect(screen.getByText('每天 09:00')).toBeVisible()
|
||||
})
|
||||
|
||||
it('disables creation and offers settings when WeChat is unsupported', async () => {
|
||||
it('keeps creation available and offers settings when WeChat is unsupported', async () => {
|
||||
vi.mocked(window.api.getPersonalWechatSendCapability).mockResolvedValue(
|
||||
capability('unsupported')
|
||||
)
|
||||
@@ -79,12 +94,13 @@ describe('ScheduledReportsWorkspace', () => {
|
||||
contacts={[group]}
|
||||
onNotice={onNotice}
|
||||
onOpenWechatSettings={onOpenWechatSettings}
|
||||
onOpenAgentHub={onOpenAgentHub}
|
||||
/>
|
||||
)
|
||||
await waitFor(() =>
|
||||
expect(screen.getByText('微信消息发送目前仅支持 macOS 和 Windows')).toBeVisible()
|
||||
)
|
||||
expect(screen.getByRole('button', { name: /新建定时日报/ })).toBeDisabled()
|
||||
expect(screen.getByRole('button', { name: /新建定时日报/ })).toBeEnabled()
|
||||
})
|
||||
|
||||
it('opens the shared dialog and creates a task', async () => {
|
||||
@@ -94,6 +110,7 @@ describe('ScheduledReportsWorkspace', () => {
|
||||
contacts={[group]}
|
||||
onNotice={onNotice}
|
||||
onOpenWechatSettings={onOpenWechatSettings}
|
||||
onOpenAgentHub={onOpenAgentHub}
|
||||
/>
|
||||
)
|
||||
await waitFor(() => expect(screen.getByText('还没有定时日报')).toBeVisible())
|
||||
@@ -110,4 +127,71 @@ describe('ScheduledReportsWorkspace', () => {
|
||||
)
|
||||
)
|
||||
})
|
||||
|
||||
it('keeps the notification switch off by default and loads the persisted setting', async () => {
|
||||
render(
|
||||
<ScheduledReportsWorkspace
|
||||
contacts={[group]}
|
||||
onNotice={onNotice}
|
||||
onOpenWechatSettings={onOpenWechatSettings}
|
||||
onOpenAgentHub={onOpenAgentHub}
|
||||
/>
|
||||
)
|
||||
|
||||
const notificationSwitch = screen.getByRole('switch', { name: '微信异常通知' })
|
||||
await waitFor(() => expect(notificationSwitch).toHaveAttribute('aria-checked', 'false'))
|
||||
expect(window.api.getScheduledReportNotificationSettings).toHaveBeenCalledOnce()
|
||||
})
|
||||
|
||||
it('restores the switch off and offers Agent Hub when enabling fails', async () => {
|
||||
vi.mocked(window.api.setScheduledReportNotificationEnabled).mockResolvedValue({
|
||||
success: false,
|
||||
data: { enabled: false },
|
||||
reason: 'agent_hub_offline',
|
||||
error: '需要先连接 Agent Hub 微信机器人,才能接收异常通知。'
|
||||
})
|
||||
render(
|
||||
<ScheduledReportsWorkspace
|
||||
contacts={[group]}
|
||||
onNotice={onNotice}
|
||||
onOpenWechatSettings={onOpenWechatSettings}
|
||||
onOpenAgentHub={onOpenAgentHub}
|
||||
/>
|
||||
)
|
||||
|
||||
await waitFor(() => expect(screen.getByText('微信异常通知')).toBeVisible())
|
||||
fireEvent.click(screen.getByRole('switch', { name: '微信异常通知' }))
|
||||
await waitFor(() =>
|
||||
expect(screen.getByText('需要先连接 Agent Hub 微信机器人,才能接收异常通知。')).toBeVisible()
|
||||
)
|
||||
expect(screen.getByRole('switch', { name: '微信异常通知' })).toHaveAttribute(
|
||||
'aria-checked',
|
||||
'false'
|
||||
)
|
||||
fireEvent.click(screen.getByRole('button', { name: '前往 Agent Hub' }))
|
||||
expect(onOpenAgentHub).toHaveBeenCalledOnce()
|
||||
})
|
||||
|
||||
it('shows the debug notification action only when enabled and sends the test request', async () => {
|
||||
vi.stubEnv('VITE_SCHEDULED_REPORT_DEBUG', 'true')
|
||||
render(
|
||||
<ScheduledReportsWorkspace
|
||||
contacts={[group]}
|
||||
onNotice={onNotice}
|
||||
onOpenWechatSettings={onOpenWechatSettings}
|
||||
onOpenAgentHub={onOpenAgentHub}
|
||||
/>
|
||||
)
|
||||
|
||||
await waitFor(() => expect(screen.getByText(task.name)).toBeVisible())
|
||||
fireEvent.click(screen.getByRole('button', { name: '测试错误信息发送' }))
|
||||
|
||||
await waitFor(() =>
|
||||
expect(window.api.testScheduledReportErrorNotification).toHaveBeenCalledWith(task.id)
|
||||
)
|
||||
expect(onNotice).toHaveBeenCalledWith(
|
||||
'测试错误信息已发送到 Agent Hub 微信通知接收者',
|
||||
'success'
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user