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>
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
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');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user