1
0
Fork 0
mirror of https://github.com/s-frick/effigenix.git synced 2026-03-28 17:39:57 +01:00
effigenix/backend/docs/MASTERDATA_MANUAL_TESTS.md
Sebastian Frick 2ace5be394 test(masterdata): Integrationstests für alle vier Masterdata-Aggregate
70 MockMvc-Integrationstests für ProductCategory, Supplier, Article
und Customer Controller. Abgedeckte Szenarien: Happy Paths, Validierung
(400), Duplikate (409), Not Found (404), Autorisierung (403/401) sowie
aggregate-spezifische Operationen (Zertifikate, Bewertungen, Verkaufs-
einheiten, Lieferadressen, Präferenzen, Rahmenverträge).

Außerdem: Manuelle Testfallbeschreibung unter backend/docs/MASTERDATA_MANUAL_TESTS.md
2026-02-19 00:33:52 +01:00

328 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Manuelle Testfälle Masterdata BC
## Kontext
Der Masterdata Bounded Context ist vollständig implementiert und umfasst vier Aggregate:
- **ProductCategory** einfaches Kategorie-Aggregate
- **Supplier** Lieferanten mit Zertifikaten, Bewertungen, Adressen
- **Article** Artikel mit Verkaufseinheiten (SalesUnits), Lieferantenzuordnung
- **Customer** Kunden (B2B/B2C) mit Lieferadressen, Präferenzen, Rahmenvertrag (nur B2B)
Die TUI ist das Testwerkzeug für das Backend. Alle Schreiboperationen erfordern `MASTERDATA_WRITE`-Permission.
---
## Voraussetzungen
- Backend läuft (`./mvnw spring-boot:run` oder Docker)
- TUI läuft (`pnpm dev` im CLI-Verzeichnis)
- Eingeloggt als User **mit** `MASTERDATA_WRITE`-Permission (z.B. `admin`)
- Eingeloggt als User **ohne** `MASTERDATA_WRITE`-Permission (z.B. `viewer`) für Authz-Tests
---
## TC-CAT: Produktkategorien
### TC-CAT-01: Kategorie erstellen (Happy Path)
1. Masterdata → Produktkategorien → `[n]` Neu
2. Name: `Obst & Gemüse`, Beschreibung: `Frische Produkte` → Enter
- [x] **Erwartung:** Kategorie erscheint in der Liste; Name und Beschreibung korrekt
### TC-CAT-02: Kategorie erstellen ohne Beschreibung
1. Name: `Milchprodukte`, Beschreibung: leer → Enter
- [x] **Erwartung:** Kategorie wird angelegt; Beschreibung fehlt ohne Fehler
### TC-CAT-03: Kategorie bearbeiten
1. Kategorie `Obst & Gemüse` auswählen → `[e]`
2. Name ändern auf `Obst und Gemüse`, Beschreibung auf `Saisonale Frische`
- [x] **Erwartung:** Änderungen werden gespeichert und korrekt angezeigt
### TC-CAT-04: Doppelter Name wird abgelehnt
1. Neue Kategorie mit Name `Milchprodukte` (existiert bereits) anlegen
- [x] **Erwartung:** Fehlermeldung Name bereits vergeben; kein Datensatz angelegt
### TC-CAT-05: Kategorie löschen
1. Kategorie `Milchprodukte` in der Liste auswählen → `[d]`
2. Bestätigungsdialog mit `Ja` bestätigen
- [c] **Erwartung:** Kategorie verschwindet aus der Liste
<!-- TODO: Löschen nicht implementiert -->
### TC-CAT-06: Leerer Name wird abgelehnt
1. Neue Kategorie, Name leer → Enter
- [x] **Erwartung:** Fehler / Eingabe nicht möglich; kein API-Aufruf
---
## TC-SUP: Lieferanten
### TC-SUP-01: Lieferant erstellen Pflichtfelder
1. Lieferanten → `[n]` Neu
2. Name: `Frisch AG`, Telefon: `+49 30 12345` → restliche Felder leer → Enter
- [x] **Erwartung:** Lieferant erscheint in der Liste, Status `AKTIV`
### TC-SUP-02: Lieferant erstellen alle Felder
1. Name: `Bio GmbH`, Telefon: `+49 89 999`, E-Mail: `bio@example.com`
2. Ansprechpartner: `Max Muster`
3. Adresse: `Gartenstraße 5`, `12`, `80333`, `München`, `Deutschland`
4. Zahlungsziel: `30` Tage
- [/] **Erwartung:** Alle Daten in der Detailansicht korrekt angezeigt
<!-- TODO: Wenn 'Deutschland' eingegeben wird bekommt man einen Fehler dass nur Länderkennzeichen z.B. DE erlaubt sind -->
### TC-SUP-03: Lieferant erstellen ohne Pflichtfelder
1. Name leer → versuchen zu speichern
- [x] **Erwartung:** Fehler; kein Lieferant angelegt
3. Name gefüllt, Telefon leer → versuchen zu speichern
- [x] **Erwartung:** Fehler; kein Lieferant angelegt
### TC-SUP-04: Doppelter Name wird abgelehnt
1. Neuen Lieferanten `Frisch AG` anlegen (Name existiert bereits)
- [x] **Erwartung:** Fehlermeldung Name bereits vergeben
### TC-SUP-05: Lieferant deaktivieren und aktivieren
1. `Frisch AG` → Detailansicht → `[Deaktivieren]` → Bestätigen
- [x] **Erwartung:** Status wechselt auf `INAKTIV` (roter Punkt in Liste)
3. Erneut öffnen → `[Aktivieren]` → Bestätigen
- [x] **Erwartung:** Status wechselt auf `AKTIV`
### TC-SUP-06: Lieferant filtern
1. Lieferantenliste: `[A]` nur Aktive
- [x] **Erwartung:** Nur AKTIV-Lieferanten sichtbar
3. `[I]` nur Inaktive
- [x] **Erwartung:** Nur INAKTIV-Lieferanten sichtbar
5. `[a]` alle
- [x] **Erwartung:** Alle Lieferanten sichtbar
### TC-SUP-07: Lieferant bewerten
1. `Frisch AG``[Bewerten]`
2. Qualität: 4, Lieferung: 3, Preis: 5 → Enter
- [x] **Erwartung:** Bewertung in Detailansicht sichtbar; Durchschnitt = 4.0
4. In der Liste: Stern-Anzeige `★ 4.0`
### TC-SUP-08: Bewertung Grenzen (1 und 5)
1. Alle Scores auf 1 setzen → Speichern
- [x] **Erwartung:** Gespeichert; Durchschnitt = 1.0
3. Alle Scores auf 5 → Speichern
- [x] **Erwartung:** Gespeichert; Durchschnitt = 5.0
### TC-SUP-09: Zertifikat hinzufügen (gültig)
1. `Frisch AG``[Zertifikat hinzufügen]`
2. Typ: `ISO9001`, Aussteller: `TÜV`, ab: `2024-01-01`, bis: `2027-01-01`
- [x] **Erwartung:** Zertifikat erscheint in Detailansicht; Anzahl in Liste = 1
### TC-SUP-10: Zertifikat hinzufügen (abgelaufen)
1. Zertifikat, bis: `2023-12-31` (Datum in der Vergangenheit)
- [x] **Erwartung:** Zertifikat wird angelegt (keine Ablauf-Prüfung beim Hinzufügen); in Detail sichtbar
*(Edge Case: System soll abgelaufene Zertifikate anzeigen, nicht blocken)*
### TC-SUP-11: Doppeltes Zertifikat wird abgelehnt
1. Erneut `ISO9001`, `TÜV`, `2024-01-01` hinzufügen
- [x] **Erwartung:** Fehlermeldung Duplikat abgelehnt
<!-- TODO: Duplikat wird abgelehnt, ABER Fehlermeldung schlecht 'Unexpected error occurred. ...' -->
### TC-SUP-12: Zertifikat entfernen
1. `Frisch AG``[Zertifikat entfernen]` → Zertifikat auswählen → Enter
- [x] **Erwartung:** Zertifikat aus Detailansicht verschwunden
<!-- TODO: Zertifikatsauswahl zeigt kein Datum, daher schwer zu entscheiden wenn mehrere gleiche Zertifikate für untersch. Jahre -->
---
## TC-ART: Artikel
### TC-ART-01: Artikel erstellen PIECE_FIXED
1. Artikel → `[n]` Neu
2. Name: `Äpfel Gala`, Nummer: `OG-001`
3. Kategorie: `Obst & Gemüse` (mit ← →)
4. Einheit: `PIECE_FIXED`, Preis: `1.99`
- [ ] **Erwartung:** Artikel in Liste; Preismodell automatisch `FIXED`
### TC-ART-02: Artikel erstellen KG (gewichtsbasiert)
1. Name: `Bananen`, Nummer: `OG-002`
2. Einheit: `KG`, Preis: `2.49`
- [ ] **Erwartung:** Preismodell automatisch `WEIGHT_BASED`
### TC-ART-03: Artikel erstellen HUNDRED_GRAM und PIECE_VARIABLE
1. Einheit `HUNDRED_GRAM` → Preismodell `WEIGHT_BASED`
2. Einheit `PIECE_VARIABLE` → Preismodell `WEIGHT_BASED`
- [ ] **Erwartung:** Konsistenz in beiden Fällen korrekt
### TC-ART-04: Doppelte Artikelnummer wird abgelehnt
1. Neuen Artikel mit Nummer `OG-001` anlegen
- [ ] **Erwartung:** Fehlermeldung Artikelnummer bereits vergeben
### TC-ART-05: Artikel deaktivieren und aktivieren
1. `Äpfel Gala``[Deaktivieren]` → Bestätigen
- [ ] **Erwartung:** Status INAKTIV
- [ ] **Erwartung:** Status AKTIV
### TC-ART-06: Artikel filtern
1. `[A]` nur Aktive, `[I]` nur Inaktive, `[a]` alle
- [ ] **Erwartung:** Filter wirkt korrekt
### TC-ART-07: Verkaufseinheit hinzufügen
1. `Äpfel Gala``[Verkaufseinheit hinzufügen]`
2. Einheit: `KG`, Preis: `3.50`
- [ ] **Erwartung:** Zweite VE in Detailansicht; Anzahl VE in Liste = 2
### TC-ART-08: Doppelte Einheit wird abgelehnt
1. Erneut `PIECE_FIXED` für `Äpfel Gala` hinzufügen
- [ ] **Erwartung:** Fehlermeldung Einheit bereits vorhanden
### TC-ART-09: Letzte Verkaufseinheit kann nicht entfernt werden
1. Artikel mit genau einer VE → `[Verkaufseinheit entfernen]`
- [ ] **Erwartung:** Aktion nicht verfügbar / Fehler mindestens eine VE erforderlich
### TC-ART-10: Verkaufseinheit entfernen (wenn 2+ vorhanden)
1. `Äpfel Gala` hat 2 VE → `[Verkaufseinheit entfernen]` → KG-Einheit wählen
- [ ] **Erwartung:** VE entfernt; nur noch PIECE_FIXED vorhanden
### TC-ART-11: Lieferant dem Artikel zuweisen *(falls TUI-Unterstützung vorhanden)*
1. `Äpfel Gala` → Lieferant `Frisch AG` zuweisen
- [ ] **Erwartung:** Lieferant in Detailansicht sichtbar
---
## TC-CUS: Kunden
### TC-CUS-01: B2C-Kunde erstellen
1. Kunden → `[n]` Neu
2. Typ: `B2C`, Name: `Max Mustermann`, Telefon: `+49 176 12345`
3. Rechnungsadresse: `Musterstr. 1`, `2`, `10115`, `Berlin`, `Deutschland`
- [ ] **Erwartung:** Kunde in Liste, Typ-Badge `B2C`, Status `AKTIV`
### TC-CUS-02: B2B-Kunde erstellen
1. Typ: `B2B`, Name: `Gastro GmbH`, Telefon: `+49 30 9876`
2. Rechnungsadresse vollständig ausfüllen
- [ ] **Erwartung:** Kunde in Liste, Typ-Badge `B2B`
### TC-CUS-03: Pflichtfelder Validierung
1. Name leer → Fehler
2. Telefon leer → Fehler
3. Rechnungsadresse unvollständig → Fehler
- [ ] **Erwartung:** Jeweils spezifische Fehlermeldung
### TC-CUS-04: Doppelter Kundenname wird abgelehnt
1. Erneut `Gastro GmbH` anlegen
- [ ] **Erwartung:** Fehlermeldung Name bereits vergeben
### TC-CUS-05: Kunde deaktivieren und aktivieren
1. `Max Mustermann``[Deaktivieren]` → Bestätigen → `[Aktivieren]`
- [ ] **Erwartung:** Status wechselt korrekt
### TC-CUS-06: Kunden filtern (Status + Typ)
1. `[A]` → nur Aktive; `[I]` → nur Inaktive; `[a]` → alle
2. `[B]` → nur B2B; `[C]` → nur B2C; `[b]` → alle
3. Kombination: Aktive B2B-Kunden
- [ ] **Erwartung:** Alle Filter wirken korrekt und kombinierbar
### TC-CUS-07: Lieferadresse hinzufügen
1. `Gastro GmbH``[Lieferadresse hinzufügen]`
2. Label: `Hauptküche`, Straße: `Kochstr.`, Nr: `12`, PLZ: `10963`, Stadt: `Berlin`, Land: `Deutschland`
3. Ansprechpartner: `Koch Müller`, Lieferhinweis: `Bitte kühlen`
- [ ] **Erwartung:** Lieferadresse in Detailansicht; Anzahl in Liste = 1
### TC-CUS-08: Lieferadresse entfernen
1. `[Lieferadresse entfernen]``Hauptküche` auswählen
- [ ] **Erwartung:** Lieferadresse entfernt
### TC-CUS-09: Mehrere Lieferadressen
1. Zwei Lieferadressen `Filiale Nord` und `Filiale Süd` hinzufügen
- [ ] **Erwartung:** Beide in Detailansicht; Anzahl in Liste = 2
### TC-CUS-10: Präferenzen setzen
1. `Max Mustermann``[Präferenzen setzen]`
2. `BIO` und `REGIONAL` aktivieren → Enter
- [ ] **Erwartung:** Präferenzen in Detailansicht sichtbar
4. Erneut öffnen → nur `HALAL` aktivieren → Enter
- [ ] **Erwartung:** Nur `HALAL` gesetzt (Set wird ersetzt, nicht ergänzt)
### TC-CUS-11: Alle Präferenzen abwählen
1. `[Präferenzen setzen]` → alle deaktivieren → Enter
- [ ] **Erwartung:** Keine Präferenzen mehr sichtbar
---
## TC-B2B: Rahmenverträge (B2B-spezifisch)
*Vorbedingung: `Gastro GmbH` (B2B) existiert; Artikel `Äpfel Gala` existiert*
### TC-B2B-01: Rahmenvertrag für B2B-Kunden erstellen *(falls TUI-Unterstützung vorhanden)*
1. `Gastro GmbH` → Rahmenvertrag-Bereich
2. Gültig ab: `2025-01-01`, bis: `2025-12-31`, Rhythmus: `WEEKLY`
3. Position: Artikel `Äpfel Gala`, vereinbarter Preis: `1.50`, Menge: `100`
- [ ] **Erwartung:** Rahmenvertrag in Detailansicht sichtbar
### TC-B2B-02: Rahmenvertrag für B2C-Kunden nicht möglich *(Backend-Test via API)*
```
POST /api/customers/{b2c-id}/frame-contract
```
- [ ] **Erwartung:** HTTP 400/422, Fehler `FrameContractNotAllowed`
---
## TC-AUTH: Autorisierung
### TC-AUTH-01: Lesezugriff ohne MASTERDATA_WRITE
1. Als `viewer` (ohne MASTERDATA_WRITE) einloggen
2. Alle Listen aufrufen (Kategorien, Lieferanten, Artikel, Kunden)
- [ ] **Erwartung:** Daten sichtbar, kein Fehler
### TC-AUTH-02: Schreibzugriff ohne MASTERDATA_WRITE wird abgelehnt
1. Als `viewer` versuchen: neue Kategorie erstellen
- [ ] **Erwartung:** HTTP 403 / Fehlermeldung in TUI; kein Datensatz angelegt
3. Dasselbe für Lieferant, Artikel, Kunde anlegen
- [ ] **Erwartung:** Jeweils Ablehnung
### TC-AUTH-03: Schreibzugriff mit MASTERDATA_WRITE funktioniert
1. Als `admin` (mit MASTERDATA_WRITE) → alle CRUD-Operationen möglich
- [ ] **Erwartung:** Alle Operationen erfolgreich
---
## TC-CROSS: Übergreifende / Integrations-Tests
### TC-CROSS-01: Artikel-Lieferant-Verknüpfung konsistent
1. Lieferant `Frisch AG` einem Artikel zuweisen
2. `Frisch AG` deaktivieren
3. Artikel aufrufen → Lieferant weiterhin referenziert (keine Zwangstrennung)
- [ ] **Erwartung:** Artikel zeigt `Frisch AG` trotz INAKTIV-Status
### TC-CROSS-02: Kategorie in Artikelauswahl verfügbar
1. Neue Kategorie `Getränke` anlegen
2. Artikel erstellen → Kategorie-Auswahl enthält `Getränke`
- [ ] **Erwartung:** Neue Kategorien sofort im Artikel-Formular verfügbar
### TC-CROSS-03: Sequenz Kompletter Lieferant-Workflow
1. Lieferant erstellen → bewerten → Zertifikat hinzufügen → deaktivieren → wieder aktivieren → Zertifikat entfernen
- [ ] **Erwartung:** Alle Schritte funktionieren in Folge ohne Datenverlust
### TC-CROSS-04: Sequenz Kompletter Artikel-Workflow
1. Kategorie erstellen → Artikel erstellen (mit Kategorie) → 2. VE hinzufügen → 1. VE entfernen → Artikel deaktivieren → aktivieren
- [ ] **Erwartung:** Konsistenz über alle Schritte
### TC-CROSS-05: Sequenz B2B-Kunde vollständig
1. B2B-Kunde erstellen → 2 Lieferadressen → Präferenzen setzen → 1 Adresse entfernen → Präferenzen ändern → deaktivieren → aktivieren
- [ ] **Erwartung:** Konsistenz über alle Schritte
---
## Verifikation / Testdurchführung
```bash
# Backend starten
./mvnw spring-boot:run
# TUI starten
cd frontend/apps/cli && pnpm dev
# Backend-Logs beobachten (Fehler sichtbar machen)
# Direkte API-Tests (für TC-B2B-02, TC-AUTH)
curl -X POST http://localhost:8080/api/... -H "Authorization: Bearer <token>"
```
**Checkliste nach Test-Durchlauf:**
- [ ] Alle TC-CAT (1-6) durchgeführt
- [ ] Alle TC-SUP (1-12) durchgeführt
- [ ] Alle TC-ART (1-11) durchgeführt
- [ ] Alle TC-CUS (1-11) durchgeführt
- [ ] TC-B2B (1-2) durchgeführt
- [ ] TC-AUTH (1-3) durchgeführt
- [ ] TC-CROSS (1-5) durchgeführt