Untitled
unknown
plain_text
2 years ago
8.4 kB
7
Indexable
const chai = require('chai');
const sinon = require('sinon');
const sinonChai = require('sinon-chai');
const chaiHttp = require('chai-http');
const { expect } = chai;
const productsServices = require('../../../src/services/products.service');
const productsController = require('../../../src/controllers/products.controller');
const { PRODUCT_1, MOCK_SERVICES, MOCK_ALL_PRODUCTS } = require('../mocks/products.mock');
chai.use(chaiHttp);
chai.use(sinonChai);
describe('Testando products controller', function () {
afterEach(function () {
sinon.restore();
});
it('Retorna todos os produtos da DB', async function () {
const request = { params: { id: 1 } };
const response = {
status: sinon.stub().returnsThis(),
json: sinon.stub().returnsThis(),
};
const stub = sinon.stub(productsServices, 'allProducts').resolves(MOCK_SERVICES);
await productsController.controllerProducts(request, response);
expect(response.status).to.have.been.calledWith(200);
stub.restore();
});
it('Retorna um produto pelo id', async function () {
const response = {
status: sinon.stub().returnsThis(),
json: sinon.stub().returnsThis(),
};
const request = { params: { id: 1 } };
const stub = sinon.stub(productsServices, 'productsByID').resolves(PRODUCT_1);
await productsController.controllerProductById(request, response);
expect(response.status).to.have.been.calledWith(200);
stub.restore();
});
it('Caso produto não exista na DB ,retorne uma mensagem de error', async function () {
const response = {
status: sinon.stub().returnsThis(),
json: sinon.stub().returnsThis(),
};
const request = { params: { id: 1 } };
const stub = sinon.stub(productsServices, 'productsByID').resolves(MOCK_ALL_PRODUCTS);
await productsController.controllerProductById(request, response);
expect(response.status).to.have.been.calledWith(200);
stub.restore();
});
it('É possível adicionar um produto ao DB', async function () {
const request = { body: { name: 'Holy Bible' } };
const response = { status: sinon.stub().returnsThis(), json: sinon.stub().returnsThis() };
const stub = sinon.stub(productsServices, 'productAddDbService').resolves(MOCK_SERVICES);
await productsController.controllerAddProduct(request, response);
expect(response.status).to.be.calledWith(201);
stub.restore();
});
describe('Produto adicionado ao DB com sucesso', function () {
it('Retorna o produto adicionado ao DB com a mensagem de sucesso', async function () {
const response = {
status: sinon.stub().returnsThis(),
json: sinon.stub().returnsThis(),
};
const request = {
body: {
name: 'Holy Bible',
},
};
const stub = sinon.stub(productsServices, 'productAddDbService').resolves(MOCK_SERVICES);
await productsController.controllerAddProduct(request, response);
expect(response.status).to.have.been.calledWith(201);
stub.restore();
});
});
describe('Quando não é possível adicionar o produto', function () {
it('Produto adicionado sem a chave name', async function () {
const response = {
status: sinon.stub().returnsThis(),
json: sinon.stub(),
};
const request = {
body: {},
};
const stub = sinon.stub(productsServices, 'productAddDbService').resolves(null);
await productsController.controllerAddProduct(request, response);
expect(response.status).to.have.been.calledWith(400);
expect(response.json).to.have.been.calledWith({ message: '"name" is required' });
stub.restore();
});
it('Error por tentar adicionar um produto com menos de 5 caracteres', async function () {
const response = {
status: sinon.stub().returnsThis(),
json: sinon.stub(),
};
const request = {
body: {
name: 'node',
},
};
const stub = sinon.stub(productsServices, 'productAddDbService').resolves(null);
await productsController.controllerAddProduct(request, response);
expect(response.status).to.have.been.calledWith(422);
expect(response.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 response = {
status: sinon.stub().returnsThis(),
json: sinon.stub().returnsThis(),
};
const request = {
params: {
id: 1,
},
body: {
name: 'Açaí batido com morango',
},
};
const stub = sinon.stub(productsServices, 'productNameUpdateServices').resolves();
await productsController.productNameUpdateController(request, response);
expect(response.status).to.have.been.calledWith(200);
stub.restore();
});
});
describe('Quando há uma falha na atualização do produto', function () {
it('Sem colocar o nome', async function () {
const response = {
status: sinon.stub().returnsThis(),
json: sinon.stub(),
};
const request = {
params: {
id: 1,
},
body: {},
};
const stub = sinon.stub(productsServices, 'productNameUpdateServices').resolves(null);
await productsController.productNameUpdateController(request, response);
expect(response.status).to.have.been.calledWith(400);
expect(response.json).to.have.been.calledWith({ message: '"name" is required' });
stub.restore();
});
it('Nome com menos de 5 caracteres', async function () {
const response = {
status: sinon.stub().returnsThis(),
json: sinon.stub(),
};
const request = {
params: {
id: 1,
},
body: {
name: 'FBI',
},
};
const stub = sinon.stub(productsServices, 'productNameUpdateServices').resolves(null);
await productsController.productNameUpdateController(request, response);
expect(response.status).to.have.been.calledWith(422);
expect(response.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 response = {
status: sinon.stub().returnsThis(),
json: sinon.stub(),
};
const request = {
params: {
id: 1,
},
body: {
name: 'Açaí batido com morango',
},
};
const stub = sinon.stub(productsServices, 'productNameUpdateServices').resolves({ message: 'Product not found' });
await productsController.productNameUpdateController(request, response);
expect(response.status).to.have.been.calledWith(200);
expect(response.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 response = {
status: sinon.stub().returnsThis(),
json: sinon.stub().returnsThis(),
};
const request = { params: { id: 1 } };
const stub = sinon.stub(productsServices, 'deleteProductService').resolves(PRODUCT_1);
await productsController.removeProductController(request, response);
expect(response.status).to.have.been.calledWith(204);
stub.restore();
sinon.restore();
});
});
describe('Quando o produto não é deletado com sucesso', function () {
it('Quando o produto é recebido com uma string vazia', async function () {
const response = {
status: sinon.stub().returnsThis(),
json: sinon.stub(),
};
const request = { params: { id: 1 } };
const stub = sinon.stub(productsServices, 'deleteProductService').resolves(null);
await productsController.removeProductController(request, response);
expect(response.status).to.have.been.calledWith(404);
expect(response.json).to.have.been.calledWith({ message: 'Product not found' });
stub.restore();
sinon.restore();
});
});
});Editor is loading...
Leave a Comment