1
resposta

[Projeto] Opinião so bre o código

Prezados,

Fiz os exercícios de teste da rota login, e gostaria da opinião dos senhores sobre meu código, uma vez que dado o desafio pesquisei formas complementares de lidar com o código que até então não haviam sido abordadas aqui:

import { afterEach, beforeEach, expect } from "@jest/globals";
import request from "supertest";
import app from "../../app.js";
import AuthService from "../../services/authService.js";
import UsuariosService from "../../services/usuariosService.js";

const authService = new AuthService();
const usuarioService = new UsuariosService();

const port = 3000
let server;

beforeEach(() => {
    server = app.listen(port)
});

afterEach(() => {
    server.close()
});


describe("Testando a rota login (POST)", () => {
    it("O login deve possuir e-mail e senha para se autenticar", async () => {
        const loginMock = {
            email: "wesley.arruda@teste.com.br"
        };

        await request(server)
            .post("/login")
            .send(loginMock)
            .expect(500)
            .expect('"A senha de usuario é obrigatório."')
    })
    it("O login deve validar se o usuário está cadastrado", async () => {
        const loginMock = {
            email: "teste@com.br",
            senha: "qualquersenha"
        }

        await request(server)
            .post("/login")
            .send(loginMock)
            .expect(500)
            .expect('"Usuario não cadastrado."')
    });
    it("O login deve validar e-mail e senha incorretos", async () => {
        const usuarioTeste = {
            nome: "Wesley",
            email: "wesley@teste.teste",
            senha: "wesleyteste"
        }
        let usuarioCriado;
        try {
            usuarioCriado = await authService.cadastrarUsuario(usuarioTeste)
            const loginTeste = {
                email: usuarioTeste.email,
                senha: "outrasenha"
            }
            
            await request(server)
                .post("/login")
                .send(loginTeste)
                .expect(500)
                .expect('"Usuario ou senha invalido."')

        } finally {
            if (usuarioCriado){
                await usuarioService.excluirUsuario(usuarioCriado.content.id)
            }
        }
    });
    it("Deve retornar um accessToken, caso haja sucesso.", async () => {
        const usuarioTeste = {
            nome: "Wesley",
            email: "wesley@teste.teste",
            senha: "wesleyteste"
        }
        let usuarioCriado;
        try {
            usuarioCriado = await authService.cadastrarUsuario(usuarioTeste)
            const loginTeste = {
                email: usuarioTeste.email,
                senha: "wesleyteste"
            }
            
            const resposta = await request(server)
                .post("/login")
                .send(loginTeste)
                .expect(201)
            
            expect(resposta.body).toHaveProperty("accessToken")

        } finally {
            if (usuarioCriado){
                await usuarioService.excluirUsuario(usuarioCriado.content.id)
            }
        }
    });
});
1 resposta

Oi, Wesley! Como vai?

Agradeço por compartilhar seu código com a comunidade Alura.

Chamou atenção o cuidado com a organização dos testes e com a limpeza do ambiente: usar beforeEach/afterEach para subir e fechar o servidor e o try/finally para garantir a exclusão do usuário criado deixa seus cenários mais confiáveis e evita sujeira no banco.

Uma dica interessante para o futuro é usar beforeAll/afterAll para subir o servidor uma única vez na suíte, reduzindo o tempo de execução. Veja este exemplo:


import request from "supertest";

let server;

beforeAll(() => {
  server = app.listen(3000);
});

afterAll(() => {
  server.close();
});

test("login ok retorna accessToken", async () => {
  const res = await request(server).post("/login").send({
    email: "user@teste.com",
    senha: "senha123"
  }).expect(201);

  expect(res.body).toHaveProperty("accessToken");
});

Esse código inicia o servidor uma vez, faz a requisição de login e valida se a resposta possui accessToken.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!