Files
admin-web/src/modules/self-operated/turnoverPresentation.test.ts
T

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,覆盖不足')
})
})