Este projeto contém os requisitos realizados por Anna Beatriz Garcia Trajano de Sá enquanto estudava na Trybe 🚀
Neste projeto desenvolvi uma API utilizando a arquitetura MSC (model-service-controller)!
A API criada tinha como base um sistema de gerenciamento de vendas no formato dropshipping em que é possível criar, visualizar, deletar e atualizar produtos e vendas. Para gestão do banco de dados, utilizei o MySQL. Além disso, a API desenvolvida foi RESTful.
| MSC |
|---|
![]() |
Após cada um dos passos, haverá um exemplo do comando a ser digitado para fazer o que está sendo pedido, caso tenha dificuldades e o exemplo não seja suficiente, não hesite em me contatar em annagarcia@id.uff.br
- Abra o terminal e crie um diretório no local de sua preferência com o comando mkdir:
mkdir projetos- Entre no diretório que acabou de criar e depois clone o projeto:
cd projetos
git clone git@github.com:annabia95/project-store-manager.git- Acesse o diretório do projeto e depois utilize o comando npm i para instalar todas as dependências necessárias:
cd project-store-manager
npm i- ✨ Dica: Caso queira utilizar Docker para rodar os testes localmente e validar as funcionalidades, basta seguir as seguintes instruções:
1.26.0 por 1.29.2.
ℹ️ Rode os serviços
nodeedbcom o comandodocker-compose up -d.
- Lembre-se de parar o
mysqlse estiver usando localmente na porta padrão (3306), ou adapte, caso queria fazer uso da aplicação em containers; - Esses serviços irão inicializar um container chamado
store_managere outro chamadostore_manager_db; - A partir daqui você pode rodar o container
store_managervia CLI ou abri-lo no VS Code.
ℹ️ Use o comando
docker exec -it store_manager bash.
- Ele te dará acesso ao terminal interativo do container criado pelo compose, que está rodando em segundo plano.
ℹ️ Instale as dependências [Caso existam] com
npm install
-
⚠️ Atenção: Caso opte por utilizar o Docker, TODOS os comandos disponíveis nopackage.json(npm start, npm test, npm run dev, ...) devem ser executados DENTRO do container, ou seja, no terminal que aparece após a execução do comandodocker execcitado acima. -
⚠️ Atenção: O git dentro do container não vem configurado com suas credenciais. Ou faça os commits fora do container, ou configure as suas credenciais do git dentro do container. -
⚠️ Atenção: Não rode o comando npm audit fix! Ele atualiza várias dependências do projeto, e essa atualização gera conflitos com o avaliador.
Neste projeto, desenvolvi as seguintes habilidades:
- Arquitetar e desenvolver a API com um banco de dados MySQL;
- Desenvolver endpoints para criar, exibir, atualizar e excluir produtos e vendas;
- Aplicar testes unitários em cada camada do modelo MSC.
Documentação Oficial - Node.js
Documentação Express - Rotas
Chai Assertion Library
Stubs - Sinon.JS
Mocha
Bulletproof node.js project architecture
Artigo Trybe: Teste unitário: o que são, por que usar e por onde começar?
- O endpoint para listar produtos deve ser acessível através do caminho (
/products) e (/products/:id); - Através do caminho
/products, todos os produtos devem ser retornados; - Através do caminho
/products/:id, apenas o produto com oidpresente na URL deve ser retornado; - O resultado da listagem deve ser ordernado de forma crescente pelo campo
id;
Os seguintes pontos serão avaliados
-
[Será validado que é possível listar todos os produtos]
- Ao listar usuários com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
200:
[ { "id": 1, "name": "Martelo de Thor", }, { "id": 2, "name": "Traje de encolhimento", } /* ... */ ] - Ao listar usuários com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
-
[Será validado que não é possível listar um produto que não existe]
- Se o produto for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http
404:
{ "message": "Product not found" } - Se o produto for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http
-
[Será validado que é possível listar um produto específico com sucesso]
- Ao listar um produto com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
200:
{ "id": 1, "name": "Martelo de Thor", } - Ao listar um produto com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
- Seus arquivos de teste devem ficar no diretório
tests/unit, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
modeldevem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQLem sua máquina. Para rodar seus teste utilizenpm run test:mocha; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
- [Será validado que a cobertura total das linhas dos arquivos de CADA camada
models,servicesecontrollersé maior ou igual a 5%. Ou seja, cada uma das camadas tem de ter, ao menos, 5% de cobertura de testes.]
- O endpoint deve ser acessível através do caminho (
/products); - Os produtos enviados devem ser salvos na tabela
productsdo banco de dados; - O corpo da requisição deverá seguir o formato abaixo:
{
"name": "ProdutoX"
}Os seguintes pontos serão avaliados
- [Será validado que é possível cadastrar um produto com sucesso]
- Se o produto for criado com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
201:
{ "id": 4, "name": "ProdutoX" } - Se o produto for criado com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
- O endpoint de produtos deve ser acessível através do caminho (
/products); - Lembre-se, o banco de dados não deve ser acessado nas validações iniciais do corpo da requisição;
Os seguintes pontos serão avaliados
-
[Será validado que não é possível realizar operações em um produto sem o campo
name]- Se a requisição não tiver o campo
name, o resultado retornado deverá ser conforme exibido abaixo, com um status http400:
{ "message": "\"name\" is required" } - Se a requisição não tiver o campo
-
[Será validado que não é possível realizar operações em um produto com o campo
namemenor que 5 caracteres]- Se a requisição não tiver
namecom pelo menos 5 caracteres, o resultado retornado deverá ser conforme exibido abaixo, com um status http422
{ "message": "\"name\" length must be at least 5 characters long" } - Se a requisição não tiver
- Seus arquivos de teste devem ficar no diretório
tests/unit, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
modeldevem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQLem sua máquina. Para rodar seus teste utilizenpm run test:mocha; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
- [Será validado que a cobertura total das linhas dos arquivos de CADA camada
models,servicesecontrollersé maior ou igual a 10%. Ou seja, cada uma das camadas tem de ter, ao menos, 10% de cobertura de testes.]
- Seus arquivos de teste devem ficar no diretório
tests/unit, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
modeldevem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQLem sua máquina. Para rodar seus teste utilizenpm run test:mocha; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
- [Será validado que a cobertura total das linhas dos arquivos de CADA camada
models,servicesecontrollersé maior ou igual a 15%. Ou seja, cada uma das camadas tem de ter, ao menos, 15% de cobertura de testes.]
- O endpoint para listar vendas deve ser acessível através do caminho (
/sales) e (/sales/:id); - Através do caminho
/sales, todas as vendas devem ser retornadas; - Através do caminho
/sales/:id, apenas a venda com oidpresente na URL deve ser retornada; - o resultado deve ser ordernado de forma crescente pelo campo
saleId, em caso de empate, ordernar também de forma crescente pelo campoproductId;
Os seguintes pontos serão avaliados
-
[Será validado que é possível listar todas as vendas]
- Ao listar vendas com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
200:
[ { "saleId": 1, "date": "2021-09-09T04:54:29.000Z", "productId": 1, "quantity": 2 }, { "saleId": 1, "date": "2021-09-09T04:54:54.000Z", "productId": 2, "quantity": 2 } /* ... */ ] - Ao listar vendas com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
-
[Será validado que não é possível listar uma venda que não existe]
- Se a venda for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http
404:
{ "message": "Sale not found" } - Se a venda for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http
-
[Será validado que é possível listar uma venda específica com sucesso]
- Ao listar uma venda com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
200:
[ { "date": "2021-09-09T04:54:29.000Z", "productId": 1, "quantity": 2 }, { "date": "2021-09-09T04:54:54.000Z", "productId": 2, "quantity": 2 } /* ... */ ] - Ao listar uma venda com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
- Seus arquivos de teste devem ficar no diretório
tests/unit, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
modeldevem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQLem sua máquina. Para rodar seus teste utilizenpm run test:mocha; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
- [Será validado que a cobertura total das linhas dos arquivos de CADA camada
models,servicesecontrollersé maior ou igual a 20%. Ou seja, cada uma das camadas tem de ter, ao menos, 20% de cobertura de testes.]
- O endpoint deve ser acessível através do caminho (
/products/:id); - Apenas o produto com o
idpresente na URL deve ser atualizado; - O corpo da requisição deve ser validado igual no cadastro;
- O corpo da requisição deverá seguir o formato abaixo:
{
"name": "Martelo do Batman"
}Os seguintes pontos serão avaliados
-
[Será validado que não é possível alterar um produto que não existe]
- Se o produto for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http
404:
{ "message": "Product not found" } - Se o produto for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http
-
[Será validado que é possível alterar um produto com sucesso]
- Se o produto for alterado com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
200:
{ "id": 1, "name": "Martelo do Batman" } - Se o produto for alterado com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
- Seus arquivos de teste devem ficar no diretório
tests/unit, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
modeldevem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQLem sua máquina. Para rodar seus teste utilizenpm run test:mocha; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
- [Será validado que a cobertura total das linhas dos arquivos de CADA camada
models,servicesecontrollersé maior ou igual a 25%. Ou seja, cada uma das camadas tem de ter, ao menos, 25% de cobertura de testes.]
- O endpoint deve ser acessível através do caminho (
/products/:id); - Apenas o produto com o
idpresente na URL deve ser deletado;
Os seguintes pontos serão avaliados
-
[Será validado que não é possível deletar um produto que não existe]
- Se o produto for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http
404:
{ "message": "Product not found" } - Se o produto for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http
-
[Será validado que é possível deletar um produto com sucesso]
- Se o produto for deletado com sucesso não deve ser retornada nenhuma resposta, apenas um status http
204;
- Se o produto for deletado com sucesso não deve ser retornada nenhuma resposta, apenas um status http
💬 Em caso de dúvidas, lembre-se de consultar a seção Diagrama ER, Entidades e Scripts
- Seus arquivos de teste devem ficar no diretório
tests/unit, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
modeldevem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQLem sua máquina. Para rodar seus teste utilizenpm run test:mocha; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
- [Será validado que a cobertura total das linhas dos arquivos de CADA camada
models,servicesecontrollersé maior ou igual a 30%. Ou seja, cada uma das camadas tem de ter, ao menos, 30% de cobertura de testes.]
- Seus arquivos de teste devem ficar no diretório
tests/unit, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
modeldevem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQLem sua máquina. Para rodar seus teste utilizenpm run test:mocha; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
- [Será validado que a cobertura total das linhas dos arquivos de CADA camada
models,servicesecontrollersé maior ou igual a 35%. Ou seja, cada uma das camadas tem de ter, ao menos, 35% de cobertura de testes.]
- Seus arquivos de teste devem ficar no diretório
tests/unit, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
modeldevem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQLem sua máquina. Para rodar seus teste utilizenpm run test:mocha; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
- [Será validado que a cobertura total das linhas dos arquivos de CADA camada
models,servicesecontrollersé maior ou igual a 40%. Ou seja, cada uma das camadas tem de ter, ao menos, 40% de cobertura de testes.]
- Seus arquivos de teste devem ficar no diretório
tests/unit, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
modeldevem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQLem sua máquina. Para rodar seus teste utilizenpm run test:mocha; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
- [Será validado que a cobertura total das linhas dos arquivos de CADA camada
models,servicesecontrollersé maior ou igual a 50%. Ou seja, cada uma das camadas tem de ter, ao menos, 50% de cobertura de testes.]

