diff --git a/infra/controller.js b/infra/controller.js index 1a9117d..e7dec5e 100644 --- a/infra/controller.js +++ b/infra/controller.js @@ -14,11 +14,12 @@ function onNoMatchHandler(request, response) { } function onErrorHandler(error, request, response) { - if ( - error instanceof ValidationError || - error instanceof NotFoundError || - error instanceof UnauthorizedError - ) { + if (error instanceof ValidationError || error instanceof NotFoundError) { + return response.status(error.statusCode).json(error); + } + + if (error instanceof UnauthorizedError) { + clearSessionCookie(response); return response.status(error.statusCode).json(error); } diff --git a/models/session.js b/models/session.js index d74bd0c..2419a56 100644 --- a/models/session.js +++ b/models/session.js @@ -63,7 +63,7 @@ async function create(userId) { async function renew(sessionId) { const expires_at = new Date(Date.now() + EXPIRATION_IN_MILLISECONDS); - const renewedSessionObject = runUpdateQuery(sessionId, expires_at); + const renewedSessionObject = await runUpdateQuery(sessionId, expires_at); return renewedSessionObject; async function runUpdateQuery(sessionId, expires_at) { diff --git a/tests/integration/api/v1/user/get.test.js b/tests/integration/api/v1/user/get.test.js index 84945ec..a160fe3 100644 --- a/tests/integration/api/v1/user/get.test.js +++ b/tests/integration/api/v1/user/get.test.js @@ -89,15 +89,28 @@ describe("GET to /api/v1/user", () => { action: "Verifique se este usuário está logado e tente novamente.", statusCode: 401, }); + + // Set - Cookie assertions + const parsedSetCookie = setCookieParser(response, { + map: true, + }); + + expect(parsedSetCookie.session_id).toEqual({ + name: "session_id", + value: "invalid", + maxAge: -1, + path: "/", + httpOnly: true, + }); }); - test("With session after 15 day", async () => { + test("With expired session", async () => { jest.useFakeTimers({ - now: new Date(Date.now() - (session.EXPIRATION_IN_MILLISECONDS + 1000)), + now: new Date(Date.now() - session.EXPIRATION_IN_MILLISECONDS), }); const createUser = await orchestrator.createUser({ - username: "UserWithSession15Day", + username: "UserWithExpiredSession", }); const sessionObject = await orchestrator.createSession(createUser.id); @@ -120,15 +133,27 @@ describe("GET to /api/v1/user", () => { action: "Verifique se este usuário está logado e tente novamente.", statusCode: 401, }); + + const parsedSetCookie = setCookieParser(response, { + map: true, + }); + + expect(parsedSetCookie.session_id).toEqual({ + name: "session_id", + value: "invalid", + maxAge: -1, + path: "/", + httpOnly: true, + }); }); - test("With session 1 second before expiration", async () => { + test("With session after 15 day", async () => { jest.useFakeTimers({ - now: new Date(Date.now() - (session.EXPIRATION_IN_MILLISECONDS - 1000)), + now: new Date(Date.now() - (session.EXPIRATION_IN_MILLISECONDS + 1000)), }); const createUser = await orchestrator.createUser({ - username: "UserWithSession", + username: "UserWithSession15Day", }); const sessionObject = await orchestrator.createSession(createUser.id); @@ -141,27 +166,25 @@ describe("GET to /api/v1/user", () => { }, }); - expect(response.status).toBe(200); + expect(response.status).toBe(401); const responseBody = await response.json(); expect(responseBody).toEqual({ - id: createUser.id, - username: "UserWithSession", - email: createUser.email, - password: createUser.password, - created_at: createUser.created_at.toISOString(), - update_at: createUser.update_at.toISOString(), + name: "UnauthorizedError", + message: "Usuario não possui sessão ativa.", + action: "Verifique se este usuário está logado e tente novamente.", + statusCode: 401, }); }); - test("With expired session", async () => { + test("With session 1 second before expiration", async () => { jest.useFakeTimers({ - now: new Date(Date.now() - session.EXPIRATION_IN_MILLISECONDS), + now: new Date(Date.now() - (session.EXPIRATION_IN_MILLISECONDS - 1000)), }); const createUser = await orchestrator.createUser({ - username: "UserWithExpiredSession", + username: "UserWithSession", }); const sessionObject = await orchestrator.createSession(createUser.id); @@ -174,15 +197,17 @@ describe("GET to /api/v1/user", () => { }, }); - expect(response.status).toBe(401); + expect(response.status).toBe(200); const responseBody = await response.json(); expect(responseBody).toEqual({ - name: "UnauthorizedError", - message: "Usuario não possui sessão ativa.", - action: "Verifique se este usuário está logado e tente novamente.", - statusCode: 401, + id: createUser.id, + username: "UserWithSession", + email: createUser.email, + password: createUser.password, + created_at: createUser.created_at.toISOString(), + update_at: createUser.update_at.toISOString(), }); }); });