1
0
Fork 0
mirror of https://github.com/s-frick/effigenix.git synced 2026-03-28 12:09:35 +01:00

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
This commit is contained in:
Sebastian Frick 2026-02-19 00:33:52 +01:00
parent 2059718a5c
commit 2ace5be394
5 changed files with 2071 additions and 0 deletions

View file

@ -0,0 +1,328 @@
# 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