Files
a-share-analysis/web/src/views/market-overview/useMarketOverview.test.ts
T

78 lines
2.7 KiB
TypeScript

import { describe, expect, it, vi } from 'vitest';
import { useMarketOverview } from './useMarketOverview';
const response = {
source: 'tdx',
status: 'fresh',
data: null,
snapshotId: '20260818-101500',
asOf: '2026-08-18T10:15:00+08:00',
warnings: [],
} as const;
describe('市场概览状态', () => {
it('并行加载五个模块,一个模块失败不影响其他模块', async () => {
const api = {
getSummary: vi.fn().mockResolvedValue(response),
getIndices: vi.fn().mockRejectedValue(new Error('failed')),
getBreadth: vi.fn().mockResolvedValue(response),
getSectors: vi.fn().mockResolvedValue(response),
getFunds: vi.fn().mockResolvedValue(response),
getSectorRankings: vi.fn().mockResolvedValue(response),
getCapitalFlow: vi.fn().mockResolvedValue(response),
getTurnoverTrend: vi.fn().mockResolvedValue(response),
getShortTermEmotion: vi.fn().mockResolvedValue(response),
getShortTermConclusion: vi.fn().mockResolvedValue(response),
};
const state = useMarketOverview(api);
await state.refresh();
expect(state.summary.value.status).toBe('ready');
expect(state.indices.value.status).toBe('error');
expect(state.breadth.value.status).toBe('ready');
expect(state.isLoading.value).toBe(false);
expect(state.shortTermEmotion.value.status).toBe('ready');
expect(state.shortTermConclusion.value.status).toBe('ready');
expect(state.sectorRankings.value.status).toBe('ready');
expect(state.capitalFlow.value.status).toBe('ready');
expect(state.turnoverTrend.value.status).toBe('ready');
});
it('分析偏好写入本地存储并可恢复', () => {
const first = useMarketOverview({} as never);
first.setAnalysisHorizon('短线');
first.setAnalysisEngine('混合');
const second = useMarketOverview({} as never);
expect(second.analysisHorizon.value).toBe('短线');
expect(second.analysisEngine.value).toBe('混合');
});
it('切换行业结构分类时重新请求对应数据', async () => {
const api = {
getSectorRankings: vi.fn().mockResolvedValue(response),
getCapitalFlow: vi.fn().mockResolvedValue(response),
};
const state = useMarketOverview(api as never);
await state.refreshSectorRankings('concept');
await state.refreshCapitalFlow('board');
expect(api.getSectorRankings).toHaveBeenCalledWith({
category: 'concept',
sort: 'rise',
limit: 10,
});
expect(api.getCapitalFlow).toHaveBeenCalledWith({
category: 'board',
sort: 'inflow',
limit: 10,
});
expect(state.sectorCategory.value).toBe('concept');
expect(state.capitalFlowCategory.value).toBe('board');
});
});