fix: tighten ci typecheck coverage

This commit is contained in:
Cita
2026-03-23 16:02:13 +08:00
parent 40c8c1c7ad
commit 4b903fdd3b
69 changed files with 335 additions and 222 deletions
@@ -42,7 +42,7 @@ describe('ModelAnalysisPanel token summaries', () => {
});
it('renders total token summaries with compact units', () => {
let root: ReturnType<typeof create> | null = null;
let root!: WebTestRenderer;
act(() => {
root = create(
@@ -70,10 +70,10 @@ describe('ModelAnalysisPanel token summaries', () => {
globalThis.document = {
documentElement: {},
} as unknown as Document;
delete (globalThis as typeof globalThis & { getComputedStyle?: typeof getComputedStyle }).getComputedStyle;
delete (globalThis as typeof globalThis & { MutationObserver?: typeof MutationObserver }).MutationObserver;
Reflect.deleteProperty(globalThis as typeof globalThis & Record<string, unknown>, 'getComputedStyle');
Reflect.deleteProperty(globalThis as typeof globalThis & Record<string, unknown>, 'MutationObserver');
let root: ReturnType<typeof create> | null = null;
let root!: WebTestRenderer;
await expect(act(async () => {
root = create(
+1 -1
View File
@@ -7,7 +7,7 @@ import CenteredModal from './CenteredModal.js';
describe('CenteredModal component', () => {
it('does not close on backdrop click by default and exposes an explicit close button', async () => {
const onClose = vi.fn();
let root: ReturnType<typeof create> | null = null;
let root!: WebTestRenderer;
try {
await act(async () => {
@@ -17,8 +17,8 @@ describe('SiteDistributionChart', () => {
getAttribute: vi.fn(),
},
} as unknown as Document;
delete (globalThis as typeof globalThis & { getComputedStyle?: typeof getComputedStyle }).getComputedStyle;
delete (globalThis as typeof globalThis & { MutationObserver?: typeof MutationObserver }).MutationObserver;
Reflect.deleteProperty(globalThis as typeof globalThis & Record<string, unknown>, 'getComputedStyle');
Reflect.deleteProperty(globalThis as typeof globalThis & Record<string, unknown>, 'MutationObserver');
});
afterEach(() => {
@@ -28,7 +28,7 @@ describe('SiteDistributionChart', () => {
});
it('renders with fallback label color when browser theme APIs are unavailable', async () => {
let renderer: ReturnType<typeof create> | null = null;
let renderer!: WebTestRenderer;
await expect(act(async () => {
renderer = create(
@@ -46,6 +46,6 @@ describe('SiteDistributionChart', () => {
);
})).resolves.toBeUndefined();
renderer?.unmount();
renderer.unmount();
});
});
@@ -17,6 +17,10 @@ interface SiteDistributionChartProps {
type ViewMode = 'balance' | 'spend';
function coerceDatumRecord(datum: unknown): Record<string, unknown> {
return datum && typeof datum === 'object' ? datum as Record<string, unknown> : {};
}
function safeNumber(value: unknown): number {
if (typeof value !== 'number' || Number.isNaN(value) || !Number.isFinite(value)) return 0;
return value;
@@ -120,24 +124,32 @@ export default function SiteDistributionChart({ data, loading }: SiteDistributio
mark: {
content: [
{
key: (datum: Record<string, unknown>) => datum.siteName as string,
value: (datum: Record<string, unknown>) => {
const val = safeNumber(datum.value);
key: (datum: unknown) => {
const item = coerceDatumRecord(datum);
return String(item.siteName || '-');
},
value: (datum: unknown) => {
const item = coerceDatumRecord(datum);
const val = safeNumber(item.value);
return `$${val.toFixed(2)}`;
},
},
{
key: '占比',
value: (datum: Record<string, unknown>) => {
const pct = datum._percent_ as number;
value: (datum: unknown) => {
const item = coerceDatumRecord(datum);
const pct = safeNumber(item._percent_);
return `${safeNumber(pct).toFixed(1)}%`;
},
},
{
key: '账户数',
value: (datum: Record<string, unknown>) => `${datum.accountCount}`,
value: (datum: unknown) => {
const item = coerceDatumRecord(datum);
return String(item.accountCount || 0);
},
},
],
] as any,
},
},
color: PIE_COLORS,
+1 -1
View File
@@ -11,7 +11,7 @@ vi.mock('react-dom', () => ({
describe('MobileDrawer', () => {
it('renders content, locks body scroll, and exposes explicit close affordances', async () => {
const onClose = vi.fn();
let root: ReturnType<typeof create> | null = null;
let root!: WebTestRenderer;
vi.stubGlobal('document', {
body: {
style: {
@@ -92,7 +92,7 @@ describe('SearchModal results', () => {
});
const onClose = vi.fn();
let root: ReturnType<typeof create> | null = null;
let root!: WebTestRenderer;
try {
await act(async () => {
root = create(
+7 -7
View File
@@ -22,7 +22,7 @@ describe('useIsMobile', () => {
removeEventListener: (event: string, handler: () => void) => {
listeners.get(event)?.delete(handler);
},
dispatchEvent: (event: { type: string }) => {
dispatchEvent: (event: Event) => {
listeners.get(event.type)?.forEach((handler) => handler());
return true;
},
@@ -39,7 +39,7 @@ describe('useIsMobile', () => {
innerWidth: 767,
});
let root: ReturnType<typeof create> | null = null;
let root!: WebTestRenderer;
try {
await act(async () => {
@@ -66,7 +66,7 @@ describe('useIsMobile', () => {
}),
});
let root: ReturnType<typeof create> | null = null;
let root!: WebTestRenderer;
try {
await act(async () => {
@@ -84,7 +84,7 @@ describe('useIsMobile', () => {
});
it('treats 767 and 768 as mobile, but 769 as desktop', async () => {
let root: ReturnType<typeof create> | null = null;
let root!: WebTestRenderer;
try {
await act(async () => {
@@ -97,7 +97,7 @@ describe('useIsMobile', () => {
widthRef.current = 767;
window.innerWidth = 767;
await act(async () => {
window.dispatchEvent({ type: 'resize' });
window.dispatchEvent(new Event('resize'));
});
expect(root.root.findByType('div').props['data-mobile']).toBe('true');
@@ -105,7 +105,7 @@ describe('useIsMobile', () => {
widthRef.current = 768;
window.innerWidth = 768;
await act(async () => {
window.dispatchEvent({ type: 'resize' });
window.dispatchEvent(new Event('resize'));
});
expect(root.root.findByType('div').props['data-mobile']).toBe('true');
@@ -113,7 +113,7 @@ describe('useIsMobile', () => {
widthRef.current = 769;
window.innerWidth = 769;
await act(async () => {
window.dispatchEvent({ type: 'resize' });
window.dispatchEvent(new Event('resize'));
});
expect(root.root.findByType('div').props['data-mobile']).toBe('false');