Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Rubén Ramírez
/
MangAffinity
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
d219c69e
authored
Mar 06, 2025
by
Rubén Ramírez
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
feat: [Metodos Recurso]: Corregidos los test por el nuevo atrinuto
parent
e8628c2d
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
432 additions
and
198 deletions
src/main/java/com/ujaen/tfg/mangaffinity/rest/RecursosController.java
src/test/java/com/ujaen/tfg/mangaffinity/rest/TestBibliotecaPersonalController.java
src/test/java/com/ujaen/tfg/mangaffinity/rest/TestRecursosController.java
src/test/java/com/ujaen/tfg/mangaffinity/servicios/TestServicioBibliotecaPersonal.java
src/test/java/com/ujaen/tfg/mangaffinity/servicios/TestServicioRecursos.java
src/main/java/com/ujaen/tfg/mangaffinity/rest/RecursosController.java
View file @
d219c69e
...
...
@@ -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
{
...
...
src/test/java/com/ujaen/tfg/mangaffinity/rest/TestBibliotecaPersonalController.java
View file @
d219c69e
...
...
@@ -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ñad
o con el usuario el recurso a su biblioteca
// Añad
ir 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
);
// List
o los recursos de la biblioteca personal filtrados
por categoría
// List
ar 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
()).
isNot
Null
().
isNot
Empty
();
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
);
// Verific
p
que la categoría ha cambiado
// Verific
o
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
a
l usuario
// Inicio sesión
con e
l 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
();
}
}
src/test/java/com/ujaen/tfg/mangaffinity/rest/TestRecursosController.java
View file @
d219c69e
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.
Lis
t
;
import
java.util.
HashSe
t
;
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
,
h
eaders
);
HttpEntity
<
DTORecurso
>
updateRequest
=
new
HttpEntity
<>(
nuevosDatos
,
jsonH
eaders
);
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
a
l administrador
// Registro
de
l 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
).
is
LessThanOrEqualTo
(
15
);
assertThat
(
respuestaAdmin
.
getBody
().
length
).
is
GreaterThanOrEqualTo
(
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"
))),
h
eaders
),
List
.
of
(
new
DTOFuenteCapitulo
(
"Crunchyroll"
,
"https://crunchyroll.com/cap1"
))),
jsonH
eaders
),
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"
))),
h
eaders
),
List
.
of
(
new
DTOFuenteCapitulo
(
"AnimeFLV"
,
"https://animeflv.com/cap2"
))),
jsonH
eaders
),
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
();
}
...
...
src/test/java/com/ujaen/tfg/mangaffinity/servicios/TestServicioBibliotecaPersonal.java
View file @
d219c69e
...
...
@@ -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
);
...
...
src/test/java/com/ujaen/tfg/mangaffinity/servicios/TestServicioRecursos.java
View file @
d219c69e
...
...
@@ -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
();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment