Commit 08da552f by Antonio Rueda

Actualizado testing mediante base de datos para testing.

parents bea00abe 9ef7b48f
...@@ -16,10 +16,17 @@ Después arranca el contenedor, define _secret_ como clave de root y ...@@ -16,10 +16,17 @@ Después arranca el contenedor, define _secret_ como clave de root y
asocia MySQL al puerto de la máquina anfitrión 33060. asocia MySQL al puerto de la máquina anfitrión 33060.
``` ```
docker exec mysql-db mysql -psecret -e create database ujacoin; use ujacoin; create user 'ujacoin' identified by 'secret'; grant all privileges on ujacoin.* to 'ujacoin'@'%'" docker exec mysql-db mysql -psecret -e "create database ujacoin; use ujacoin; create user 'ujacoin' identified by 'secret'; grant all privileges on ujacoin.* to 'ujacoin'@'%'"
``` ```
Este comando ejecuta la utilidad de administración `mysql` dentro del contenedor, Este comando ejecuta la utilidad de administración `mysql` dentro del contenedor,
crea la base de datos *ujacoin*, un usuario con el mismo nombre y clave _secret_ crea la base de datos *ujacoin*, un usuario con el mismo nombre y clave _secret_
y finalmente le otorga los permisos necesarios para trabajar con la base y finalmente le otorga los permisos necesarios para trabajar con la base
de datos. de datos.
Para el testing, crear una nueva base de datos ujacoin_test y dar permisos al usuario creado anteriormente.
```
docker exec mysql-db mysql -psecret -e "create database ujacoin_test; use ujacon_test; grant all privileges on ujacoin_test.* to 'ujacoin'@'%'"
```
...@@ -43,7 +43,13 @@ ...@@ -43,7 +43,13 @@
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope> <scope>runtime</scope>
</dependency> </dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId> <artifactId>spring-boot-starter-validation</artifactId>
......
## Fichero de configuración para UjaCoin durante testing
# spring.datasource.url: jdbc:mysql://localhost:33060/ujacoin_test
spring.datasource.url: jdbc:h2:mem:ujacoin_test;MODE=MYSQL;DATABASE_TO_LOWER=TRUE;DB_CLOSE_DELAY=-1
spring.jpa.properties.javax.persistence.schema-generation.database.action: drop-and-create
## YAML Template. ## Fichero de configuración para UjaCoin
spring.datasource.url: jdbc:mysql://localhost:33060/ujacoin spring.datasource.url: jdbc:mysql://localhost:33060/ujacoin
spring.datasource.username: ujacoin spring.datasource.username: ujacoin
......
...@@ -9,12 +9,10 @@ import es.ujaen.dae.ujacoin.controladoresREST.DTO.DTOCliente; ...@@ -9,12 +9,10 @@ import es.ujaen.dae.ujacoin.controladoresREST.DTO.DTOCliente;
import es.ujaen.dae.ujacoin.controladoresREST.DTO.DTOCuenta; import es.ujaen.dae.ujacoin.controladoresREST.DTO.DTOCuenta;
import es.ujaen.dae.ujacoin.controladoresREST.DTO.DTOMovimiento; import es.ujaen.dae.ujacoin.controladoresREST.DTO.DTOMovimiento;
import es.ujaen.dae.ujacoin.controladoresREST.DTO.DTOTarjeta; import es.ujaen.dae.ujacoin.controladoresREST.DTO.DTOTarjeta;
import es.ujaen.dae.ujacoin.servicios.ServicioLimpiadoBaseDatos;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.List; import java.util.List;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import org.assertj.core.api.Assertions; import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
...@@ -24,6 +22,8 @@ import org.springframework.boot.web.server.LocalServerPort; ...@@ -24,6 +22,8 @@ import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ActiveProfiles;
/** /**
* Test para controlador REST de clientes * Test para controlador REST de clientes
...@@ -31,27 +31,27 @@ import org.springframework.http.converter.json.MappingJackson2HttpMessageConvert ...@@ -31,27 +31,27 @@ import org.springframework.http.converter.json.MappingJackson2HttpMessageConvert
* @author ajrueda * @author ajrueda
*/ */
@SpringBootTest(classes = es.ujaen.dae.ujacoin.app.UjaCoinApp.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @SpringBootTest(classes = es.ujaen.dae.ujacoin.app.UjaCoinApp.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles(profiles = {"test"})
public class ControladorRESTTest { public class ControladorRESTTest {
@Autowired
ServicioLimpiadoBaseDatos limpiadorBaseDatos;
@LocalServerPort @LocalServerPort
int localPort; int localPort;
@Autowired @Autowired
MappingJackson2HttpMessageConverter springBootJacksonConverter; MappingJackson2HttpMessageConverter springBootJacksonConverter;
RestTemplateBuilder restTemplateBuilder; TestRestTemplate restTemplate;
/** /**
* Crear un TestRestTemplate para las pruebas * Crear un TestRestTemplate para las pruebas
*/ */
@PostConstruct @PostConstruct
void crearRestTemplateBuilder() { void crearRestTemplateBuilder() {
restTemplateBuilder = new RestTemplateBuilder() RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder()
.rootUri("http://localhost:" + localPort + "/ujacoin") .rootUri("http://localhost:" + localPort + "/ujacoin")
.additionalMessageConverters(List.of(springBootJacksonConverter)); .additionalMessageConverters(List.of(springBootJacksonConverter));
restTemplate = new TestRestTemplate(restTemplateBuilder);
} }
/** /**
...@@ -69,7 +69,6 @@ public class ControladorRESTTest { ...@@ -69,7 +69,6 @@ public class ControladorRESTTest {
"jeegmail.com", "jeegmail.com",
"clave"); "clave");
TestRestTemplate restTemplate = new TestRestTemplate(restTemplateBuilder);
ResponseEntity<DTOCuenta> respuesta = restTemplate.postForEntity( ResponseEntity<DTOCuenta> respuesta = restTemplate.postForEntity(
"/clientes", "/clientes",
cliente, cliente,
...@@ -82,7 +81,8 @@ public class ControladorRESTTest { ...@@ -82,7 +81,8 @@ public class ControladorRESTTest {
/** /**
* test de alta y login de cliente * test de alta y login de cliente
*/ */
@Test @Test
@DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD)
public void testAltaYAccesoDatosCliente() { public void testAltaYAccesoDatosCliente() {
DTOCliente cliente = new DTOCliente( DTOCliente cliente = new DTOCliente(
"11995667D", "11995667D",
...@@ -93,7 +93,6 @@ public class ControladorRESTTest { ...@@ -93,7 +93,6 @@ public class ControladorRESTTest {
"jee@gmail.com", "jee@gmail.com",
"clave"); "clave");
TestRestTemplate restTemplate = new TestRestTemplate(restTemplateBuilder);
ResponseEntity<DTOCuenta> respuestaAlta = restTemplate.postForEntity( ResponseEntity<DTOCuenta> respuestaAlta = restTemplate.postForEntity(
"/clientes", "/clientes",
cliente, cliente,
...@@ -102,9 +101,8 @@ public class ControladorRESTTest { ...@@ -102,9 +101,8 @@ public class ControladorRESTTest {
Assertions.assertThat(respuestaAlta.getStatusCode()).isEqualTo(HttpStatus.CREATED); Assertions.assertThat(respuestaAlta.getStatusCode()).isEqualTo(HttpStatus.CREATED);
TestRestTemplate restTemplateAutenticado = new TestRestTemplate(restTemplateBuilder.basicAuthentication(cliente.getDni(), cliente.getClave())); ResponseEntity<DTOCliente> respuestaLogin = restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
ResponseEntity<DTOCliente> respuestaLogin = restTemplateAutenticado
.getForEntity( .getForEntity(
"/clientes/{dni}", "/clientes/{dni}",
DTOCliente.class, DTOCliente.class,
...@@ -121,6 +119,7 @@ public class ControladorRESTTest { ...@@ -121,6 +119,7 @@ public class ControladorRESTTest {
* test de alta e intento de acceso a datos de otro cliente * test de alta e intento de acceso a datos de otro cliente
*/ */
@Test @Test
@DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD)
public void testAltaYAccesoDatosClienteDiferente() { public void testAltaYAccesoDatosClienteDiferente() {
DTOCliente cliente = new DTOCliente( DTOCliente cliente = new DTOCliente(
"11995667D", "11995667D",
...@@ -131,7 +130,6 @@ public class ControladorRESTTest { ...@@ -131,7 +130,6 @@ public class ControladorRESTTest {
"jee@gmail.com", "jee@gmail.com",
"clave"); "clave");
TestRestTemplate restTemplate = new TestRestTemplate(restTemplateBuilder);
restTemplate.postForEntity( restTemplate.postForEntity(
"/clientes", "/clientes",
cliente, cliente,
...@@ -154,11 +152,10 @@ public class ControladorRESTTest { ...@@ -154,11 +152,10 @@ public class ControladorRESTTest {
cliente2, cliente2,
DTOCuenta.class DTOCuenta.class
).getBody(); ).getBody();
TestRestTemplate restTemplateAutenticado = new TestRestTemplate(restTemplateBuilder.basicAuthentication(cliente.getDni(), cliente.getClave()));
// Acceso con credenciales del primer cliente a la información del segundo // Acceso con credenciales del primer cliente a la información del segundo
ResponseEntity<DTOCliente> respuestaLogin = restTemplateAutenticado ResponseEntity<DTOCliente> respuestaLogin = restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
.getForEntity( .getForEntity(
"/clientes/{dni}", "/clientes/{dni}",
DTOCliente.class, DTOCliente.class,
...@@ -172,6 +169,7 @@ public class ControladorRESTTest { ...@@ -172,6 +169,7 @@ public class ControladorRESTTest {
* Creación de cuenta adicional * Creación de cuenta adicional
*/ */
@Test @Test
@DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD)
public void testCuentaAdicional() { public void testCuentaAdicional() {
DTOCliente cliente = new DTOCliente( DTOCliente cliente = new DTOCliente(
"11995667D", "11995667D",
...@@ -182,15 +180,14 @@ public class ControladorRESTTest { ...@@ -182,15 +180,14 @@ public class ControladorRESTTest {
"jee@gmail.com", "jee@gmail.com",
"clave"); "clave");
TestRestTemplate restTemplate = new TestRestTemplate(restTemplateBuilder);
restTemplate.postForEntity( restTemplate.postForEntity(
"/clientes", "/clientes",
cliente, cliente,
DTOCuenta.class DTOCuenta.class
); );
TestRestTemplate restTemplateAutenticado = new TestRestTemplate(restTemplateBuilder.basicAuthentication(cliente.getDni(), cliente.getClave())); ResponseEntity<DTOCuenta> respuesta = restTemplate
ResponseEntity<DTOCuenta> respuesta = restTemplateAutenticado .withBasicAuth(cliente.getDni(), cliente.getClave())
.postForEntity( .postForEntity(
"/clientes/{dni}/cuentas", "/clientes/{dni}/cuentas",
null, null,
...@@ -200,7 +197,8 @@ public class ControladorRESTTest { ...@@ -200,7 +197,8 @@ public class ControladorRESTTest {
Assertions.assertThat(respuesta.getStatusCode()).isEqualTo(HttpStatus.CREATED); Assertions.assertThat(respuesta.getStatusCode()).isEqualTo(HttpStatus.CREATED);
DTOCuenta[] cuentas = restTemplateAutenticado DTOCuenta[] cuentas = restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
.getForEntity( .getForEntity(
"/clientes/{dni}/cuentas", "/clientes/{dni}/cuentas",
DTOCuenta[].class, DTOCuenta[].class,
...@@ -215,6 +213,7 @@ public class ControladorRESTTest { ...@@ -215,6 +213,7 @@ public class ControladorRESTTest {
* Test de creación de tarjeta * Test de creación de tarjeta
*/ */
@Test @Test
@DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD)
public void testAnadirTarjetaACliente() { public void testAnadirTarjetaACliente() {
// Registrar cliente // Registrar cliente
DTOCliente cliente = new DTOCliente( DTOCliente cliente = new DTOCliente(
...@@ -226,13 +225,12 @@ public class ControladorRESTTest { ...@@ -226,13 +225,12 @@ public class ControladorRESTTest {
"jee@gmail.com", "jee@gmail.com",
"clave"); "clave");
TestRestTemplate restTemplate = new TestRestTemplate(restTemplateBuilder);
restTemplate.postForEntity("/clientes", cliente, DTOCuenta.class); restTemplate.postForEntity("/clientes", cliente, DTOCuenta.class);
DTOTarjeta tarjeta = new DTOTarjeta("4111111111111111", cliente.getNombre(), LocalDate.of(2022, 12, 1), "365"); DTOTarjeta tarjeta = new DTOTarjeta("4111111111111111", cliente.getNombre(), LocalDate.of(2022, 12, 1), "365");
TestRestTemplate restTemplateAutenticado = new TestRestTemplate(restTemplateBuilder.basicAuthentication(cliente.getDni(), cliente.getClave())); ResponseEntity<DTOTarjeta> respuesta = restTemplate
ResponseEntity<DTOTarjeta> respuesta = restTemplateAutenticado .withBasicAuth(cliente.getDni(), cliente.getClave())
.postForEntity( .postForEntity(
"/clientes/{dni}/tarjetas", "/clientes/{dni}/tarjetas",
tarjeta, tarjeta,
...@@ -242,7 +240,8 @@ public class ControladorRESTTest { ...@@ -242,7 +240,8 @@ public class ControladorRESTTest {
Assertions.assertThat(respuesta.getStatusCode()).isEqualTo(HttpStatus.CREATED); Assertions.assertThat(respuesta.getStatusCode()).isEqualTo(HttpStatus.CREATED);
respuesta = restTemplateAutenticado respuesta = restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
.getForEntity( .getForEntity(
"/clientes/{dni}/tarjetas/{num}", "/clientes/{dni}/tarjetas/{num}",
DTOTarjeta.class, DTOTarjeta.class,
...@@ -263,6 +262,7 @@ public class ControladorRESTTest { ...@@ -263,6 +262,7 @@ public class ControladorRESTTest {
* Test de ingreso en cuenta * Test de ingreso en cuenta
*/ */
@Test @Test
@DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD)
public void testIngreso() { public void testIngreso() {
// Registrar cliente // Registrar cliente
DTOCliente cliente = new DTOCliente( DTOCliente cliente = new DTOCliente(
...@@ -275,7 +275,6 @@ public class ControladorRESTTest { ...@@ -275,7 +275,6 @@ public class ControladorRESTTest {
"clave" "clave"
); );
TestRestTemplate restTemplate = new TestRestTemplate(restTemplateBuilder);
DTOCuenta cuenta = restTemplate.postForEntity( DTOCuenta cuenta = restTemplate.postForEntity(
"/clientes", "/clientes",
cliente, cliente,
...@@ -289,18 +288,19 @@ public class ControladorRESTTest { ...@@ -289,18 +288,19 @@ public class ControladorRESTTest {
"365" "365"
); );
TestRestTemplate restTemplateAutenticado = new TestRestTemplate(restTemplateBuilder.basicAuthentication(cliente.getDni(), cliente.getClave())); restTemplate
restTemplateAutenticado .withBasicAuth(cliente.getDni(), cliente.getClave())
.postForEntity( .postForEntity(
"/clientes/{dni}/tarjetas", "/clientes/{dni}/tarjetas",
tarjeta, tarjeta,
DTOTarjeta.class, DTOTarjeta.class,
cliente.getDni() cliente.getDni()
); );
// Realizar ingreso y comprobar estado de la cuenta // Realizar ingreso y comprobar estado de la cuenta
DTOMovimiento ingreso = DTOMovimiento.ingreso(tarjeta.getNum(), 1000); DTOMovimiento ingreso = DTOMovimiento.ingreso(tarjeta.getNum(), 1000);
ResponseEntity<Void> respuestaRegistroMovimiento = restTemplateAutenticado ResponseEntity<Void> respuestaRegistroMovimiento = restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
.postForEntity( .postForEntity(
"/clientes/{dni}/cuentas/{num}/movimientos", "/clientes/{dni}/cuentas/{num}/movimientos",
ingreso, ingreso,
...@@ -311,14 +311,16 @@ public class ControladorRESTTest { ...@@ -311,14 +311,16 @@ public class ControladorRESTTest {
Assertions.assertThat(respuestaRegistroMovimiento.getStatusCode()).isEqualTo(HttpStatus.CREATED); Assertions.assertThat(respuestaRegistroMovimiento.getStatusCode()).isEqualTo(HttpStatus.CREATED);
// Refrescar estado de la cuenta y comprobar saldo // Refrescar estado de la cuenta y comprobar saldo
cuenta = restTemplateAutenticado cuenta = restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
.getForObject("/clientes/{dni}/cuentas/{num}", .getForObject("/clientes/{dni}/cuentas/{num}",
DTOCuenta.class, DTOCuenta.class,
cliente.getDni(), cuenta.getNum()); cliente.getDni(), cuenta.getNum());
Assertions.assertThat(cuenta.getSaldo()).isEqualTo(1000); Assertions.assertThat(cuenta.getSaldo()).isEqualTo(1000);
ResponseEntity<DTOMovimiento[]> respuestaListadoMovimientos = restTemplateAutenticado ResponseEntity<DTOMovimiento[]> respuestaListadoMovimientos = restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
.getForEntity( .getForEntity(
"/clientes/{dni}/cuentas/{num}/movimientos", "/clientes/{dni}/cuentas/{num}/movimientos",
DTOMovimiento[].class, DTOMovimiento[].class,
...@@ -336,6 +338,7 @@ public class ControladorRESTTest { ...@@ -336,6 +338,7 @@ public class ControladorRESTTest {
* Test de transferencia entre cuentas * Test de transferencia entre cuentas
*/ */
@Test @Test
@DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD)
public void testTransferencia() { public void testTransferencia() {
// Registrar cliente // Registrar cliente
DTOCliente cliente = new DTOCliente( DTOCliente cliente = new DTOCliente(
...@@ -348,7 +351,6 @@ public class ControladorRESTTest { ...@@ -348,7 +351,6 @@ public class ControladorRESTTest {
"clave" "clave"
); );
TestRestTemplate restTemplate = new TestRestTemplate(restTemplateBuilder);
DTOCuenta cuentaOrigen = restTemplate.postForEntity( DTOCuenta cuentaOrigen = restTemplate.postForEntity(
"/clientes", "/clientes",
cliente, cliente,
...@@ -362,8 +364,9 @@ public class ControladorRESTTest { ...@@ -362,8 +364,9 @@ public class ControladorRESTTest {
"365" "365"
); );
TestRestTemplate restTemplateAutenticado1 = new TestRestTemplate(restTemplateBuilder.basicAuthentication(cliente.getDni(), cliente.getClave())); restTemplate
restTemplateAutenticado1.postForEntity( .withBasicAuth(cliente.getDni(), cliente.getClave())
.postForEntity(
"/clientes/{dni}/tarjetas", "/clientes/{dni}/tarjetas",
tarjeta, tarjeta,
DTOTarjeta.class, DTOTarjeta.class,
...@@ -372,7 +375,9 @@ public class ControladorRESTTest { ...@@ -372,7 +375,9 @@ public class ControladorRESTTest {
// Realizar ingreso y comprobar estado de la cuenta // Realizar ingreso y comprobar estado de la cuenta
DTOMovimiento ingreso = DTOMovimiento.ingreso(tarjeta.getNum(), 1000); DTOMovimiento ingreso = DTOMovimiento.ingreso(tarjeta.getNum(), 1000);
restTemplateAutenticado1.postForEntity( restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
.postForEntity(
"/clientes/{dni}/cuentas/{num}/movimientos", "/clientes/{dni}/cuentas/{num}/movimientos",
ingreso, ingreso,
Void.class, Void.class,
...@@ -398,7 +403,9 @@ public class ControladorRESTTest { ...@@ -398,7 +403,9 @@ public class ControladorRESTTest {
// Realizar transferencia // Realizar transferencia
DTOMovimiento transferencia = DTOMovimiento.transferencia(cuentaDestino.getNum(), 500); DTOMovimiento transferencia = DTOMovimiento.transferencia(cuentaDestino.getNum(), 500);
restTemplateAutenticado1.postForEntity( restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
.postForEntity(
"/clientes/{dni}/cuentas/{num}/movimientos", "/clientes/{dni}/cuentas/{num}/movimientos",
transferencia, transferencia,
Void.class, Void.class,
...@@ -407,19 +414,24 @@ public class ControladorRESTTest { ...@@ -407,19 +414,24 @@ public class ControladorRESTTest {
// Refrescar cuenta origen y destino // Refrescar cuenta origen y destino
// Refrescar estados de la cuentas y comprobar saldos // Refrescar estados de la cuentas y comprobar saldos
cuentaOrigen = restTemplateAutenticado1.getForObject("/clientes/{dni}/cuentas/{num}", cuentaOrigen = restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
.getForObject("/clientes/{dni}/cuentas/{num}",
DTOCuenta.class, DTOCuenta.class,
cliente.getDni(), cuentaOrigen.getNum()); cliente.getDni(), cuentaOrigen.getNum());
Assertions.assertThat(cuentaOrigen.getSaldo()).isEqualTo(500); Assertions.assertThat(cuentaOrigen.getSaldo()).isEqualTo(500);
TestRestTemplate restTemplateAutenticado2 = new TestRestTemplate(restTemplateBuilder.basicAuthentication(cliente2.getDni(), cliente2.getClave())); cuentaDestino = restTemplate
cuentaDestino = restTemplateAutenticado2.getForObject("/clientes/{dni}/cuentas/{num}", .withBasicAuth(cliente2.getDni(), cliente2.getClave())
.getForObject("/clientes/{dni}/cuentas/{num}",
DTOCuenta.class, DTOCuenta.class,
cliente2.getDni(), cuentaDestino.getNum()); cliente2.getDni(), cuentaDestino.getNum());
Assertions.assertThat(cuentaDestino.getSaldo()).isEqualTo(500); Assertions.assertThat(cuentaDestino.getSaldo()).isEqualTo(500);
// Listar movimientos de la cuenta origen // Listar movimientos de la cuenta origen
DTOMovimiento[] movimientos = restTemplateAutenticado1.getForEntity( DTOMovimiento[] movimientos = restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
.getForEntity(
"/clientes/{dni}/cuentas/{num}/movimientos", "/clientes/{dni}/cuentas/{num}/movimientos",
DTOMovimiento[].class, DTOMovimiento[].class,
cliente.getDni(), cuentaOrigen.getNum() cliente.getDni(), cuentaOrigen.getNum()
...@@ -429,7 +441,9 @@ public class ControladorRESTTest { ...@@ -429,7 +441,9 @@ public class ControladorRESTTest {
Assertions.assertThat(movimientos[1].getTipo()).isEqualTo(DTOMovimiento.TRANSFERENCIA_EMITIDA); Assertions.assertThat(movimientos[1].getTipo()).isEqualTo(DTOMovimiento.TRANSFERENCIA_EMITIDA);
// Listar movimientos de la cuenta destino // Listar movimientos de la cuenta destino
movimientos = restTemplateAutenticado2.getForEntity( movimientos = restTemplate
.withBasicAuth(cliente2.getDni(), cliente2.getClave())
.getForEntity(
"/clientes/{dni}/cuentas/{num}/movimientos", "/clientes/{dni}/cuentas/{num}/movimientos",
DTOMovimiento[].class, DTOMovimiento[].class,
cliente2.getDni(), cuentaDestino.getNum() cliente2.getDni(), cuentaDestino.getNum()
...@@ -443,6 +457,7 @@ public class ControladorRESTTest { ...@@ -443,6 +457,7 @@ public class ControladorRESTTest {
* Reintegro sin saldo suficiente * Reintegro sin saldo suficiente
*/ */
@Test @Test
@DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD)
public void testReintegroSinSaldo() { public void testReintegroSinSaldo() {
// Registrar cliente // Registrar cliente
DTOCliente cliente = new DTOCliente( DTOCliente cliente = new DTOCliente(
...@@ -455,7 +470,6 @@ public class ControladorRESTTest { ...@@ -455,7 +470,6 @@ public class ControladorRESTTest {
"clave" "clave"
); );
TestRestTemplate restTemplate = new TestRestTemplate(restTemplateBuilder);
DTOCuenta cuenta = restTemplate.postForEntity( DTOCuenta cuenta = restTemplate.postForEntity(
"/clientes", "/clientes",
cliente, cliente,
...@@ -469,8 +483,9 @@ public class ControladorRESTTest { ...@@ -469,8 +483,9 @@ public class ControladorRESTTest {
"365" "365"
); );
TestRestTemplate restTemplateAutenticado = new TestRestTemplate(restTemplateBuilder.basicAuthentication(cliente.getDni(), cliente.getClave())); restTemplate
restTemplateAutenticado.postForEntity( .withBasicAuth(cliente.getDni(), cliente.getClave())
.postForEntity(
"/clientes/{dni}/tarjetas", "/clientes/{dni}/tarjetas",
tarjeta, tarjeta,
DTOTarjeta.class, DTOTarjeta.class,
...@@ -479,7 +494,9 @@ public class ControladorRESTTest { ...@@ -479,7 +494,9 @@ public class ControladorRESTTest {
// Realizar ingreso en cuenta // Realizar ingreso en cuenta
DTOMovimiento ingreso = DTOMovimiento.ingreso(tarjeta.getNum(), 1000); DTOMovimiento ingreso = DTOMovimiento.ingreso(tarjeta.getNum(), 1000);
restTemplateAutenticado.postForEntity( restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
.postForEntity(
"/clientes/{dni}/cuentas/{num}/movimientos", "/clientes/{dni}/cuentas/{num}/movimientos",
ingreso, ingreso,
Void.class, Void.class,
...@@ -488,7 +505,9 @@ public class ControladorRESTTest { ...@@ -488,7 +505,9 @@ public class ControladorRESTTest {
// Primer reintegro correcto // Primer reintegro correcto
DTOMovimiento reintegro = DTOMovimiento.reintegro(tarjeta.getNum(), 1000); DTOMovimiento reintegro = DTOMovimiento.reintegro(tarjeta.getNum(), 1000);
ResponseEntity<Void> respuesta = restTemplateAutenticado.postForEntity( ResponseEntity<Void> respuesta = restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
.postForEntity(
"/clientes/{dni}/cuentas/{num}/movimientos", "/clientes/{dni}/cuentas/{num}/movimientos",
reintegro, reintegro,
Void.class, Void.class,
...@@ -498,7 +517,9 @@ public class ControladorRESTTest { ...@@ -498,7 +517,9 @@ public class ControladorRESTTest {
Assertions.assertThat(respuesta.getStatusCode()).isEqualTo(HttpStatus.CREATED); Assertions.assertThat(respuesta.getStatusCode()).isEqualTo(HttpStatus.CREATED);
// No hay saldo suficiente para el segundo reintegro // No hay saldo suficiente para el segundo reintegro
respuesta = restTemplateAutenticado.postForEntity( respuesta = restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
.postForEntity(
"/clientes/{dni}/cuentas/{num}/movimientos", "/clientes/{dni}/cuentas/{num}/movimientos",
reintegro, reintegro,
Void.class, Void.class,
...@@ -512,6 +533,7 @@ public class ControladorRESTTest { ...@@ -512,6 +533,7 @@ public class ControladorRESTTest {
* Test de listado de movimientos con paginación * Test de listado de movimientos con paginación
*/ */
@Test @Test
@DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD)
public void testListadoMovimientosPaginado() { public void testListadoMovimientosPaginado() {
// Registrar cliente // Registrar cliente
DTOCliente cliente = new DTOCliente( DTOCliente cliente = new DTOCliente(
...@@ -524,7 +546,6 @@ public class ControladorRESTTest { ...@@ -524,7 +546,6 @@ public class ControladorRESTTest {
"clave" "clave"
); );
TestRestTemplate restTemplate = new TestRestTemplate(restTemplateBuilder);
DTOCuenta cuenta = restTemplate.postForEntity( DTOCuenta cuenta = restTemplate.postForEntity(
"/clientes", "/clientes",
cliente, cliente,
...@@ -538,8 +559,9 @@ public class ControladorRESTTest { ...@@ -538,8 +559,9 @@ public class ControladorRESTTest {
"365" "365"
); );
TestRestTemplate restTemplateAutenticado = new TestRestTemplate(restTemplateBuilder.basicAuthentication(cliente.getDni(), cliente.getClave())); restTemplate
restTemplateAutenticado.postForEntity( .withBasicAuth(cliente.getDni(), cliente.getClave())
.postForEntity(
"/clientes/{dni}/tarjetas", "/clientes/{dni}/tarjetas",
tarjeta, tarjeta,
DTOTarjeta.class, DTOTarjeta.class,
...@@ -552,7 +574,9 @@ public class ControladorRESTTest { ...@@ -552,7 +574,9 @@ public class ControladorRESTTest {
float[] importeIngresos = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120}; float[] importeIngresos = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120};
for (float importe : importeIngresos) { for (float importe : importeIngresos) {
restTemplateAutenticado.postForEntity( restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
.postForEntity(
"/clientes/{dni}/cuentas/{num}/movimientos", "/clientes/{dni}/cuentas/{num}/movimientos",
DTOMovimiento.ingreso(tarjeta.getNum(), importe), DTOMovimiento.ingreso(tarjeta.getNum(), importe),
Void.class, Void.class,
...@@ -561,7 +585,9 @@ public class ControladorRESTTest { ...@@ -561,7 +585,9 @@ public class ControladorRESTTest {
} }
// Obtener primera página (10 elementos) // Obtener primera página (10 elementos)
ResponseEntity<DTOMovimiento[]> respuesta1 = restTemplateAutenticado.getForEntity( ResponseEntity<DTOMovimiento[]> respuesta1 = restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
.getForEntity(
"/clientes/{dni}/cuentas/{num}/movimientos", "/clientes/{dni}/cuentas/{num}/movimientos",
DTOMovimiento[].class, DTOMovimiento[].class,
cliente.getDni(), cuenta.getNum() cliente.getDni(), cuenta.getNum()
...@@ -573,7 +599,9 @@ public class ControladorRESTTest { ...@@ -573,7 +599,9 @@ public class ControladorRESTTest {
Assertions.assertThat(movimientos[0].getImporte()).isEqualTo(10); Assertions.assertThat(movimientos[0].getImporte()).isEqualTo(10);
// Obtener segunda página (2 selementos) // Obtener segunda página (2 selementos)
ResponseEntity<DTOMovimiento[]> respuesta2 = restTemplateAutenticado.getForEntity( ResponseEntity<DTOMovimiento[]> respuesta2 = restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
.getForEntity(
"/clientes/{dni}/cuentas/{num}/movimientos?pag=2", "/clientes/{dni}/cuentas/{num}/movimientos?pag=2",
DTOMovimiento[].class, DTOMovimiento[].class,
cliente.getDni(), cuenta.getNum() cliente.getDni(), cuenta.getNum()
...@@ -585,7 +613,9 @@ public class ControladorRESTTest { ...@@ -585,7 +613,9 @@ public class ControladorRESTTest {
Assertions.assertThat(movimientos[0].getImporte()).isEqualTo(110); Assertions.assertThat(movimientos[0].getImporte()).isEqualTo(110);
// Obtener primera página con 5 elementos solo // Obtener primera página con 5 elementos solo
ResponseEntity<DTOMovimiento[]> respuesta3 = restTemplateAutenticado.getForEntity( ResponseEntity<DTOMovimiento[]> respuesta3 = restTemplate
.withBasicAuth(cliente.getDni(), cliente.getClave())
.getForEntity(
"/clientes/{dni}/cuentas/{num}/movimientos?pag=1&num=5", "/clientes/{dni}/cuentas/{num}/movimientos?pag=1&num=5",
DTOMovimiento[].class, DTOMovimiento[].class,
cliente.getDni(), cuenta.getNum() cliente.getDni(), cuenta.getNum()
...@@ -596,9 +626,4 @@ public class ControladorRESTTest { ...@@ -596,9 +626,4 @@ public class ControladorRESTTest {
Assertions.assertThat(movimientos).hasSize(5); Assertions.assertThat(movimientos).hasSize(5);
Assertions.assertThat(movimientos[0].getImporte()).isEqualTo(10); Assertions.assertThat(movimientos[0].getImporte()).isEqualTo(10);
} }
@BeforeEach
void limpiarBaseDatos() {
limpiadorBaseDatos.limpiar();
}
} }
package es.ujaen.dae.ujacoin.servicios;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;
/**
* Servicio auxiliar de borrado de los datos en la base de datos (sólo para testing)
* @author ajrueda
*/
@Service
public class ServicioLimpiadoBaseDatos {
@PersistenceContext
EntityManager em;
@Autowired
TransactionTemplate transactionTemplate;
/**
* Lista de entidades a borrar. Ojo: el orden es muy importante
* para evitar errores de violación de integridad
*/
final String[] entidades = {
"Movimiento",
"Cuenta",
"Tarjeta",
"Cliente"
};
final String deleteFrom = "delete from ";
/** Realizar borrado */
public void limpiar() {
transactionTemplate.executeWithoutResult(transactionStatus -> {
for (String tabla : entidades) {
em.createQuery(deleteFrom + tabla).executeUpdate();
}
});
}
}
...@@ -18,10 +18,12 @@ import java.util.concurrent.Executors; ...@@ -18,10 +18,12 @@ import java.util.concurrent.Executors;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import javax.validation.ConstraintViolationException; import javax.validation.ConstraintViolationException;
import org.assertj.core.api.Assertions; import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.MethodMode;
import org.springframework.test.context.ActiveProfiles;
/** /**
* Test de integración de la aplicación * Test de integración de la aplicación
...@@ -29,14 +31,12 @@ import org.springframework.boot.test.context.SpringBootTest; ...@@ -29,14 +31,12 @@ import org.springframework.boot.test.context.SpringBootTest;
*/ */
// @Disabled // @Disabled
@SpringBootTest(classes = es.ujaen.dae.ujacoin.app.UjaCoinApp.class) @SpringBootTest(classes = es.ujaen.dae.ujacoin.app.UjaCoinApp.class)
@ActiveProfiles(profiles = {"test"})
public class ServicioUjaCoinTest { public class ServicioUjaCoinTest {
@Autowired @Autowired
ServicioUjaCoin servicioUjaCoin; ServicioUjaCoin servicioUjaCoin;
@Autowired
ServicioLimpiadoBaseDatos limpiadorBaseDatos;
@Test @Test
public void testAccesoServicioUjaCoin() { public void testAccesoServicioUjaCoin() {
Assertions.assertThat(servicioUjaCoin).isNotNull(); Assertions.assertThat(servicioUjaCoin).isNotNull();
...@@ -60,6 +60,7 @@ public class ServicioUjaCoinTest { ...@@ -60,6 +60,7 @@ public class ServicioUjaCoinTest {
} }
@Test @Test
@DirtiesContext(methodMode = MethodMode.AFTER_METHOD)
public void testAltaYLoginClienteCuenta() { public void testAltaYLoginClienteCuenta() {
Cliente cliente = new Cliente( Cliente cliente = new Cliente(
"11995667D", "11995667D",
...@@ -79,6 +80,7 @@ public class ServicioUjaCoinTest { ...@@ -79,6 +80,7 @@ public class ServicioUjaCoinTest {
} }
@Test @Test
@DirtiesContext(methodMode = MethodMode.AFTER_METHOD)
public void testCreacionCuentaAdicional() { public void testCreacionCuentaAdicional() {
Cliente cliente = new Cliente( Cliente cliente = new Cliente(
"11995667D", "11995667D",
...@@ -101,6 +103,7 @@ public class ServicioUjaCoinTest { ...@@ -101,6 +103,7 @@ public class ServicioUjaCoinTest {
} }
@Test @Test
@DirtiesContext(methodMode = MethodMode.AFTER_METHOD)
public void testAnadirTarjetaACliente() { public void testAnadirTarjetaACliente() {
// Registrar cliente y realizar login // Registrar cliente y realizar login
Cliente cliente = new Cliente( Cliente cliente = new Cliente(
...@@ -124,6 +127,7 @@ public class ServicioUjaCoinTest { ...@@ -124,6 +127,7 @@ public class ServicioUjaCoinTest {
} }
@Test @Test
@DirtiesContext(methodMode = MethodMode.AFTER_METHOD)
public void testIngreso() { public void testIngreso() {
// Registrar cliente y realizar login // Registrar cliente y realizar login
Cliente cliente = new Cliente( Cliente cliente = new Cliente(
...@@ -157,6 +161,7 @@ public class ServicioUjaCoinTest { ...@@ -157,6 +161,7 @@ public class ServicioUjaCoinTest {
} }
@Test @Test
@DirtiesContext(methodMode = MethodMode.AFTER_METHOD)
public void testTransferencia() { public void testTransferencia() {
// Registrar cliente // Registrar cliente
Cliente cliente = new Cliente( Cliente cliente = new Cliente(
...@@ -212,6 +217,7 @@ public class ServicioUjaCoinTest { ...@@ -212,6 +217,7 @@ public class ServicioUjaCoinTest {
} }
@Test @Test
@DirtiesContext(methodMode = MethodMode.AFTER_METHOD)
public void testReintegroDoble() { public void testReintegroDoble() {
// Registrar cliente // Registrar cliente
Cliente cliente = new Cliente( Cliente cliente = new Cliente(
...@@ -240,6 +246,7 @@ public class ServicioUjaCoinTest { ...@@ -240,6 +246,7 @@ public class ServicioUjaCoinTest {
} }
@Test @Test
@DirtiesContext(methodMode = MethodMode.AFTER_METHOD)
public void testReintegroDobleParalelo() { public void testReintegroDobleParalelo() {
// Registrar cliente // Registrar cliente
Cliente cliente = new Cliente( Cliente cliente = new Cliente(
...@@ -287,9 +294,4 @@ public class ServicioUjaCoinTest { ...@@ -287,9 +294,4 @@ public class ServicioUjaCoinTest {
} }
}).isInstanceOfAny(SaldoInsuficienteParaOperacion.class); }).isInstanceOfAny(SaldoInsuficienteParaOperacion.class);
} }
@BeforeEach
void limpiarBaseDatos() {
limpiadorBaseDatos.limpiar();
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment