Bem-vindo(a) ao nosso teste para desenvolvedores(as) back-end.
Queremos entender como você modela um problema e o transforma em código, como você estrutura, como você testa. Enviar uma aplicação funcionando é o ideal, mas mesmo que não esteja 100 % envie o código para que possamos analisar até onde você chegou.
O problema que vamos apresentar não tem uma lógica complexa, mas implemente seu código pensando em um sistema extensível e de alta concorrência no uso, é muito importante que você aplique SOLID em tudo que fizer.
- Nossa stack de desenvolvimento é predominantemente C# e Java, então nossa sugestão é que você utilize .NET Core para C# ou Spring para Java.
- Teste seu código, crie Unit tests e/ou Integration tests.
- A aplicação deve ser self contained, use um database em memória, por exemplo o H2 no caso do Spring.
Você deve construir uma API que terá dois endpoints:
Sua aplicação deve expor em http://localhost:{porta}/api/pedido
uma API RESTful. (GET, POST, PUT, DELETE)
O conteúdo de um Pedido possui o seguinte payload:
{
"pedido":"123456",
"itens": [
{
"descricao": "Item A",
"precoUnitario": 10,
"qtd": 1
},
{
"descricao": "Item B",
"precoUnitario": 5,
"qtd": 2
}
]
}
O conteúdo desse Pedido e Itens deverá ser persistido em banco de dados. Fique à vontade para criar as validações que você considerar necessárias.
Sua aplicação deve receber um POST em http://localhost:{porta}/api/status
com o seguinte payload:
{
"status":"XXX",
"itensAprovados":0,
"valorAprovado":0,
"pedido":"XXX"
}
E terá o seguinte response, baseado nas regras detalhadas a seguir:
{
"pedido":"123456",
"status": ["STATUS_1", "STATUS_2", "STATUS_...n"]
}
O status não precisa ser persistido em banco de dados, basta retornar na API.
Exemplos de requests e responses baseados no payload do pedido descrito anteriormente:
request
{
"status":"APROVADO",
"itensAprovados": 3,
"valorAprovado": 20,
"pedido":"123456"
}
response
{
"pedido":"123456",
"status": ["APROVADO"]
}
request
{
"status":"APROVADO",
"itensAprovados": 3,
"valorAprovado": 10,
"pedido":"123456"
}
response
{
"pedido":"123456",
"status": ["APROVADO_VALOR_A_MENOR"]
}
request
{
"status":"APROVADO",
"itensAprovados": 4,
"valorAprovado": 21,
"pedido":"123456"
}
response
{
"pedido":"123456",
"status": ["APROVADO_VALOR_A_MAIOR", "APROVADO_QTD_A_MAIOR"]
}
request
{
"status":"APROVADO",
"itensAprovados": 2,
"valorAprovado": 20,
"pedido":"123456"
}
response
{
"pedido":"123456",
"status": ["APROVADO_QTD_A_MENOR"]
}
request
{
"status":"REPROVADO",
"itensAprovados": 0,
"valorAprovado": 0,
"pedido":"123456"
}
response
{
"pedido":"123456",
"status": ["REPROVADO"]
}
request
{
"status":"APROVADO",
"itensAprovados": 3,
"valorAprovado": 20,
"pedido":"123456-N"
}
response
{
"pedido":"123456",
"status": ["CODIGO_PEDIDO_INVALIDO"]
}
Dado (Given) o status Quando (When)
pedido não for localizado no banco de dados.
Então (Then) retorne
{
"status": "CODIGO_PEDIDO_INVALIDO"
}
Dado (Given) o status Quando (When)
pedido for localizado no banco de dados.
status for igual a REPROVADO
Então (Then) retorne
{
"status": "REPROVADO"
}
Dado (Given) o status Quando (When)
pedido for localizado no banco de dados.
itensAprovados for igual a quantidade de itens do pedido.
valorAprovado for igual o valor total do pedido.
status for igual a APROVADO.
Então (Then) retorne
{
"status": "APROVADO"
}
Dado (Given) o status Quando (When)
pedido for localizado no banco de dados.
valorAprovado for menor que o valor total do pedido
status for igual a APROVADO
Então (Then) retorne
{
"status": "APROVADO_VALOR_A_MENOR"
}
Dado (Given) o status Quando (When)
pedido for localizado no banco de dados.
itensAprovados for menor que a quantidade de itens do pedido.
status for igual a APROVADO
Então (Then) retorne
{
"status": "APROVADO_QTD_A_MENOR"
}
Dado (Given) o status Quando (When)
pedido for localizado no banco de dados.
valorAprovado for maior que o valor total do pedido
status for igual a APROVADO
Então (Then) retorne
{
"status": "APROVADO_VALOR_A_MAIOR"
}
Dado (Given) o status Quando (When)
pedido for localizado no banco de dados.
itensAprovados for maior que a quantidade de itens do pedido.
status for igual a APROVADO
Então (Then) retorne
{
"status": "APROVADO_QTD_A_MAIOR"
}
Uma tentativa de mudança de status deverá passar por todas essas regras descritas e a API deverá retornar todos os status gerados, observe que as validações são compartilhadas entre as regras, reutilize código (DRY).
Observe que:
-
O valor total do pedido é composto pela somatória do valor calculado de cada item (precoUnitario * qtd).
-
A quantidade total de itens do pedido é composta pela somatória da qtd de cada item.
Crie um arquivo chamado instructions.md
com todas as informações necessárias para executar sua aplicação.
Para enviar seu código, você pode:
- Enviar a URL do seu repositório para a pessoa responsável pelo seu processo seletivo dentro do ME.
- Fazer um fork deste repositório, criar uma branch com o seu nome, enviar um pull request e nos notificar.