39 lines
2.9 KiB
TypeScript
39 lines
2.9 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { turnoverChart, turnoverNumber, volumeText, windowText, turnoverReasonsText, volumeNote } from './turnoverPresentation'
|
|
import type { TurnoverCharts, TurnoverWindowMetric } from './turnoverTypes'
|
|
describe('turnover honest precision and charts', () => {
|
|
it('keeps unknown volume distinct from zero and labels historical volume as estimated', () => {
|
|
const value = { value: null, knownSubtotal: 0, missingDimensionQuantity: 15, missingDimensionSkuCount: 2, unknownQuantitySkuCount: 1, declaredDimensionQuantity: 0, reasonCodes: [] }
|
|
expect(volumeNote(value)).toContain('已知小计 0 m³')
|
|
expect(volumeNote(value)).toContain('缺尺寸 2 SKU / 15 件')
|
|
expect(volumeNote(value)).toContain('数量待确认 1 SKU')
|
|
expect(volumeNote({ ...value, value: 0, missingDimensionSkuCount: 0, unknownQuantitySkuCount: 0 })).toBe('已知体积为0')
|
|
expect(volumeNote(value, true)).toContain('按当前商品尺寸估算')
|
|
})
|
|
it('explains missing samples and zero average stock without exposing internal statuses', () => {
|
|
expect(turnoverReasonsText(['INSUFFICIENT'])).toBe('合格日末库存记录不足')
|
|
expect(turnoverReasonsText(['ZERO_AVERAGE_STOCK'])).toContain('期间平均日末库存为0')
|
|
expect(turnoverReasonsText(['INVENTORY_UNKNOWN_OR_STALE'])).toContain('已过期')
|
|
})
|
|
it('keeps tiny positive values distinct from zero and unknown', () => {
|
|
expect(turnoverNumber(0.000001)).toBe('<0.01')
|
|
expect(turnoverNumber(0.01, 1)).toBe('<0.1')
|
|
expect(turnoverNumber(0)).toBe('0'); expect(turnoverNumber(null)).toBe('—')
|
|
expect(volumeText(1.25)).toBe('1.25 m³')
|
|
expect(volumeText(0)).toBe('0 m³')
|
|
expect(volumeText(null)).toBe('—')
|
|
expect(volumeText(0.0000000001, 9)).toBe('<0.000000001 m³')
|
|
})
|
|
it('does not draw partial-window totals as daily averages or zero bars', () => {
|
|
const partial: TurnoverWindowMetric = { days: 15, startDate: '2026-09-28', endDateExclusive: '2026-10-13', dataStatus: 'PARTIAL', observedQuantity: 150, outboundQuantity: null, averageDailyOutboundQuantity: null, completeDayCount: 7, partialDayCount: 1, unknownDayCount: 7, reasonCodes: [] }
|
|
const charts: TurnoverCharts = { ownerPhysicalTop: [], unknownOwnerCount: 0, ownerVolumeTop: [], unknownVolumeOwnerCount: 0, averageDaily: [{ ...partial, days: 7, dataStatus: 'COMPLETE', averageDailyOutboundQuantity: 10 }, partial] }
|
|
const option = turnoverChart(charts, 'daily')
|
|
const tooltip = option.tooltip as { valueFormatter: (value: number | null) => string }
|
|
expect(tooltip.valueFormatter(2165.133333)).toBe('2,165.13 件/日')
|
|
expect(tooltip.valueFormatter(0)).toBe('0 件/日')
|
|
expect(tooltip.valueFormatter(null)).toBe('— 件/日')
|
|
expect(JSON.stringify(option.series)).toContain('"data":[10,null]')
|
|
expect(windowText(partial)).toBe('已采集 150,覆盖不足')
|
|
})
|
|
})
|