import { describe, expect, it } from 'vitest'; import { defaultShanghaiRange, eachShanghaiBuckets, periodMomRatio, previousShanghaiRangeByGrain, shanghaiBucketKey, shanghaiQuarterIndex, shanghaiQuarterRange, } from './dashboard-period'; import { shanghaiYmd } from './shanghai-date'; describe('shanghaiBucketKey', () => { it('周跨年落到周一 2025-12-29', () => { expect(shanghaiBucketKey(new Date('2026-01-02T04:00:00+08:00'), 'week')).toBe('2025-12-29'); }); it('Q4 → Q1 分属两年', () => { expect(shanghaiBucketKey(new Date('2025-12-15T00:00:00+08:00'), 'quarter')).toBe('2025-Q4'); expect(shanghaiBucketKey(new Date('2026-01-02T00:00:00+08:00'), 'quarter')).toBe('2026-Q1'); }); }); describe('eachShanghaiBuckets', () => { it('周跨年包含 2025-12-29 与 2026-01-05', () => { const keys = eachShanghaiBuckets( new Date('2025-12-31T00:00:00+08:00'), new Date('2026-01-06T00:00:00+08:00'), 'week', ).map((b) => b.key); expect(keys).toEqual(['2025-12-29', '2026-01-05']); }); it('季从 Q4 跨到 Q1', () => { const keys = eachShanghaiBuckets( new Date('2025-11-01T00:00:00+08:00'), new Date('2026-02-01T00:00:00+08:00'), 'quarter', ).map((b) => b.key); expect(keys).toEqual(['2025-Q4', '2026-Q1']); }); }); describe('previousShanghaiRangeByGrain', () => { it('日:昨天~今天 的环比是 前天~昨天', () => { const prev = previousShanghaiRangeByGrain( new Date('2026-09-01T00:00:00+08:00'), new Date('2026-09-02T00:00:00+08:00'), 'day', ); expect(shanghaiYmd(prev.from)).toBe('2026-08-31'); expect(shanghaiYmd(prev.to)).toBe('2026-09-01'); }); it('周:整段回退 7 天', () => { const prev = previousShanghaiRangeByGrain( new Date('2026-08-24T00:00:00+08:00'), new Date('2026-09-02T00:00:00+08:00'), 'week', ); expect(shanghaiYmd(prev.from)).toBe('2026-08-17'); expect(shanghaiYmd(prev.to)).toBe('2026-08-26'); }); it('月:整段回退 1 个月', () => { const prev = previousShanghaiRangeByGrain( new Date('2026-08-01T00:00:00+08:00'), new Date('2026-09-02T00:00:00+08:00'), 'month', ); expect(shanghaiYmd(prev.from)).toBe('2026-07-01'); expect(shanghaiYmd(prev.to)).toBe('2026-08-02'); }); }); describe('periodMomRatio', () => { it('上期为 0:本期 0 为 null,本期 > 0 为 1', () => { expect(periodMomRatio(0, 0)).toBeNull(); expect(periodMomRatio(8, 0)).toBe(1); }); it('常规环比', () => { expect(periodMomRatio(12, 10)).toBeCloseTo(0.2); expect(periodMomRatio(8, 10)).toBeCloseTo(-0.2); }); }); describe('shanghaiQuarterRange', () => { it('Q1 为 1/1~4/1(不含)', () => { const { start, endExclusive } = shanghaiQuarterRange(2026, 1); expect(shanghaiYmd(start)).toBe('2026-01-01'); expect(shanghaiYmd(endExclusive)).toBe('2026-04-01'); expect(shanghaiQuarterIndex(start)).toEqual({ year: 2026, quarter: 1 }); }); }); describe('defaultShanghaiRange', () => { it('日:昨天~今天', () => { const r = defaultShanghaiRange('day', new Date('2026-09-02T12:00:00+08:00')); expect(shanghaiYmd(r.from)).toBe('2026-09-01'); expect(shanghaiYmd(r.to)).toBe('2026-09-02'); }); it('周:上周一~今天', () => { const r = defaultShanghaiRange('week', new Date('2026-09-02T12:00:00+08:00')); expect(shanghaiYmd(r.from)).toBe('2026-08-24'); expect(shanghaiYmd(r.to)).toBe('2026-09-02'); }); it('月:上月1日~今天', () => { const r = defaultShanghaiRange('month', new Date('2026-09-02T12:00:00+08:00')); expect(shanghaiYmd(r.from)).toBe('2026-08-01'); expect(shanghaiYmd(r.to)).toBe('2026-09-02'); }); it('季:上季首日~今天', () => { const r = defaultShanghaiRange('quarter', new Date('2026-09-02T12:00:00+08:00')); expect(shanghaiYmd(r.from)).toBe('2026-04-01'); expect(shanghaiYmd(r.to)).toBe('2026-09-02'); }); it('年:去年1月1日~今天', () => { const r = defaultShanghaiRange('year', new Date('2026-09-02T12:00:00+08:00')); expect(shanghaiYmd(r.from)).toBe('2025-01-01'); expect(shanghaiYmd(r.to)).toBe('2026-09-02'); }); });