Untitled
unknown
plain_text
2 years ago
7.9 kB
12
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();
});
});
});Editor is loading...
Leave a Comment