- Extract PublicSettingsInjectionPayload named struct with drift test - Add channel_monitor_default_interval_seconds to SSR injection - Add image_output_price to SupportedModelChip - Simplify AppSidebar buildSelfNavItems (admins see available channels) - Add gateway WARN logs for 503 no-available-accounts branches - Wire ChannelMonitorRunner into provideCleanup for graceful shutdown - Add migrations 130/131 (CC template userid fix + mimicry field cleanup) - Clean up fork-only features (sora, claude max simulation, client affinity) - Remove ~320 obsolete i18n keys - Add codexUsage utility, WechatServiceButton, BulkEditAccountModal - Tidy go.sum
62 lines
1.8 KiB
TypeScript
62 lines
1.8 KiB
TypeScript
/**
|
|
* Vitest 测试环境设置
|
|
* 提供全局 mock 和测试工具
|
|
*/
|
|
import { config } from '@vue/test-utils'
|
|
import { vi } from 'vitest'
|
|
|
|
// Mock requestIdleCallback (Safari < 15 不支持)
|
|
if (typeof globalThis.requestIdleCallback === 'undefined') {
|
|
globalThis.requestIdleCallback = ((callback: IdleRequestCallback) => {
|
|
return window.setTimeout(() => callback({ didTimeout: false, timeRemaining: () => 50 }), 1)
|
|
}) as unknown as typeof requestIdleCallback
|
|
}
|
|
|
|
if (typeof globalThis.cancelIdleCallback === 'undefined') {
|
|
globalThis.cancelIdleCallback = ((id: number) => {
|
|
window.clearTimeout(id)
|
|
}) as unknown as typeof cancelIdleCallback
|
|
}
|
|
|
|
// Mock IntersectionObserver
|
|
class MockIntersectionObserver {
|
|
observe = vi.fn()
|
|
disconnect = vi.fn()
|
|
unobserve = vi.fn()
|
|
}
|
|
|
|
globalThis.IntersectionObserver = MockIntersectionObserver as unknown as typeof IntersectionObserver
|
|
|
|
// Mock ResizeObserver
|
|
class MockResizeObserver {
|
|
observe = vi.fn()
|
|
disconnect = vi.fn()
|
|
unobserve = vi.fn()
|
|
}
|
|
|
|
globalThis.ResizeObserver = MockResizeObserver as unknown as typeof ResizeObserver
|
|
|
|
// Mock matchMedia (jsdom doesn't implement it).
|
|
// Default matches=true so desktop viewport queries pass and components that
|
|
// only lazy-load on mobile render content immediately in tests.
|
|
if (typeof window !== 'undefined' && !window.matchMedia) {
|
|
window.matchMedia = (query: string): MediaQueryList => ({
|
|
matches: true,
|
|
media: query,
|
|
onchange: null,
|
|
addListener: vi.fn(),
|
|
removeListener: vi.fn(),
|
|
addEventListener: vi.fn(),
|
|
removeEventListener: vi.fn(),
|
|
dispatchEvent: vi.fn()
|
|
}) as MediaQueryList
|
|
}
|
|
|
|
// Vue Test Utils 全局配置
|
|
config.global.stubs = {
|
|
// 可以在这里添加全局 stub
|
|
}
|
|
|
|
// 设置全局测试超时
|
|
vi.setConfig({ testTimeout: 10000 })
|