Files
dukang/packages/domain/src/dashboard-period.test.ts
T
jacy 68a4b7f984
CI / verify (pull_request) Has been cancelled
v4.0.14概览和日报
2026-09-02 21:11:58 +08:00

128 lines
4.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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/14/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');
});
});