Untitled

 avatar
unknown
plain_text
a year ago
7.9 kB
7
Indexable
// CAMINHO: BACKEND/TESTS/UNIT/CONTROLLERS/products.test.js

const chai = require('chai');
const sinon = require('sinon');
const sinonChai = require('sinon-chai');
const chaiHttp = require('chai-http');

const { expect } = chai;

const productsService = require('../../../src/services/products.service');
const productsController = require('../../../src/controllers/products.controller');

const { FIRST_PRODUCT_MOCK, MOCK_FOR_SERVICES, MOCK_FOR_SERVICES_NOT_FOUND, MOCK_UPDATE_OUTPUT } = require('../mocks/products.mock');

chai.use(chaiHttp);
chai.use(sinonChai);

describe('Testes para products controller', function () {
  afterEach(function () {
    sinon.restore();
  });

  describe('Quando o produto está presente na base de dados', function () {
    it('Retorna todos os produtos', async function () {
      const req = { params: { id: 1 } };
      const res = {
        status: sinon.stub().returnsThis(),
        json: sinon.stub().returnsThis(),
      };
      const stub = sinon.stub(productsService, 'getAllProducts').resolves(MOCK_FOR_SERVICES);
      await productsController.getAllController(req, res);
      expect(res.status).to.have.been.calledWith(200);

      stub.restore();
    });

    it('Retorna um único produto por meio do ID', async function () {
      const res = {
        status: sinon.stub().returnsThis(),
        json: sinon.stub().returnsThis(),
      };
      const req = {
        params:
        {
          id: 1,
        },
      };
      const stub = sinon.stub(productsService, 'getProductById').resolves(FIRST_PRODUCT_MOCK);
      await productsController.getByIdController(req, res);
      expect(res.status).to.have.been.calledWith(200);

      stub.restore();
    });
  });

  describe('Quando o produto não está presente na base de dados', function () {
    it('Retorna uma mensagem de erro caso o produto não seja encontrado', async function () {
      const res = {
        status: sinon.stub().returnsThis(),
        json: sinon.stub().returnsThis(),
      };
      const req = {
        params:
        {
          id: 1,
        },
      };
      const stub = sinon.stub(productsService, 'getProductById').resolves(MOCK_FOR_SERVICES_NOT_FOUND);
      await productsController.getByIdController(req, res);

      expect(res.status).to.have.been.calledWith(200);
      stub.restore();
    });
  });

  describe('Quando o produto é inserido com sucesso', function () {
    it('Retorna o produto inserido', async function () {
      const res = {
        status: sinon.stub().returnsThis(),
        json: sinon.stub().returnsThis(),
      };
      const req = {
        body:
        {
          name: 'Bolo de cenoura',
        },
      };
      const stub = sinon.stub(productsService, 'insertNewProduct').resolves(MOCK_FOR_SERVICES);
      await productsController.insertNewProduct(req, res);

      expect(res.status).to.have.been.calledWith(201);
      stub.restore();
    });
  });

  describe('Quando o produto não é inserido com sucesso', function () {
    it('Sem nome', async function () {
      const res = {
        status: sinon.stub().returnsThis(),
        json: sinon.stub(),
      };
      const req = {
        body: {},
      };
      const stub = sinon.stub(productsService, 'insertNewProduct').resolves(null);
      await productsController.insertNewProduct(req, res);

      expect(res.status).to.have.been.calledWith(400);
      expect(res.json).to.have.been.calledWith({ message: '"name" is required' });
      stub.restore();
    });

    it('Nome com menos de 5 caracteres', async function () {
      const res = {
        status: sinon.stub().returnsThis(),
        json: sinon.stub(),
      };
      const req = {
        body: {
          name: 'hjkl',
        },
      };
      const stub = sinon.stub(productsService, 'insertNewProduct').resolves(null);
      await productsController.insertNewProduct(req, res);

      expect(res.status).to.have.been.calledWith(422);
      expect(res.json).to.have.been.calledWith({ message: '"name" length must be at least 5 characters long' });
      stub.restore();
    });
  });

  describe('Quando o produto é atualizado com sucesso', function () {
    it('Retorna o produto atualizado', async function () {
      const res = {
        status: sinon.stub().returnsThis(),
        json: sinon.stub().returnsThis(),
      };
      const req = {
        params: {
          id: 1,
        },
        body: {
          name: 'Bombril de ouro',
        },
      };
      const stub = sinon.stub(productsService, 'updateProductName').resolves(MOCK_UPDATE_OUTPUT);
      await productsController.updateProductName(req, res);

      expect(res.status).to.have.been.calledWith(200);
      stub.restore();
    });
  });

  describe('Quando o produto não é atualizado com sucesso', function () {
    it('Sem nome', async function () {
      const res = {
        status: sinon.stub().returnsThis(),
        json: sinon.stub(),
      };
      const req = {
        params: {
          id: 1,
        },
        body: {},
      };
      const stub = sinon.stub(productsService, 'updateProductName').resolves(null);
      await productsController.updateProductName(req, res);

      expect(res.status).to.have.been.calledWith(400);
      expect(res.json).to.have.been.calledWith({ message: '"name" is required' });
      stub.restore();
    });

    it('Nome com menos de 5 caracteres', async function () {
      const res = {
        status: sinon.stub().returnsThis(),
        json: sinon.stub(),
      };
      const req = {
        params: {
          id: 1,
        },
        body: {
          name: 'hjkl',
        },
      };
      const stub = sinon.stub(productsService, 'updateProductName').resolves(null);
      await productsController.updateProductName(req, res);

      expect(res.status).to.have.been.calledWith(422);
      expect(res.json).to.have.been.calledWith({ message: '"name" length must be at least 5 characters long' });
      stub.restore();
    });

    it('Produto não encontrado', async function () {
      const res = {
        status: sinon.stub().returnsThis(),
        json: sinon.stub(),
      };
      const req = {
        params: {
          id: 1,
        },
        body: {
          name: 'Bombril de ouro',
        },
      };
      const stub = sinon.stub(productsService, 'updateProductName').resolves({ message: 'Product not found' });
      await productsController.updateProductName(req, res);

      expect(res.status).to.have.been.calledWith(200);
      expect(res.json).to.have.been.calledWith({ message: 'Product not found' });
      stub.restore();
    });
  });

  describe('Quando o produto é deletado com sucesso', function () {
    it('Retorna uma mensagem de sucesso', async function () {
      const res = {
        status: sinon.stub().returnsThis(),
        json: sinon.stub().returnsThis(),
      };
      const req = { params: { id: 1 } };
      const stub = sinon.stub(productsService, 'removeProduct').resolves(FIRST_PRODUCT_MOCK);
      await productsController.deleteProductController(req, res);

      expect(res.status).to.have.been.calledWith(204);
      stub.restore();
      sinon.restore();
    });
  });

  describe('Quando o produto não é deletado com sucesso', function () { // ESSA FUNCTION ESTA COM ERRO TEM QUE ARRUMAR 1!!111!11!1
    it('Quando o produto vem com o nome vazio', async function () {
      const res = {
        status: sinon.stub().returnsThis(),
        json: sinon.stub(),
      };
      const req = { params: { id: 1 } };
      const stub = sinon.stub(productsService, 'removeProduct').resolves(null);
      await productsController.deleteProductController(req, res);

      expect(res.status).to.have.been.calledWith(404);
      expect(res.json).to.have.been.calledWith({ message: 'Product not found' });
      stub.restore();
      sinon.restore();
    });
  });
});
Leave a Comment