Zwischen commit Löschung Testmodule Da KundenModulTest alle beinhaltet
parent
fef7e8f80c
commit
380efbeb8e
|
|
@ -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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue