Implemente todos os tipos Order
, Product
e User
, do projeto na pasta src/types
de forma adequada. Isso é necessário para as migrations rodarem.
Atenção
1 - Crie um endpoint para o cadastro de produtos e testes que cubram as funcionalidades deste endpoint
- O endpoint deve ser acessível no caminho (
/products
); - Os produtos enviados devem ser salvos na tabela
products
do banco de dados; - O endpoint deve receber a seguinte estrutura:
{
"name": "Martelo de Thor",
"price": "30 peças de ouro",
"orderId": 4
}
As ordens dos pedidos de id 1 a 3 já foram criados pelo seeders no banco de dados, sendo assim novos produtos devem passar um novo orderId
, pois os produtos são exclusivos.
- Os testes devem garantir no mínimo 30% de cobertura do código das camadas
Service
eController
.
De olho na dica 👀:
Para construir seus testes use o método
.build()
quando for necessário;Lembre do Type Assertion para testar tipos.
As seguintes verificações serão feitas:
👉 Para caso os dados sejam enviados corretamente
-
[Será validado que é possível cadastrar um produto com sucesso]
- O resultado retornado para cadastrar o produto com sucesso deverá ser conforme exibido abaixo, com um status http
201
:
{ "id": 6, "name": "Martelo de Thor", "price": "30 peças de ouro" }
- O resultado retornado para cadastrar o produto com sucesso deverá ser conforme exibido abaixo, com um status http
-
[Será validado que os testes estão cobrindo pelo menos 30% das camadas
Service
eController
.]
2 - Crie um endpoint para a listagem de produtos e testes que cubram as funcionalidades deste endpoint
- O endpoint deve ser acessível no caminho (
/products
); - Os testes devem garantir no mínimo 50% de cobertura do código das camadas
Service
eController
.
Além disso, as seguintes verificações serão feitas:
👉 Para caso os dados sejam enviados corretamente
-
[Será validado que é possível listar todos os produtos com sucesso]
- O resultado retornado para listar produtos com sucesso deverá ser conforme exibido abaixo, com um status http
200
:
[ { "id": 1, "name": "Pedra Filosofal", "price": "20 gold", "orderId": null }, { "id": 2, "name": "Lança do Destino", "price": "100 diamond", "orderId": 1 } ]
- O resultado retornado para listar produtos com sucesso deverá ser conforme exibido abaixo, com um status http
-
[Será validado que os testes estão cobrindo pelo menos 50% das camadas
Service
eController
.]
3 - Crie um endpoint para listar todos os pedidos e testes que cubram as funcionalidades deste endpoint
- O endpoint deve ser acessível no caminho (
/orders
). - Essa rota deve retornar todos os pedidos e os
id
s dos produtos associados a estes. - Os testes devem garantir no mínimo 60% de cobertura do código das camadas
Service
eController
.
De olho na dica 👀: Todos os produtos são itens artesanais, portanto, únicos. Por isso são os produtos que contêm os id
s dos pedidos.
De olho na dica 👀: Você precisará combinar a lógica de dois models aqui 😉
Além disso, as seguintes verificações serão feitas:
👉 Para orders
-
[Será validado que é possível listar todos os pedidos com sucesso]
- Quando houver mais de um pedido, o resultado retornado para listar pedidos com sucesso deverá ser conforme exibido abaixo, com um status http
200
:
[ { "id": 1, "userId": 2, "productIds": [1, 2] }, { "id": 2, "userId": 1, "productIds": [3, 4] } ]
- Quando houver mais de um pedido, o resultado retornado para listar pedidos com sucesso deverá ser conforme exibido abaixo, com um status http
-
[Será validado que os testes estão cobrindo pelo menos 60% das camadas
Service
eController
.]
4 - Crie um endpoint para o login de pessoas usuárias e testes que cubram as funcionalidades deste endpoint
-
O endpoint deve ser acessível no caminho (
/login
). -
A rota deve receber os campos
username
epassword
, e esses campos devem ser validados no banco de dados. -
Um token
JWT
deve ser gerado e retornado caso haja sucesso no login. No seu payload deve estar presente o id e username. -
O endpoint deve receber a seguinte estrutura:
{
"username": "string",
"password": "string"
}
- Os testes devem garantir no mínimo 70% de cobertura do código das camadas
Service
eController
.
Além disso, as seguintes verificações serão feitas:
👉 Para caso haja problemas no login
-
[Será validado que o campo "username" é enviado]
- Se o login não tiver o campo "username", o resultado retornado deverá ser um status http
400
e
{ "message": "\"username\" and \"password\" are required" }
- Se o login não tiver o campo "username", o resultado retornado deverá ser um status http
-
[Será validado que o campo "password" é enviado]
- Se o login não tiver o campo "password", o resultado retornado deverá ser um status http
400
e
{ "message": "\"username\" and \"password\" are required" }
- Se o login não tiver o campo "password", o resultado retornado deverá ser um status http
-
[Será validado que não é possível fazer login com um username inválido]
- Se o login tiver um username que não exista no banco de dados ele será considerado inválido e o resultado retornado deverá ser um status http
401
e
{ "message": "Username or password invalid" }
- Se o login tiver um username que não exista no banco de dados ele será considerado inválido e o resultado retornado deverá ser um status http
-
[Será validado que não é possível fazer login com uma senha inválida]
- Se o login tiver uma senha que não corresponda à senha salva no banco de dados, ela será considerada inválida e o resultado retornado deverá ser um status http
401
e
{ "message": "Username or password invalid" }
De olho na dica 👀: As senhas salvas no banco de dados estão encriptadas com o bcrypt, portanto, você deve levar isso em consideração no momento de compará-las com as enviadas na requisição e utilizar o método adequado.
- Se o login tiver uma senha que não corresponda à senha salva no banco de dados, ela será considerada inválida e o resultado retornado deverá ser um status http
👉 Para caso os dados sejam enviados corretamente
-
[Será validado que é possível fazer login com sucesso]
- Se o login foi feito com sucesso, o resultado deverá ser um status http
200
e deverá retornar um token no formato abaixo (a token não precisa ser exatamente igual a essa):
{ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIYWdhciIsImlhdCI6MTY4Njc1NDc1Nn0.jqAuJkcLp0RuvrOd4xKxtj_lm3Z3-73gQQ9IVmwE5gA" }
- Se o login foi feito com sucesso, o resultado deverá ser um status http
-
[Será validado que os testes estão cobrindo pelo menos 70% das camadas
Service
eController
.]
- Neste requisito iremos desenvolver validações referentes a criação do endpoint do requisito 1.
- Os testes devem garantir no mínimo 80% de cobertura do código das camadas
Service
eController
.
As seguintes validações deverão ser realizadas:
👉 Para name
-
[Será validado que o campo "name" é obrigatório]
- Se o campo "name" não for informado, o resultado retornado deverá ser um status http
400
e
{ "message": "\"name\" is required" }
- Se o campo "name" não for informado, o resultado retornado deverá ser um status http
-
[Será validado que o campo "name" tem o tipo string]
- Se o campo "name" não for do tipo
string
, o resultado retornado deverá ser um status http422
e
{ "message": "\"name\" must be a string" }
- Se o campo "name" não for do tipo
-
[Será validado que o campo "name" é uma string com mais de 2 caracteres]
- Se o campo "name" não for uma string com mais de 2 caracteres, o resultado retornado deverá ser um status http
422
e
{ "message": "\"name\" length must be at least 3 characters long" }
- Se o campo "name" não for uma string com mais de 2 caracteres, o resultado retornado deverá ser um status http
👉 Para price
-
[Será validado que o campo "price" é obrigatório]
- Se o campo "price" não for informado, o resultado retornado deverá ser um status http
400
e
{ "message": "\"price\" is required" }
- Se o campo "price" não for informado, o resultado retornado deverá ser um status http
-
[Será validado que o campo "price" tem o tipo string]
- Se o campo "price" não for do tipo
string
, o resultado retornado deverá ser um status http422
e
{ "message": "\"price\" must be a string" }
- Se o campo "price" não for do tipo
-
[Será validado que o campo "price" é uma string com mais de 2 caracteres]
- Se o campo "price" não for uma string com mais de 2 caracteres, o resultado retornado deverá ser um status http
422
e
{ "message": "\"price\" length must be at least 3 characters long" }
- Se o campo "price" não for uma string com mais de 2 caracteres, o resultado retornado deverá ser um status http
-
[Será validado que os testes estão cobrindo pelo menos 80% das camadas
Service
eController
.]
6 - Crie um endpoint para o cadastro de um pedido e testes que cubram as funcionalidades deste endpoint
-
O endpoint deve ser acessível no caminho (
/orders
); -
Um pedido só pode ser criado caso a pessoa usuária esteja logada e o token
JWT
validado; -
Os pedidos enviados devem ser salvos na tabela
orders
do banco de dados, salvandoid
da pessoa usuária da aplicação que fez esse pedido; -
A tabela
products
também deve ser alterada, atualizando todos os produtos com osid
incluídos na chaveproductIds
da requisição, e adicionando nesses produtos oorderId
do pedido recém criado; -
O endpoint deve receber a seguinte estrutura:
{
"productIds": [1, 2],
"userId": 1
}
- Os testes devem garantir no mínimo 90% de cobertura do código das camadas
Service
eController
.
Além disso, as seguintes verificações serão feitas:
👉 Para token
-
[Será validado que não é possível cadastrar pedidos sem token]
- Se o token não for informado, o resultado retornado deverá ser um status http
401
e
{ "message": "Token not found" }
- Se o token não for informado, o resultado retornado deverá ser um status http
-
[Será validado que não é possível cadastrar um pedido com token inválido]
- Se o token informado não for válido, o resultado retornado deverá ser um status http
401
e
{ "message": "Invalid token" }
- Se o token informado não for válido, o resultado retornado deverá ser um status http
👉 Para user
-
[Será validado que o campo "userId" é obrigatório]
- Se o corpo da requisição não possuir o campo "userId", o resultado retornado deverá ser um status http
400
e
{ "message": "\"userId\" is required" }
- Se o corpo da requisição não possuir o campo "userId", o resultado retornado deverá ser um status http
-
[Será validado que o campo "userId" tem o tipo número]
- Se o campo "userId" não for do tipo
number
, o resultado retornado deverá ser um status http422
e
{ "message": "\"userId\" must be a number" }
- Se o campo "userId" não for do tipo
-
[Será validado que o campo "userId" é uma pessoa usuária existente]
- Se o campo "userId" não for um usuário, o resultado retornado deverá ser um status http
404
e
{ "message": "\"userId\" not found" }
- Se o campo "userId" não for um usuário, o resultado retornado deverá ser um status http
👉 Para products
-
[Será validado que o campo "productIds" é obrigatório]
- Se o corpo da requisição não possuir o campo "productIds", o resultado retornado deverá ser um status http
400
e
{ "message": "\"productIds\" is required" }
- Se o corpo da requisição não possuir o campo "productIds", o resultado retornado deverá ser um status http
-
[Será validado que não é possível criar um pedido com o campo "productIds" não sendo um array]
- Se o valor do campo "productIds" não for um array, o resultado retornado deverá ser um status http
422
e
{ "message": "\"productIds\" must be an array" }
- Se o valor do campo "productIds" não for um array, o resultado retornado deverá ser um status http
-
[Será validado que não é possível cadastrar um pedido se o campo "productIds" for um array vazio]
- Se o campo "productIds" possuir um array vazio, o resultado retornado deverá ser um status http
422
e
{ "message": "\"productIds\" must include only numbers" }
- Se o campo "productIds" possuir um array vazio, o resultado retornado deverá ser um status http
👉 Para caso os dados sejam enviados corretamente
-
[Será validado que é possível criar um pedido com sucesso com 1 item]
- O resultado retornado para cadastrar um pedido com sucesso deverá ser conforme exibido abaixo, com um status http
201
:
{ "userId": 1, "productIds": [1] }
- O resultado retornado para cadastrar um pedido com sucesso deverá ser conforme exibido abaixo, com um status http
-
[Será validado que é possível criar um pedido com sucesso com vários itens]
- O resultado retornado para cadastrar um pedido com sucesso deverá ser conforme exibido abaixo, com um status http
201
:
{ "userId": 1, "productIds": [1, 2] }
- O resultado retornado para cadastrar um pedido com sucesso deverá ser conforme exibido abaixo, com um status http
-
[Será validado que os testes estão cobrindo pelo menos 90% das camadas
Service
eController
.]