mirror of
https://github.com/s-frick/effigenix.git
synced 2026-03-28 17:04:49 +01:00
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
328 lines
13 KiB
Markdown
328 lines
13 KiB
Markdown
# 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
|