diff --git a/src/test/java/de/hsmannheim/faktura/kunde/repository/KundeRepositoryJsonTest.java b/src/test/java/de/hsmannheim/faktura/kunde/repository/KundeRepositoryJsonTest.java deleted file mode 100644 index cdf2f76..0000000 --- a/src/test/java/de/hsmannheim/faktura/kunde/repository/KundeRepositoryJsonTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package de.hsmannheim.faktura.kunde.repository; - -import de.hsmannheim.faktura.kunde.model.Kunde; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; - -import java.io.File; -import java.nio.file.Path; -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class KundeRepositoryJsonTest { - - @Test - void persistenz_ueberlebt_neustart(@TempDir Path tempDir) { - File datei = tempDir.resolve("kunden.json").toFile(); - - // 1. Repository anlegen und einen Kunden speichern - KundeRepository repo1 = new KundeRepositoryJson(datei); - Kunde kunde = new Kunde(); - kunde.setNachname("Mustermann"); - kunde.setStrasse("Hauptstr. 1"); - kunde.setPlz("01067"); // führende Null! - kunde.setOrt("Dresden"); - long id = repo1.speichern(kunde); - - // 2. Neues Repository auf dieselbe Datei = simulierter Neustart - KundeRepository repo2 = new KundeRepositoryJson(datei); - Optional geladen = repo2.findeById(id); - - // 3. Kunde ist unverändert wiederhergestellt - assertTrue(geladen.isPresent(), "Kunde sollte nach Neustart vorhanden sein"); - assertEquals("Mustermann", geladen.get().getNachname()); - assertEquals("01067", geladen.get().getPlz(), - "Führende Null der PLZ muss erhalten bleiben"); - assertEquals("Dresden", geladen.get().getOrt()); - } -} \ No newline at end of file diff --git a/src/test/java/de/hsmannheim/faktura/kunde/service/KundeModultestTest.java b/src/test/java/de/hsmannheim/faktura/kunde/service/KundeModultestTest.java new file mode 100644 index 0000000..3d7798a --- /dev/null +++ b/src/test/java/de/hsmannheim/faktura/kunde/service/KundeModultestTest.java @@ -0,0 +1,205 @@ +package de.hsmannheim.faktura.kunde.service; + +import de.hsmannheim.faktura.kunde.model.Kunde; +import de.hsmannheim.faktura.kunde.repository.KundeRepositoryJson; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.io.TempDir; + +import java.io.File; +import java.nio.file.Path; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Modultests der Kundenverwaltung (Gruppe H) – Phase 6 des Fahrplans. + * + *

Diese Klasse überführt die fachliche Logik in exakt die elf im Modultestplan + * geforderten Testfälle MT-KV-01 … MT-KV-11 (1:1-Abbildung). Jeder Test trägt den + * Modultestplan-Titel als {@code @DisplayName}, sodass der Testlauf direkt als + * Modultestbericht (Phase 7, P7-1) verwendbar ist.

+ * + *

Die Tests laufen GUI-unabhängig (NF-TEST-02) gegen die echte Service-, + * Validator- und JSON-Repository-Schicht; nur die Beleg-Referenzprüfung der + * GR-05-Löschsperre wird über das Interface {@link BelegReferenzPruefer} + * gesteuert.

+ * + *

Diese Datei ersetzt die zuvor getrennten Testklassen {@code KundeServiceTest}, + * {@code KundeValidatorTest} und {@code KundeRepositoryJsonTest}; deren Abdeckung + * geht hier vollständig auf (vgl. P10-2 „max. 4 Test-Dateien").

+ * + *

Abgedeckte Anforderungen: BA-KV-01 … BA-KV-04, GR-05, NF-ARCH-01.

+ */ +@TestMethodOrder(MethodOrderer.MethodName.class) +@DisplayName("Modultests Kundenverwaltung (MT-KV-01 … MT-KV-11)") +class KundeModultestTest { + + private KundeService service; + private File datei; + private boolean kundeIstReferenziert; // steuert die GR-05-Löschsperre im Test + private BelegReferenzPruefer belegPruefer; + + @BeforeEach + void setUp(@TempDir Path tempDir) { + datei = tempDir.resolve("kunden.json").toFile(); + kundeIstReferenziert = false; + belegPruefer = kundeId -> kundeIstReferenziert; + service = new KundeService(new KundeRepositoryJson(datei), + new KundeValidator(), belegPruefer); + } + + /** Gültiger Kunde mit Firmenname (entspricht „Muster GmbH" aus MT-KV-01 / MT-KV-07). */ + private Kunde musterKunde() { + Kunde k = new Kunde(); + k.setFirmenname("Muster GmbH"); + k.setStrasse("Hauptstr. 1"); + k.setPlz("68159"); + k.setOrt("Mannheim"); + return k; + } + + // ───────────────────────────── BA-KV-01: Kunde anlegen ───────────────────────────── + + @Test + @DisplayName("MT-KV-01: Kunde mit vollständigen Pflichtattributen anlegen") + void mtKv01_kundeMitPflichtattributen_wirdGespeichert() { // BA-KV-01 + long id = service.anlegen(musterKunde()); + + assertTrue(id > 0, "Es muss eine fortlaufende kundeId vergeben werden"); + assertEquals(1, service.suchen("Muster").size(), + "Angelegter Kunde muss in der Kundenliste auffindbar sein"); + } + + @Test + @DisplayName("MT-KV-02: Kunde ohne Firmenname bzw. Nachname anlegen") + void mtKv02_ohneFirmennameUndNachname_wirdAbgelehnt() { // BA-KV-01 + Kunde k = musterKunde(); + k.setFirmenname(null); // nachname ist ohnehin null -> beide leer + + assertThrows(ValidierungsException.class, () -> service.anlegen(k)); + assertTrue(service.suchen("Muster").isEmpty(), "Es darf nichts gespeichert werden"); + } + + @Test + @DisplayName("MT-KV-03: Kunde ohne Straße anlegen") + void mtKv03_ohneStrasse_wirdAbgelehnt() { // BA-KV-01 + Kunde k = musterKunde(); + k.setStrasse(null); + + assertThrows(ValidierungsException.class, () -> service.anlegen(k)); + } + + @Test + @DisplayName("MT-KV-04: Kunde mit ungültigem E-Mail-Format anlegen") + void mtKv04_ungueltigeEmail_wirdAbgelehnt() { // BA-KV-01 + Kunde k = musterKunde(); + k.setEmail("kunde@"); + + assertThrows(ValidierungsException.class, () -> service.anlegen(k)); + } + + // ──────────────────────────── BA-KV-02: Kunde bearbeiten ─────────────────────────── + + @Test + @DisplayName("MT-KV-05: Vorhandenen Kunden bearbeiten") + void mtKv05_telefonnummerAendern_wirdGespeichert() { // BA-KV-02 + long id = service.anlegen(musterKunde()); + Kunde k = service.finde(id).orElseThrow(); + k.setTelefon("0621 12345"); + + service.bearbeiten(k); + + assertEquals("0621 12345", service.finde(id).orElseThrow().getTelefon(), + "Geänderte Telefonnummer muss gespeichert und angezeigt werden"); + } + + @Test + @DisplayName("MT-KV-06: Persistenz geänderter Kundendaten prüfen") + void mtKv06_geaenderteDaten_ueberlebenNeuladen() { // BA-KV-02, NF-ARCH-01 + // Kunde mit führender Null in der PLZ -> prüft zugleich den String-PLZ-Typ (Kap. 6.1.2) + Kunde k = new Kunde(); + k.setNachname("Mustermann"); + k.setStrasse("Hauptstr. 1"); + k.setPlz("01067"); + k.setOrt("Dresden"); + long id = service.anlegen(k); + + Kunde geladen = service.finde(id).orElseThrow(); + geladen.setTelefon("0351 99999"); + service.bearbeiten(geladen); + + // Neues Repository/Service auf dieselbe Datei = simulierter Neustart + KundeService nachNeustart = new KundeService(new KundeRepositoryJson(datei), + new KundeValidator(), belegPruefer); + Kunde wieder = nachNeustart.finde(id).orElseThrow(); + + assertEquals("0351 99999", wieder.getTelefon(), "Geänderte Daten müssen erhalten bleiben"); + assertEquals("01067", wieder.getPlz(), "Führende Null der PLZ muss erhalten bleiben"); + assertEquals("Mustermann", wieder.getNachname()); + } + + // ──────────────────────────── BA-KV-03: Kunde suchen ─────────────────────────────── + + @Test + @DisplayName("MT-KV-07: Kunde über Namen suchen") + void mtKv07_sucheUeberNamen_findetKunden() { // BA-KV-03 + service.anlegen(musterKunde()); // „Muster GmbH" + + List treffer = service.suchen("Muster"); + + assertEquals(1, treffer.size()); + assertEquals("Muster GmbH", treffer.get(0).getFirmenname()); + } + + @Test + @DisplayName("MT-KV-08: Kunde über Kundennummer suchen") + void mtKv08_sucheUeberKundennummer_findetKunden() { // BA-KV-03 + long id = service.anlegen(musterKunde()); + + List treffer = service.suchen(String.valueOf(id)); + + assertEquals(1, treffer.size()); + assertEquals(id, treffer.get(0).getKundeId()); + } + + @Test + @DisplayName("MT-KV-09: Nicht vorhandenen Kunden suchen") + void mtKv09_sucheOhneTreffer_istLeer() { // BA-KV-03 + service.anlegen(musterKunde()); + + assertTrue(service.suchen("Gibtsnicht").isEmpty(), + "Ohne Treffer muss eine leere Liste zurückgegeben werden"); + } + + // ──────────────────────────── BA-KV-04: Kunde löschen ────────────────────────────── + + @Test + @DisplayName("MT-KV-10: Nicht referenzierten Kunden löschen") + void mtKv10_nichtReferenzierterKunde_wirdEntfernt() { // BA-KV-04 + long id = service.anlegen(musterKunde()); + kundeIstReferenziert = false; + + service.loeschen(id); + + assertTrue(service.finde(id).isEmpty(), "Kunde muss entfernt sein"); + assertTrue(service.suchen("Muster").isEmpty(), + "Gelöschter Kunde darf nicht mehr gefunden werden"); + } + + @Test + @DisplayName("MT-KV-11: Referenzierten Kunden löschen") + void mtKv11_referenzierterKunde_wirdAbgewiesen() { // BA-KV-04, GR-05 + long id = service.anlegen(musterKunde()); + kundeIstReferenziert = true; + + assertThrows(LoeschsperreException.class, () -> service.loeschen(id)); + assertTrue(service.finde(id).isPresent(), + "Referenzierter Kunde muss erhalten bleiben"); + } +} \ No newline at end of file diff --git a/src/test/java/de/hsmannheim/faktura/kunde/service/KundeServiceTest.java b/src/test/java/de/hsmannheim/faktura/kunde/service/KundeServiceTest.java deleted file mode 100644 index c58e6f5..0000000 --- a/src/test/java/de/hsmannheim/faktura/kunde/service/KundeServiceTest.java +++ /dev/null @@ -1,99 +0,0 @@ -package de.hsmannheim.faktura.kunde.service; - -import de.hsmannheim.faktura.kunde.model.Kunde; -import de.hsmannheim.faktura.kunde.repository.KundeRepository; -import de.hsmannheim.faktura.kunde.repository.KundeRepositoryJson; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; - -import java.io.File; -import java.nio.file.Path; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -class KundeServiceTest { - - private KundeService service; - private boolean kundeIstReferenziert; // steuert den BelegReferenzPruefer im Test - - @BeforeEach - void setUp(@TempDir Path tempDir) { - File datei = tempDir.resolve("kunden.json").toFile(); - KundeRepository repository = new KundeRepositoryJson(datei); - KundeValidator validator = new KundeValidator(); - BelegReferenzPruefer belegPruefer = kundeId -> kundeIstReferenziert; - service = new KundeService(repository, validator, belegPruefer); - kundeIstReferenziert = false; - } - - private Kunde gueltigerKunde() { - Kunde k = new Kunde(); - k.setNachname("Mustermann"); - k.setStrasse("Hauptstr. 1"); - k.setPlz("68159"); - k.setOrt("Mannheim"); - return k; - } - - @Test - void anlegen_vergibtIdUndPersistiert() { // BA-KV-01 - long id = service.anlegen(gueltigerKunde()); - assertTrue(id > 0); - assertEquals(1, service.suchen("Mustermann").size()); - } - - @Test - void anlegen_ungueltig_wirdNichtGespeichert() { // P3-4 im Service - Kunde k = gueltigerKunde(); - k.setNachname(null); - assertThrows(ValidierungsException.class, () -> service.anlegen(k)); - assertTrue(service.suchen("Mustermann").isEmpty()); - } - - @Test - void bearbeiten_aendertGespeichertenKunden() { // BA-KV-02 - service.anlegen(gueltigerKunde()); - Kunde k = service.suchen("Mustermann").get(0); - k.setTelefon("0621 12345"); - service.bearbeiten(k); - assertEquals("0621 12345", service.suchen("Mustermann").get(0).getTelefon()); - } - - @Test - void suchen_ueberKundennummer_findet() { // BA-KV-03 / MT-KV-08 - long id = service.anlegen(gueltigerKunde()); - assertEquals(1, service.suchen(String.valueOf(id)).size()); - } - - @Test - void suchen_ohneTreffer_istLeer() { // BA-KV-03 / MT-KV-09 - service.anlegen(gueltigerKunde()); - assertTrue(service.suchen("Gibtsnicht").isEmpty()); - } - - @Test - void loeschen_nichtReferenziert_entfernt() { // BA-KV-04 / MT-KV-10 - long id = service.anlegen(gueltigerKunde()); - kundeIstReferenziert = false; - service.loeschen(id); - assertTrue(service.suchen("Mustermann").isEmpty()); - } - - @Test - void loeschen_referenziert_wirdAbgewiesen() { // BA-KV-04 / GR-05 / MT-KV-11 - long id = service.anlegen(gueltigerKunde()); - kundeIstReferenziert = true; - assertThrows(LoeschsperreException.class, () -> service.loeschen(id)); - assertEquals(1, service.suchen("Mustermann").size()); // noch vorhanden - } - - @Test - void finde_liefertAngelegtenKunden() { // K3 - long id = service.anlegen(gueltigerKunde()); - assertTrue(service.finde(id).isPresent()); - assertEquals(id, service.finde(id).get().getKundeId()); - assertTrue(service.finde(999L).isEmpty()); // unbekannte ID -> leer - } -} \ No newline at end of file diff --git a/src/test/java/de/hsmannheim/faktura/kunde/service/KundeValidatorTest.java b/src/test/java/de/hsmannheim/faktura/kunde/service/KundeValidatorTest.java deleted file mode 100644 index bf2395e..0000000 --- a/src/test/java/de/hsmannheim/faktura/kunde/service/KundeValidatorTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package de.hsmannheim.faktura.kunde.service; - -import de.hsmannheim.faktura.kunde.model.Kunde; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertThrows; - -class KundeValidatorTest { - - private final KundeValidator validator = new KundeValidator(); - - private Kunde gueltigerKunde() { - Kunde k = new Kunde(); - k.setNachname("Mustermann"); - k.setStrasse("Hauptstr. 1"); - k.setPlz("68159"); - k.setOrt("Mannheim"); - return k; - } - - @Test - void gueltigerKunde_wirftNicht() { - assertDoesNotThrow(() -> validator.pruefe(gueltigerKunde())); - } - - @Test - void ohneFirmennameUndNachname_wirdAbgelehnt() { // → MT-KV-02 - Kunde k = gueltigerKunde(); - k.setNachname(null); - assertThrows(ValidierungsException.class, () -> validator.pruefe(k)); - } - - @Test - void ohneStrasse_wirdAbgelehnt() { // → MT-KV-03 - Kunde k = gueltigerKunde(); - k.setStrasse(null); - assertThrows(ValidierungsException.class, () -> validator.pruefe(k)); - } - - @Test - void ungueltigeEmail_wirdAbgelehnt() { // → MT-KV-04 - Kunde k = gueltigerKunde(); - k.setEmail("kunde@"); - assertThrows(ValidierungsException.class, () -> validator.pruefe(k)); - } - - @Test - void gueltigeEmail_wirftNicht() { - Kunde k = gueltigerKunde(); - k.setEmail("kunde@example.com"); - assertDoesNotThrow(() -> validator.pruefe(k)); - } -}