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) <noreply@anthropic.com>
This commit is contained in:
11
src/lib/server/unit-consolidation.ts
Normal file
11
src/lib/server/unit-consolidation.ts
Normal file
@@ -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;
|
||||
}
|
||||
28
tests/unit/unit-consolidation.test.ts
Normal file
28
tests/unit/unit-consolidation.test.ts
Normal file
@@ -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('');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user