diff --git a/src/main/java/model/MyOrder.java b/src/main/java/model/MyOrder.java index fb0e44c..da5c4b2 100644 --- a/src/main/java/model/MyOrder.java +++ b/src/main/java/model/MyOrder.java @@ -5,29 +5,42 @@ import java.util.Collection; import java.util.Iterator; +import java.util.logging.Logger; /** - * @author Isabel Román + * @author Isabel Román, Jorge Jiménez-Sánchez */ public class MyOrder implements Order { + + /** + * Objeto tipo logger para gestionar los mensajes durante la ejecución + */ + private static Logger trazador=Logger.getLogger(MyProduct.class.getName()); + /** + * Identificador del producto + */ + private String id; + + /** * */ public MyOrder() { - // TODO Auto-generated constructor stub } @Override public void setId(String id) { - // TODO Auto-generated method stub - + String msg="Estableciendo id a "+id; + trazador.info(msg); + this.id=id; } @Override public String getId() { - // TODO Auto-generated method stub - return null; + String msg="Devolviendo el id como "+id; + trazador.info(msg); + return this.id; } @Override diff --git a/src/main/java/shopmanager/MyBagManager.java b/src/main/java/shopmanager/MyBagManager.java index 8deb338..b73a8fd 100644 --- a/src/main/java/shopmanager/MyBagManager.java +++ b/src/main/java/shopmanager/MyBagManager.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.UUID; import java.util.Collection; import java.util.HashMap; @@ -18,9 +19,8 @@ import model.Order; import model.Product; import persistency.OrderRepository; -import shopmanager.StockManager; /** - * @author Isabel Román + * @author Isabel Román, Jorge Jiménez-Sánchez * */ public class MyBagManager implements BagManager { @@ -102,14 +102,37 @@ public Optional findProduct(Product product) { @Override public Order order() { - // No crea el objeto order, aún no está resuelto quién será el responsable de elegir el tipo concreto + try{ + + // Creamos el objeto + trazador.info("Creo Objeto de la clase MyOrder"); + order=new MyOrder(); + + // Persisto el stock trazador.info("Intento persistir el stock"); stock.save(); + + // Actualizo pedido trazador.info("Actualizo el pedido"); order.setProducts(cesta.values()); + + // Creo ID Univoco + trazador.info("Creo ID Univoco"); + UUID id = UUID.randomUUID(); + + // Asigno el UUID al objeto creado + trazador.info("Asigno ID Univoco"); + order.setId(String.valueOf(id)); + + // Persisto el pedido trazador.info("Persisto el pedido"); repositorio.save(order); + + // Borro la cesta + trazador.info("Borro la cesta"); + cesta.clear(); + } catch (UnknownRepo ex) { trazador.info("No ha sido posible guardar el pedido, no se estableció el repositorio en el stock"); diff --git a/src/test/java/shopManager/BagManagerTestOrder.java b/src/test/java/shopManager/BagManagerTestOrder.java new file mode 100644 index 0000000..226a0f1 --- /dev/null +++ b/src/test/java/shopManager/BagManagerTestOrder.java @@ -0,0 +1,138 @@ +package shopManager; + +import shopmanager.*; + +import static org.junit.jupiter.api.Assertions.*; + + +import java.util.logging.Logger; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.mockito.junit.jupiter.MockitoExtension; + +import exceptions.NoEnoughStock; +import exceptions.NotInStock; +import exceptions.UnknownRepo; +import model.Product; +import model.Order; +import persistency.OrderRepository; + + +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; + +@ExtendWith(MockitoExtension.class) +class BagManagerTestOrder { + + // Mensanjes + private static Logger trazador=Logger.getLogger(ProductTest.class.getName()); + + //Creo los objetos sustitutos (representantes o mocks) + //Son objetos contenidos en MyBagManager de los que aún no disponemos el código + @Mock(serializable = true) + private static Product producto1Mock= Mockito.mock(Product.class); + @Mock(serializable = true) + private static Product producto2Mock= Mockito.mock(Product.class); + @Mock + private static StockManager stockMock= Mockito.mock(StockManager.class); + @Mock + private static OrderRepository repositoryMock= Mockito.mock(OrderRepository.class); + @Mock + private static Order orderMock=Mockito.mock(Order.class); + + //Inyección de dependencias + //Los objetos contenidos en micestaTesteada son reemplazados automáticamente por los sustitutos (mocks) + @InjectMocks + private static MyBagManager micestaTesteada; + + /** + * @see BeforeEach {@link org.junit.jupiter.api.BeforeEach} + */ + + @BeforeEach + void setUpBeforeClass(){ + //Todos los tests empiezan con la bolsa vac�a + + micestaTesteada.reset(); + + } + + @Test + @Tag("unidad") + @DisplayName("Prueba del metodo que asienta el pedido") + void testOrder() throws NoEnoughStock, NotInStock, UnknownRepo { + + // Comienzo del Test + trazador.info("Comienza el test de order"); + + // El procedimiento rellenaCesta mete dos productos (mocks) en la cesta + rellenaCesta(); + + // Invoco al método order (esto creará un objeto de tipo order, por tanto no es puramente un test unitario) + micestaTesteada.order(); + + // Obtiene el id unívoco del primer pedido + String idPedido1 = micestaTesteada.order().getId(); + + // VERIFICAMOS QUE EL ID DEVUELTO DEL PRIMER PEDIDO NO ES NULL + + // Comprobamos que el string devuelto no es null + assertNotNull(idPedido1,"El ID devuelto es Null"); + + // VERIFICA QUE SE BORRA LA CESTA AL EFECTUAR EL PEDIDO CON ORDER: + + // Tras ejecutar order() la cesta no debe contener ninguno de los productos "id1" e "id2" que + // se añadieron en rellenaCesta() para efectuar el pedido + assertTrue(micestaTesteada.findProduct("id1").isEmpty(),"La cesta contiene un producto con id1 que se ha eliminado"); + assertTrue(micestaTesteada.findProduct("id2").isEmpty(),"La cesta contiene un producto con id2 que se ha eliminado"); + + // NUEVO PEDIDO PARA PROBAR QUE SE GESTIONA UN ID UNIVOCO PARA CADA PEDIDO, LLENAMOS LA CESTA + + // Vaciamos la cesta antes del nuevo pedido + micestaTesteada.reset(); + + // El procedimiento rellenaCesta mete dos productos (mocks) en la cesta + rellenaCesta(); + + // Invoco al método order (esto creará un objeto de tipo order, por tanto no es puramente un test unitario) + micestaTesteada.order(); + + // Obtiene el id univoco del segundo pedido + String idPedido2 = micestaTesteada.order().getId(); + + // VERIFICAMOS QUE EL ID DEVUELTO DEL PRIMER PEDIDO NO ES NULL + // Comprobamos que el string devuelto no es null + assertNotNull(idPedido2,"El ID devuelto es Null"); + + // VERIFICA QUE SE BORRA LA CESTA AL EFECTUAR EL PEDIDO CON ORDER: + + // Tras ejecutar order() la cesta no debe contener ninguno de los productos "id1" e "id2" que + // se añadieron en rellenaCesta() para efectuar el pedido + assertTrue(micestaTesteada.findProduct("id1").isEmpty(),"La cesta contiene un producto con id1 que se ha eliminado"); + assertTrue(micestaTesteada.findProduct("id2").isEmpty(),"La cesta contiene un producto con id2 que se ha eliminado"); + + // COMPARAMOS QUE LOS ID DE LOS DIFERENTES PEDIDOS NO SON IGUALES + assertNotEquals(idPedido1, idPedido2, "No asigna id univoco a cada pedido"); + + } + + /** + * Rellena una cesta con los dos mocks declarados al inicio + * @throws NoEnoughStock Si no hay suficiente stock del producto a a�adir + * @throws NotInStock Si no existe el producto en el stock + */ + void rellenaCesta() throws NoEnoughStock, NotInStock { + Mockito.when(producto1Mock.getId()).thenReturn("id1"); + Mockito.when(producto1Mock.getNumber()).thenReturn(1); + Mockito.when(producto2Mock.getId()).thenReturn("id2"); + Mockito.when(producto2Mock.getNumber()).thenReturn(2); + micestaTesteada.addProduct(producto1Mock); + micestaTesteada.addProduct(producto2Mock); + } + +}