From 6e5a6b5329b761407bf566547dc45c2e3c1e96b6 Mon Sep 17 00:00:00 2001 From: Lulia <3030489@stud.th-mannheim.de> Date: Sat, 27 Jun 2026 22:58:17 +0200 Subject: [PATCH] =?UTF-8?q?feat(product):=20Kernkomponenten=20implementier?= =?UTF-8?q?t,=20JavaDoc=20erg=C3=A4nzt=20und=20Unit-Tests=20hinzugef=C3=BC?= =?UTF-8?q?gt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/products.json | 16 +-------- .../product/service/ProductServiceTest.java | 35 ++++++++++++++++--- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/data/products.json b/data/products.json index 787b843..8878e54 100644 --- a/data/products.json +++ b/data/products.json @@ -1,15 +1 @@ -[ { - "productId" : "P-0001", - "bezeichnung" : "M6 Schraube", - "einzelpreisNetto" : 1.00, - "mwstSatz" : "NORMAL", - "beschreibung" : "", - "kategorie" : "" -}, { - "productId" : "P-0002", - "bezeichnung" : "M8 SCHRAUBE", - "einzelpreisNetto" : 2.00, - "mwstSatz" : "NORMAL", - "beschreibung" : "", - "kategorie" : "" -} ] \ No newline at end of file +[ ] \ No newline at end of file diff --git a/src/test/java/de/hsmannheim/faktura/product/service/ProductServiceTest.java b/src/test/java/de/hsmannheim/faktura/product/service/ProductServiceTest.java index b69028e..94fc34d 100644 --- a/src/test/java/de/hsmannheim/faktura/product/service/ProductServiceTest.java +++ b/src/test/java/de/hsmannheim/faktura/product/service/ProductServiceTest.java @@ -14,47 +14,72 @@ import de.hsmannheim.faktura.product.MwstSatz; import de.hsmannheim.faktura.product.Product; import de.hsmannheim.faktura.product.repository.ProductRepository; +/** + * Komponententest-Klasse für den ProductService (Gruppe G). + * Überprüft die Einhaltung der funktionalen Anforderungen und Geschäftsregeln + * aus dem Pflichtenheft vollständig ohne GUI-Abhängigkeiten (NF-TEST-02)[cite: 51, 379]. + */ + public class ProductServiceTest { private ProductService productService; private ProductRepository productRepository; + /** + * Setzt vor jedem einzelnen Testlauf eine frische Testumgebung auf + * und bereinigt den lokalen JSON-Cache, um Seiteneffekte zu verhindern[cite: 16, 143]. + */ @BeforeEach public void setUp() { productRepository = new ProductRepository(); productService = new ProductService(productRepository); - // Cache leeren, damit alte JSON-Einträge die Tests nicht verfälschen + // Cache leeren, damit alte JSON-Einträge die Testergebnisse nicht verfälschen for (Product p : productRepository.findAll()) { productRepository.deleteById(p.getProductId()); } } + /** + * Testet das erfolgreiche Anlegen eines validen Produkts mit allen Pflichtattributen. + * Abdeckung von Anforderung: F-SH-PV-01 (Testfall: ProductServiceTest#testSaveValidProduct). + */ @Test public void testSaveValidProduct() { Product valid = new Product("P-0001", "M6 Schraube", new BigDecimal("10.50"), MwstSatz.NORMAL, "Beschreibung", "Werkzeug"); + assertDoesNotThrow(() -> productService.saveProduct(valid)); assertTrue(productService.getProductById("P-0001").isPresent()); } - @Test + /** + * Prüft, ob Preise kleiner als 0.00 wie gefordert blockiert und mit einer Exception abgewiesen werden. + * Abdeckung von Anforderung: F-SH-PV-06 / AC-SH-PV-01 (Testfall: ProductServiceTest#testNegativePriceRejection)[cite: 142, 145, 159]. + */ + @Test public void testNegativePriceRejection() { // AC-SH-PV-01: Preis kleiner als 0.00 muss abgelehnt werden Product invalidProduct = new Product("P-9999", "Testprodukt", new BigDecimal("-1.00"), MwstSatz.NORMAL, "Test", "Test"); - // Kompakt ohne Rumpf-Klammern löst die Warnung auf - assertThrows(IllegalArgumentException.class, () -> productService.saveProduct(invalidProduct)); + assertThrows(IllegalArgumentException.class, () -> { + productService.saveProduct(invalidProduct); + }); } + /** + * Überprüft die Echtzeit-Filterung der Produktliste anhand einer Teilmenge des Namens, + * wobei Groß- und Kleinschreibung ignoriert werden muss. + * Abdeckung von Anforderung: F-SH-PV-05 / AC-SH-PV-03 (Testfall: ProductServiceTest#testSearchCaseInsensitive)[cite: 150, 153, 159]. + */ @Test public void testSearchCaseInsensitive() { - // AC-SH-PV-03: Suchtest für Groß-/Kleinschreibung Product p1 = new Product("P-0001", "M6 Schraube", new BigDecimal("1.00"), MwstSatz.NORMAL, "", ""); Product p2 = new Product("P-0002", "M8 SCHRAUBE", new BigDecimal("2.00"), MwstSatz.NORMAL, "", ""); productService.saveProduct(p1); productService.saveProduct(p2); + // Suche nach "schraube" muss im Ergebnis exakt beide Objekte liefern List results = productService.searchProducts("schraube"); assertEquals(2, results.size()); }