From 29f0245ce093609a7365bfe5bf75ba7326422d95 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Wed, 22 Apr 2026 16:46:43 +0200 Subject: [PATCH] feat(shopping): unitFamily-Utility fuer Konsolidierung Neue Hilfsfunktion `unitFamily` normalisiert Einheiten auf eine Familien-Kennung ('weight', 'volume' oder lowercase-trim). Wird in nachfolgenden Konsolidierungs-Schritten der Einkaufsliste verwendet. Abgedeckt durch 5 Vitest-Unit-Tests (TDD). Co-Authored-By: Claude Opus 4.7 (1M context) --- src/lib/server/unit-consolidation.ts | 11 +++++++++++ tests/unit/unit-consolidation.test.ts | 28 +++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 src/lib/server/unit-consolidation.ts create mode 100644 tests/unit/unit-consolidation.test.ts 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(''); + }); +});