278 lines
9.4 KiB
Markdown
278 lines
9.4 KiB
Markdown
# 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 |
|