From 931d5eef576475d5ef94b19e3879910c05cf25dd Mon Sep 17 00:00:00 2001 From: Shan Ruhhammer Date: Wed, 14 Jun 2023 14:38:31 +0200 Subject: [PATCH 01/17] Grobkonstrukt Klasse Preisentnahme der AmazonAPI --- .../de/rwu/easydrop/api/Preisentnahme.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/main/java/de/rwu/easydrop/api/Preisentnahme.java diff --git a/src/main/java/de/rwu/easydrop/api/Preisentnahme.java b/src/main/java/de/rwu/easydrop/api/Preisentnahme.java new file mode 100644 index 0000000..073ef9b --- /dev/null +++ b/src/main/java/de/rwu/easydrop/api/Preisentnahme.java @@ -0,0 +1,49 @@ +package de.rwu.easydrop.api.client; + +import java.net.MalformedURLException; +import java.net.URL; + +import com.jayway.jsonpath.JsonPath; +import com.jayway.jsonpath.PathNotFoundException; +import com.jayway.jsonpath.ReadContext; + +import de.rwu.easydrop.api.dto.ProductDTO; + +/** + * Diese Klasse AmazonPriceFetcher enthält die Methode getProductPrice, + * die den Preis eines Produkts von der Amazon API abruft. + * Die Methode verwendet die Base URL, den API-Schlüssel und die Produkt-ID, + * um die API-URL zu erstellen und die Daten von der API abzurufen. + * Anschließend wird der Preis aus der JSON-Antwort extrahiert und zurückgegeben. + */ +public final class AmazonPriceFetcher { + /** + * URL zur Amazon API. + */ + private String baseUrl; + /** + * API-Schlüssel zur Autorisierung. + */ + private String apiKey; + /** + * Produktregion für den Datenzugriff. + */ + private static final String PRODUCT_REGION = "DE"; + /** + * Sprachparameter für den Datenzugriff. + */ + private static final String LOCALE = "de_DE"; + + /** + * Initialisiert die Klasse mit der Base URL und dem API-Schlüssel. + * + * @param newBaseUrl Die Base URL zur Amazon API. + * @param newApiKey Der API-Schlüssel zur Autorisierung. + */ + + public AmazonPriceFetcher(final String newBaseUrl, final String newApiKey) { + this.baseUrl = newBaseUrl; + this.apiKey = newApiKey; + } + +} \ No newline at end of file From 36de6ce7bb34a144c8a4916c1d27e194be83032c Mon Sep 17 00:00:00 2001 From: Shan Ruhhammer Date: Wed, 14 Jun 2023 14:47:33 +0200 Subject: [PATCH 02/17] Klasse Preisentnahme AmazonAPI Konstrukt --- src/main/java/de/rwu/easydrop/api/Preisentnahme.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/de/rwu/easydrop/api/Preisentnahme.java b/src/main/java/de/rwu/easydrop/api/Preisentnahme.java index 073ef9b..8041bb5 100644 --- a/src/main/java/de/rwu/easydrop/api/Preisentnahme.java +++ b/src/main/java/de/rwu/easydrop/api/Preisentnahme.java @@ -46,4 +46,6 @@ public final class AmazonPriceFetcher { this.apiKey = newApiKey; } + + } \ No newline at end of file From 82a0569e9db84822ed202051275888343a663acb Mon Sep 17 00:00:00 2001 From: Shan Ruhhammer Date: Sun, 18 Jun 2023 18:26:17 +0200 Subject: [PATCH 03/17] Abrufen der PRodukte der AmazonAPI --- src/main/java/de/rwu/easydrop/Main.java | 12 ++++ .../java/de/rwu/easydrop/PriceFetcher.java | 61 +++++++++++++++++++ .../java/de/rwu/easydrop/api/BeforeEach.java | 5 ++ .../de/rwu/easydrop/api/Preisentnahme.java | 51 ---------------- src/main/java/de/rwu/easydrop/api/Test.java | 5 ++ .../rwu/easydrop/model/ProductCatalogue.java | 1 + .../easydrop/api/AmazonPriceFetcherTest.java | 56 +++++++++++++++++ 7 files changed, 140 insertions(+), 51 deletions(-) create mode 100644 src/main/java/de/rwu/easydrop/PriceFetcher.java create mode 100644 src/main/java/de/rwu/easydrop/api/BeforeEach.java delete mode 100644 src/main/java/de/rwu/easydrop/api/Preisentnahme.java create mode 100644 src/main/java/de/rwu/easydrop/api/Test.java create mode 100644 src/test/java/de/rwu/easydrop/api/AmazonPriceFetcherTest.java diff --git a/src/main/java/de/rwu/easydrop/Main.java b/src/main/java/de/rwu/easydrop/Main.java index 5441d96..efc9a60 100644 --- a/src/main/java/de/rwu/easydrop/Main.java +++ b/src/main/java/de/rwu/easydrop/Main.java @@ -1,5 +1,6 @@ package de.rwu.easydrop; +import java.net.MalformedURLException; import java.util.List; import javax.naming.ConfigurationException; @@ -11,6 +12,7 @@ import org.sqlite.SQLiteDataSource; import de.rwu.easydrop.api.client.DataSourceFactory; import de.rwu.easydrop.data.connector.AbstractProductPersistence; import de.rwu.easydrop.data.connector.SQLiteConnector; +import de.rwu.easydrop.model.Product; import de.rwu.easydrop.model.ProductCatalogue; import de.rwu.easydrop.service.retriever.CatalogueRetriever; import de.rwu.easydrop.service.retriever.ProductRetriever; @@ -58,5 +60,15 @@ public final class Main { String pCatStr = pCat.toString(); LOGGER.info(pCatStr); } + + for (ProductCatalogue pCat : pCats) { + List products = pCat.getProducts(); + + for (Product product : products) { + String productId = product.getProductId(); + double price = product.getCurrentPrice(); + LOGGER.info("Product ID: " + productId + ", Price: " + price); + } + } } } diff --git a/src/main/java/de/rwu/easydrop/PriceFetcher.java b/src/main/java/de/rwu/easydrop/PriceFetcher.java new file mode 100644 index 0000000..f25a371 --- /dev/null +++ b/src/main/java/de/rwu/easydrop/PriceFetcher.java @@ -0,0 +1,61 @@ +package de.rwu.easydrop; + +import java.net.MalformedURLException; +import java.util.List; + +import javax.naming.ConfigurationException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.sqlite.SQLiteDataSource; + +import de.rwu.easydrop.api.client.DataSourceFactory; +import de.rwu.easydrop.data.connector.AbstractProductPersistence; +import de.rwu.easydrop.data.connector.SQLiteConnector; +import de.rwu.easydrop.model.Product; +import de.rwu.easydrop.model.ProductCatalogue; +import de.rwu.easydrop.service.retriever.CatalogueRetriever; +import de.rwu.easydrop.service.retriever.ProductRetriever; +import de.rwu.easydrop.service.writer.CatalogueWriter; +import de.rwu.easydrop.util.Config; +import de.rwu.easydrop.util.ProductsConfig; + + +/** + * Diese Klasse PriceFetcher enthält die Methode getProductPrice, + * die den Preis eines Produkts von den jeweiligen API's abruft. + */ +public final class PriceFetcher { + + private static final Logger LOGGER = LoggerFactory.getLogger(PriceFetcher.class); + + public static void getProductPrice(final String[] args) throws ConfigurationException{ + + Config config = Config.getInstance(); + ProductsConfig pConfig = ProductsConfig.getInstance(); + DataSourceFactory dataSourceFactory = new DataSourceFactory(config); + ProductRetriever retriever = new ProductRetriever(dataSourceFactory); + CatalogueRetriever catRetriever = new CatalogueRetriever(pConfig, retriever); + AbstractProductPersistence db = new SQLiteConnector(new SQLiteDataSource()); + CatalogueWriter catWriter = new CatalogueWriter(db); + + catRetriever.loadCatalogues(); + List pCats = catRetriever.getProductCatalogues(); + catWriter.writeCatalogues(pCats); + + for (ProductCatalogue pCat : pCats) { + String pCatStr = pCat.toString(); + LOGGER.info(pCatStr); + } + + for (ProductCatalogue pCat : pCats) { + List products = pCat.getProducts(); + + for (Product product : products) { + String productId = product.getProductId(); + double price = product.getCurrentPrice(); + LOGGER.info("Product ID: " + productId + ", Price: " + price); + } + } + } +} diff --git a/src/main/java/de/rwu/easydrop/api/BeforeEach.java b/src/main/java/de/rwu/easydrop/api/BeforeEach.java new file mode 100644 index 0000000..b316851 --- /dev/null +++ b/src/main/java/de/rwu/easydrop/api/BeforeEach.java @@ -0,0 +1,5 @@ +package de.rwu.easydrop.api; + +public @interface BeforeEach { + +} diff --git a/src/main/java/de/rwu/easydrop/api/Preisentnahme.java b/src/main/java/de/rwu/easydrop/api/Preisentnahme.java deleted file mode 100644 index 8041bb5..0000000 --- a/src/main/java/de/rwu/easydrop/api/Preisentnahme.java +++ /dev/null @@ -1,51 +0,0 @@ -package de.rwu.easydrop.api.client; - -import java.net.MalformedURLException; -import java.net.URL; - -import com.jayway.jsonpath.JsonPath; -import com.jayway.jsonpath.PathNotFoundException; -import com.jayway.jsonpath.ReadContext; - -import de.rwu.easydrop.api.dto.ProductDTO; - -/** - * Diese Klasse AmazonPriceFetcher enthält die Methode getProductPrice, - * die den Preis eines Produkts von der Amazon API abruft. - * Die Methode verwendet die Base URL, den API-Schlüssel und die Produkt-ID, - * um die API-URL zu erstellen und die Daten von der API abzurufen. - * Anschließend wird der Preis aus der JSON-Antwort extrahiert und zurückgegeben. - */ -public final class AmazonPriceFetcher { - /** - * URL zur Amazon API. - */ - private String baseUrl; - /** - * API-Schlüssel zur Autorisierung. - */ - private String apiKey; - /** - * Produktregion für den Datenzugriff. - */ - private static final String PRODUCT_REGION = "DE"; - /** - * Sprachparameter für den Datenzugriff. - */ - private static final String LOCALE = "de_DE"; - - /** - * Initialisiert die Klasse mit der Base URL und dem API-Schlüssel. - * - * @param newBaseUrl Die Base URL zur Amazon API. - * @param newApiKey Der API-Schlüssel zur Autorisierung. - */ - - public AmazonPriceFetcher(final String newBaseUrl, final String newApiKey) { - this.baseUrl = newBaseUrl; - this.apiKey = newApiKey; - } - - - -} \ No newline at end of file diff --git a/src/main/java/de/rwu/easydrop/api/Test.java b/src/main/java/de/rwu/easydrop/api/Test.java new file mode 100644 index 0000000..ca98b8c --- /dev/null +++ b/src/main/java/de/rwu/easydrop/api/Test.java @@ -0,0 +1,5 @@ +package de.rwu.easydrop.api; + +public @interface Test { + +} diff --git a/src/main/java/de/rwu/easydrop/model/ProductCatalogue.java b/src/main/java/de/rwu/easydrop/model/ProductCatalogue.java index 97f31dc..7f0ad97 100644 --- a/src/main/java/de/rwu/easydrop/model/ProductCatalogue.java +++ b/src/main/java/de/rwu/easydrop/model/ProductCatalogue.java @@ -24,6 +24,7 @@ public class ProductCatalogue { * Product collection. */ private List products; + public float getProducts; /** * Creates new Product Catalogue. diff --git a/src/test/java/de/rwu/easydrop/api/AmazonPriceFetcherTest.java b/src/test/java/de/rwu/easydrop/api/AmazonPriceFetcherTest.java new file mode 100644 index 0000000..4be1200 --- /dev/null +++ b/src/test/java/de/rwu/easydrop/api/AmazonPriceFetcherTest.java @@ -0,0 +1,56 @@ +package de.rwu.easydrop.api; + +import java.net.MalformedURLException; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class AmazonPriceFetcherTest { + private static final String BASE_URL = "https://api.amazon.com"; + private static final String API_KEY = "your_api_key"; + private static final String PRODUCT_ID = "12345"; + + private AmazonPriceFetcher priceFetcher; + + @BeforeEach + public void setup() { + priceFetcher = new AmazonPriceFetcher(BASE_URL, API_KEY); + } + + @Test + public void testGetProductPrice_ValidProductId_ReturnsPrice() throws MalformedURLException { + // Arrange + double expectedPrice = -1.0; + + // Act + double actualPrice = priceFetcher.getProductPrice(PRODUCT_ID); + + // Assert + Assertions.assertEquals(expectedPrice, actualPrice); + } + + @Test + public void testGetProductPrice_InvalidProductId_ReturnsNegativePrice() throws MalformedURLException { + // Arrange + double expectedPrice = -1.0; + + // Act + double actualPrice = priceFetcher.getProductPrice("invalid_product_id"); + + // Assert + Assertions.assertEquals(expectedPrice, actualPrice); + } + + @Test + public void testGetProductPrice_ExceptionThrown_ReturnsNegativePrice() throws MalformedURLException { + // Arrange + double expectedPrice = -1.0; + + // Act + double actualPrice = priceFetcher.getProductPrice("exception_thrown"); + + // Assert + Assertions.assertEquals(expectedPrice, actualPrice); + } +} \ No newline at end of file From dce001f1b3cfbf5f644e9252798dc9aa01c5018c Mon Sep 17 00:00:00 2001 From: Shan Ruhhammer Date: Fri, 23 Jun 2023 12:40:36 +0200 Subject: [PATCH 04/17] Funktion zur Margenermittlung --- .../java/de/rwu/easydrop/PriceFetcher.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/main/java/de/rwu/easydrop/PriceFetcher.java b/src/main/java/de/rwu/easydrop/PriceFetcher.java index f25a371..4ccf2e5 100644 --- a/src/main/java/de/rwu/easydrop/PriceFetcher.java +++ b/src/main/java/de/rwu/easydrop/PriceFetcher.java @@ -1,6 +1,7 @@ package de.rwu.easydrop; import java.net.MalformedURLException; +import java.util.ArrayList; import java.util.List; import javax.naming.ConfigurationException; @@ -26,9 +27,36 @@ import de.rwu.easydrop.util.ProductsConfig; * die den Preis eines Produkts von den jeweiligen API's abruft. */ public final class PriceFetcher { + static List api1Prices = new ArrayList<>(); + static List api2Prices = new ArrayList<>(); private static final Logger LOGGER = LoggerFactory.getLogger(PriceFetcher.class); + //Methode, um Preise der Prdukte zu vergleichen -> MArgen ermitteln + public static void comparePrices() throws ConfigurationException { + List api1Prices = new ArrayList<>(); + List api2Prices = new ArrayList<>(); + + for (int i = 0; i < api1Prices.size(); i++) { + double api1Price = api1Prices.get(i); + double api2Price = api2Prices.get(i); + String productId = "Product " + (i + 1); + + if (api1Price < api2Price) { + double priceDifference = api2Price - api1Price; + LOGGER.info("API 1 hat einen günstigeren Preis für " + productId + + ". Der Preisunterschied beträgt: " + priceDifference); + } else if (api2Price < api1Price) { + double priceDifference = api1Price - api2Price; + LOGGER.info("API 2 hat einen günstigeren Preis für " + productId + + ". Der Preisunterschied beträgt: " + priceDifference); + } else { + LOGGER.info("Beide APIs haben den gleichen Preis für " + productId); + } + } +} + + // Methode, um Preise der Produkte zu ermitteln public static void getProductPrice(final String[] args) throws ConfigurationException{ Config config = Config.getInstance(); @@ -55,7 +83,14 @@ public final class PriceFetcher { String productId = product.getProductId(); double price = product.getCurrentPrice(); LOGGER.info("Product ID: " + productId + ", Price: " + price); + if (productId == "B096Y2TYKV") { + api1Prices.add(price); + } else if (productId == "Gigabyte GeForce RTX 3060") { + api2Prices.add(price); + } } } } + + } From 554cc99b6dd4905fb07cf321c3e3749d2388494f Mon Sep 17 00:00:00 2001 From: Shan Ruhhammer Date: Sun, 25 Jun 2023 02:00:35 +0200 Subject: [PATCH 05/17] Removed needless classes --- src/main/java/de/rwu/easydrop/api/BeforeEach.java | 5 ----- src/main/java/de/rwu/easydrop/api/Test.java | 5 ----- 2 files changed, 10 deletions(-) delete mode 100644 src/main/java/de/rwu/easydrop/api/BeforeEach.java delete mode 100644 src/main/java/de/rwu/easydrop/api/Test.java diff --git a/src/main/java/de/rwu/easydrop/api/BeforeEach.java b/src/main/java/de/rwu/easydrop/api/BeforeEach.java deleted file mode 100644 index b316851..0000000 --- a/src/main/java/de/rwu/easydrop/api/BeforeEach.java +++ /dev/null @@ -1,5 +0,0 @@ -package de.rwu.easydrop.api; - -public @interface BeforeEach { - -} diff --git a/src/main/java/de/rwu/easydrop/api/Test.java b/src/main/java/de/rwu/easydrop/api/Test.java deleted file mode 100644 index ca98b8c..0000000 --- a/src/main/java/de/rwu/easydrop/api/Test.java +++ /dev/null @@ -1,5 +0,0 @@ -package de.rwu.easydrop.api; - -public @interface Test { - -} From e771063c283b9bd20ea02e40cbbc9a76a144d38f Mon Sep 17 00:00:00 2001 From: Shan Ruhhammer Date: Sun, 25 Jun 2023 02:00:51 +0200 Subject: [PATCH 06/17] Removed unused attribute --- src/main/java/de/rwu/easydrop/model/ProductCatalogue.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/de/rwu/easydrop/model/ProductCatalogue.java b/src/main/java/de/rwu/easydrop/model/ProductCatalogue.java index 7f0ad97..97f31dc 100644 --- a/src/main/java/de/rwu/easydrop/model/ProductCatalogue.java +++ b/src/main/java/de/rwu/easydrop/model/ProductCatalogue.java @@ -24,7 +24,6 @@ public class ProductCatalogue { * Product collection. */ private List products; - public float getProducts; /** * Creates new Product Catalogue. From 124d06a6bc325051acbbcbd11f9255f39f0e8ee7 Mon Sep 17 00:00:00 2001 From: Shan Ruhhammer Date: Sun, 25 Jun 2023 02:11:36 +0200 Subject: [PATCH 07/17] Removed needless stump --- .../rwu/easydrop/service/processing/OrderManager.java | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 src/main/java/de/rwu/easydrop/service/processing/OrderManager.java diff --git a/src/main/java/de/rwu/easydrop/service/processing/OrderManager.java b/src/main/java/de/rwu/easydrop/service/processing/OrderManager.java deleted file mode 100644 index 4d373b2..0000000 --- a/src/main/java/de/rwu/easydrop/service/processing/OrderManager.java +++ /dev/null @@ -1,10 +0,0 @@ -package de.rwu.easydrop.service.processing; - -/** - * Processes dropshipping orders. - * - * TODO implement - */ -public class OrderManager { - -} From d3f89b726a7869a906b94e7d226b974fe7d9088f Mon Sep 17 00:00:00 2001 From: Shan Ruhhammer Date: Sun, 25 Jun 2023 02:14:41 +0200 Subject: [PATCH 08/17] Revert "Removed needless stump" This reverts commit 124d06a6bc325051acbbcbd11f9255f39f0e8ee7. --- .../rwu/easydrop/service/processing/OrderManager.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/de/rwu/easydrop/service/processing/OrderManager.java diff --git a/src/main/java/de/rwu/easydrop/service/processing/OrderManager.java b/src/main/java/de/rwu/easydrop/service/processing/OrderManager.java new file mode 100644 index 0000000..4d373b2 --- /dev/null +++ b/src/main/java/de/rwu/easydrop/service/processing/OrderManager.java @@ -0,0 +1,10 @@ +package de.rwu.easydrop.service.processing; + +/** + * Processes dropshipping orders. + * + * TODO implement + */ +public class OrderManager { + +} From 5f6fa3fec9598ad0afc938a304067459d6b21a14 Mon Sep 17 00:00:00 2001 From: Shan Ruhhammer Date: Sun, 25 Jun 2023 03:04:32 +0200 Subject: [PATCH 09/17] #11 Rewrote, moved code to OrderManager --- .../java/de/rwu/easydrop/PriceFetcher.java | 96 ------------------- .../service/processing/OrderManager.java | 90 +++++++++++++++-- 2 files changed, 84 insertions(+), 102 deletions(-) delete mode 100644 src/main/java/de/rwu/easydrop/PriceFetcher.java diff --git a/src/main/java/de/rwu/easydrop/PriceFetcher.java b/src/main/java/de/rwu/easydrop/PriceFetcher.java deleted file mode 100644 index 4ccf2e5..0000000 --- a/src/main/java/de/rwu/easydrop/PriceFetcher.java +++ /dev/null @@ -1,96 +0,0 @@ -package de.rwu.easydrop; - -import java.net.MalformedURLException; -import java.util.ArrayList; -import java.util.List; - -import javax.naming.ConfigurationException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.sqlite.SQLiteDataSource; - -import de.rwu.easydrop.api.client.DataSourceFactory; -import de.rwu.easydrop.data.connector.AbstractProductPersistence; -import de.rwu.easydrop.data.connector.SQLiteConnector; -import de.rwu.easydrop.model.Product; -import de.rwu.easydrop.model.ProductCatalogue; -import de.rwu.easydrop.service.retriever.CatalogueRetriever; -import de.rwu.easydrop.service.retriever.ProductRetriever; -import de.rwu.easydrop.service.writer.CatalogueWriter; -import de.rwu.easydrop.util.Config; -import de.rwu.easydrop.util.ProductsConfig; - - -/** - * Diese Klasse PriceFetcher enthält die Methode getProductPrice, - * die den Preis eines Produkts von den jeweiligen API's abruft. - */ -public final class PriceFetcher { - static List api1Prices = new ArrayList<>(); - static List api2Prices = new ArrayList<>(); - - private static final Logger LOGGER = LoggerFactory.getLogger(PriceFetcher.class); - - //Methode, um Preise der Prdukte zu vergleichen -> MArgen ermitteln - public static void comparePrices() throws ConfigurationException { - List api1Prices = new ArrayList<>(); - List api2Prices = new ArrayList<>(); - - for (int i = 0; i < api1Prices.size(); i++) { - double api1Price = api1Prices.get(i); - double api2Price = api2Prices.get(i); - String productId = "Product " + (i + 1); - - if (api1Price < api2Price) { - double priceDifference = api2Price - api1Price; - LOGGER.info("API 1 hat einen günstigeren Preis für " + productId + - ". Der Preisunterschied beträgt: " + priceDifference); - } else if (api2Price < api1Price) { - double priceDifference = api1Price - api2Price; - LOGGER.info("API 2 hat einen günstigeren Preis für " + productId + - ". Der Preisunterschied beträgt: " + priceDifference); - } else { - LOGGER.info("Beide APIs haben den gleichen Preis für " + productId); - } - } -} - - // Methode, um Preise der Produkte zu ermitteln - public static void getProductPrice(final String[] args) throws ConfigurationException{ - - Config config = Config.getInstance(); - ProductsConfig pConfig = ProductsConfig.getInstance(); - DataSourceFactory dataSourceFactory = new DataSourceFactory(config); - ProductRetriever retriever = new ProductRetriever(dataSourceFactory); - CatalogueRetriever catRetriever = new CatalogueRetriever(pConfig, retriever); - AbstractProductPersistence db = new SQLiteConnector(new SQLiteDataSource()); - CatalogueWriter catWriter = new CatalogueWriter(db); - - catRetriever.loadCatalogues(); - List pCats = catRetriever.getProductCatalogues(); - catWriter.writeCatalogues(pCats); - - for (ProductCatalogue pCat : pCats) { - String pCatStr = pCat.toString(); - LOGGER.info(pCatStr); - } - - for (ProductCatalogue pCat : pCats) { - List products = pCat.getProducts(); - - for (Product product : products) { - String productId = product.getProductId(); - double price = product.getCurrentPrice(); - LOGGER.info("Product ID: " + productId + ", Price: " + price); - if (productId == "B096Y2TYKV") { - api1Prices.add(price); - } else if (productId == "Gigabyte GeForce RTX 3060") { - api2Prices.add(price); - } - } - } - } - - -} diff --git a/src/main/java/de/rwu/easydrop/service/processing/OrderManager.java b/src/main/java/de/rwu/easydrop/service/processing/OrderManager.java index 4d373b2..c84640f 100644 --- a/src/main/java/de/rwu/easydrop/service/processing/OrderManager.java +++ b/src/main/java/de/rwu/easydrop/service/processing/OrderManager.java @@ -1,10 +1,88 @@ package de.rwu.easydrop.service.processing; -/** - * Processes dropshipping orders. - * - * TODO implement - */ -public class OrderManager { +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import de.rwu.easydrop.Main; +import de.rwu.easydrop.exception.InvalidCatalogueException; +import de.rwu.easydrop.model.Product; +import de.rwu.easydrop.model.ProductCatalogue; +import de.rwu.easydrop.model.ProductPair; +import de.rwu.easydrop.util.FormattingUtil; + +/** + * Creates dropshipping orders based on price margin. + * + * @since 0.3.0 + */ +public final class OrderManager { + + /** + * Temporary logging instance. + */ + private static final Logger LOGGER = LoggerFactory.getLogger(OrderManager.class); + + /** + * Private constructor to prevent unwanted instantiation. + * + * @throws UnsupportedOperationException always + */ + private OrderManager() throws UnsupportedOperationException { + throw new UnsupportedOperationException("This is a stateless class, don't instantiate it."); + } + + /** + * Creates orders for products with sufficient margin. + * + * @param pCats Product Catalogues + */ + public static void createOrders(final List pCats) { + for (ProductCatalogue pCat : pCats) { + ProductPair pair = getHighestMarginProducts(pCat); + + // TODO: create actual orders/transactions, remove logger + double margin = pair.getProduct2().getCurrentPrice() - + pair.getProduct1().getCurrentPrice(); + String marginFormatted = FormattingUtil.formatEuro(margin); + LOGGER.info("{}: Margin {} ({} to {})", + pCat.getProductName(), + marginFormatted, + pair.getProduct1().getDataOrigin(), + pair.getProduct2().getDataOrigin()); + } + } + + /** + * Returns the cheapest and most expensive product of a catalogue to guarantee + * the biggest margin as a pair. + * + * @param pCat Product Catalogue + * @return Cheapest Product, Most Expensive Product as a Product Pair + */ + public static ProductPair getHighestMarginProducts(final ProductCatalogue pCat) { + if (pCat.getProducts().size() < 2) { + throw new InvalidCatalogueException("Product Catalogue holds less than 2 products!"); + } + + // Initialize indexes + Product cheapestProduct = pCat.getProducts().get(0); + Product mostExpensiveProduct = pCat.getProducts().get(0); + + for (Product product : pCat.getProducts()) { + if (product.getCurrentPrice() < cheapestProduct.getCurrentPrice()) { + cheapestProduct = product; + } + if (product.getCurrentPrice() > mostExpensiveProduct.getCurrentPrice()) { + mostExpensiveProduct = product; + } + } + + if (cheapestProduct.getCurrentPrice() == mostExpensiveProduct.getCurrentPrice()) { + throw new InvalidCatalogueException("Price margin is zero!"); + } + + return new ProductPair(cheapestProduct, mostExpensiveProduct); + } } From 4c3f6ebe82e24f38dbe30840c830b22d2a0cbee6 Mon Sep 17 00:00:00 2001 From: Shan Ruhhammer Date: Sun, 25 Jun 2023 03:04:56 +0200 Subject: [PATCH 10/17] #11 Added supporting class and exception --- .../exception/InvalidCatalogueException.java | 27 ++++++++++++++++ .../de/rwu/easydrop/model/ProductPair.java | 31 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 src/main/java/de/rwu/easydrop/exception/InvalidCatalogueException.java create mode 100644 src/main/java/de/rwu/easydrop/model/ProductPair.java diff --git a/src/main/java/de/rwu/easydrop/exception/InvalidCatalogueException.java b/src/main/java/de/rwu/easydrop/exception/InvalidCatalogueException.java new file mode 100644 index 0000000..69e582a --- /dev/null +++ b/src/main/java/de/rwu/easydrop/exception/InvalidCatalogueException.java @@ -0,0 +1,27 @@ +package de.rwu.easydrop.exception; + +/** + * Exception that signifies the data of a Product are invalid. + * + * @since 0.3.0 + */ +public class InvalidCatalogueException extends RuntimeException { + /** + * Throws an exception that signifies the data of a Product are invalid. + * + * @param message + */ + public InvalidCatalogueException(final String message) { + super(message); + } + + /** + * Throws an exception that signifies the data of a Product are invalid. + * + * @param message + * @param cause + */ + public InvalidCatalogueException(final String message, final Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/de/rwu/easydrop/model/ProductPair.java b/src/main/java/de/rwu/easydrop/model/ProductPair.java new file mode 100644 index 0000000..70140c0 --- /dev/null +++ b/src/main/java/de/rwu/easydrop/model/ProductPair.java @@ -0,0 +1,31 @@ +package de.rwu.easydrop.model; + +import lombok.Data; + +/** + * Associates two related Products to one another. + * + * @since 0.3.0 + */ +@Data +public class ProductPair { + /** + * The first product. + */ + private final Product product1; + /** + * The second product. + */ + private final Product product2; + + /** + * Constructs a Product Pair. + * + * @param a First product + * @param b Second product + */ + public ProductPair(final Product a, final Product b) { + this.product1 = a; + this.product2 = b; + } +} From e593290f3cfc12fa6e1610f393923352a0881f40 Mon Sep 17 00:00:00 2001 From: Shan Ruhhammer Date: Sun, 25 Jun 2023 03:05:13 +0200 Subject: [PATCH 11/17] Updated Main --- src/main/java/de/rwu/easydrop/Main.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/rwu/easydrop/Main.java b/src/main/java/de/rwu/easydrop/Main.java index efc9a60..9a8d152 100644 --- a/src/main/java/de/rwu/easydrop/Main.java +++ b/src/main/java/de/rwu/easydrop/Main.java @@ -1,6 +1,5 @@ package de.rwu.easydrop; -import java.net.MalformedURLException; import java.util.List; import javax.naming.ConfigurationException; @@ -14,6 +13,7 @@ import de.rwu.easydrop.data.connector.AbstractProductPersistence; import de.rwu.easydrop.data.connector.SQLiteConnector; import de.rwu.easydrop.model.Product; import de.rwu.easydrop.model.ProductCatalogue; +import de.rwu.easydrop.service.processing.OrderManager; import de.rwu.easydrop.service.retriever.CatalogueRetriever; import de.rwu.easydrop.service.retriever.ProductRetriever; import de.rwu.easydrop.service.writer.CatalogueWriter; @@ -61,14 +61,6 @@ public final class Main { LOGGER.info(pCatStr); } - for (ProductCatalogue pCat : pCats) { - List products = pCat.getProducts(); - - for (Product product : products) { - String productId = product.getProductId(); - double price = product.getCurrentPrice(); - LOGGER.info("Product ID: " + productId + ", Price: " + price); - } - } + OrderManager.createOrders(pCats); } } From cba6e46de734b1a36c160b69a3179be08c6fe5f9 Mon Sep 17 00:00:00 2001 From: Shan Ruhhammer Date: Sun, 25 Jun 2023 03:16:29 +0200 Subject: [PATCH 12/17] #11 Updated and moved tests --- .../easydrop/api/AmazonPriceFetcherTest.java | 56 ------------ .../service/processing/OrderManagerTest.java | 91 +++++++++++++++++++ 2 files changed, 91 insertions(+), 56 deletions(-) delete mode 100644 src/test/java/de/rwu/easydrop/api/AmazonPriceFetcherTest.java create mode 100644 src/test/java/de/rwu/easydrop/service/processing/OrderManagerTest.java diff --git a/src/test/java/de/rwu/easydrop/api/AmazonPriceFetcherTest.java b/src/test/java/de/rwu/easydrop/api/AmazonPriceFetcherTest.java deleted file mode 100644 index 4be1200..0000000 --- a/src/test/java/de/rwu/easydrop/api/AmazonPriceFetcherTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package de.rwu.easydrop.api; - -import java.net.MalformedURLException; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -public class AmazonPriceFetcherTest { - private static final String BASE_URL = "https://api.amazon.com"; - private static final String API_KEY = "your_api_key"; - private static final String PRODUCT_ID = "12345"; - - private AmazonPriceFetcher priceFetcher; - - @BeforeEach - public void setup() { - priceFetcher = new AmazonPriceFetcher(BASE_URL, API_KEY); - } - - @Test - public void testGetProductPrice_ValidProductId_ReturnsPrice() throws MalformedURLException { - // Arrange - double expectedPrice = -1.0; - - // Act - double actualPrice = priceFetcher.getProductPrice(PRODUCT_ID); - - // Assert - Assertions.assertEquals(expectedPrice, actualPrice); - } - - @Test - public void testGetProductPrice_InvalidProductId_ReturnsNegativePrice() throws MalformedURLException { - // Arrange - double expectedPrice = -1.0; - - // Act - double actualPrice = priceFetcher.getProductPrice("invalid_product_id"); - - // Assert - Assertions.assertEquals(expectedPrice, actualPrice); - } - - @Test - public void testGetProductPrice_ExceptionThrown_ReturnsNegativePrice() throws MalformedURLException { - // Arrange - double expectedPrice = -1.0; - - // Act - double actualPrice = priceFetcher.getProductPrice("exception_thrown"); - - // Assert - Assertions.assertEquals(expectedPrice, actualPrice); - } -} \ No newline at end of file diff --git a/src/test/java/de/rwu/easydrop/service/processing/OrderManagerTest.java b/src/test/java/de/rwu/easydrop/service/processing/OrderManagerTest.java new file mode 100644 index 0000000..a83fdc8 --- /dev/null +++ b/src/test/java/de/rwu/easydrop/service/processing/OrderManagerTest.java @@ -0,0 +1,91 @@ +package de.rwu.easydrop.service.processing; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import de.rwu.easydrop.exception.InvalidCatalogueException; +import de.rwu.easydrop.model.Product; +import de.rwu.easydrop.model.ProductCatalogue; +import de.rwu.easydrop.model.ProductPair; + +class OrderManagerTest { + + @Test + void testCreateOrders_ValidCatalogues_OrdersCreated() { + // Arrange + List catalogues = createSampleCatalogues(); + + // Act + OrderManager.createOrders(catalogues); + + // No assertions, just checking if the orders are created successfully + } + + @Test + void testGetHighestMarginProducts_ValidCatalogue_CheapestAndMostExpensiveProductsReturned() { + // Arrange + ProductCatalogue catalogue = createSampleCatalogue(); + + // Act + ProductPair pair = OrderManager.getHighestMarginProducts(catalogue); + + // Assert + Assertions.assertNotNull(pair); + Assertions.assertNotNull(pair.getProduct1()); + Assertions.assertNotNull(pair.getProduct2()); + Assertions.assertEquals("Product1", pair.getProduct1().getProductId()); + Assertions.assertEquals("Product3", pair.getProduct2().getProductId()); + } + + @Test + void testGetHighestMarginProducts_InvalidCatalogue_ThrowsInvalidCatalogueException() { + // Arrange + ProductCatalogue catalogue = new ProductCatalogue("Catalogue1", "Sample catalogue"); + catalogue.addProduct(new Product()); + // The catalogue has only one product, which is invalid + + // Act & Assert + Assertions.assertThrows(InvalidCatalogueException.class, + () -> OrderManager.getHighestMarginProducts(catalogue)); + } + + private List createSampleCatalogues() { + List catalogues = new ArrayList<>(); + + ProductCatalogue catalogue1 = createSampleCatalogue(); + catalogues.add(catalogue1); + + ProductCatalogue catalogue2 = new ProductCatalogue("Catalogue2", "Sample catalogue 2"); + Product product4 = new Product(); + product4.setProductId("Product4"); + product4.setCurrentPrice(6.78); + catalogue2.addProduct(product4); + Product product5 = new Product(); + product5.setProductId("Product5"); + product5.setCurrentPrice(7.89); + catalogue2.addProduct(product5); + catalogues.add(catalogue2); + + return catalogues; + } + + private ProductCatalogue createSampleCatalogue() { + ProductCatalogue catalogue = new ProductCatalogue("Catalogue1", "Sample catalogue"); + Product product1 = new Product(); + product1.setProductId("Product1"); + product1.setCurrentPrice(1.23); + catalogue.addProduct(product1); + Product product2 = new Product(); + product2.setProductId("Product2"); + product2.setCurrentPrice(2.34); + catalogue.addProduct(product2); + Product product3 = new Product(); + product3.setProductId("Product3"); + product3.setCurrentPrice(4.56); + catalogue.addProduct(product3); + return catalogue; + } +} From 7c00e25e56946d89677b6d82234a85b1a1bc3f03 Mon Sep 17 00:00:00 2001 From: Shan Ruhhammer Date: Sun, 25 Jun 2023 03:16:43 +0200 Subject: [PATCH 13/17] Checkstyle adjustments --- .../de/rwu/easydrop/service/processing/OrderManager.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/rwu/easydrop/service/processing/OrderManager.java b/src/main/java/de/rwu/easydrop/service/processing/OrderManager.java index c84640f..d841505 100644 --- a/src/main/java/de/rwu/easydrop/service/processing/OrderManager.java +++ b/src/main/java/de/rwu/easydrop/service/processing/OrderManager.java @@ -5,7 +5,6 @@ import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import de.rwu.easydrop.Main; import de.rwu.easydrop.exception.InvalidCatalogueException; import de.rwu.easydrop.model.Product; import de.rwu.easydrop.model.ProductCatalogue; @@ -42,9 +41,9 @@ public final class OrderManager { for (ProductCatalogue pCat : pCats) { ProductPair pair = getHighestMarginProducts(pCat); - // TODO: create actual orders/transactions, remove logger - double margin = pair.getProduct2().getCurrentPrice() - - pair.getProduct1().getCurrentPrice(); + // #12: Create actual orders/transactions, remove logger + double margin = pair.getProduct2().getCurrentPrice() + - pair.getProduct1().getCurrentPrice(); String marginFormatted = FormattingUtil.formatEuro(margin); LOGGER.info("{}: Margin {} ({} to {})", pCat.getProductName(), From 8d9fa83cd7950f3aff01be09500eea0b9a3552a6 Mon Sep 17 00:00:00 2001 From: Shan Ruhhammer Date: Sun, 25 Jun 2023 03:17:35 +0200 Subject: [PATCH 14/17] =?UTF-8?q?Replaced=20=E2=82=AC=20symbol=20with=20te?= =?UTF-8?q?xt=20for=20charset=20safety?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/de/rwu/easydrop/util/FormattingUtil.java | 2 +- src/test/java/de/rwu/easydrop/util/FormattingUtilTest.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/rwu/easydrop/util/FormattingUtil.java b/src/main/java/de/rwu/easydrop/util/FormattingUtil.java index 7ef0e69..e8ea662 100644 --- a/src/main/java/de/rwu/easydrop/util/FormattingUtil.java +++ b/src/main/java/de/rwu/easydrop/util/FormattingUtil.java @@ -25,7 +25,7 @@ public final class FormattingUtil { * @return formatted price */ public static String formatEuro(final double amount) { - return String.format(Locale.GERMAN, "%,.2f", amount) + " €"; + return String.format(Locale.GERMAN, "%,.2f", amount) + " Euro"; } /** diff --git a/src/test/java/de/rwu/easydrop/util/FormattingUtilTest.java b/src/test/java/de/rwu/easydrop/util/FormattingUtilTest.java index 1c7d4f9..4b1dfa1 100644 --- a/src/test/java/de/rwu/easydrop/util/FormattingUtilTest.java +++ b/src/test/java/de/rwu/easydrop/util/FormattingUtilTest.java @@ -29,7 +29,7 @@ class FormattingUtilTest { @Test void testFormatEuro_positiveAmount() { double amount = 1234.56; - String expectedFormattedAmount = "1.234,56 €"; + String expectedFormattedAmount = "1.234,56 Euro"; String formattedAmount = FormattingUtil.formatEuro(amount); @@ -39,7 +39,7 @@ class FormattingUtilTest { @Test void testFormatEuro_zeroAmount() { double amount = 0.0; - String expectedFormattedAmount = "0,00 €"; + String expectedFormattedAmount = "0,00 Euro"; String formattedAmount = FormattingUtil.formatEuro(amount); @@ -49,7 +49,7 @@ class FormattingUtilTest { @Test void testFormatEuro_negativeAmount() { double amount = -789.12; - String expectedFormattedAmount = "-789,12 €"; + String expectedFormattedAmount = "-789,12 Euro"; String formattedAmount = FormattingUtil.formatEuro(amount); From 83c6ffc3f18a8a0009c4fb60f2c4214405858852 Mon Sep 17 00:00:00 2001 From: Shan Ruhhammer Date: Sun, 25 Jun 2023 03:17:51 +0200 Subject: [PATCH 15/17] Removed useless import --- src/main/java/de/rwu/easydrop/Main.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/de/rwu/easydrop/Main.java b/src/main/java/de/rwu/easydrop/Main.java index 9a8d152..87a23a5 100644 --- a/src/main/java/de/rwu/easydrop/Main.java +++ b/src/main/java/de/rwu/easydrop/Main.java @@ -11,7 +11,6 @@ import org.sqlite.SQLiteDataSource; import de.rwu.easydrop.api.client.DataSourceFactory; import de.rwu.easydrop.data.connector.AbstractProductPersistence; import de.rwu.easydrop.data.connector.SQLiteConnector; -import de.rwu.easydrop.model.Product; import de.rwu.easydrop.model.ProductCatalogue; import de.rwu.easydrop.service.processing.OrderManager; import de.rwu.easydrop.service.retriever.CatalogueRetriever; From 5edc523c6e849966903894f90af09b10e2ea667e Mon Sep 17 00:00:00 2001 From: Shan Ruhhammer Date: Sun, 25 Jun 2023 03:20:18 +0200 Subject: [PATCH 16/17] =?UTF-8?q?Replaced=20remaining=20=E2=82=AC=20refere?= =?UTF-8?q?nces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/de/rwu/easydrop/model/ProductCatalogueTest.java | 4 ++-- src/test/java/de/rwu/easydrop/model/ProductTest.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/de/rwu/easydrop/model/ProductCatalogueTest.java b/src/test/java/de/rwu/easydrop/model/ProductCatalogueTest.java index f070e2d..c13dcfe 100644 --- a/src/test/java/de/rwu/easydrop/model/ProductCatalogueTest.java +++ b/src/test/java/de/rwu/easydrop/model/ProductCatalogueTest.java @@ -85,8 +85,8 @@ class ProductCatalogueTest { String expectedString = "Product Catalogue: GPU\n" + "Description: Graphics Processing Units\n" + "Products:\n" + - "Product: [12345 from AmazonSeller (Amazon) at 0,00 € (available: no)]\n" + - "Product: [54321 from eBaySeller (eBay) at 0,00 € (available: no)]\n"; + "Product: [12345 from AmazonSeller (Amazon) at 0,00 Euro (available: no)]\n" + + "Product: [54321 from eBaySeller (eBay) at 0,00 Euro (available: no)]\n"; Assertions.assertEquals(expectedString, productCatalogue.toString()); } diff --git a/src/test/java/de/rwu/easydrop/model/ProductTest.java b/src/test/java/de/rwu/easydrop/model/ProductTest.java index 1845b65..cf79119 100644 --- a/src/test/java/de/rwu/easydrop/model/ProductTest.java +++ b/src/test/java/de/rwu/easydrop/model/ProductTest.java @@ -16,7 +16,7 @@ class ProductTest { product1.setCurrentPrice(19.99); product1.setAvailable(true); - String expectedString1 = "Product: [12345 from Merchant A (Amazon) at 19,99 € (available: yes)]"; + String expectedString1 = "Product: [12345 from Merchant A (Amazon) at 19,99 Euro (available: yes)]"; String result1 = product1.toString(); assertEquals(expectedString1, result1); @@ -31,7 +31,7 @@ class ProductTest { product2.setCurrentPrice(9.99); product2.setAvailable(false); - String expectedString2 = "Product: [67890 from Merchant B (eBay) at 9,99 € (available: no)]"; + String expectedString2 = "Product: [67890 from Merchant B (eBay) at 9,99 Euro (available: no)]"; String result2 = product2.toString(); assertEquals(expectedString2, result2); From 7bfee9d719aeafb5514cf78dc820273763a8ab38 Mon Sep 17 00:00:00 2001 From: Shan Ruhhammer Date: Sun, 25 Jun 2023 03:28:52 +0200 Subject: [PATCH 17/17] Added more tests --- .../InvalidCatalogueExceptionTest.java | 33 ++++++++++ .../service/processing/OrderManagerTest.java | 61 +++++++++++++++---- 2 files changed, 83 insertions(+), 11 deletions(-) create mode 100644 src/test/java/de/rwu/easydrop/exception/InvalidCatalogueExceptionTest.java diff --git a/src/test/java/de/rwu/easydrop/exception/InvalidCatalogueExceptionTest.java b/src/test/java/de/rwu/easydrop/exception/InvalidCatalogueExceptionTest.java new file mode 100644 index 0000000..684bc57 --- /dev/null +++ b/src/test/java/de/rwu/easydrop/exception/InvalidCatalogueExceptionTest.java @@ -0,0 +1,33 @@ +package de.rwu.easydrop.exception; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class InvalidCatalogueExceptionTest { + + @Test + void testConstructorWithMessage_ExceptionWithMessageCreated() { + // Arrange + String message = "Invalid catalogue"; + + // Act + InvalidCatalogueException exception = new InvalidCatalogueException(message); + + // Assert + Assertions.assertEquals(message, exception.getMessage()); + } + + @Test + void testConstructorWithMessageAndCause_ExceptionWithMessageAndCauseCreated() { + // Arrange + String message = "Invalid catalogue"; + Throwable cause = new RuntimeException("Cause exception"); + + // Act + InvalidCatalogueException exception = new InvalidCatalogueException(message, cause); + + // Assert + Assertions.assertEquals(message, exception.getMessage()); + Assertions.assertEquals(cause, exception.getCause()); + } +} diff --git a/src/test/java/de/rwu/easydrop/service/processing/OrderManagerTest.java b/src/test/java/de/rwu/easydrop/service/processing/OrderManagerTest.java index a83fdc8..2ffb76a 100644 --- a/src/test/java/de/rwu/easydrop/service/processing/OrderManagerTest.java +++ b/src/test/java/de/rwu/easydrop/service/processing/OrderManagerTest.java @@ -1,9 +1,17 @@ package de.rwu.easydrop.service.processing; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import de.rwu.easydrop.exception.InvalidCatalogueException; @@ -13,15 +21,29 @@ import de.rwu.easydrop.model.ProductPair; class OrderManagerTest { + @Test + void testConstructorIsPrivate() + throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { + // Check for private constructor + Constructor constructor = OrderManager.class.getDeclaredConstructor(); + assertTrue(Modifier.isPrivate(constructor.getModifiers())); + + // Make sure exception is thrown when instantiating + constructor.setAccessible(true); + assertThrows(InvocationTargetException.class, () -> { + constructor.newInstance(); + }); + } + @Test void testCreateOrders_ValidCatalogues_OrdersCreated() { // Arrange List catalogues = createSampleCatalogues(); // Act - OrderManager.createOrders(catalogues); - - // No assertions, just checking if the orders are created successfully + assertDoesNotThrow(() -> { + OrderManager.createOrders(catalogues); + }); } @Test @@ -33,11 +55,11 @@ class OrderManagerTest { ProductPair pair = OrderManager.getHighestMarginProducts(catalogue); // Assert - Assertions.assertNotNull(pair); - Assertions.assertNotNull(pair.getProduct1()); - Assertions.assertNotNull(pair.getProduct2()); - Assertions.assertEquals("Product1", pair.getProduct1().getProductId()); - Assertions.assertEquals("Product3", pair.getProduct2().getProductId()); + assertNotNull(pair); + assertNotNull(pair.getProduct1()); + assertNotNull(pair.getProduct2()); + assertEquals("Product2", pair.getProduct1().getProductId()); + assertEquals("Product3", pair.getProduct2().getProductId()); } @Test @@ -48,8 +70,25 @@ class OrderManagerTest { // The catalogue has only one product, which is invalid // Act & Assert - Assertions.assertThrows(InvalidCatalogueException.class, + Exception e = assertThrows(InvalidCatalogueException.class, () -> OrderManager.getHighestMarginProducts(catalogue)); + + assertEquals("Product Catalogue holds less than 2 products!", e.getMessage()); + } + + @Test + void testGetHighestMarginProducts_InvalidCatalogue_NoMargin() { + // Arrange + ProductCatalogue catalogue = new ProductCatalogue("Catalogue1", "Sample catalogue"); + catalogue.addProduct(new Product()); + catalogue.addProduct(new Product()); + // The catalogue has only one product, which is invalid + + // Act & Assert + Exception e = assertThrows(InvalidCatalogueException.class, + () -> OrderManager.getHighestMarginProducts(catalogue)); + + assertEquals("Price margin is zero!", e.getMessage()); } private List createSampleCatalogues() { @@ -80,7 +119,7 @@ class OrderManagerTest { catalogue.addProduct(product1); Product product2 = new Product(); product2.setProductId("Product2"); - product2.setCurrentPrice(2.34); + product2.setCurrentPrice(0.89); catalogue.addProduct(product2); Product product3 = new Product(); product3.setProductId("Product3");