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
node
edb
com o comandodocker-compose up -d
.
- Lembre-se de parar o
mysql
se 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_manager
e outro chamadostore_manager_db
; - A partir daqui você pode rodar o container
store_manager
via 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 exec
citado 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 oid
presente 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
model
devem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em 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
,services
econtrollers
é 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
products
do 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
name
menor que 5 caracteres]- Se a requisição não tiver
name
com 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
model
devem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em 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
,services
econtrollers
é 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
model
devem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em 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
,services
econtrollers
é 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 oid
presente 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
model
devem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em 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
,services
econtrollers
é 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
id
presente 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
model
devem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em 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
,services
econtrollers
é 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
id
presente 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
model
devem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em 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
,services
econtrollers
é 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
model
devem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em 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
,services
econtrollers
é 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
model
devem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em 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
,services
econtrollers
é 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
model
devem fazer mock do banco de dados obrigatóriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em 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
,services
econtrollers
é maior ou igual a 50%. Ou seja, cada uma das camadas tem de ter, ao menos, 50% de cobertura de testes.]