Desafio Calculadora Frete

Size Limit logo by Anton Lovchikov


PRÉ REQUISITOS

FASE 1

Objetivo: Criar uma aplicação que baseada em um produto e no endereço do cliente, seja calculado o valor do frete e impresso no console.

Obs: Para esse desafio, foi utilizado como base a apostila Java e Orientação a Objetos da Caelum

Aprendizado: A idéia aqui é desenvolver conceitos basicos da linguagem Java e da orientação a objetos.

Exemplo do que deve ser impresso no Console :

Produto: Geladeira
UF: SP
Valor do Frete: 15,00

Regras de Negócio

  • O cliente deverá conter as seguintes informações:
    • nome;
    • data de aniversario;
    • cep;
      • O cep deve estar dentro das seguintes regras:
        • O cep deve aceitar zeros a esquerda. Exemplo: 02123040;
        • O cep deve conter exatamente 8 dígitos numéricos;
        • Não pode ter letras ou caracteres especiais;
        • Caso o Cep seja invalido, você deve lançar a exceção IllegalArgumentException do Java, trata-la e exibir a seguinte mensagem no console: "Cep invalido ! o formato correto deveria ser XXXXXXXX"
        • Se o usuário mandar um cep com mascara (hifen) exemplo: 021023-040, você deve remover esse hifen exemplo: 02123040;
        • Dicas:
    • logradouro;
    • bairro;
    • cidade;
    • uf;
      • A uf deve ser um estado do Brasil valido. Exemplo: SP, MG, RJ e etc ...
      • Dicas:
        • Você pode utilizar uma enum para representar a uf ao invés de String;
  • O produto deverá conter as seguintes informações:
    • descrição;
    • valor;
      • Utilize Double como tipo;
      • O valor do produto não pode ser nulo ou zero, caso seja, a exceção PrecoInvalidoException deverá ser lançada e tratada e a unica mensagem que deverá ser exibida no console é: "O valor do produto [Aqui vc coloca o nome do produto] está inválido pois deve ser maior que zero !" ;
  • O frete deverá conter as seguintes informações:
    • produto;
    • uf;
    • valor;

Como funcionará o calculo de frete ?

  • Deve existir 2 tipos de calculo de frete, um baseado na uf do cliente e outro baseado no valor do produto.
  • Ambos irão receber como parâmetro o produto e o cliente e devem retornar o Frete.
Calculo Frete por uf

A regra para o calculo de frete por uf deverá ser a seguinte: Se a uf do cliente for SP, MG ou RJ, o valor do frete deverá ser 30% do valor do produto, caso contrário o valor do frete será 15% do valor do produto;

Calculo de Frete por valor do produto

A regra para o calculo de frete por valor do produto deverá ser a seguinte: Se o preco do produto for menor que 20,00 o valor do frete será de 2,00. Se o valor do produto for entre 20,00 e 100,00 o Frete deverá ser 8,00 e acima de R$ 100,00 o frete é gratis (0,00);

O que será avaliado ?

Material de Apoio


FASE 2

Objetivo: Precisamos testar a nossa aplicação e para isso, a ideia é utilizar o conceito de testes automatizados !

Aprendizado: A idéia aqui é treinar conceitos relacionados a testes e a qualidade do software de uma maneira geral.

Implementes testes automatizados para os tipos de calculo e para as validações.

Recomendações:

  • Como Framework de teste, utilize o Junit 5.
  • Para mockar os objetos, utilize o framework Mockito.
  • Nos testes unitários, não subir o contexto do Spring (SpringBootTest);

Material de Apoio:

O que será avaliado ?

  • Qualidade dos testes;
  • Cobertura de testes;

FASE 3

Objetivo: A ideia agora é implementar apis para nossa aplicação utilizando Spring Framework e não mais utilizar a impressão pelo console.

Aprendizado: A idéia aqui é consolidar os conceitos de Web e Apis Rest por meio do Spring Framework.

Material de apoio:

Precisamos construir uma Api que nos forneça as seguintes funcionalidades:

Produto:

  • Obter o produto por Id;
  • Cadastrar um produto;
  • Deletar um produto;
  • Buscar todos os produtos cadastrados;

Cliente:

  • Obter o cliente por Id;
  • Cadastrar um cliente;
  • Deletar um cliente;
  • Buscar todos os clientes cadastrados;

Calculo de Frete:

  • Calcular o frete informando como parametros o tipo de calculo a ser executado, o id do produto e o id do cliente;

O que será avaliado ?

  • Boas práticas de API;
  • Testes das Apis;

FASE 4

Objetivo: Agora vamos alterar o cadastro do nosso cliente para que seja necessario enviar apenas o cep e o restante dos dados sejam obtidos através de uma api de terceiros (uf, logradouro, bairro cidade e etc...).

Aprendizado: A idéia é aprender a consumir uma api rest de terceiros.

Obs:

O que será avaliado ?

  • Qualidade do código;
  • Boas práticas no consumos de Apis (Configuração de timeout e etc ..);

FASE 5

Objetivo: Agora vamos trabalhar com banco de dados na nossa aplicação. Para isso, vamos fazer uso de 2 tipos de banco, um relacional (H2) e outro não relacional (MongoDb).

Aprendizado: A idéia é consolidar os conceitos de base de dados relacionais e não relacionais (NoSql).

Obs: Crie um modulo maven separado cada banco.

O que será avaliado ?

  • Conexão com banco de dados;
  • Utilização de banco de dados com a API;

FASE 6

Objetivo: Nessa fase vamos utilizar o Swagger para documentar os recursos dessa API.

Aprendizado: O Swagger é uma ferramenta open source que auxilia desenvolvedores nos processos de definir, criar, documentar e consumir APIs REST. Essa ferramenta auxilia descrevendo os recursos que uma API deve possuir, como endpoints, dados recebidos, dados retornados, códigos HTTP e métodos de autenticação, entre outros.

Obs:

O que será avaliado ?

  • Documentação da API via Swagger