Files
unknownandClaude Opus 5 4e3cbb81ce feat(import): lego-sets ueber die rebrickable-api uebernehmen
Auf "Neues Set" reicht die Setnummer von der Packung: Name, Jahr,
Teile, Minifiguren und Thema kommen aus der API, das Bild wird lokal
gespeichert und nicht nur verlinkt. Hersteller und Thema werden bei
Bedarf angelegt, ein Oberthema inklusive. Alle Aufrufe laufen
serverseitig; der Browser spricht nie mit rebrickable.com.

Ohne REBRICKABLE_API_KEY bleibt der Import sichtbar, aber abgeschaltet,
mit dem Hinweis, was zu tun ist - von Hand anlegen geht unveraendert.

Rebrickable liefert keine Anleitungsdateien. Statt das zu verschleiern,
legt der Import einen externen Link auf die LEGO-Serviceseite zur
Setnummer an.

Nebenbei: src/env.ts behandelt leere Werte jetzt wie nicht gesetzt - ein
"BASE_URL=" in der .env fuehrte sonst zum Start-Abbruch mit "Invalid
URL" statt zum Standardwert.

14 neue Unit-Tests decken Antwortverarbeitung, Setnummern-Varianten und
alle Fehlerfaelle der API ab (404, 401, 429, Netzwerk).

Refs Phase 2

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-07 07:12:22 +02:00

45 lines
1.6 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { displaySetNumber, legoInstructionsUrl, normalizeSetNumber } from '@/lib/set-number';
describe('Setnummern fuer den Rebrickable-Import', () => {
it('haengt die Variante an, wenn nur die Packungsnummer eingetippt wurde', () => {
expect(normalizeSetNumber('60398')).toBe('60398-1');
expect(normalizeSetNumber('71427')).toBe('71427-1');
});
it('laesst eine bereits vollstaendige Nummer unveraendert', () => {
expect(normalizeSetNumber('60398-1')).toBe('60398-1');
expect(normalizeSetNumber('10265-2')).toBe('10265-2');
});
it('ignoriert Leerzeichen und vereinheitlicht Grossschreibung', () => {
expect(normalizeSetNumber(' 60398 ')).toBe('60398-1');
expect(normalizeSetNumber('k8672')).toBe('K8672-1');
});
it('entfernt fuer die Anzeige nur die erste Variante', () => {
expect(displaySetNumber('60398-1')).toBe('60398');
// -2 ist eine echte zweite Variante und muss sichtbar bleiben.
expect(displaySetNumber('10265-2')).toBe('10265-2');
expect(displaySetNumber('60398')).toBe('60398');
});
it('ueberlebt den Rundweg Anzeige -> API -> Anzeige', () => {
for (const number of ['60398', '71427', '42172']) {
expect(displaySetNumber(normalizeSetNumber(number))).toBe(number);
}
});
});
describe('Link auf die LEGO-Bauanleitung', () => {
it('nutzt die Nummer ohne Variante', () => {
expect(legoInstructionsUrl('60398-1')).toBe(
'https://www.lego.com/de-de/service/building-instructions/60398',
);
});
it('maskiert Sonderzeichen in der Nummer', () => {
expect(legoInstructionsUrl('2 30500')).toContain('2%2030500');
});
});