diff --git a/src/lib/server/unit-consolidation.ts b/src/lib/server/unit-consolidation.ts new file mode 100644 index 0000000..ce22f28 --- /dev/null +++ b/src/lib/server/unit-consolidation.ts @@ -0,0 +1,11 @@ +export type UnitFamily = 'weight' | 'volume' | string; + +const WEIGHT_UNITS = new Set(['g', 'kg']); +const VOLUME_UNITS = new Set(['ml', 'l']); + +export function unitFamily(unit: string | null | undefined): UnitFamily { + const u = (unit ?? '').trim().toLowerCase(); + if (WEIGHT_UNITS.has(u)) return 'weight'; + if (VOLUME_UNITS.has(u)) return 'volume'; + return u; +} diff --git a/tests/unit/unit-consolidation.test.ts b/tests/unit/unit-consolidation.test.ts new file mode 100644 index 0000000..40b6cb5 --- /dev/null +++ b/tests/unit/unit-consolidation.test.ts @@ -0,0 +1,28 @@ +import { describe, it, expect } from 'vitest'; +import { unitFamily } from '../../src/lib/server/unit-consolidation'; + +describe('unitFamily', () => { + it('maps g and kg to weight', () => { + expect(unitFamily('g')).toBe('weight'); + expect(unitFamily('kg')).toBe('weight'); + }); + it('maps ml and l to volume', () => { + expect(unitFamily('ml')).toBe('volume'); + expect(unitFamily('l')).toBe('volume'); + }); + it('lowercases and trims unknown units', () => { + expect(unitFamily(' Bund ')).toBe('bund'); + expect(unitFamily('TL')).toBe('tl'); + expect(unitFamily('Stück')).toBe('stück'); + }); + it('is case-insensitive for weight/volume', () => { + expect(unitFamily('Kg')).toBe('weight'); + expect(unitFamily('ML')).toBe('volume'); + }); + it('returns empty string for null/undefined/empty', () => { + expect(unitFamily(null)).toBe(''); + expect(unitFamily(undefined)).toBe(''); + expect(unitFamily('')).toBe(''); + expect(unitFamily(' ')).toBe(''); + }); +});