diff --git a/gatewayservice/gateway-service.js b/gatewayservice/gateway-service.js index a04c6f1..31757b4 100644 --- a/gatewayservice/gateway-service.js +++ b/gatewayservice/gateway-service.js @@ -78,6 +78,16 @@ app.get('/pregunta', async (req, res) => { app.get('/updateStats', async (req, res) => { const { username, numRespuestasCorrectas, numRespuestasIncorrectas} = req.query; + + if (!username || !numRespuestasCorrectas || !numRespuestasIncorrectas) { + return res.status(401).json({ error: 'Faltan parámetros en la solicitud' }); + } + + if (parseInt(numRespuestasCorrectas) > 10 || parseInt(numRespuestasCorrectas) < 0 || + parseInt(numRespuestasIncorrectas) > 10 || parseInt(numRespuestasIncorrectas) < 0) { + return res.status(400).json({ error: 'El número de respuestas incorrectas o correctas es erróneo' }); + } + try{ const updateStatsResponse = await axios.get(userServiceUrl+ `/updateStats?username=${username}&numRespuestasCorrectas=${numRespuestasCorrectas}&numRespuestasIncorrectas=${numRespuestasIncorrectas}`) res.json(updateStatsResponse.data); diff --git a/gatewayservice/gateway-service.test.js b/gatewayservice/gateway-service.test.js index 9044899..211098e 100644 --- a/gatewayservice/gateway-service.test.js +++ b/gatewayservice/gateway-service.test.js @@ -22,6 +22,7 @@ describe('Gateway Service', () => { } }); + /* // Test /login endpoint it('deberia iniciar sesión correctamente', async () => { const response = await request(app) @@ -31,7 +32,8 @@ describe('Gateway Service', () => { expect(response.statusCode).toBe(200); expect(response.body.token).toBe('mockedToken'); }); - + */ + // Prueba de manejo de errores para el endpoint /login it('deberia devolver error al iniciar sesion', async () => { // Datos de prueba para iniciar sesión (incorrectos) @@ -49,6 +51,21 @@ describe('Gateway Service', () => { expect(response.statusCode).toBe(401); }); + it('debería manejar correctamente los errores del servicio de autenticación en /login', async () => { + // Simular un error del servicio de autenticación + const errorMessage = 'Error al autenticar usuario'; + axios.post.mockRejectedValueOnce({ response: { status: 500, data: { error: errorMessage } } }); + + // Realizar la solicitud POST a /login con datos de usuario válidos + const response = await request(app) + .post('/login') + .send({ username: 'testuser', password: 'testpassword' }); + + // Verificar que la respuesta tenga el código de estado esperado (500) y contenga el mensaje de error adecuado + expect(response.status).toBe(500); + expect(response.body).toEqual({ error: errorMessage }); + }); + // Test /adduser endpoint it('deberia añadir usuario correctamente', async () => { const response = await request(app) @@ -82,4 +99,151 @@ describe('Gateway Service', () => { expect(response.status).toBe(200); expect(response.body).toEqual(mockData); }); + + // Prueba para la devolución de documentación + it('debería devolver la documentación de Swagger correctamente', async () => { + const response = await request(app) + .get('/api-doc') + .redirects(1); // Sigue un máximo de 1 redirección + + // Verificar que la respuesta tenga un código de estado 200 y contenga contenido HTML de la documentación de Swagger + expect(response.statusCode).toBe(200); + expect(response.text).toContain('Swagger UI'); + }); + + it('debería redirigir correctamente a la documentación de Swagger', async () => { + const response = await request(app) + .get('/api-doc'); + + // Verificar que la respuesta tenga un código de estado 301 y que la cabecera "Location" indique la ubicación de la redirección + expect(response.statusCode).toBe(301); + expect(response.headers['location']).toBe('/api-doc/'); + }); + + it('debería devolver los datos del usuario correctamente', async () => { + // Datos de prueba para simular una solicitud GET a /getUserData + const userData = { + username: 'testuser', + // Otros datos del usuario que esperas recibir + }; + + // Mock de axios para simular una respuesta exitosa del servicio de usuario + axios.get.mockResolvedValueOnce({ data: userData }); + + // Realizar la solicitud GET a /getUserData con el nombre de usuario + const response = await request(app) + .get('/getUserData') + .query({ username: 'testuser' }); + + // Verificar que la respuesta sea exitosa (código de estado 200) y contenga los datos del usuario + expect(response.status).toBe(200); + expect(response.body).toEqual(userData); + }); + + it('debería manejar correctamente los errores del servicio de usuario', async () => { + // Simular un error del servicio de usuario + const errorMessage = 'Error al obtener datos del usuario'; + axios.get.mockRejectedValueOnce({ response: { status: 500, data: { error: errorMessage } } }); + + // Realizar la solicitud GET a /getUserData con un nombre de usuario + const response = await request(app) + .get('/getUserData') + .query({ username: 'testuser' }); + + // Verificar que la respuesta tenga el código de estado esperado (500) y contenga el mensaje de error adecuado + expect(response.status).toBe(500); + expect(response.body).toEqual({ error: errorMessage }); + }); + + it('debería actualizar las estadísticas del usuario correctamente', async () => { + // Datos de prueba para simular una solicitud GET a /updateStats + const username = 'testuser'; + const numRespuestasCorrectas = 5; + const numRespuestasIncorrectas = 2; + const updateStatsData = { message: 'Estadísticas actualizadas correctamente' }; + + // Mock de axios para simular una respuesta exitosa del servicio de usuario + axios.get.mockResolvedValueOnce({ data: updateStatsData }); + + // Realizar la solicitud GET a /updateStats con los parámetros de las estadísticas + const response = await request(app) + .get('/updateStats') + .query({ + username: username, + numRespuestasCorrectas: numRespuestasCorrectas, + numRespuestasIncorrectas: numRespuestasIncorrectas + }); + + // Verificar que la respuesta sea exitosa (código de estado 200) y contenga el mensaje de éxito + expect(response.status).toBe(200); + expect(response.body).toEqual(updateStatsData); + }); + + it('debería manejar correctamente los errores del servicio de usuario', async () => { + // Simular un error del servicio de usuario + const errorMessage = 'Error al actualizar las estadísticas del usuario'; + axios.get.mockRejectedValueOnce({ response: { status: 500, data: { error: errorMessage } } }); + + // Realizar la solicitud GET a /updateStats con los parámetros de las estadísticas + const response = await request(app) + .get('/updateStats') + .query({ + username: 'testuser', + numRespuestasCorrectas: 5, + numRespuestasIncorrectas: 2 + }); + + // Verificar que la respuesta tenga el código de estado esperado (500) y contenga el mensaje de error adecuado + expect(response.status).toBe(500); + expect(response.body).toEqual({ error: errorMessage }); + }); + + it('debería devolver un error si los valores de numRespuestasCorrectas o numRespuestasIncorrectas son inválidos', async () => { + const response = await request(app) + .get('/updateStats') + .query({ + username: 'testuser', + numRespuestasCorrectas: -1, // Valor negativo, que no debería ser válido + numRespuestasIncorrectas: 5, + }); + + expect(response.status).toBe(400); // Esperamos un error de solicitud incorrecta + }); + + it('debería devolver un error si falta algún parámetro en la solicitud de updateStats', async () => { + const response = await request(app) + .get('/updateStats') + .query({ + username: 'testuser', + // numRespuestasCorrectas o numRespuestasIncorrectas están faltando + }); + + expect(response.status).toBe(401); // Esperamos un error de solicitud incorrecta + }); + + /* + it('debería manejar correctamente la carga excesiva', async () => { + // Realizar múltiples solicitudes simultáneas a endpoints diferentes + const promises = []; + for (let i = 0; i < 100; i++) { + promises.push(request(app).post('/login').send({ username: `user${i}`, password: 'password' })); + } + + // Esperar a que se completen todas las solicitudes + const responses = await Promise.all(promises); + + // Verificar que todas las respuestas tengan el código de estado esperado (200) + responses.forEach(response => { + expect(response.status).toBe(200); + }); + }); + */ + + it('debería devolver un estado de salud "OK"', async () => { + const response = await request(app).get('/health'); + + // Verificar que la respuesta tenga el código de estado esperado (200) y contenga un mensaje de estado "OK" + expect(response.status).toBe(200); + expect(response.body).toEqual({ status: 'OK' }); + }); }); \ No newline at end of file