fix(FEAT-MO-001): 修复交易日对齐与延迟状态

This commit is contained in:
2026-08-18 20:12:26 +08:00
parent 49f6be9c43
commit 7e4dcd9232
15 changed files with 396 additions and 58 deletions
@@ -95,13 +95,30 @@ describe('市场概览服务', () => {
);
});
it('核心指数交易日旧于上海当前日期时标记 delayed', async () => {
vi.useFakeTimers();
vi.setSystemTime(new Date('2026-08-19T03:00:00.000Z'));
try {
const client = { request: vi.fn().mockResolvedValue(indexResult) };
const service = new MarketOverviewService(client);
const response = await service.getIndices();
expect(response.status).toBe('delayed');
expect(response.warnings).toEqual(['核心指数交易日期为 20260818,非当前日期']);
} finally {
vi.useRealTimers();
}
});
it('汇总三个市场指数的上涨和下跌家数并保留未知平盘数', async () => {
const client = {
request: vi
.fn()
.mockResolvedValueOnce(breadthSnapshot('10', '5'))
.mockResolvedValueOnce(breadthSnapshot('20', '15'))
.mockResolvedValueOnce(breadthSnapshot('3', '2')),
.mockResolvedValueOnce(breadthSnapshot('3', '2'))
.mockResolvedValueOnce(indexResult),
};
const service = new MarketOverviewService(client);
@@ -124,7 +141,8 @@ describe('市场概览服务', () => {
.fn()
.mockResolvedValueOnce(breadthSnapshot('10', '5'))
.mockResolvedValueOnce({ ErrorId: '0', UpHome: '', DownHome: '3' })
.mockRejectedValueOnce(new Error('raw network detail')),
.mockRejectedValueOnce(new Error('raw network detail'))
.mockResolvedValueOnce(indexResult),
};
const service = new MarketOverviewService(client);
@@ -138,6 +156,31 @@ describe('市场概览服务', () => {
expect(response.warnings.join(' ')).not.toContain('raw network detail');
});
it('市场宽度使用核心指数交易日识别 delayed,不把旧快照标为 fresh', async () => {
vi.useFakeTimers();
vi.setSystemTime(new Date('2026-08-18T03:00:00.000Z'));
try {
const staleIndexResult = structuredClone(indexResult);
staleIndexResult.Value['000001.SH'].Date = ['20260816', '20260817'];
const client = {
request: vi
.fn()
.mockResolvedValueOnce(breadthSnapshot('10', '5'))
.mockResolvedValueOnce(breadthSnapshot('20', '15'))
.mockResolvedValueOnce(breadthSnapshot('3', '2'))
.mockResolvedValueOnce(staleIndexResult),
};
const service = new MarketOverviewService(client);
const response = await service.getBreadth();
expect(response.status).toBe('delayed');
expect(response.warnings).toEqual(['市场宽度交易日期为 20260817,非当前日期']);
} finally {
vi.useRealTimers();
}
});
it('按一级行业涨跌幅排序板块并保留 TDX 代码', async () => {
const client = {
request: vi.fn().mockResolvedValueOnce(sectorResult).mockResolvedValueOnce(sectorKlineResult),
@@ -202,6 +245,44 @@ describe('市场概览服务', () => {
expect(response.data?.items[0].name).toBe('行业8');
});
it('一级行业混合交易日时返回 partial,不把不同日期误标 fresh', async () => {
const mixedDates = structuredClone(sectorKlineResult);
mixedDates.Value['881355.SH'].Date = ['20260818', '20260819'];
const client = {
request: vi.fn().mockResolvedValueOnce(sectorResult).mockResolvedValueOnce(mixedDates),
};
const service = new MarketOverviewService(client);
const response = await service.getSectors();
expect(response).toMatchObject({
status: 'partial',
data: { items: [expect.objectContaining({ code: '881355.SH', tradeDate: '20260819' })] },
});
expect(response.warnings).toEqual(['部分一级行业未返回有效行情']);
});
it('一级行业交易日旧于上海当前日期时标记 delayed', async () => {
vi.useFakeTimers();
vi.setSystemTime(new Date('2026-08-19T03:00:00.000Z'));
try {
const client = {
request: vi
.fn()
.mockResolvedValueOnce(sectorResult)
.mockResolvedValueOnce(sectorKlineResult),
};
const service = new MarketOverviewService(client);
const response = await service.getSectors();
expect(response.status).toBe('delayed');
expect(response.warnings).toEqual(['一级行业交易日期为 20260818,非当前日期']);
} finally {
vi.useRealTimers();
}
});
it('按交易所指数成交额计算亿元级趋势而不宣称主力净流入', async () => {
const client = { request: vi.fn().mockResolvedValue(turnoverResult) };
const service = new MarketOverviewService(client);
@@ -238,4 +319,20 @@ describe('市场概览服务', () => {
});
expect(response.warnings).toEqual(['部分市场成交额不可用,当前汇总 2 个市场']);
});
it('成交额交易日旧于上海当前日期时标记 delayed', async () => {
vi.useFakeTimers();
vi.setSystemTime(new Date('2026-08-19T03:00:00.000Z'));
try {
const client = { request: vi.fn().mockResolvedValue(turnoverResult) };
const service = new MarketOverviewService(client);
const response = await service.getFunds();
expect(response.status).toBe('delayed');
expect(response.warnings).toEqual(['成交额交易日期为 20260818,非当前日期']);
} finally {
vi.useRealTimers();
}
});
});