chore: Atualiza variavel de ambiente

This commit is contained in:
Michel Pereira 2021-11-18 02:40:25 -03:00
parent 24302cfa39
commit f120bd5aac
6 changed files with 1364 additions and 9 deletions

2
.gitignore vendored
View file

@ -6,6 +6,8 @@
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
trybe.yml
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml

View file

@ -2,22 +2,15 @@ const express = require('express');
const products = require('./controllers/products');
const sales = require('./controllers/sales');
const PORT = '3000';
const app = express();
app.use(express.json());
// não remova esse endpoint, e para o avaliador funcionar
app.get('/', (_request, response) => {
response.send();
});
app.use('/products', products);
app.use('/sales', sales);
app.all('*', (req, res) => res.status(404).send('Router not found'));
app.listen(PORT, () => {
app.listen(process.env.PORT, () => {
console.log('Online');
});

View file

@ -6,7 +6,7 @@ const OPTIONS = {
useUnifiedTopology: true,
};
const MONGO_DB_URL = process.env.DB_URL || 'mongodb://mongodb:27017/StoreManager';
const MONGO_DB_URL = process.env.DB_URL;
let db = null;

61
test/bonus.test.js Normal file
View file

@ -0,0 +1,61 @@
const fs = require('fs').promises;
const util = require('util');
const { exec: callbackExec } = require('child_process');
const path = require('path');
const exec = util.promisify(callbackExec);
const mongoDbUrl = 'mongodb://localhost:27017';
const url = 'http://localhost:3000';
const NPX_NYC_COMMAND =
(unit) => `npx nyc --all --include ${unit} --reporter json-summary mocha test/unit/${unit}.js --exit`;
function readCoverageFile() {
const COVERAGE_FILE_PATH = path.join(__dirname, '..', 'coverage', 'coverage-summary.json');
return fs.readFile(COVERAGE_FILE_PATH).then(JSON.parse);
}
describe('11 - Escreva testes para seus models', () => {
beforeAll(async () => {
await exec(NPX_NYC_COMMAND('models'));
});
afterAll(async () => {
await exec('rm -rf coverage .nyc_output');
});
it('Será validado que cobertura total das linhas dos arquivos na pasta `models` é maior ou igual a 80%', async () => {
const coverageResults = await readCoverageFile();
expect(coverageResults.total.lines.pct).toBeGreaterThanOrEqual(80);
});
});
describe('12 - Escreva testes para seus services', () => {
beforeAll(async () => {
await exec(NPX_NYC_COMMAND('services'));
});
afterAll(async () => {
await exec('rm -rf coverage .nyc_output');
});
it('Será validado que cobertura total das linhas dos arquivos na pasta `services` é maior ou igual a 80%', async () => {
const coverageResults = await readCoverageFile();
expect(coverageResults.total.lines.pct).toBeGreaterThanOrEqual(80);
});
});
describe('13 - Escreva testes para seus controllers', () => {
beforeAll(async () => {
await exec(NPX_NYC_COMMAND('controllers'));
});
afterAll(async () => {
await exec('rm -rf coverage .nyc_output');
});
it('Será validado que cobertura total das linhas dos arquivos na pasta `controllers` é maior ou igual a 80%', async () => {
const coverageResults = await readCoverageFile();
expect(coverageResults.total.lines.pct).toBeGreaterThanOrEqual(80);
});
});

461
test/products.test.js Normal file
View file

@ -0,0 +1,461 @@
const frisby = require('frisby');
const { MongoClient } = require('mongodb');
// const mongoDbUrl = 'mongodb://mongodb:27017/StoreManager';
const mongoDbUrl = 'mongodb://localhost:27017/StoreManager';
const url = 'http://localhost:3000';
const invalidId = 99999;
describe('1 - Crie um endpoint para o cadastro de produtos', () => {
let connection;
let db;
beforeAll(async () => {
connection = await MongoClient.connect(mongoDbUrl, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
db = connection.db('StoreManager');
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
});
beforeEach(async () => {
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
const myobj = { name: 'Martelo de Thor', quantity: 10 };
await db.collection('products').insertOne(myobj);
});
afterEach(async () => {
await db.collection('products').deleteMany({});
});
afterAll(async () => {
await connection.close();
});
it('Será validado que não é possível criar um produto com o nome menor que 5 caracteres', async () => {
await frisby
.post(`${url}/products/`, {
name: 'Rai',
quantity: 100,
})
.expect('status', 422)
.then((res) => {
let { body } = res;
body = JSON.parse(body);
const error = body.err.code;
const { message } = body.err;
expect(error).toEqual('invalid_data');
expect(message).toEqual('"name" length must be at least 5 characters long');
});
});
it('Será validado que não é possível criar um produto com o mesmo nomede outro já existente', async () => {
await frisby
.post(`${url}/products/`, {
name: 'Martelo de Thor',
quantity: 100,
})
.expect('status', 422)
.then((res) => {
let { body } = res;
body = JSON.parse(body);
const error = body.err.code;
const { message } = body.err;
expect(error).toEqual('invalid_data');
expect(message).toEqual('Product already exists');
});
});
it('Será validado que não é possível criar um produto com quantidade menor que zero', async () => {
await frisby
.post(`${url}/products`, {
name: 'Produto do Batista',
quantity: -1,
})
.expect('status', 422)
.then((res) => {
let { body } = res;
body = JSON.parse(body);
const error = body.err.code;
const { message } = body.err;
expect(error).toEqual('invalid_data');
expect(message).toEqual('"quantity" must be larger than or equal to 1');
});
});
it('Será validado que não é possível criar um produto com quantidade igual a zero', async () => {
await frisby
.post(`${url}/products`, {
name: 'Produto do Batista',
quantity: 0,
})
.expect('status', 422)
.then((res) => {
let { body } = res;
body = JSON.parse(body);
const error = body.err.code;
const { message } = body.err;
expect(error).toEqual('invalid_data');
expect(message).toEqual('"quantity" must be larger than or equal to 1');
});
});
it('Será validado que não é possível criar um produto com uma string no campo quantidade', async () => {
await frisby
.post(`${url}/products`, {
name: 'Produto do Batista',
quantity: 'string',
})
.expect('status', 422)
.then((res) => {
let { body } = res;
body = JSON.parse(body);
const error = body.err.code;
const { message } = body.err;
expect(error).toEqual('invalid_data');
expect(message).toEqual('"quantity" must be a number');
});
});
it('Será validado que é possível criar um produto com sucesso', async () => {
await frisby
.post(`${url}/products`, {
name: 'Arco do Gavião Arqueiro',
quantity: 1,
})
.expect('status', 201)
.then((res) => {
let { body } = res;
body = JSON.parse(body);
const productName = body.name;
const quantityProduct = body.quantity;
expect(productName).toEqual('Arco do Gavião Arqueiro');
expect(quantityProduct).toEqual(1);
expect(body).toHaveProperty('_id');
});
});
});
describe('2 - Crie um endpoint para listar os produtos', () => {
let connection;
let db;
beforeAll(async () => {
connection = await MongoClient.connect(mongoDbUrl, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
db = connection.db('StoreManager');
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
});
beforeEach(async () => {
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
const products = [{ name: 'Martelo de Thor', quantity: 10 },
{ name: 'Traje de encolhimento', quantity: 20 },
{ name: 'Escudo do Capitão América', quantity: 30 }];
await db.collection('products').insertMany(products);
});
afterEach(async () => {
await db.collection('products').deleteMany({});
});
afterAll(async () => {
await connection.close();
});
it('Será validado que todos produtos estão sendo retornados', async () => {
await frisby
.get(`${url}/products`)
.expect('status', 200)
.then((res) => {
let { body } = res;
body = JSON.parse(body);
const firstProductName = body.products[0].name;
const firstQuantityProduct = body.products[0].quantity;
const secondProductName = body.products[1].name;
const secondQuantityProduct = body.products[1].quantity;
const thirdProductName = body.products[2].name;
const thirdQuantityProduct = body.products[2].quantity;
expect(firstProductName).toEqual('Martelo de Thor');
expect(firstQuantityProduct).toEqual(10);
expect(secondProductName).toEqual('Traje de encolhimento');
expect(secondQuantityProduct).toEqual(20);
expect(thirdProductName).toEqual('Escudo do Capitão América');
expect(thirdQuantityProduct).toEqual(30);
});
});
it('Será validado que não é possível listar um produto que não existe', async () => {
await frisby.get(`${url}/products/${invalidId}`)
.expect('status', 422)
.then((secondResponse) => {
const { json } = secondResponse;
const error = json.err.code;
const { message } = json.err;
expect(error).toEqual('invalid_data');
expect(message).toEqual('Wrong id format');
});
});
it('Será validado que é possível listar um determinado produto', async () => {
let result;
await frisby
.post(`${url}/products`, {
name: 'Armadura do Homem de Ferro',
quantity: 40,
})
.expect('status', 201)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
responseProductId = result._id;
});
await frisby.get(`${url}/products/${responseProductId}`)
.expect('status', 200)
.then((secondResponse) => {
const { json } = secondResponse;
const productName = json.name;
const quantityProduct = json.quantity;
expect(productName).toEqual('Armadura do Homem de Ferro');
expect(quantityProduct).toEqual(40);
});
});
});
describe('3 - Crie um endpoint para atualizar um produto', () => {
let connection;
let db;
beforeAll(async () => {
connection = await MongoClient.connect(mongoDbUrl, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
db = connection.db('StoreManager');
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
});
beforeEach(async () => {
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
const myobj = { name: 'Martelo de Thor', quantity: 10 };
await db.collection('products').insertOne(myobj);
});
afterEach(async () => {
await db.collection('products').deleteMany({});
});
afterAll(async () => {
await connection.close();
});
it('Será validado que não é possível atualizar um produto com o nome menor que 5 caracteres', async () => {
let result;
let resultProductId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
resultProductId = result.products[0]._id;
});
await frisby.put(`${url}/products/${resultProductId}`,
{
name: 'Mar',
quantity: 10,
})
.expect('status', 422)
.then((secondResponse) => {
const { json } = secondResponse;
expect(json.err.code).toEqual('invalid_data');
expect(json.err.message).toEqual('"name" length must be at least 5 characters long');
});
});
it('Será validado que não é possível atualizar um produto com quantidade menor que zero', async () => {
let result;
let resultProductId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
resultProductId = result.products[0]._id;
});
await frisby.put(`${url}/products/${resultProductId}`,
{
name: 'Martelo de Thor',
quantity: -1,
})
.expect('status', 422)
.then((secondResponse) => {
const { json } = secondResponse;
expect(json.err.code).toEqual('invalid_data');
expect(json.err.message).toEqual('"quantity" must be larger than or equal to 1');
});
});
it('Será validado que não é possível atualizar um produto com quantidade igual a zero', async () => {
let result;
let resultProductId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
resultProductId = result.products[0]._id;
});
await frisby.put(`${url}/products/${resultProductId}`,
{
name: 'Martelo de Thor',
quantity: 0,
})
.expect('status', 422)
.then((secondResponse) => {
const { json } = secondResponse;
expect(json.err.code).toEqual('invalid_data');
expect(json.err.message).toEqual('"quantity" must be larger than or equal to 1');
});
});
it('Será validado que não é possível atualizar um produto com uma string no campo quantidade', async () => {
let result;
let resultProductId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
resultProductId = result.products[0]._id;
});
await frisby.put(`${url}/products/${resultProductId}`,
{
name: 'Martelo de Thor',
quantity: 'string',
})
.expect('status', 422)
.then((secondResponse) => {
const { json } = secondResponse;
expect(json.err.code).toEqual('invalid_data');
expect(json.err.message).toEqual('"quantity" must be a number');
});
});
it('Será validado que é possível atualizar um produto com sucesso', async () => {
let result;
let resultProductId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
resultProductId = result.products[0]._id;
});
await frisby.put(`${url}/products/${resultProductId}`,
{
name: 'Machado de Thor',
quantity: 20,
})
.expect('status', 200)
.then((secondResponse) => {
const { json } = secondResponse;
const productName = json.name;
const quantityProduct = json.quantity;
expect(productName).toEqual('Machado de Thor');
expect(quantityProduct).toEqual(20);
});
});
});
describe('4 - Crie um endpoint para deletar um produto', () => {
let connection;
let db;
beforeAll(async () => {
connection = await MongoClient.connect(mongoDbUrl, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
db = connection.db('StoreManager');
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
});
beforeEach(async () => {
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
const myobj = { name: 'Martelo de Thor', quantity: 10 };
await db.collection('products').insertOne(myobj);
});
afterEach(async () => {
await db.collection('products').deleteMany({});
});
afterAll(async () => {
await connection.close();
});
it('Será validado que não é possível deletar um produto com sucesso', async () => {
let result;
let resultProductId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
resultProductId = result.products[0]._id;
});
await frisby.delete(`${url}/products/${resultProductId}`)
.expect('status', 200);
await frisby.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
expect(result.products.length).toBe(0);
});
});
it('Será validado que não é possível deletar um produto que não existe', async () => {
await frisby
.delete(`${url}/products/${invalidId}`)
.expect('status', 422)
.then((secondResponse) => {
const { json } = secondResponse;
expect(json.err.code).toEqual('invalid_data');
expect(json.err.message).toEqual('Wrong id format');
});
});
});

