Commit d219c69e by Rubén Ramírez

feat: [Metodos Recurso]: Corregidos los test por el nuevo atrinuto

parent e8628c2d
......@@ -18,6 +18,21 @@ import java.time.LocalDate;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.io.File;import org.springframework.web.multipart.MultipartFile;import com.ujaen.tfg.mangaffinity.entidades.Recurso;
import com.ujaen.tfg.mangaffinity.rest.DTO.DTORecurso;
import com.ujaen.tfg.mangaffinity.rest.DTO.Mapper;
import com.ujaen.tfg.mangaffinity.servicios.ServicioRecursos;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.nio.file.*;
import java.time.LocalDate;
import java.util.UUID;
@RestController
@RequestMapping("/recursos")
......@@ -28,17 +43,60 @@ public class RecursosController {
@Autowired
private Mapper mapper;
@PostMapping("/")
public ResponseEntity<String> crearRecurso(@RequestBody DTORecurso recurso) {
@PostMapping(value = "/", consumes = {"multipart/form-data"})
public ResponseEntity<String> crearRecurso(
@RequestPart("recurso") DTORecurso recursoDTO,
@RequestPart(value = "foto", required = false) MultipartFile foto) {
try {
Recurso nuevoRecurso = mapper.entity(recurso);
String fotoUrl = null;
// Verificar tipo de archivo (solo imágenes)
if (foto != null && !foto.isEmpty()) {
String mimeType = foto.getContentType();
if (mimeType == null || (!mimeType.equals("image/jpeg") && !mimeType.equals("image/png"))) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Solo se permiten imágenes JPEG o PNG.");
}
// Renombrar el archivo con un nombre único
String fileName = UUID.randomUUID().toString() + "_" + foto.getOriginalFilename();
Path uploadsPath = Paths.get("uploads/");
// Crear directorio si no existe
if (!Files.exists(uploadsPath)) {
Files.createDirectories(uploadsPath);
}
// Guardar la imagen en la carpeta uploads/
Path filePath = uploadsPath.resolve(fileName);
Files.copy(foto.getInputStream(), filePath, StandardCopyOption.REPLACE_EXISTING);
// Crear la URL completa de la imagen
String urlBase = "http://localhost:8080";
fotoUrl = urlBase + "/uploads/" + fileName.replace(" ", "_");
}
// Crear el recurso con la imagen (si hay)
Recurso nuevoRecurso = new Recurso(
recursoDTO.getTitulo(),
recursoDTO.getDescripcion(),
recursoDTO.getFechaPublicacion(),
recursoDTO.getAutor(),
fotoUrl
);
servicioRecursos.crearRecurso(nuevoRecurso);
return ResponseEntity.status(HttpStatus.CREATED).build();
} catch (SecurityException e) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
return ResponseEntity.status(HttpStatus.CREATED).body("Recurso creado correctamente");
} catch (IOException e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error al subir la imagen");
}
}
@GetMapping("/titulo/{titulo}")
public ResponseEntity<List<DTORecurso>> buscarPorTitulo(@PathVariable String titulo) {
try {
......@@ -110,16 +168,36 @@ public class RecursosController {
@DeleteMapping("/{id}")
public ResponseEntity<Void> borrarRecurso(@PathVariable Long id) {
try {
// Buscar el recurso por ID
Recurso recurso = servicioRecursos.buscarRecursoPorId(id);
if (recurso == null) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
}
// Verificar si el recurso tiene una imagen asociada
if (recurso.getFotoUrl() != null && !recurso.getFotoUrl().isEmpty()) {
Path imagePath = Paths.get("uploads/", recurso.getFotoUrl().replace("/uploads/", ""));
// Eliminar la imagen asociada si existe
if (Files.exists(imagePath)) {
try {
Files.delete(imagePath); // Eliminar la imagen
} catch (IOException e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
}
// Eliminar el recurso de la base de datos
servicioRecursos.borrarRecurso(id);
// Responder con éxito
return ResponseEntity.noContent().build();
} catch (SecurityException e) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); // En caso de que el usuario no tenga permiso
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); // Error inesperado
}
}
......@@ -128,7 +206,6 @@ public class RecursosController {
try {
Recurso nuevosDatos = mapper.entity(dtoRecurso);
Recurso recursoModificado = servicioRecursos.modificarRecurso(id, nuevosDatos);
return ResponseEntity.ok(mapper.dto(recursoModificado));
} catch (RecursoNoExiste e) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
......@@ -139,6 +216,7 @@ public class RecursosController {
}
}
@GetMapping
public ResponseEntity<List<DTORecurso>> obtenerRecursos() {
try {
......
......@@ -17,12 +17,14 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.test.web.server.LocalServerPort;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.*;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ActiveProfiles;
import java.time.LocalDate;
import java.util.HashSet;
import java.util.Map;
......@@ -50,6 +52,8 @@ import static org.assertj.core.api.Assertions.assertThat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import static org.assertj.core.api.Assertions.assertThat;
......@@ -66,7 +70,7 @@ public class TestBibliotecaPersonalController {
@Test
@DirtiesContext
void testAnadirRecursoBiblioteca() {
// Registro un administrador
// Registro de un administrador
restTemplate.postForEntity("/usuarios/", Map.of(
"email", "admin@example.com",
"nombreUsuario", "admin",
......@@ -80,7 +84,7 @@ public class TestBibliotecaPersonalController {
assertThat(authAdmin.getStatusCode()).isEqualTo(HttpStatus.OK);
String tokenAdmin = "Bearer " + authAdmin.getBody().getToken();
// Registro un usuario normal
// Registro de un usuario normal
ResponseEntity<Void> respuestaUsuario = restTemplate.postForEntity("/usuarios/", Map.of(
"email", "nuevo.usuario@example.com",
"nombreUsuario", "nuevoUsuario",
......@@ -95,6 +99,7 @@ public class TestBibliotecaPersonalController {
assertThat(authUser.getStatusCode()).isEqualTo(HttpStatus.OK);
String tokenUser = "Bearer " + authUser.getBody().getToken();
// Obtención del ID del usuario
ResponseEntity<Long> respuestaUsuarioId = restTemplate.exchange(
"/usuarios/email/{email}", HttpMethod.GET, null, Long.class, "nuevo.usuario@example.com"
);
......@@ -102,16 +107,25 @@ public class TestBibliotecaPersonalController {
Long usuarioId = respuestaUsuarioId.getBody();
assertThat(usuarioId).isNotNull();
// Creo un recurso con el administrador
Recurso nuevoRecurso = new Recurso("Titulo Prueba", "Descripción de prueba", LocalDate.now(), "Autor Prueba");
// Creación del recurso
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
formData.add("recurso", new DTORecurso(null, "Titulo Prueba", "Descripción de prueba", LocalDate.now(), "Autor Prueba", null, new HashSet<>())) ;
formData.add("foto", new ByteArrayResource(new byte[0]) {
@Override
public String getFilename() {
return "dummy.jpg";
}
});
HttpHeaders headersAdmin = new HttpHeaders();
headersAdmin.set("Authorization", tokenAdmin);
headersAdmin.setContentType(MediaType.APPLICATION_JSON);
headersAdmin.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<Recurso> requestAdmin = new HttpEntity<>(nuevoRecurso, headersAdmin);
HttpEntity<MultiValueMap<String, Object>> requestAdmin = new HttpEntity<>(formData, headersAdmin);
var respuestaRecurso = restTemplate.exchange("/recursos/", HttpMethod.POST, requestAdmin, Void.class);
assertThat(respuestaRecurso.getStatusCode()).isEqualTo(HttpStatus.CREATED);
// Búsqueda del recurso
ResponseEntity<DTORecurso[]> respuestaBusqueda = restTemplate.exchange(
"/recursos/titulo/{titulo}", HttpMethod.GET, null, DTORecurso[].class, "Titulo Prueba"
);
......@@ -120,14 +134,13 @@ public class TestBibliotecaPersonalController {
Long recursoId = respuestaBusqueda.getBody()[0].getId();
assertThat(recursoId).isNotNull();
// Añado con el usuario el recurso a su biblioteca
// Añadir recurso a la biblioteca del usuario
DTORecursoEnBiblioteca dtoRecurso = new DTORecursoEnBiblioteca(recursoId, "Titulo Prueba", Categoria.AL_DIA);
HttpHeaders headersUser = new HttpHeaders();
headersUser.set("Authorization", tokenUser);
headersUser.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<DTORecursoEnBiblioteca> bibliotecaRequest = new HttpEntity<>(dtoRecurso, headersUser);
ResponseEntity<Void> respuestaBiblioteca = restTemplate.exchange(
"/biblioteca/{usuarioId}/recursos/{recursoId}/categoria",
HttpMethod.POST, bibliotecaRequest, Void.class, usuarioId, recursoId
......@@ -136,10 +149,11 @@ public class TestBibliotecaPersonalController {
assertThat(respuestaBiblioteca.getStatusCode()).isEqualTo(HttpStatus.CREATED);
}
@Test
@DirtiesContext
void testListarRecursosPorCategoria() {
// Registro un administrador
// Registro de administrador
restTemplate.postForEntity("/usuarios/", Map.of(
"email", "admin@example.com",
"nombreUsuario", "admin",
......@@ -153,7 +167,7 @@ public class TestBibliotecaPersonalController {
assertThat(authAdmin.getStatusCode()).isEqualTo(HttpStatus.OK);
String tokenAdmin = "Bearer " + authAdmin.getBody().getToken();
// Registro un usuario normal
// Registro de usuario
restTemplate.postForEntity("/usuarios/", Map.of(
"email", "usuario@example.com",
"nombreUsuario", "usuario",
......@@ -167,26 +181,35 @@ public class TestBibliotecaPersonalController {
assertThat(authUser.getStatusCode()).isEqualTo(HttpStatus.OK);
String tokenUser = "Bearer " + authUser.getBody().getToken();
// Creo el recurso con el administrador
// Creación de recurso con autenticación
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
DTORecurso dtoRecurso = new DTORecurso(null, "Titulo Prueba", "Descripción de prueba", LocalDate.now(), "Autor Prueba", "", new HashSet<>());
formData.add("recurso", dtoRecurso);
formData.add("foto", new ByteArrayResource(new byte[0]) {
@Override
public String getFilename() {
return "dummy.jpg";
}
});
HttpHeaders headersAdmin = new HttpHeaders();
headersAdmin.set("Authorization", tokenAdmin);
headersAdmin.setContentType(MediaType.APPLICATION_JSON);
headersAdmin.setContentType(MediaType.MULTIPART_FORM_DATA);
Recurso recurso = new Recurso("Titulo Prueba", "Descripción de prueba", LocalDate.now(), "Autor Prueba");
HttpEntity<Recurso> requestAdmin = new HttpEntity<>(recurso, headersAdmin);
HttpEntity<MultiValueMap<String, Object>> requestAdmin = new HttpEntity<>(formData, headersAdmin);
ResponseEntity<Void> respuestaRecurso = restTemplate.exchange("/recursos/", HttpMethod.POST, requestAdmin, Void.class);
assertThat(respuestaRecurso.getStatusCode()).isEqualTo(HttpStatus.CREATED);
// Obtener ID del recurso
ResponseEntity<DTORecurso[]> respuestaBusqueda = restTemplate.exchange(
"/recursos/titulo/{titulo}", HttpMethod.GET, null, DTORecurso[].class, "Titulo Prueba"
);
assertThat(respuestaBusqueda.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(respuestaBusqueda.getBody()).isNotNull().isNotEmpty();
assertThat(respuestaBusqueda.getBody()).isNotEmpty();
Long recursoId = respuestaBusqueda.getBody()[0].getId();
assertThat(recursoId).isNotNull();
// Obtener ID del usuario
ResponseEntity<Long> respuestaUsuarioId = restTemplate.exchange(
"/usuarios/email/{email}", HttpMethod.GET, null, Long.class, "usuario@example.com"
);
......@@ -194,21 +217,20 @@ public class TestBibliotecaPersonalController {
Long usuarioId = respuestaUsuarioId.getBody();
assertThat(usuarioId).isNotNull();
// Añado con el usuario el recurso a su biblioteca
// Añadir recurso a la biblioteca del usuario
DTORecursoEnBiblioteca dtoRecursoBiblioteca = new DTORecursoEnBiblioteca(recursoId, "Titulo Prueba", Categoria.AL_DIA);
HttpHeaders headersUser = new HttpHeaders();
headersUser.set("Authorization", tokenUser);
headersUser.setContentType(MediaType.APPLICATION_JSON);
DTORecursoEnBiblioteca dtoRecurso = new DTORecursoEnBiblioteca(null, "Titulo Prueba", Categoria.AL_DIA);
HttpEntity<DTORecursoEnBiblioteca> bibliotecaRequest = new HttpEntity<>(dtoRecurso, headersUser);
HttpEntity<DTORecursoEnBiblioteca> bibliotecaRequest = new HttpEntity<>(dtoRecursoBiblioteca, headersUser);
ResponseEntity<Void> respuestaAñadir = restTemplate.exchange(
"/biblioteca/{usuarioId}/recursos/{recursoId}/categoria",
HttpMethod.POST, bibliotecaRequest, Void.class, usuarioId, recursoId
);
assertThat(respuestaAñadir.getStatusCode()).isEqualTo(HttpStatus.CREATED);
// Listo los recursos de la biblioteca personal filtrados por categoría
// Listar los recursos de la biblioteca por categoría
ResponseEntity<DTORecursoEnBiblioteca[]> respuestaLista = restTemplate.exchange(
"/biblioteca/{usuarioId}/recursos/categoria/{categoria}",
HttpMethod.GET, new HttpEntity<>(headersUser), DTORecursoEnBiblioteca[].class, usuarioId, Categoria.AL_DIA.name()
......@@ -216,10 +238,9 @@ public class TestBibliotecaPersonalController {
// Validaciones
assertThat(respuestaLista.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(respuestaLista.getBody()).isNotNull().isNotEmpty();
assertThat(respuestaLista.getBody()).isNotEmpty();
assertThat(respuestaLista.getBody()[0].getTitulo()).isEqualTo("Titulo Prueba");
assertThat(respuestaLista.getBody()[0].getCategoria()).isEqualTo(Categoria.AL_DIA);
}
@Test
......@@ -239,7 +260,7 @@ public class TestBibliotecaPersonalController {
assertThat(authAdmin.getStatusCode()).isEqualTo(HttpStatus.OK);
String tokenAdmin = "Bearer " + authAdmin.getBody().getToken();
// Registro un usuario normal
// Registro un usuario normal
restTemplate.postForEntity("/usuarios/", Map.of(
"email", "usuario@example.com",
"nombreUsuario", "usuario",
......@@ -261,12 +282,20 @@ public class TestBibliotecaPersonalController {
assertThat(usuarioId).isNotNull();
// Creo un recurso con el administrador
Recurso recurso = new Recurso("Manga de prueba", "Descripción", LocalDate.now(), "Autor");
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
formData.add("recurso", new DTORecurso(null, "Manga de prueba", "Descripción", LocalDate.now(), "Autor", "", new HashSet<>()));
formData.add("foto", new ByteArrayResource(new byte[0]) {
@Override
public String getFilename() {
return "dummy.jpg";
}
});
HttpHeaders headersAdmin = new HttpHeaders();
headersAdmin.set("Authorization", tokenAdmin);
headersAdmin.setContentType(MediaType.APPLICATION_JSON);
headersAdmin.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<Recurso> requestRecurso = new HttpEntity<>(recurso, headersAdmin);
HttpEntity<MultiValueMap<String, Object>> requestRecurso = new HttpEntity<>(formData, headersAdmin);
var respuestaRecurso = restTemplate.exchange("/recursos/", HttpMethod.POST, requestRecurso, Void.class);
assertThat(respuestaRecurso.getStatusCode()).isEqualTo(HttpStatus.CREATED);
......@@ -302,7 +331,7 @@ public class TestBibliotecaPersonalController {
);
assertThat(respuestaModificar.getStatusCode()).isEqualTo(HttpStatus.OK);
// Verificp que la categoría ha cambiado
// Verifico que la categoría ha cambiado
ResponseEntity<DTORecursoEnBiblioteca[]> respuestaLista = restTemplate.exchange(
"/biblioteca/{usuarioId}/recursos/categoria/{categoria}",
HttpMethod.GET, new HttpEntity<>(headersUser), DTORecursoEnBiblioteca[].class, usuarioId, Categoria.COMPLETADO.name()
......@@ -331,14 +360,13 @@ public class TestBibliotecaPersonalController {
String tokenAdmin = "Bearer " + authAdmin.getBody().getToken();
// Registro a un usuario normal
restTemplate.postForEntity("/usuarios/", Map.of(
"email", "usuario@example.com",
"nombreUsuario", "usuario",
"contrasenia", "password"
), Void.class);
// Inicio sesión al usuario
// Inicio sesión con el usuario
var authUser = restTemplate.postForEntity("/usuarios/usuario@example.com", Map.of(
"clave", "password"
), DTOLoginRespuesta.class);
......@@ -353,12 +381,21 @@ public class TestBibliotecaPersonalController {
assertThat(usuarioId).isNotNull();
// Creo un recurso con el administrador
Recurso recurso = new Recurso("Manga de prueba", "Descripción", LocalDate.now(), "Autor");
Recurso recurso = new Recurso("Manga de prueba", "Descripción", LocalDate.now(), "Autor", "");
HttpHeaders headersAdmin = new HttpHeaders();
headersAdmin.set("Authorization", tokenAdmin);
headersAdmin.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Recurso> requestRecurso = new HttpEntity<>(recurso, headersAdmin);
headersAdmin.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
formData.add("recurso", recurso);
formData.add("foto", new ByteArrayResource(new byte[0]) {
@Override
public String getFilename() {
return "dummy.jpg";
}
});
HttpEntity<MultiValueMap<String, Object>> requestRecurso = new HttpEntity<>(formData, headersAdmin);
var respuestaRecurso = restTemplate.exchange("/recursos/", HttpMethod.POST, requestRecurso, Void.class);
assertThat(respuestaRecurso.getStatusCode()).isEqualTo(HttpStatus.CREATED);
......@@ -400,5 +437,4 @@ public class TestBibliotecaPersonalController {
assertThat(respuestaLista.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(respuestaLista.getBody()).isNotNull();
}
}
package com.ujaen.tfg.mangaffinity.rest;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ujaen.tfg.mangaffinity.MangAffinityApplication;
import com.ujaen.tfg.mangaffinity.config.JpaTestConfig;
import com.ujaen.tfg.mangaffinity.entidades.Genero;
......@@ -15,17 +17,36 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.test.web.server.LocalServerPort;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.*;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.core.io.ByteArrayResource;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.*;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.time.LocalDate;
import java.util.*;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(classes = {MangAffinityApplication.class, JpaTestConfig.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
......@@ -33,6 +54,7 @@ import static org.assertj.core.api.Assertions.assertThat;
public class TestRecursosController {
@Autowired
private TestRestTemplate restTemplate;
private static final Logger logger = LoggerFactory.getLogger(TestRecursosController.class);
@Test
@DirtiesContext
......@@ -52,14 +74,24 @@ public class TestRecursosController {
String token = "Bearer " + authResponse.getBody().getToken();
// Caso 1: Intento crear un recurso sin autenticación
Recurso nuevoRecurso = new Recurso("Titulo Prueba", "Descripción de prueba", LocalDate.now(), "Autor Prueba");
Recurso nuevoRecurso = new Recurso("Titulo Prueba", "Descripción de prueba", LocalDate.now(), "Autor Prueba", "");
var respuestaNoAutenticado = restTemplate.postForEntity("/recursos/", nuevoRecurso, Void.class);
assertThat(respuestaNoAutenticado.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN);
// Caso 2: Intento crear un recurso correctamente con autenticación de admin
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
formData.add("recurso", new DTORecurso(null, "Titulo Prueba", "Descripción de prueba", LocalDate.now(), "Autor Prueba", null, new HashSet<>()));
formData.add("foto", new ByteArrayResource(new byte[0]) {
@Override
public String getFilename() {
return "dummy.jpg";
}
});
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", token);
HttpEntity<Recurso> request = new HttpEntity<>(nuevoRecurso, headers);
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(formData, headers);
var respuestaAdmin = restTemplate.exchange("/recursos/", HttpMethod.POST, request, Void.class);
assertThat(respuestaAdmin.getStatusCode()).isEqualTo(HttpStatus.CREATED);
}
......@@ -81,12 +113,22 @@ public class TestRecursosController {
assertThat(authResponse.getStatusCode()).isEqualTo(HttpStatus.OK);
String token = "Bearer " + authResponse.getBody().getToken();
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
formData.add("recurso", new DTORecurso(null, "One Piece", "Manga de aventuras", LocalDate.of(1997, 7, 22), "Eiichiro Oda", null, new HashSet<>()));
formData.add("foto", new ByteArrayResource(new byte[0]) { // Imagen vacía
@Override
public String getFilename() {
return "dummy.jpg";
}
});
// Creo un recurso en la BD con autenticación
Recurso recurso = new Recurso("One Piece", "Manga de aventuras", LocalDate.of(1997, 7, 22), "Eiichiro Oda");
Recurso recurso = new Recurso("One Piece", "Manga de aventuras", LocalDate.of(1997, 7, 22), "Eiichiro Oda", "");
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", token);
HttpEntity<Recurso> request = new HttpEntity<>(recurso, headers);
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(formData, headers);
var respuestaAdmin = restTemplate.exchange("/recursos/", HttpMethod.POST, request, Void.class);
assertThat(respuestaAdmin.getStatusCode()).isEqualTo(HttpStatus.CREATED);
......@@ -107,9 +149,12 @@ public class TestRecursosController {
assertThat(respuestaNoEncontrada.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
}
private static final Logger LOGGER = LoggerFactory.getLogger(TestRecursosController.class);
@Test
@DirtiesContext
void testBuscarPorGenero() {
void testBuscarPorGenero() throws InterruptedException {
// Registro un administrador
restTemplate.postForEntity("/usuarios/", Map.of(
"email", "admin@example.com",
......@@ -125,57 +170,95 @@ public class TestRecursosController {
String token = "Bearer " + authResponse.getBody().getToken();
// Creo un recurso con autenticación
Recurso recurso = new Recurso("Dragon Ball", "Manga de peleas", LocalDate.of(1984, 11, 20), "Akira Toriyama");
recurso.getGeneros().add(Genero.ACCION);
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
DTORecurso recursoDTO = new DTORecurso(null, "Dragon Ball", "Manga de peleas",
LocalDate.of(1984, 11, 20), "Akira Toriyama", null,
new HashSet<>(Collections.singleton(Genero.ACCION)));
formData.add("recurso", recursoDTO);
formData.add("foto", new ByteArrayResource(new byte[0]) {
@Override
public String getFilename() {
return "dummy.jpg";
}
});
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", token);
HttpEntity<Recurso> request = new HttpEntity<>(recurso, headers);
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(formData, headers);
var respuestaAdmin = restTemplate.exchange("/recursos/", HttpMethod.POST, request, Void.class);
assertThat(respuestaAdmin.getStatusCode()).isEqualTo(HttpStatus.CREATED);
//Caso 1: Busco por género que si encontraremos
LOGGER.info("✅ Recurso creado: Título: {}, Géneros: {}", recursoDTO.getTitulo(), recursoDTO.getGeneros());
// 🔹 Esperar 1 segundo para que la transacción se complete
Thread.sleep(4000);
// 🔍 Buscar el recurso por título para verificar que tiene géneros asignados
ResponseEntity<DTORecurso[]> respuestaTitulo = restTemplate.exchange(
"/recursos/titulo/{titulo}", HttpMethod.GET, null, DTORecurso[].class, "Dragon Ball"
);
assertThat(respuestaTitulo.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(respuestaTitulo.getBody()).isNotEmpty();
LOGGER.info("📌 Recurso encontrado por título: {}", respuestaTitulo.getBody()[0]);
// 🔍 Buscar el recurso por género
ResponseEntity<DTORecurso[]> respuesta = restTemplate.exchange(
"/recursos/genero/{genero}", HttpMethod.GET, null, DTORecurso[].class, "ACCION"
);
assertThat(respuesta.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(respuesta.getBody()).isNotEmpty();
assertThat(respuesta.getBody()[0].getGeneros()).contains(Genero.ACCION);
LOGGER.info("🔍 Consulta por género ACCION retornó: {}", Arrays.toString(respuesta.getBody()));
//Caso 2: Busco por género que no encontraremos
ResponseEntity<DTORecurso[]> respuestaNoEncontrada = restTemplate.exchange(
"/recursos/genero/{genero}", HttpMethod.GET, null, DTORecurso[].class, "ROMANCE"
);
assertThat(respuestaNoEncontrada.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(respuestaNoEncontrada.getBody()).isEmpty();
assertThat(respuesta.getStatusCode()).isEqualTo(HttpStatus.OK);
}
@Test
@DirtiesContext
void testBuscarPorAutor() {
// Creo un administrador
void testBuscarPorAutor() {
restTemplate.postForEntity("/usuarios/", Map.of(
"email", "admin@example.com",
"nombreUsuario", "admin",
"contrasenia", "adminpassword"
), Void.class);
// Inicio sesión con el administrador
var authResponse = restTemplate.postForEntity("/usuarios/admin@example.com", Map.of(
"clave", "adminpassword"
), DTOLoginRespuesta.class);
assertThat(authResponse.getStatusCode()).isEqualTo(HttpStatus.OK);
String token = "Bearer " + authResponse.getBody().getToken();
// Creo un recurso con autenticación
Recurso nuevoRecurso = new Recurso("Titulo Prueba", "Descripción de prueba", LocalDate.now(), "Autor Prueba");
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
DTORecurso dtoRecurso = new DTORecurso(
null, "Titulo Prueba", "Descripción de prueba", LocalDate.now(), "Autor Prueba",
null, new HashSet<>()
);
formData.add("recurso", dtoRecurso);
formData.add("foto", new ByteArrayResource(new byte[0]) {
@Override
public String getFilename() {
return "dummy.jpg";
}
});
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", token);
HttpEntity<Recurso> request = new HttpEntity<>(nuevoRecurso, headers);
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(formData, headers);
restTemplate.exchange("/recursos/", HttpMethod.POST, request, Void.class);
//Caso 1: Busco por autor que si encontraremos
ResponseEntity<DTORecurso[]> respuesta = restTemplate.exchange(
"/recursos/autor/{autor}", HttpMethod.GET, null, DTORecurso[].class, "Autor Prueba"
);
......@@ -183,14 +266,15 @@ public class TestRecursosController {
assertThat(respuesta.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(respuesta.getBody()).isNotNull().isNotEmpty();
//Caso 1: Busco por autor que no encontraremos
ResponseEntity<DTORecurso[]> respuestaNoEncontrada = restTemplate.exchange(
"/recursos/autor/{autor}", HttpMethod.GET, null, DTORecurso[].class, "Autor Desconocido"
);
assertThat(respuestaNoEncontrada.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(respuestaNoEncontrada.getBody()).isEmpty();
}
@Test
@DirtiesContext
void testBuscarPorRangoDeFechas() {
......@@ -213,16 +297,27 @@ public class TestRecursosController {
LocalDate fecha2 = LocalDate.of(2023, 6, 15);
LocalDate fecha3 = LocalDate.of(2024, 1, 10);
Recurso recurso1 = new Recurso("Titulo1", "Desc1", fecha1, "Autor1");
Recurso recurso2 = new Recurso("Titulo2", "Desc2", fecha2, "Autor2");
Recurso recurso3 = new Recurso("Titulo3", "Desc3", fecha3, "Autor3");
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", token);
restTemplate.exchange("/recursos/", HttpMethod.POST, new HttpEntity<>(recurso1, headers), Void.class);
restTemplate.exchange("/recursos/", HttpMethod.POST, new HttpEntity<>(recurso2, headers), Void.class);
restTemplate.exchange("/recursos/", HttpMethod.POST, new HttpEntity<>(recurso3, headers), Void.class);
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
for (LocalDate fecha : List.of(fecha1, fecha2, fecha3)) {
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
DTORecurso dtoRecurso = new DTORecurso(
null, "Titulo" + fecha.getYear(), "Desc" + fecha.getYear(), fecha, "Autor" + fecha.getYear(),
null,new HashSet<>()
);
formData.add("recurso", dtoRecurso);
formData.add("foto", new ByteArrayResource(new byte[0]) {
@Override
public String getFilename() {
return "dummy.jpg";
}
});
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(formData, headers);
restTemplate.exchange("/recursos/", HttpMethod.POST, request, Void.class);
}
//Caso 1: Busco por fecha que si encontraremos
ResponseEntity<DTORecurso[]> respuesta = restTemplate.exchange(
......@@ -258,16 +353,28 @@ public class TestRecursosController {
assertThat(authResponse.getStatusCode()).isEqualTo(HttpStatus.OK);
String token = "Bearer " + authResponse.getBody().getToken();
// Creo un recurso con autenticación
Recurso recurso = new Recurso("Titulo Buscado", "Descripción", LocalDate.now(), "Autor");
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", token);
HttpEntity<Recurso> request = new HttpEntity<>(recurso, headers);
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
DTORecurso dtoRecurso = new DTORecurso(
null, "Titulo Buscado", "Descripción", LocalDate.now(), "Autor",
null,new HashSet<>()
);
formData.add("recurso", dtoRecurso);
formData.add("foto", new ByteArrayResource(new byte[0]) {
@Override
public String getFilename() {
return "dummy.jpg";
}
});
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(formData, headers);
var respuestaCreacion = restTemplate.exchange("/recursos/", HttpMethod.POST, request, Void.class);
assertThat(respuestaCreacion.getStatusCode()).isEqualTo(HttpStatus.CREATED);
// Busco el recurso por título para obtener su ID
ResponseEntity<DTORecurso[]> respuestaBusqueda = restTemplate.getForEntity(
"/recursos/titulo/Titulo Buscado", DTORecurso[].class
);
......@@ -310,13 +417,29 @@ public class TestRecursosController {
String token = "Bearer " + authResponse.getBody().getToken();
// Creo un recurso
Recurso recurso = new Recurso("Recurso para borrar", "Descripción", LocalDate.now(), "Autor");
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", token);
HttpEntity<Recurso> request = new HttpEntity<>(recurso, headers);
headers.setContentType(MediaType.MULTIPART_FORM_DATA); // Cambio aquí
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
DTORecurso dtoRecurso = new DTORecurso(
null, "Recurso para borrar", "Descripción", LocalDate.now(), "Autor",
null, new HashSet<>()
);
formData.add("recurso", dtoRecurso);
formData.add("foto", new ByteArrayResource(new byte[0]) {
@Override
public String getFilename() {
return "dummy.jpg";
}
});
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(formData, headers);
var respuestaAdmin = restTemplate.exchange("/recursos/", HttpMethod.POST, request, Void.class);
assertThat(respuestaAdmin.getStatusCode()).isEqualTo(HttpStatus.CREATED);
// Obtengo el recurso recién creado
ResponseEntity<DTORecurso[]> respuestaBusqueda = restTemplate.getForEntity(
"/recursos/titulo/Recurso para borrar", DTORecurso[].class
......@@ -330,14 +453,14 @@ public class TestRecursosController {
);
assertThat(deleteUnauthorized.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN);
//Caso 2: Intento borrar el recurso con autenticación
// Caso 2: Intento borrar el recurso con autenticación
HttpHeaders authHeaders = new HttpHeaders();
authHeaders.set("Authorization", token);
HttpEntity<Void> deleteRequest = new HttpEntity<>(authHeaders);
var deleteResponse = restTemplate.exchange("/recursos/" + recursoId, HttpMethod.DELETE, deleteRequest, Void.class);
assertThat(deleteResponse.getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT);
//Caso 3: Intento borrarlo otra vez
// Caso 3: Intento borrarlo otra vez
ResponseEntity<Void> deleteAgainResponse = restTemplate.exchange(
"/recursos/" + recursoId, HttpMethod.DELETE, deleteRequest, Void.class
);
......@@ -362,11 +485,24 @@ public class TestRecursosController {
String token = "Bearer " + authResponse.getBody().getToken();
// Crear un recurso con autenticación
Recurso recurso = new Recurso("Titulo Original", "Descripción Original", LocalDate.of(2022, 5, 10), "Autor Original");
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", token);
HttpEntity<Recurso> request = new HttpEntity<>(recurso, headers);
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
DTORecurso dtoRecurso = new DTORecurso(
null, "Titulo Original", "Descripción Original", LocalDate.of(2022, 5, 10), "Autor Original",
null, new HashSet<>()
);
formData.add("recurso", dtoRecurso);
formData.add("foto", new ByteArrayResource(new byte[0]) {
@Override
public String getFilename() {
return "dummy.jpg";
}
});
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(formData, headers);
var respuestaCreacion = restTemplate.exchange("/recursos/", HttpMethod.POST, request, Void.class);
assertThat(respuestaCreacion.getStatusCode()).isEqualTo(HttpStatus.CREATED);
......@@ -379,11 +515,15 @@ public class TestRecursosController {
Long recursoId = respuestaBusqueda.getBody()[0].getId();
// Caso 1: Modificar todos los campos
// Caso 1: Modificar todos los campos (SIN MODIFICAR FOTO)
DTORecurso nuevosDatos = new DTORecurso(recursoId, "Titulo Modificado", "Descripción Modificada",
LocalDate.of(2024, 1, 1), "Autor Modificado", Set.of(Genero.ACCION, Genero.AVENTURA));
LocalDate.of(2024, 1, 1), "Autor Modificado", null, new HashSet<>(Set.of(Genero.ACCION, Genero.AVENTURA)));
HttpHeaders jsonHeaders = new HttpHeaders();
jsonHeaders.set("Authorization", token);
jsonHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<DTORecurso> updateRequest = new HttpEntity<>(nuevosDatos, headers);
HttpEntity<DTORecurso> updateRequest = new HttpEntity<>(nuevosDatos, jsonHeaders);
ResponseEntity<DTORecurso> respuestaModificacion = restTemplate.exchange(
"/recursos/{id}", HttpMethod.PUT, updateRequest, DTORecurso.class, recursoId
);
......@@ -397,8 +537,10 @@ public class TestRecursosController {
assertThat(respuestaModificacion.getBody().getGeneros()).containsExactlyInAnyOrder(Genero.ACCION, Genero.AVENTURA);
// Caso 2: Intentar modificar un recurso que NO existe
DTORecurso datosFalsos = new DTORecurso(null, "Titulo Inexistente", "Descripción", LocalDate.of(2024, 1, 1), "Autor", Set.of(Genero.DRAMA));
HttpEntity<DTORecurso> fakeUpdateRequest = new HttpEntity<>(datosFalsos, headers);
DTORecurso datosFalsos = new DTORecurso(null, "Titulo Inexistente", "Descripción",
LocalDate.of(2024, 1, 1), "Autor", null, new HashSet<>(Set.of(Genero.DRAMA)));
HttpEntity<DTORecurso> fakeUpdateRequest = new HttpEntity<>(datosFalsos, jsonHeaders);
ResponseEntity<Void> respuestaNoEncontrado = restTemplate.exchange(
"/recursos/{id}", HttpMethod.PUT, fakeUpdateRequest, Void.class, 9999
);
......@@ -414,10 +556,12 @@ public class TestRecursosController {
assertThat(respuestaNoAutenticado.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN);
}
@Test
@DirtiesContext
void testListarRecursos() {
// Registro al administrador
// Registro del administrador
restTemplate.postForEntity("/usuarios/", Map.of(
"email", "admin@example.com",
"nombreUsuario", "admin",
......@@ -431,25 +575,51 @@ public class TestRecursosController {
assertThat(authResponse.getStatusCode()).isEqualTo(HttpStatus.OK);
String token = "Bearer " + authResponse.getBody().getToken();
// Creo 10 recursos de prueba
// Headers con autenticación
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", token);
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
// Crear recursos de prueba con imágenes simuladas
for (int i = 1; i <= 10; i++) {
Recurso recurso = new Recurso("Titulo " + i, "Descripción " + i, LocalDate.of(2020, 1, i), "Autor " + i);
HttpEntity<Recurso> request = new HttpEntity<>(recurso, headers);
restTemplate.exchange("/recursos/", HttpMethod.POST, request, Void.class);
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
DTORecurso dtoRecurso = new DTORecurso(
null, "Titulo " + i, "Descripción " + i, LocalDate.of(2020, 1, i), "Autor " + i,
null, new HashSet<>()
);
formData.add("recurso", dtoRecurso);
formData.add("foto", new ByteArrayResource(new byte[0]) {
@Override
public String getFilename() {
return "dummy.jpg";
}
});
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(formData, headers);
ResponseEntity<Void> response = restTemplate.exchange("/recursos/", HttpMethod.POST, request, Void.class);
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.CREATED);
}
// Esperar un momento para que los datos se confirmen en la BD
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
// Caso 1: Obtener recursos con autenticación de administrador
HttpEntity<Void> authRequest = new HttpEntity<>(headers);
HttpHeaders jsonHeaders = new HttpHeaders();
jsonHeaders.set("Authorization", token);
jsonHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Void> authRequest = new HttpEntity<>(jsonHeaders);
ResponseEntity<DTORecurso[]> respuestaAdmin = restTemplate.exchange(
"/recursos", HttpMethod.GET, authRequest, DTORecurso[].class
);
assertThat(respuestaAdmin.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(respuestaAdmin.getBody()).isNotNull();
assertThat(respuestaAdmin.getBody().length).isLessThanOrEqualTo(15);
assertThat(respuestaAdmin.getBody().length).isGreaterThanOrEqualTo(10); // Debería haber 10 o más
// Caso 2: Obtener recursos sin autenticación
ResponseEntity<Void> respuestaNoAuth = restTemplate.exchange(
......@@ -458,77 +628,12 @@ public class TestRecursosController {
assertThat(respuestaNoAuth.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN);
}
@Test
@DirtiesContext
void testAnadirCapitulo() {
// Registro de un administrador
restTemplate.postForEntity("/usuarios/", Map.of(
"email", "admin@example.com",
"nombreUsuario", "admin",
"contrasenia", "adminpassword"
), Void.class);
// Inicio sesión con el administrador
var authResponse = restTemplate.postForEntity("/usuarios/admin@example.com", Map.of(
"clave", "adminpassword"
), DTOLoginRespuesta.class);
assertThat(authResponse.getStatusCode()).isEqualTo(HttpStatus.OK);
String token = "Bearer " + authResponse.getBody().getToken();
// Creo recurso con autenticación de administrador
Recurso recurso = new Recurso("Manga Ejemplo", "Sinopsis", LocalDate.now(), "Autor X");
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", token);
HttpEntity<Recurso> request = new HttpEntity<>(recurso, headers);
var respuestaAdmin = restTemplate.exchange("/recursos/", HttpMethod.POST, request, Void.class);
assertThat(respuestaAdmin.getStatusCode()).isEqualTo(HttpStatus.CREATED);
ResponseEntity<DTORecurso[]> respuestaBusqueda = restTemplate.exchange(
"/recursos/titulo/{titulo}", HttpMethod.GET, null, DTORecurso[].class, "Manga Ejemplo"
);
assertThat(respuestaBusqueda.getStatusCode()).isEqualTo(HttpStatus.OK);
Long recursoId = respuestaBusqueda.getBody()[0].getId();
assertThat(recursoId).isNotNull();
// Intento añadir un capítulo con autenticación de administrador
DTOCapitulo nuevoCapitulo = new DTOCapitulo(
null, 1, "Capítulo 1", TipoRecurso.MANGA,
List.of(new DTOFuenteCapitulo("Crunchyroll", "https://crunchyroll.com/cap1"))
);
HttpEntity<DTOCapitulo> capituloRequest = new HttpEntity<>(nuevoCapitulo, headers);
ResponseEntity<Void> respuestaCapitulo = restTemplate.exchange(
"/recursos/{id}/capitulos", HttpMethod.POST, capituloRequest, Void.class, recursoId
);
assertThat(respuestaCapitulo.getStatusCode()).isEqualTo(HttpStatus.CREATED);
// Registro un usuario normal
restTemplate.postForEntity("/usuarios/", Map.of(
"email", "usuario@example.com",
"nombreUsuario", "usuario",
"contrasenia", "userpassword"
), Void.class);
// Inicio sesión con ese usuario
var authUserResponse = restTemplate.postForEntity("/usuarios/usuario@example.com", Map.of(
"clave", "userpassword"
), DTOLoginRespuesta.class);
assertThat(authUserResponse.getStatusCode()).isEqualTo(HttpStatus.OK);
String tokenUser = "Bearer " + authUserResponse.getBody().getToken();
HttpHeaders headersUser = new HttpHeaders();
headersUser.set("Authorization", tokenUser);
// Intento añadir un capítulo con el usuario normal
HttpEntity<DTOCapitulo> capituloRequestUser = new HttpEntity<>(nuevoCapitulo, headersUser);
ResponseEntity<Void> respuestaCapituloUser = restTemplate.exchange(
"/recursos/{id}/capitulos", HttpMethod.POST, capituloRequestUser, Void.class, recursoId
);
assertThat(respuestaCapituloUser.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN);
}
@Test
@DirtiesContext
......@@ -548,11 +653,24 @@ public class TestRecursosController {
String token = "Bearer " + authResponse.getBody().getToken();
// Creo un recurso con autenticación
Recurso recurso = new Recurso("Manga Ejemplo", "Sinopsis", LocalDate.now(), "Autor X");
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", token);
HttpEntity<Recurso> request = new HttpEntity<>(recurso, headers);
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
DTORecurso dtoRecurso = new DTORecurso(
null, "Manga Ejemplo", "Sinopsis", LocalDate.now(), "Autor X",
null, new HashSet<>()
);
formData.add("recurso", dtoRecurso);
formData.add("foto", new ByteArrayResource(new byte[0]) {
@Override
public String getFilename() {
return "dummy.jpg";
}
});
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(formData, headers);
var respuestaCreacion = restTemplate.exchange("/recursos/", HttpMethod.POST, request, Void.class);
assertThat(respuestaCreacion.getStatusCode()).isEqualTo(HttpStatus.CREATED);
......@@ -565,21 +683,24 @@ public class TestRecursosController {
Long recursoId = respuestaBusqueda.getBody()[0].getId();
// Agrego capítulos al recurso
HttpHeaders jsonHeaders = new HttpHeaders();
jsonHeaders.set("Authorization", token);
jsonHeaders.setContentType(MediaType.APPLICATION_JSON);
restTemplate.exchange("/recursos/{id}/capitulos", HttpMethod.POST,
new HttpEntity<>(new DTOCapitulo(null, 1, "Capítulo 1", TipoRecurso.MANGA,
List.of(new DTOFuenteCapitulo("Crunchyroll", "https://crunchyroll.com/cap1"))), headers),
List.of(new DTOFuenteCapitulo("Crunchyroll", "https://crunchyroll.com/cap1"))), jsonHeaders),
Void.class, recursoId);
restTemplate.exchange("/recursos/{id}/capitulos", HttpMethod.POST,
new HttpEntity<>(new DTOCapitulo(null, 2, "Capítulo 2", TipoRecurso.MANGA,
List.of(new DTOFuenteCapitulo("AnimeFLV", "https://animeflv.com/cap2"))), headers),
List.of(new DTOFuenteCapitulo("AnimeFLV", "https://animeflv.com/cap2"))), jsonHeaders),
Void.class, recursoId);
// Obtengo capítulos del recurso
ResponseEntity<DTOCapitulo[]> respuestaCapitulos = restTemplate.exchange(
"/recursos/{id}/capitulos", HttpMethod.GET, null, DTOCapitulo[].class, recursoId);
assertThat(respuestaCapitulos.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(respuestaCapitulos.getBody()).isNotNull();
assertThat(respuestaCapitulos.getBody()[0].getNumero()).isEqualTo(1);
......@@ -591,7 +712,6 @@ public class TestRecursosController {
"/recursos/{id}/capitulos", HttpMethod.GET, null, DTOCapitulo[].class, 9999);
assertThat(respuestaSinCapitulos.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
assertThat(respuestaSinCapitulos.getBody()).isNull();
}
......
......@@ -40,7 +40,7 @@ public class TestServicioBibliotecaPersonal {
BibliotecaPersonal bibliotecaPersonal = usuario.getBibliotecaPersonal();
// Creo un recurso
Recurso recurso = new Recurso("Manga de prueba", "Descripción", LocalDate.now(), "Autor");
Recurso recurso = new Recurso("Manga de prueba", "Descripción", LocalDate.now(), "Autor", "");
servicioRecursos.crearRecurso(recurso);
Recurso recursoGuardado = servicioRecursos.buscarRecursoPorTitulo("Manga de prueba").getFirst();
......@@ -61,8 +61,8 @@ public class TestServicioBibliotecaPersonal {
BibliotecaPersonal bibliotecaPersonal = usuario.getBibliotecaPersonal();
// Creo unos cuantos recursos de prueba
Recurso recurso1 = new Recurso("Manga Acción", "Sinopsis 1", LocalDate.now(), "Autor A");
Recurso recurso2 = new Recurso("Manga Romance", "Sinopsis 2", LocalDate.now(), "Autor B");
Recurso recurso1 = new Recurso("Manga Acción", "Sinopsis 1", LocalDate.now(), "Autor A", "");
Recurso recurso2 = new Recurso("Manga Romance", "Sinopsis 2", LocalDate.now(), "Autor B", "");
servicioRecursos.crearRecurso(recurso1);
servicioRecursos.crearRecurso(recurso2);
......@@ -90,7 +90,7 @@ public class TestServicioBibliotecaPersonal {
BibliotecaPersonal bibliotecaPersonal = usuario.getBibliotecaPersonal();
// Creo un recurso
Recurso recurso = new Recurso("Manga Prueba", "Descripción", LocalDate.now(), "Autor");
Recurso recurso = new Recurso("Manga Prueba", "Descripción", LocalDate.now(), "Autor", "");
servicioRecursos.crearRecurso(recurso);
Recurso recursoGuardado = servicioRecursos.buscarRecursoPorTitulo("Manga Prueba").getFirst();
......@@ -114,7 +114,7 @@ public class TestServicioBibliotecaPersonal {
servicioUsuarios.crearUsuario(usuario);
BibliotecaPersonal bibliotecaPersonal = usuario.getBibliotecaPersonal();
Recurso recurso = new Recurso("Manga Cambio", "Otra Descripción", LocalDate.now(), "AutorX");
Recurso recurso = new Recurso("Manga Cambio", "Otra Descripción", LocalDate.now(), "AutorX", "");
servicioRecursos.crearRecurso(recurso);
Recurso recursoGuardado = servicioRecursos.buscarRecursoPorTitulo("Manga Cambio").getFirst();
servicioBibliotecaPersonal.anadirRecursoBiblioteca(bibliotecaPersonal, recursoGuardado, Categoria.PENDIENTE);
......
......@@ -32,7 +32,7 @@ public class TestServicioRecursos {
@DirtiesContext
void testCrearRecurso() {
// Crear recurso de prueba
Recurso nuevoRecurso = new Recurso("Titulo Prueba", "Descripción de prueba", LocalDate.now(), "Autor Prueba");
Recurso nuevoRecurso = new Recurso("Titulo Prueba", "Descripción de prueba", LocalDate.now(), "Autor Prueba", "");
servicioRecursos.crearRecurso(nuevoRecurso);
// Buscar el recurso en la base de datos después de crearlo
......@@ -53,8 +53,8 @@ public class TestServicioRecursos {
@DirtiesContext
void testBuscarRecursoPorTitulo() {
// Crear recursos de prueba
Recurso recurso1 = new Recurso("Titulo Uno", "Descripción de prueba 1", LocalDate.now(), "Autor 1");
Recurso recurso2 = new Recurso("Titulo Dos", "Descripción de prueba 2", LocalDate.now(), "Autor 2");
Recurso recurso1 = new Recurso("Titulo Uno", "Descripción de prueba 1", LocalDate.now(), "Autor 1", "");
Recurso recurso2 = new Recurso("Titulo Dos", "Descripción de prueba 2", LocalDate.now(), "Autor 2", "");
servicioRecursos.crearRecurso(recurso1);
servicioRecursos.crearRecurso(recurso2);
......@@ -71,8 +71,8 @@ public class TestServicioRecursos {
@DirtiesContext
void testBuscarRecursoPorAutor() {
// Crear recursos con diferentes autores
Recurso recurso1 = new Recurso("Titulo Uno", "Desc 1", LocalDate.now(), "Autor A");
Recurso recurso2 = new Recurso("Titulo Dos", "Desc 2", LocalDate.now(), "Autor B");
Recurso recurso1 = new Recurso("Titulo Uno", "Desc 1", LocalDate.now(), "Autor A", "");
Recurso recurso2 = new Recurso("Titulo Dos", "Desc 2", LocalDate.now(), "Autor B", "");
servicioRecursos.crearRecurso(recurso1);
servicioRecursos.crearRecurso(recurso2);
......@@ -89,10 +89,10 @@ public class TestServicioRecursos {
@DirtiesContext
void testBuscarRecursoPorGenero() {
// Crear recursos con diferentes géneros
Recurso recurso1 = new Recurso("Manga A", "Desc", LocalDate.now(), "Autor X");
Recurso recurso1 = new Recurso("Manga A", "Desc", LocalDate.now(), "Autor X", "");
recurso1.getGeneros().add(Genero.ACCION);
Recurso recurso2 = new Recurso("Manga B", "Desc", LocalDate.now(), "Autor Y");
Recurso recurso2 = new Recurso("Manga B", "Desc", LocalDate.now(), "Autor Y", "");
recurso2.getGeneros().add(Genero.ROMANCE);
servicioRecursos.crearRecurso(recurso1);
......@@ -115,9 +115,9 @@ public class TestServicioRecursos {
LocalDate fecha2 = LocalDate.of(2022, 6, 15);
LocalDate fecha3 = LocalDate.of(2023, 12, 25);
Recurso recurso1 = new Recurso("Titulo A", "Desc", fecha1, "Autor X");
Recurso recurso2 = new Recurso("Titulo B", "Desc", fecha2, "Autor Y");
Recurso recurso3 = new Recurso("Titulo C", "Desc", fecha3, "Autor Z");
Recurso recurso1 = new Recurso("Titulo A", "Desc", fecha1, "Autor X", "");
Recurso recurso2 = new Recurso("Titulo B", "Desc", fecha2, "Autor Y", "");
Recurso recurso3 = new Recurso("Titulo C", "Desc", fecha3, "Autor Z", "");
servicioRecursos.crearRecurso(recurso1);
servicioRecursos.crearRecurso(recurso2);
......@@ -135,7 +135,7 @@ public class TestServicioRecursos {
@DirtiesContext
void testBuscarRecursoPorId() {
// Crear un recurso de prueba
Recurso recurso = new Recurso("Manga Prueba", "Descripción de prueba", LocalDate.now(), "Autor X");
Recurso recurso = new Recurso("Manga Prueba", "Descripción de prueba", LocalDate.now(), "Autor X", "");
servicioRecursos.crearRecurso(recurso);
// Buscar el recurso en la base de datos
......@@ -153,7 +153,7 @@ public class TestServicioRecursos {
@DirtiesContext
void testBorrarRecurso() {
// Crear recurso en la base de datos
Recurso recurso = new Recurso("Titulo", "Descripcion", LocalDate.now(), "Autor");
Recurso recurso = new Recurso("Titulo", "Descripcion", LocalDate.now(), "Autor", "");
servicioRecursos.crearRecurso(recurso);
// Buscar el recurso creado y asegurar que tiene un ID
......@@ -176,7 +176,7 @@ public class TestServicioRecursos {
@DirtiesContext
void testModificarRecurso() {
// Crear un recurso inicial
Recurso recursoOriginal = new Recurso("Titulo 1", "Descripción 1", LocalDate.of(2022, 5, 10), "Autor 1");
Recurso recursoOriginal = new Recurso("Titulo 1", "Descripción 1", LocalDate.of(2022, 5, 10), "Autor 1", "");
servicioRecursos.crearRecurso(recursoOriginal);
// Buscar el recurso creado para obtener su ID
......@@ -188,7 +188,7 @@ public class TestServicioRecursos {
assertThat(recursoId).isNotNull();
// Crear un objeto con algunos campos en null (solo modificamos la descripción)
Recurso nuevosDatos = new Recurso(null, "Descripción Modificada", null, null);
Recurso nuevosDatos = new Recurso(null, "Descripción Modificada", null, null, "");
// Modificar el recurso
Recurso recursoModificado = servicioRecursos.modificarRecurso(recursoId, nuevosDatos);
......@@ -214,7 +214,7 @@ public class TestServicioRecursos {
@DirtiesContext
void testAnadirCapitulo() {
// Creo recurso inicial
Recurso recurso = new Recurso("Manga Ejemplo", "Sinopsis", LocalDate.now(), "Autor X");
Recurso recurso = new Recurso("Manga Ejemplo", "Sinopsis", LocalDate.now(), "Autor X", "");
servicioRecursos.crearRecurso(recurso);
List<Recurso> recursos = servicioRecursos.buscarRecursoPorTitulo("Manga Ejemplo");
assertThat(recursos).isNotEmpty();
......@@ -255,7 +255,7 @@ public class TestServicioRecursos {
@DirtiesContext
void testObtenerCapitulosDeRecurso() {
// Creo un recurso
Recurso recurso = new Recurso("Manga Prueba", "Sinopsis", LocalDate.now(), "Autor X");
Recurso recurso = new Recurso("Manga Prueba", "Sinopsis", LocalDate.now(), "Autor X", "");
servicioRecursos.crearRecurso(recurso);
List<Recurso> recursos = servicioRecursos.buscarRecursoPorTitulo("Manga Prueba");
assertThat(recursos).isNotEmpty();
......
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