177 lines
6.2 KiB
Java
177 lines
6.2 KiB
Java
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<ProductCatalogue> 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<Offer> 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<ProductCatalogue> 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<Offer> 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());
|
|
}
|
|
}
|