Zwischen commit Löschung Testmodule Da KundenModulTest alle beinhaltet

feature/kundenverwaltung
3027248 2026-06-25 21:46:09 +02:00
parent fef7e8f80c
commit 380efbeb8e
4 changed files with 205 additions and 193 deletions

View File

@ -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<Kunde> 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());
}
}

View File

@ -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.
*
* <p>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.</p>
*
* <p>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.</p>
*
* <p>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").</p>
*
* <p>Abgedeckte Anforderungen: BA-KV-01 BA-KV-04, GR-05, NF-ARCH-01.</p>
*/
@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<Kunde> 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<Kunde> 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");
}
}

View File

@ -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
}
}

View File

@ -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));
}
}