76 lines
2.0 KiB
TypeScript
76 lines
2.0 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
||
import type { CourtSummary, MonitorAlert, MonitorTask } from '../shared/contracts'
|
||
import { createMonitorMenuBarModel } from './menuBarModel'
|
||
|
||
const court: CourtSummary = {
|
||
id: 'test-court',
|
||
name: '测试球场',
|
||
shortName: '测试',
|
||
accent: '#123456',
|
||
status: 'online'
|
||
}
|
||
|
||
function task(overrides: Partial<MonitorTask> = {}): MonitorTask {
|
||
return {
|
||
id: 'task-1',
|
||
courtId: court.id,
|
||
startTime: '08:00',
|
||
endTime: '10:00',
|
||
enabled: true,
|
||
createdAt: '2026-07-16T00:00:00.000Z',
|
||
availableCount: 0,
|
||
stats: {
|
||
totalChecks: 0,
|
||
successfulChecks: 0,
|
||
partialFailureChecks: 0,
|
||
failedChecks: 0,
|
||
alertsSent: 0,
|
||
availableObservations: 0
|
||
},
|
||
autoBooking: { enabled: false, status: 'disabled', attemptCount: 0 },
|
||
...overrides
|
||
}
|
||
}
|
||
|
||
function alert(taskId = 'task-1'): MonitorAlert {
|
||
return {
|
||
taskId,
|
||
courtId: court.id,
|
||
targetDate: '2026-07-17',
|
||
startTime: '08:00',
|
||
endTime: '10:00',
|
||
slotLabels: ['1 号场 08:00–10:00'],
|
||
occurredAt: '2026-07-16T01:00:00.000Z'
|
||
}
|
||
}
|
||
|
||
describe('createMonitorMenuBarModel', () => {
|
||
it('汇总运行任务、未读提醒和空场状态', () => {
|
||
const model = createMonitorMenuBarModel(
|
||
[task({ availableCount: 2 }), task({ id: 'task-2', enabled: false })],
|
||
[court],
|
||
[alert()]
|
||
)
|
||
|
||
expect(model.summary).toBe('2 个任务 · 1 个运行中')
|
||
expect(model.unreadSummary).toBe('1 条空场提醒待查看')
|
||
expect(model.tasks[0]).toMatchObject({
|
||
label: '测试球场 · 未来 7 天 · 08:00–10:00',
|
||
status: '发现 2 个完整空场',
|
||
hasUnreadAlert: true
|
||
})
|
||
expect(model.tasks[1]?.status).toBe('已暂停')
|
||
})
|
||
|
||
it('优先展示监控异常', () => {
|
||
const model = createMonitorMenuBarModel(
|
||
[task({ availableCount: 3, lastError: '网络失败' })],
|
||
[court],
|
||
[]
|
||
)
|
||
|
||
expect(model.tasks[0]?.status).toBe('检查异常 · 网络失败')
|
||
expect(model.unreadSummary).toBe('暂无未读空场提醒')
|
||
})
|
||
})
|