838
test/sales.test.js Normal file
View file

@ -0,0 +1,838 @@
const frisby = require('frisby');
const { MongoClient } = require('mongodb');
// const mongoDbUrl = 'mongodb://mongodb:27017/StoreManager';
const mongoDbUrl = 'mongodb://localhost:27017/StoreManager';
const url = 'http://localhost:3000';
const invalidId = 99999;
describe('5 - Crie um endpoint para cadastrar vendas', () => {
let connection;
let db;
beforeAll(async () => {
connection = await MongoClient.connect(mongoDbUrl, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
db = connection.db('StoreManager');
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
});
beforeEach(async () => {
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
const products = [
{ name: 'Martelo de Thor', quantity: 10 },
{ name: 'Traje de encolhimento', quantity: 20 },
{ name: 'Escudo do Capitão América', quantity: 30 },
];
await db.collection('products').insertMany(products);
});
afterEach(async () => {
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
});
afterAll(async () => {
await connection.close();
});
it('Será validado que não é possível cadastrar compras com quantidade menor que zero', async () => {
let result;
let resultProductId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
resultProductId = result.products[0]._id;
});
await frisby
.post(`${url}/sales/`, [
{
productId: resultProductId,
quantity: -1,
},
])
.expect('status', 422)
.then((secondResponse) => {
const { json } = secondResponse;
expect(json.err.code).toBe('invalid_data');
expect(json.err.message).toBe('Wrong product ID or invalid quantity');
});
});
it('Será validado que não é possível cadastrar compras com quantidade igual a zero', async () => {
let result;
let resultProductId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
resultProductId = result.products[0]._id;
});
await frisby
.post(`${url}/sales/`, [
{
productId: resultProductId,
quantity: 0,
},
])
.expect('status', 422)
.then((secondResponse) => {
const { json } = secondResponse;
expect(json.err.code).toBe('invalid_data');
expect(json.err.message).toBe('Wrong product ID or invalid quantity');
});
});
it('Será validado que não é possível cadastrar compras com uma string no campo quantidade', async () => {
let result;
let resultProductId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
resultProductId = result.products[0]._id;
});
await frisby
.post(`${url}/sales/`, [
{
productId: resultProductId,
quantity: 'String',
},
])
.expect('status', 422)
.then((secondResponse) => {
const { json } = secondResponse;
expect(json.err.code).toBe('invalid_data');
expect(json.err.message).toBe('Wrong product ID or invalid quantity');
});
});
it('Será validado que é possível criar uma compra com sucesso', async () => {
let result;
let resultProductId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
resultProductId = result.products[0]._id;
});
await frisby
.post(`${url}/sales/`, [
{
productId: resultProductId,
quantity: 2,
},
])
.expect('status', 200)
.then((secondResponse) => {
const { json } = secondResponse;
const idFirstItenSold = json.itensSold[0].productId;
const quantityFirstItenSold = json.itensSold[0].quantity;
expect(json).toHaveProperty('_id');
expect(idFirstItenSold).toBe(resultProductId);
expect(quantityFirstItenSold).toBe(2);
});
});
it('Será validado que é possível criar várias compras com sucesso', async () => {
let result;
let resultProductId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
resultProductId = result.products[0]._id;
});
await frisby
.post(`${url}/sales/`, [
{
productId: resultProductId,
quantity: 2,
},
{
productId: resultProductId,
quantity: 6,
},
])
.expect('status', 200)
.then((secondResponse) => {
const { json } = secondResponse;
const idFirstItenSold = json.itensSold[0].productId;
const quantityFirstItenSold = json.itensSold[0].quantity;
const idSecondItenSold = json.itensSold[1].productId;
const quantitySecondItenSold = json.itensSold[1].quantity;
expect(json).toHaveProperty('_id');
expect(idFirstItenSold).toBe(resultProductId);
expect(quantityFirstItenSold).toBe(2);
expect(idSecondItenSold).toBe(resultProductId);
expect(quantitySecondItenSold).toBe(6);
});
});
});
describe('6 - Crie um endpoint para listar as vendas', () => {
let connection;
let db;
beforeAll(async () => {
connection = await MongoClient.connect(mongoDbUrl, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
db = connection.db('StoreManager');
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
});
beforeEach(async () => {
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
const products = [
{ name: 'Martelo de Thor', quantity: 10 },
{ name: 'Traje de encolhimento', quantity: 20 },
{ name: 'Escudo do Capitão América', quantity: 30 },
];
await db.collection('products').insertMany(products);
});
afterEach(async () => {
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
});
afterAll(async () => {
await connection.close();
});
it('Será validado que todas as vendas estão sendo retornadas', async () => {
let result;
let resultProductId;
let resultSales;
let resultSalesId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
resultProductId = result.products[0]._id;
});
await frisby
.post(`${url}/sales/`, [
{
productId: resultProductId,
quantity: 2,
},
{
productId: resultProductId,
quantity: 6,
},
])
.expect('status', 200)
.then((responseSales) => {
const { body } = responseSales;
resultSales = JSON.parse(body);
resultSalesId = resultSales._id;
});
await frisby
.get(`${url}/sales/`)
.expect('status', 200)
.then((responseAll) => {
const { body } = responseAll;
const resultSalesAll = JSON.parse(body);
const idSales = resultSalesAll.sales[0]._id;
const idFirstProductSales = resultSalesAll.sales[0].itensSold[0].productId;
const quantityFirstProductSales = resultSalesAll.sales[0].itensSold[0].quantity;
const idSecondProductSales = resultSalesAll.sales[0].itensSold[1].productId;
const quantitySecondProductSales = resultSalesAll.sales[0].itensSold[1].quantity;
expect(idSales).toBe(resultSalesId);
expect(idFirstProductSales).toBe(resultProductId);
expect(quantityFirstProductSales).toBe(2);
expect(idSecondProductSales).toBe(resultProductId);
expect(quantitySecondProductSales).toBe(6);
});
});
it('Será validado que é possível listar uma determinada venda', async () => {
let result;
let resultSales;
let resultSalesId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
});
await frisby
.post(`${url}/sales/`, [
{
productId: result.products[0]._id,
quantity: 2,
},
{
productId: result.products[1]._id,
quantity: 6,
},
])
.expect('status', 200)
.then((responseSales) => {
const { body } = responseSales;
resultSales = JSON.parse(body);
resultSalesId = resultSales._id;
});
await frisby
.get(`${url}/sales/`)
.expect('status', 200)
.then((responseOne) => {
const { body } = responseOne;
const responseAll = JSON.parse(body);
const idSales = responseAll.sales[0]._id;
const idFirstProductSales = responseAll.sales[0].itensSold[0].productId;
const quantityFirstProductSales = responseAll.sales[0].itensSold[0].quantity;
const idSecondProductSales = responseAll.sales[0].itensSold[1].productId;
const quantitySecondProductSales = responseAll.sales[0].itensSold[1].quantity;
expect(idSales).toBe(resultSales._id);
expect(idFirstProductSales).toBe(result.products[0]._id);
expect(quantityFirstProductSales).toBe(2);
expect(idSecondProductSales).toBe(result.products[1]._id);
expect(quantitySecondProductSales).toBe(6);
});
});
it('Será validado que não é possível listar uma venda inexistente', async () => {
await frisby
.get(`${url}/sales/9999`)
.expect('status', 404)
.then((responseOne) => {
const { body } = responseOne;
const responseError = JSON.parse(body);
expect(responseError.err.code).toEqual('not_found');
expect(responseError.err.message).toEqual('Sale not found');
});
});
});
describe('7 - Crie um endpoint para atualizar uma venda', () => {
let connection;
let db;
beforeAll(async () => {
connection = await MongoClient.connect(mongoDbUrl, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
db = connection.db('StoreManager');
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
});
beforeEach(async () => {
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
const products = [
{ name: 'Martelo de Thor', quantity: 10 },
{ name: 'Traje de encolhimento', quantity: 20 },
{ name: 'Escudo do Capitão América', quantity: 30 },
];
await db.collection('products').insertMany(products);
});
afterEach(async () => {
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
});
afterAll(async () => {
await connection.close();
});
it('Será validado que não é possível atualizar vendas com quantidade menor que zero', async () => {
let result;
let resultProductId;
let resultSales;
let resultSalesId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
resultProductId = result.products[0]._id;
});
await frisby
.post(`${url}/sales/`, [
{
productId: resultProductId,
quantity: 2,
},
])
.expect('status', 200)
.then((responseSales) => {
const { body } = responseSales;
resultSales = JSON.parse(body);
resultSalesId = resultSales._id;
});
await frisby
.put(`${url}/sales/${resultSales._id}`, [
{
productId: resultProductId,
quantity: -1,
},
])
.expect('status', 422)
.then((responseEdit) => {
const { body } = responseEdit;
const responseEditBody = JSON.parse(body);
const error = responseEditBody.err.code;
const { message } = responseEditBody.err;
expect(error).toBe('invalid_data');
expect(message).toBe('Wrong product ID or invalid quantity');
});
});
it('Será validado que não é possível atualizar vendas com quantidade igual a zero', async () => {
let result;
let resultProductId;
let resultSales;
let resultSalesId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
resultProductId = result.products[0]._id;
});
await frisby
.post(`${url}/sales/`, [
{
productId: resultProductId,
quantity: 2,
},
])
.expect('status', 200)
.then((responseSales) => {
const { body } = responseSales;
resultSales = JSON.parse(body);
resultSalesId = resultSales._id;
});
await frisby
.put(`${url}/sales/${resultSalesId}`, [
{
productId: resultProductId,
quantity: 0,
},
])
.expect('status', 422)
.then((responseEdit) => {
const { body } = responseEdit;
const responseEditBody = JSON.parse(body);
const error = responseEditBody.err.code;
const { message } = responseEditBody.err;
expect(error).toBe('invalid_data');
expect(message).toBe('Wrong product ID or invalid quantity');
});
});
it('Será validado que não é possível atualizar vendas com uma string no campo quantidade', async () => {
let result;
let resultProductId;
let resultSales;
let resultSalesId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
resultProductId = result.products[0]._id;
});
await frisby
.post(`${url}/sales/`, [
{
productId: resultProductId,
quantity: 2,
},
])
.expect('status', 200)
.then((responseSales) => {
const { body } = responseSales;
resultSales = JSON.parse(body);
resultSalesId = resultSales._id;
});
await frisby
.put(`${url}/sales/${resultSalesId}`, [
{
productId: resultProductId,
quantity: 'String',
},
])
.expect('status', 422)
.then((responseEdit) => {
const { body } = responseEdit;
const responseEditBody = JSON.parse(body);
const error = responseEditBody.err.code;
const { message } = responseEditBody.err;
expect(error).toBe('invalid_data');
expect(message).toBe('Wrong product ID or invalid quantity');
});
});
it('Será validado que é possível atualizar uma venda com sucesso', async () => {
let result;
let resultProductId;
let resultSales;
let resultSalesId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
resultProductId = result.products[0]._id;
});
await frisby
.post(`${url}/sales/`, [
{
productId: resultProductId,
quantity: 2,
},
])
.expect('status', 200)
.then((responseSales) => {
const { body } = responseSales;
resultSales = JSON.parse(body);
resultSalesId = resultSales._id;
});
await frisby
.put(`${url}/sales/${resultSalesId}`, [
{
productId: resultProductId,
quantity: 5,
},
])
.expect('status', 200)
.then((responseEdit) => {
const { body } = responseEdit;
const responseEditBody = JSON.parse(body);
const salesId = responseEditBody._id;
const idProductSales = responseEditBody.itensSold[0].productId;
const quantityProductSales = responseEditBody.itensSold[0].quantity;
expect(salesId).toBe(resultSalesId);
expect(idProductSales).toBe(resultSales.itensSold[0].productId);
expect(quantityProductSales).toBe(5);
});
});
});
describe('8 - Crie um endpoint para deletar uma venda', () => {
let connection;
let db;
beforeAll(async () => {
connection = await MongoClient.connect(mongoDbUrl, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
db = connection.db('StoreManager');
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
});
beforeEach(async () => {
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
const products = [
{ name: 'Martelo de Thor', quantity: 10 },
{ name: 'Traje de encolhimento', quantity: 20 },
{ name: 'Escudo do Capitão América', quantity: 30 },
];
await db.collection('products').insertMany(products);
});
afterEach(async () => {
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
});
afterAll(async () => {
await connection.close();
});
it('Será validado que é possível deletar uma venda com sucesso', async () => {
let result;
let resultSales;
let resultProductId;
let resultSalesId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
resultProductId = result.products[0]._id;
});
await frisby
.post(`${url}/sales/`, [
{
productId: resultProductId,
quantity: 2,
},
])
.expect('status', 200)
.then((responseSales) => {
const { body } = responseSales;
resultSales = JSON.parse(body);
resultSalesId = resultSales._id;
});
await frisby.delete(`${url}/sales/${resultSalesId}`).expect('status', 200);
await frisby
.get(`${url}/sales/${resultSalesId}`)
.expect('status', 404)
.expect((resultGet) => {
const { body } = resultGet;
const resultGetBody = JSON.parse(body);
const error = resultGetBody.err.code;
const { message } = resultGetBody.err;
expect(error).toBe('not_found');
expect(message).toBe('Sale not found');
});
});
it('Será validado que não é possível deletar uma venda que não existe', async () => {
await frisby
.delete(`${url}/sales/${invalidId}`)
.expect('status', 422)
.expect((resultDelete) => {
const { body } = resultDelete;
const resultDeleteBody = JSON.parse(body);
const error = resultDeleteBody.err.code;
const { message } = resultDeleteBody.err;
expect(error).toBe('invalid_data');
expect(message).toBe('Wrong sale ID format');
});
});
});
describe('9 - Atualize a quantidade de produtos', () => {
let connection;
let db;
beforeAll(async () => {
connection = await MongoClient.connect(mongoDbUrl, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
db = connection.db('StoreManager');
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
});
beforeEach(async () => {
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
const products = [
{ name: 'Martelo de Thor', quantity: 10 },
{ name: 'Traje de encolhimento', quantity: 20 },
{ name: 'Escudo do Capitão América', quantity: 30 },
];
await db.collection('products').insertMany(products);
});
afterEach(async () => {
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
});
afterAll(async () => {
await connection.close();
});
it('Será validado que é possível a quantidade do produto atualize ao fazer uma compra', async () => {
let result;
let responseProductId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
responseProductId = result.products[0]._id;
});
await frisby
.post(`${url}/sales/`, [
{
productId: responseProductId,
quantity: 2,
},
])
.expect('status', 200);
await frisby
.get(`${url}/products/${responseProductId}`)
.expect('status', 200)
.expect((responseProducts) => {
const { body } = responseProducts;
const resultProducts = JSON.parse(body);
const quantityProducts = resultProducts.quantity;
expect(quantityProducts).toBe(8);
});
});
it('Será validado que é possível a quantidade do produto atualize ao deletar uma compra', async () => {
let result;
let resultSales;
let responseProductId;
let responseSalesId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
responseProductId = result.products[0]._id;
});
await frisby
.post(`${url}/sales/`, [
{
productId: responseProductId,
quantity: 2,
},
])
.expect('status', 200)
.then((responseSales) => {
const { body } = responseSales;
resultSales = JSON.parse(body);
responseSalesId = resultSales._id;
});
await frisby.delete(`${url}/sales/${responseSalesId}`).expect('status', 200);
await frisby
.get(`${url}/products/${responseProductId}`)
.expect('status', 200)
.expect((responseProducts) => {
const { body } = responseProducts;
const resultProducts = JSON.parse(body);
const quantityProducts = resultProducts.quantity;
expect(quantityProducts).toBe(10);
});
});
});
describe('10 - Valide a quantidade de produtos', () => {
let connection;
let db;
beforeAll(async () => {
connection = await MongoClient.connect(mongoDbUrl, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
db = connection.db('StoreManager');
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
});
beforeEach(async () => {
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
const products = [
{ name: 'Martelo de Thor', quantity: 10 },
{ name: 'Traje de encolhimento', quantity: 20 },
{ name: 'Escudo do Capitão América', quantity: 30 },
];
await db.collection('products').insertMany(products);
});
afterEach(async () => {
await db.collection('products').deleteMany({});
await db.collection('sales').deleteMany({});
});
afterAll(async () => {
await connection.close();
});
it('Será validado que o estoque do produto nunca fique com a quantidade menor que zero', async () => {
let result;
let responseProductId;
await frisby
.get(`${url}/products/`)
.expect('status', 200)
.then((response) => {
const { body } = response;
result = JSON.parse(body);
responseProductId = result.products[0]._id;
});
await frisby
.post(`${url}/sales/`, [
{
productId: responseProductId,
quantity: 100,
},
])
.expect('status', 404)
.then((responseSales) => {
const { json } = responseSales;
expect(json.err.code).toBe('stock_problem');
expect(json.err.message).toBe('Such amount is not permitted to sell');
});
});
});