50 Unit-Tests mit Vitest fuer die Stellen, an denen ein Fehler teuer waere: Besitzstatus, Mehrfachauswahl inklusive Ueberspringen von Dubletten und bereits besessenen Sets, Token-Erzeugung und -Vergleich, Cent-Umrechnung und Slugs. Der Playwright-Smoke-Test laeuft den ganzen Weg: Registrierung des ersten Nutzers, Hersteller anlegen, Set anlegen, auf eine neue Wunschliste setzen, Link holen und als Besucher ohne Konto reservieren. Er nutzt ein eigenes Datenverzeichnis (./data-e2e), das vor jedem Lauf geleert wird. Dabei aufgefallen und behoben: eine spontan aus dem Katalog angelegte Wunschliste war nicht teilbar, weil das Feld isPublic ohne Formular auf false fiel. Ausserdem ist das Sternchen an Pflichtfeldern jetzt aria-hidden, damit der zugaengliche Name des Feldes sauber bleibt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
104 lines
3.5 KiB
TypeScript
104 lines
3.5 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { describeBulkAdd, planBulkAdd, priorityLabel } from '@/lib/wishlist-logic';
|
|
|
|
describe('Mehrfachauswahl auf die Wunschliste', () => {
|
|
it('uebernimmt alles, was weder drauf noch in der Sammlung ist', () => {
|
|
const plan = planBulkAdd(['a', 'b', 'c'], new Set(), new Set());
|
|
|
|
expect(plan.toAdd).toEqual(['a', 'b', 'c']);
|
|
expect(plan.duplicates).toEqual([]);
|
|
expect(plan.owned).toEqual([]);
|
|
});
|
|
|
|
it('ueberspringt Sets, die schon auf der Liste stehen', () => {
|
|
const plan = planBulkAdd(['a', 'b', 'c'], new Set(['b']), new Set());
|
|
|
|
expect(plan.toAdd).toEqual(['a', 'c']);
|
|
expect(plan.duplicates).toEqual(['b']);
|
|
});
|
|
|
|
it('ueberspringt Sets, die schon in der Sammlung sind', () => {
|
|
const plan = planBulkAdd(['a', 'b'], new Set(), new Set(['a']));
|
|
|
|
expect(plan.toAdd).toEqual(['b']);
|
|
expect(plan.owned).toEqual(['a']);
|
|
});
|
|
|
|
it('zaehlt ein Set, das beides ist, nur als Dublette', () => {
|
|
const plan = planBulkAdd(['a'], new Set(['a']), new Set(['a']));
|
|
|
|
expect(plan.toAdd).toEqual([]);
|
|
expect(plan.duplicates).toEqual(['a']);
|
|
expect(plan.owned).toEqual([]);
|
|
});
|
|
|
|
it('entfernt Mehrfachnennungen aus der Auswahl', () => {
|
|
const plan = planBulkAdd(['a', 'a', 'b', 'a'], new Set(), new Set());
|
|
|
|
expect(plan.toAdd).toEqual(['a', 'b']);
|
|
});
|
|
|
|
it('behaelt die Reihenfolge der Auswahl bei', () => {
|
|
const plan = planBulkAdd(['c', 'a', 'b'], new Set(), new Set());
|
|
|
|
expect(plan.toAdd).toEqual(['c', 'a', 'b']);
|
|
});
|
|
|
|
it('kommt mit einer leeren Auswahl klar', () => {
|
|
const plan = planBulkAdd([], new Set(['a']), new Set(['b']));
|
|
|
|
expect(plan).toEqual({ toAdd: [], duplicates: [], owned: [] });
|
|
});
|
|
});
|
|
|
|
describe('Rueckmeldung nach der Mehrfachauswahl', () => {
|
|
const names = new Map([
|
|
['a', '60398 Familienhaus'],
|
|
['b', '71427 Lloyds Drache'],
|
|
['c', '42172 McLaren P1'],
|
|
['d', '70392 Novelmore'],
|
|
['e', '2-30500 Mustang'],
|
|
]);
|
|
|
|
it('nennt die Zahl der hinzugefuegten Sets im Singular', () => {
|
|
const message = describeBulkAdd({ toAdd: ['a'], duplicates: [], owned: [] }, names);
|
|
expect(message).toBe('1 Set hinzugefügt');
|
|
});
|
|
|
|
it('benennt uebersprungene Dubletten mit Namen', () => {
|
|
const message = describeBulkAdd({ toAdd: ['a'], duplicates: ['b'], owned: [] }, names);
|
|
|
|
expect(message).toContain('1 übersprungen (schon auf der Liste)');
|
|
expect(message).toContain('71427 Lloyds Drache');
|
|
});
|
|
|
|
it('nennt bei vielen Dubletten nur die ersten drei', () => {
|
|
const message = describeBulkAdd(
|
|
{ toAdd: [], duplicates: ['a', 'b', 'c', 'd', 'e'], owned: [] },
|
|
names,
|
|
);
|
|
|
|
expect(message).toContain('und 2 weitere');
|
|
expect(message).not.toContain('70392 Novelmore');
|
|
});
|
|
|
|
it('trennt Dubletten von bereits besessenen Sets', () => {
|
|
const message = describeBulkAdd({ toAdd: [], duplicates: ['a'], owned: ['b'] }, names);
|
|
|
|
expect(message).toContain('schon auf der Liste');
|
|
expect(message).toContain('schon in der Sammlung');
|
|
});
|
|
});
|
|
|
|
describe('Prioritaeten', () => {
|
|
it('hat fuer jede Stufe ein deutsches Label', () => {
|
|
expect(priorityLabel(1)).toBe('Großer Wunsch');
|
|
expect(priorityLabel(2)).toBe('Gerne');
|
|
expect(priorityLabel(3)).toBe('Irgendwann');
|
|
});
|
|
|
|
it('faellt bei unbekannten Werten auf die mittlere Stufe zurueck', () => {
|
|
expect(priorityLabel(99)).toBe('Gerne');
|
|
});
|
|
});
|