docs: Modultestbericht Gruppe F hinzugefügt

main
Andreas Ivanovic 2026-06-28 18:29:31 +02:00
parent 54c1a482b4
commit 9f22667592
1 changed files with 277 additions and 0 deletions

View File

@ -0,0 +1,277 @@
# Modultestbericht Dokumentenprozess (Gruppe F)
| Feld | Wert |
|---|---|
| Modul | Dokumentenprozess |
| Gruppe | F |
| Verantwortlicher | Andreas Ivanovic |
| Datum | 28.06.2026 |
| Testart | Modultest (Unit-Test, JUnit 5) |
| Testklasse | `DokumentServiceTest.java` |
| Paket | `de.hsmannheim.faktura.dokumente.service` |
| Spec-Grundlage | Pflichtenheft Gruppe F v1.0.1 |
| Gesamt-Ergebnis | ✅ 16 / 16 Tests bestanden |
---
## 1. Testumgebung
| Komponente | Version |
|---|---|
| Java | 17 |
| JUnit Jupiter | 5.10.2 |
| Maven Surefire | 3.2.5 |
| Repository (Test) | `InMemoryDokumentRepository` |
| Produktlookup (Test) | `FakeProductLookup` (intern in Testklasse) |
| Kundenlookup (Test) | `FakeCustomerLookup` (intern in Testklasse) |
| PDF-Export (Test) | `SimplePdfExportService` mit `@TempDir` |
Alle Tests laufen ohne JavaFX-Abhängigkeit, ohne Datenbankverbindung und ohne Netzwerk (PH-NF-DP-05, PH-DP-16).
---
## 2. Testdaten
### Produkte (FakeProductLookup)
| Produkt-ID | Bezeichnung | Einzelpreis Netto | MwSt-Satz |
|---|---|---|---|
| 20001 | Produkt Alpha | 100,00 EUR | 19 % |
| 20002 | Produkt Beta | 50,00 EUR | 7 % |
| 20003 | Produkt Gamma | 200,00 EUR | 19 % |
### Kunden (FakeCustomerLookup)
| Kunden-ID | Name | Anschrift | Steuernummer |
|---|---|---|---|
| 10001 | Max Mustermann | Musterweg 5, 68159 Mannheim | DE123456789 |
| 10002 | Erika Muster | Beispielgasse 3, 68161 Mannheim | |
---
## 3. Testergebnisse
### MT-DP-01 Angebot anlegen (Happy Path)
| Feld | Wert |
|---|---|
| Spec-Bezug | PH-DP-01 |
| Methode | `erstelleAngebot(long, List<PositionCommand>)` |
| Vorbedingung | Kunde 10001 und Produkte 20001, 20002 existieren |
| Eingabe | kundenId=10001, Positionen: [20001×2, 20002×1] |
| Erwartetes Ergebnis | Angebot mit Nummer A-2026-xxxx, Status OFFEN, 2 Positionen, Datum gesetzt |
| Tatsächliches Ergebnis | ✅ Angebot erstellt, alle Felder korrekt |
---
### MT-DP-02 Summenberechnung Angebot
| Feld | Wert |
|---|---|
| Spec-Bezug | PH-DP-01, PH-DP-08 |
| Methode | `erstelleAngebot(...)``berechneSummen()` |
| Eingabe | 2 × Produkt Alpha (100,00 EUR, 19 %), 1 × Produkt Beta (50,00 EUR, 7 %) |
| Erwartetes Ergebnis | Netto: 250,00 EUR · USt: 41,50 EUR · Brutto: 291,50 EUR |
| Tatsächliches Ergebnis | ✅ Alle drei Summen korrekt berechnet |
Berechnung:
- Netto: (2 × 100,00) + (1 × 50,00) = 250,00 EUR
- USt: (200,00 × 0,19) + (50,00 × 0,07) = 38,00 + 3,50 = 41,50 EUR
- Brutto: 250,00 + 41,50 = 291,50 EUR
---
### MT-DP-03 Fortlaufende Angebotsnummern
| Feld | Wert |
|---|---|
| Spec-Bezug | PH-DP-02 |
| Methode | `DokumentNummernGenerator.naechsteNummer()` |
| Eingabe | Zwei Angebote nacheinander anlegen |
| Erwartetes Ergebnis | Nummern A-2026-0001 und A-2026-0002 (eindeutig, fortlaufend) |
| Tatsächliches Ergebnis | ✅ Nummern korrekt vergeben, kein Duplikat |
---
### MT-DP-04 Gesperrtes Angebot nach Überführung
| Feld | Wert |
|---|---|
| Spec-Bezug | PH-DP-03 |
| Methode | `aktualisiereAngebot(String, List<PositionCommand>)` |
| Vorbedingung | Angebot wurde bereits in AB überführt (Status UEBERFUEHRT) |
| Eingabe | Versuch Angebot zu bearbeiten |
| Erwartetes Ergebnis | `IllegalStateException` wird geworfen |
| Tatsächliches Ergebnis | ✅ Exception korrekt ausgelöst |
---
### MT-DP-05 Auftragsbestätigung erzeugen
| Feld | Wert |
|---|---|
| Spec-Bezug | PH-DP-04 |
| Methode | `erstelleAuftragsbestaetigung(String)` |
| Vorbedingung | Angebot mit Status OFFEN vorhanden |
| Eingabe | angebotsNummer = A-2026-0001 |
| Erwartetes Ergebnis | AB mit Nummer AB-2026-xxxx, Referenz auf Angebot, Angebot auf Status UEBERFUEHRT |
| Tatsächliches Ergebnis | ✅ AB korrekt erstellt, Angebotsstatus korrekt aktualisiert |
---
### MT-DP-06 Doppelte Auftragsbestätigung verhindern
| Feld | Wert |
|---|---|
| Spec-Bezug | PH-DP-05 |
| Methode | `erstelleAuftragsbestaetigung(String)` (zweiter Aufruf) |
| Vorbedingung | AB für dieses Angebot existiert bereits |
| Eingabe | Zweiter Versuch AB für dasselbe Angebot zu erzeugen |
| Erwartetes Ergebnis | `DuplicateDocumentException` wird geworfen |
| Tatsächliches Ergebnis | ✅ Exception korrekt ausgelöst |
| Hinweis | **Patch 28.06.2026 (Christopher Lampert, Gruppe H):** Reihenfolge der Prüfungen in `erstelleAuftragsbestaetigung` getauscht Duplikat-Check muss vor Status-Check stehen, da beide Bedingungen im Szenario „zweite AB" gleichzeitig zutreffen. Spec verlangt explizit `DuplicateDocumentException` (PH-DP-05). |
---
### MT-DP-07 Lieferschein erzeugen
| Feld | Wert |
|---|---|
| Spec-Bezug | PH-DP-06 |
| Methode | `erstelleLieferschein(String, LocalDate)` |
| Vorbedingung | AB mit Status BESTAETIGT vorhanden |
| Eingabe | auftragsNummer = AB-2026-0001, lieferdatum = heute + 3 Tage |
| Erwartetes Ergebnis | Lieferschein mit Nummer LS-2026-xxxx, Referenz auf AB, Status GELIEFERT |
| Tatsächliches Ergebnis | ✅ Lieferschein korrekt erstellt |
---
### MT-DP-08 Lieferschein enthält keine Preise
| Feld | Wert |
|---|---|
| Spec-Bezug | PH-DP-07 |
| Methode | `exportiereAlsPdf(String)` auf Lieferschein |
| Vorbedingung | Lieferschein vorhanden |
| Erwartetes Ergebnis | PDF-Inhalt enthält Bezeichnung und Menge, aber keine Nettosumme, USt oder Bruttosumme |
| Tatsächliches Ergebnis | ✅ Preisfelder im Export nicht vorhanden |
---
### MT-DP-09 Rechnung erzeugen (Happy Path)
| Feld | Wert |
|---|---|
| Spec-Bezug | PH-DP-08, PH-DP-09 |
| Methode | `erstelleRechnung(String)` |
| Vorbedingung | Vollständige Kette: Angebot → AB → Lieferschein vorhanden |
| Eingabe | lieferscheinNummer = LS-2026-0001 |
| Erwartetes Ergebnis | Rechnung mit Nummer R-2026-xxxx, Status FESTGESCHRIEBEN, Pflichtangaben gesetzt, Summen korrekt |
| Tatsächliches Ergebnis | ✅ Rechnung vollständig und korrekt erstellt |
---
### MT-DP-10 Fehlende Pflichtangaben verhindern Rechnungserstellung
| Feld | Wert |
|---|---|
| Spec-Bezug | PH-DP-09 |
| Methode | `erstelleRechnung(String)` mit unvollständigen Kundendaten |
| Vorbedingung | CustomerLookup liefert Kunde ohne Name und Anschrift |
| Erwartetes Ergebnis | `ValidationException` mit Liste der fehlenden Felder |
| Tatsächliches Ergebnis | ✅ Exception mit korrekten Fehlermeldungen ausgelöst |
---
### MT-DP-11 Rechnungsnummern lückenlos
| Feld | Wert |
|---|---|
| Spec-Bezug | PH-DP-10 |
| Methode | `erstelleRechnung(String)` dreimal hintereinander |
| Erwartetes Ergebnis | Nummern R-2026-0001, R-2026-0002, R-2026-0003 (lückenlos) |
| Tatsächliches Ergebnis | ✅ Alle drei Nummern korrekt und lückenlos vergeben |
---
### MT-DP-12 Rechnung unveränderlich nach Festschreibung
| Feld | Wert |
|---|---|
| Spec-Bezug | PH-DP-11 |
| Methode | `rechnung.pruefeAenderbar()` auf festgeschriebener Rechnung |
| Vorbedingung | Rechnung wurde erstellt und ist festgeschrieben |
| Erwartetes Ergebnis | `IllegalStateException` beim Versuch die Rechnung zu ändern |
| Tatsächliches Ergebnis | ✅ Exception korrekt ausgelöst, Status nach Reload weiterhin FESTGESCHRIEBEN |
---
### MT-DP-13 Preis-Snapshot bleibt stabil
| Feld | Wert |
|---|---|
| Spec-Bezug | PH-DP-14 |
| Methode | Angebot erstellen → Produktpreis ändern → Angebot neu laden |
| Vorbedingung | Angebot mit Produkt Alpha (100,00 EUR) erstellt |
| Eingabe | Produktpreis wird nachträglich auf 120,00 EUR geändert |
| Erwartetes Ergebnis | Snapshot-Preis im Angebot bleibt 100,00 EUR |
| Tatsächliches Ergebnis | ✅ Snapshot unverändert, Preisänderung hat keinen Einfluss |
---
### MT-DP-14 PDF-Export erzeugt Datei
| Feld | Wert |
|---|---|
| Spec-Bezug | PH-DP-12 |
| Methode | `exportiereAlsPdf(String)` |
| Vorbedingung | Angebot vorhanden |
| Erwartetes Ergebnis | Datei existiert, ist nicht leer, enthält Dokumentnummer und Typ |
| Tatsächliches Ergebnis | ✅ Datei korrekt erstellt, Inhalt vollständig |
---
### MT-DP-15 Dokumentübersicht pro Kunde
| Feld | Wert |
|---|---|
| Spec-Bezug | PH-DP-13 |
| Methode | `findByKunde(long)` |
| Vorbedingung | 2 Dokumente für Kunde 10001, 1 Dokument für Kunde 10002 |
| Erwartetes Ergebnis | Kunde 10001 → 2 Dokumente, Kunde 10002 → 1 Dokument |
| Tatsächliches Ergebnis | ✅ Filterung korrekt, keine Vermischung zwischen Kunden |
---
### MT-DP-16 Stammdatenreferenz prüfen
| Feld | Wert |
|---|---|
| Spec-Bezug | PH-DP-15 |
| Methode | `existsReferencedProdukt(long)`, `existsReferencedKunde(long)` |
| Vorbedingung | Angebot mit Produkt 20001 und Kunde 10001 vorhanden |
| Erwartetes Ergebnis | Produkt 20001 → true, Produkt 99999 → false, Kunde 10001 → true, Kunde 99998 → false |
| Tatsächliches Ergebnis | ✅ Alle vier Prüfungen korrekt |
---
## 4. Zusammenfassung
| Status | Anzahl |
|---|---|
| ✅ Bestanden | 16 |
| ❌ Fehlgeschlagen | 0 |
| ⚠️ Übersprungen | 0 |
| **Gesamt** | **16** |
Alle 16 Modultestfälle aus dem Pflichtenheft Gruppe F v1.0.1 wurden erfolgreich ausgeführt. Der Patch vom 28.06.2026 (MT-DP-06, Reihenfolge der Prüfungen in `erstelleAuftragsbestaetigung`) wurde in den Code integriert und verifiziert. Alle anderen Testfälle bleiben durch den Patch unberührt.
---
## 5. Bekannte offene Punkte
| ID | Beschreibung | Priorität |
|---|---|---|
| OP-7 | GUI-Integration: `DokumentPanel` muss mit `DokumentService` verbunden werden | Hoch |
| | SQLite-Repository (Produktionsbetrieb) noch nicht implementiert, InMemory für Tests ausreichend | Mittel |
| | Leistungserbringer-Daten in `DokumentServiceImpl.erstellePflichtangaben()` aktuell hartcodiert | Niedrig |