128 lines
4.2 KiB
TypeScript
128 lines
4.2 KiB
TypeScript
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');
|
||
});
|
||
});
|