package de.rwu.easydrop.service.processing; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import de.rwu.easydrop.exception.InvalidCatalogueException; import de.rwu.easydrop.exception.InvalidOfferException; import de.rwu.easydrop.model.Offer; import de.rwu.easydrop.model.Product; import de.rwu.easydrop.model.ProductCatalogue; import de.rwu.easydrop.model.ProductPair; class OfferIdentifierTest { @Mock private ProductCatalogue mockProductCatalogue; private OfferIdentifier offerIdentifier; @BeforeEach void setUp() { MockitoAnnotations.openMocks(this); offerIdentifier = new OfferIdentifier(); } @Test void runIdentifier_WithValidProductCatalogues_IdentifiesOffers() { // Arrange List productCatalogues = new ArrayList<>(); ProductCatalogue productCatalogue1 = new ProductCatalogue("Catalogue1", "desc"); ProductCatalogue productCatalogue2 = new ProductCatalogue("Catalogue2", "desc"); Product product1 = new Product(); product1.setCurrentPrice(100.0); Product product2 = new Product(); product2.setCurrentPrice(200.0); Product product3 = new Product(); product3.setCurrentPrice(300.0); Product product4 = new Product(); product4.setCurrentPrice(400.0); productCatalogue1.addProduct(product1); productCatalogue1.addProduct(product2); productCatalogue2.addProduct(product3); productCatalogue2.addProduct(product4); productCatalogues.add(productCatalogue1); productCatalogues.add(productCatalogue2); // Act List identifiedOffers = offerIdentifier.runIdentifier(productCatalogues); // Assert assertEquals(2, identifiedOffers.size()); assertNotNull(identifiedOffers.get(0).getSourceProduct()); assertNotNull(identifiedOffers.get(0).getTargetProduct()); assertNotNull(identifiedOffers.get(1).getSourceProduct()); assertNotNull(identifiedOffers.get(1).getTargetProduct()); } @Test void runIdentifier_WithOneGoodOneBadCatalogue_BadOneIsntIncluded() { // Arrange List productCatalogues = new ArrayList<>(); ProductCatalogue productCatalogue1 = new ProductCatalogue("Catalogue1", "desc"); ProductCatalogue productCatalogue2 = new ProductCatalogue("Catalogue2", "desc"); Product product1 = new Product(); product1.setCurrentPrice(100.0); Product product2 = new Product(); product2.setCurrentPrice(200.0); Product product3 = new Product(); product3.setCurrentPrice(300.0); Product product4 = new Product(); product4.setCurrentPrice(300.0); productCatalogue1.addProduct(product1); productCatalogue1.addProduct(product2); productCatalogue2.addProduct(product3); productCatalogue2.addProduct(product4); productCatalogues.add(productCatalogue1); productCatalogues.add(productCatalogue2); // Act List identifiedOffers = offerIdentifier.runIdentifier(productCatalogues); // Assert assertEquals(1, identifiedOffers.size()); // Only 1 passed } @Test void getHighestMarginProducts_WithValidProductCatalogue_ReturnsProductPair() { // Arrange ProductCatalogue productCatalogue = new ProductCatalogue("TestCatalogue", "desc"); Product product1 = new Product(); product1.setCurrentPrice(100.0); Product product2 = new Product(); product2.setCurrentPrice(200.0); productCatalogue.addProduct(product1); productCatalogue.addProduct(product2); // Act ProductPair productPair = OfferIdentifier.getHighestMarginProducts(productCatalogue); // Assert assertNotNull(productPair); assertNotNull(productPair.getProduct1()); assertNotNull(productPair.getProduct2()); assertNotEquals(productPair.getProduct1(), productPair.getProduct2()); } @Test void getHighestMarginProducts_SecondProductCheaper() { // Arrange ProductCatalogue productCatalogue = new ProductCatalogue("TestCatalogue", "desc"); Product product1 = new Product(); product1.setCurrentPrice(200.0); Product product2 = new Product(); product2.setCurrentPrice(100.0); productCatalogue.addProduct(product1); productCatalogue.addProduct(product2); // Act ProductPair productPair = OfferIdentifier.getHighestMarginProducts(productCatalogue); // Assert assertNotNull(productPair); assertNotNull(productPair.getProduct1()); assertNotNull(productPair.getProduct2()); assertNotEquals(productPair.getProduct1(), productPair.getProduct2()); } @Test void getHighestMarginProducts_WithCatalogueSizeLessThan2_ThrowsInvalidCatalogueException() { // Arrange ProductCatalogue productCatalogue = new ProductCatalogue("SmallCatalogue", "desc"); // Act and Assert assertThrows(InvalidCatalogueException.class, () -> { OfferIdentifier.getHighestMarginProducts(productCatalogue); }); } @Test void getHighestMarginProducts_WithZeroPriceMargin_ThrowsInvalidOfferException() { // Arrange ProductCatalogue productCatalogue = new ProductCatalogue("name", "desc"); Product product1 = new Product(); product1.setCurrentPrice(200.0); Product product2 = new Product(); product2.setCurrentPrice(200.0); productCatalogue.getProducts().add(product1); productCatalogue.getProducts().add(product2); // Act and Assert InvalidOfferException e = assertThrows(InvalidOfferException.class, () -> { OfferIdentifier.getHighestMarginProducts(productCatalogue); }); assertEquals("Price margin is zero!", e.getMessage()); } }