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