Skip to content

This project is a REST API application developed with Node Js. It includes tests (Mocha, Chai and Sinon) and it is structured with MSC architectural pattern.

Notifications You must be signed in to change notification settings

VitBrandao/NodeJS-Store-Manager-Project

Repository files navigation

Boas vindas ao repositório do projeto Store Manager!

Aqui você vai encontrar os detalhes de como estruturar o desenvolvimento do seu projeto a partir deste repositório, utilizando uma branch específica e um Pull Request para colocar seus códigos.


Lista de requisitos

1 - Escreva testes para cobrir 35% das camadas da sua aplicação

  • Seus arquivos de teste devem ficar no diretório test/unit, como citado aqui;

  • 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 utilize npm run test:mocha;

O que será validado

👉 Será validado que a cobertura total das linhas dos arquivos de CADA camada models, services e controllers é maior ou igual a 35%. Ou seja, cada uma das camadas tem de ter, ao menos, 35% de cobertura de testes.

👉 Será validado que ao menos 24 linhas são cobertas pelos testes.


2 - Crie endpoints para listar os produtos e as vendas

ℹ️ Para Produtos

  • 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 o id presente na URL deve ser retornado;

  • o resultado deve ser ordernado de forma crescente pelo campo id;

O que será validado no endpoint para listar produtos

👉 Para o endpoint GET /products, será validado que todos produtos estão sendo retornados.

  • sua API deve responder com status http 200 e o seguinte body:
  [
    {
      "id": 1,
      "name": "produto A",
      "quantity": 10
    },
    {
      "id": 2,
      "name": "produto B",
      "quantity": 20
    }
  ]

👉 Para o endpoint GET /products/:id, será validado que é possível listar um determinado produto.

  • sua API deve responder com status http 200 e o seguinte body:
      {
        "id": 1,
        "name": "produto A",
        "quantity": 10
      }

👉 Para o endpoint GET /products/:id, será validado que não é possível listar um produto que não existe.

  • sua API deve responder com status http 404 e o seguinte body:
      { "message": "Product not found" }

ℹ️ Para Vendas

  • 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 o id 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 campo productId;

O que será validado no endpoint para listar vendas

👉 Para o endpoint GET /sales, será validado que todas vendas estão sendo retornados.

  • sua API deve responder com status http 200 e o seguinte body:
  [
    {
      "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
    }
  ]

👉 Para o endpoint GET /sales/:id, será validado que é possível listar uma determinada venda.

  • sua API deve responder com status http 200 e o seguinte body:
      [
        {
          "date": "2021-09-09T04:54:29.000Z",
          "productId": 1,
          "quantity": 2
        },
        {
          "date": "2021-09-09T04:54:54.000Z",
          "productId": 2,
          "quantity": 2
        }
      ]

👉 Para o endpoint GET /sales/:id, será validado que não é possível listar uma venda que não existe.

  • sua API deve responder com status http 404 e o seguinte body:
      { "message": "Sale not found" }

3 - Crie middlewares de validação para as rotas /products e /sales

ℹ️ Para Produtos

  • 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;

O que será validado

⚠️ Nenhum dos casos testados com informações inválidas ou com campos faltantes fará acesso ao banco de dados.

👉 Para o endpoint POST /products, o campo name deve ser uma string com 5 ou mais caracteres e deve ser único.

  • Quando a requisição é feita sem o atributo name :
      { "quantity": 100 }
    • sua API deve responder com status http 400 e o seguinte body:
      { "message": "\"name\" is required" }          
  • Quando a requisição é feita e contém o seguinte body:
      { "name": "pro", "quantity": 100 }
    • sua API deve responder com status http 422 e o seguinte body:
      { "message": "\"name\" length must be at least 5 characters long" }          

👉 O campoquantity deve ser um número inteiro maior que 0.

  • Quando a requisição é feita sem o atributo quantity :

      { "name": "produto" }
    • sua API deve responder com status http 400 e o seguinte body:
      { "message": "\"quantity\" is required" } 
  • Quando a requisição é feita com o quantity menor ou igual a 0:

      { "name": "produto", "quantity": 0 }
     { "name": "produto", "quantity": -1 }
    • sua API deve responder com status http 422 e o seguinte body:
    { "message": "\"quantity\" must be greater than or equal to 1" }           

ℹ️ Para Vendas

  • O endpoint de produtos deve ser acessível através do caminho (/sales);

  • Lembre-se, o banco de dados não deve ser acessado nas validações iniciais do corpo da requisição;

O que será validado

⚠️ Nenhum dos casos testados com informações inválidas ou com campos faltantes fará acesso ao banco de dados.

👉 será validado que o campo productId está presente no body.

  • Quando a requisição é feita sem o atributo productId :
      [{ "quantity": 2 }]
    • sua API deve responder com status http 400 e o seguinte body:
      { "message": "\"productId\" is required" }           

👉 será validado que o campo quantity está presente no body.

  • Quando a requisição é feita sem o atributo quantity :

      [{ "productId": 1 }]
    • sua API deve responder com status http 400 e o seguinte body:
      { "message": "\"quantity\" is required" }           
  • Quando a requisição é feita com o quantity menor ou igual a 0:

      [{ "productId": 1, "quantity": 0 }]
     [{ "productId": 1, "quantity": -1 }]
    • sua API deve responder com status http 422 e o seguinte body:
    { "message": "\"quantity\" must be greater than or equal to 1" }           

4 - Crie um endpoint para o cadastro de produtos

  • O endpoint deve ser acessível através do caminho (/products);

  • Os produtos enviados devem ser salvos na tabela products do Banco de Dados;

  • Observe as regras de negócio e coloque na camada certa;

O que será validado

👉 Para o endpoint POST /products, o campo name deve ser uma string com 5 ou mais caracteres e deve ser único.

  • Quando a requisição é feita com o atributo name igual um já cadastrado:
      { "name": "produto", "quantity": 100 }
    • sua API deve responder com status http 409 e o seguinte body:
      { "message": "Product already exists" }

👉 Para o endpoint POST /products, quando a requisição é feita corretamente, o produto deve ser cadastrado.

  • Quando a requisição é feita e contém o seguinte body:
      { "name": "produto", "quantity": 10 }
    • sua API deve responder com status http 201 e o seguinte body:
      { "id": 1, "name": "produto", "quantity": 10 }
    

5 - Crie um endpoint para atualizar um produto

  • O endpoint deve ser acessível através do caminho (/products/:id);

  • O corpo da requisição deve seguir a mesma estrutura do método responsável por adicionar um produto;

  • Apenas o produto com o id presente na URL deve ser atualizado;

  • Observe as regras de negócio e coloque na camada certa;

O que será validado

👉 Para o endpoint PUT /products/:id, quando a requisição é feita corretamente, o produto deve ser alterado.

  • Quando a requisição é feita e contém o seguinte body:
      { "name": "produto", "quantity": 15 }
    • sua API deve responder com status http 200 e o seguinte body:
      { "id": 1, "name": "produto", "quantity": 15 }

👉 Para o endpoint PUT /products/:id, será validado que não é possível alterar um produto que não existe.

  • sua API deve responder com status http 404 e o seguinte body:
      { "message": "Product not found" }

6 - Crie um endpoint para deletar um produto

  • O endpoint deve ser acessível através do caminho (/products/:id);

  • Apenas o produto com o id presente na URL deve ser deletado;

  • Observe as regras de negócio e coloque na camada certa;

O que será validado

👉 Para o endpoint DELETE /products/:id, será validado que é possível deletar um produto com sucesso.

  • sua API deve responder com status http 204 e sem nenhuma resposta no body.

👉 Para o endpoint DELETE /products/:id, será validado que não é possível deletar um produto que não existe.

  • sua API deve responder com status http 404 e o seguinte body:
      { "message": "Product not found" }

7 - Crie um endpoint para cadastrar vendas

  • O endpoint deve ser acessível através do caminho (/sales);

  • As vendas enviadas devem ser salvas na tabela sales e sales_products do Banco de dados;

  • Deve ser possível cadastrar a venda de vários produtos através da uma mesma requisição;

  • Observe as regras de negócio e coloque na camada certa;

O que será validado

👉 Para o endpoint POST /sales, quando a requisição é feita corretamente, o produto deve ser cadastrado.

  • Quando a requisição é feita e contém o seguinte body:
      [
        {
          "productId": 1,
          "quantity": 3
        }
      ]
    • sua API deve responder com status http 201 e o seguinte body:
      {
        "id": 1,
        "itemsSold": [
          {
            "productId": 1,
            "quantity": 3
          }
        ]
      }

👉 Para o endpoint POST /sales, quando a requisição é feita corretamente, a venda deve ser cadastrada.

  • Quando a requisição é feita e contém o seguinte body:
      [
        {
          "productId": 1,
          "quantity": 2
        },
        {
          "productId": 2,
          "quantity": 5
        }
      ]
    • sua API deve responder com status http 201 e o seguinte body:
      {
        "id": 1,
        "itemsSold": [
          {
            "productId": 1,
            "quantity": 2
          },
          {
            "productId": 2,
            "quantity": 5
          }
        ]
      }

8 - Crie um endpoint para atualizar uma venda

  • O endpoint deve ser acessível através do caminho (/sales/:id);

  • quantity deve ser um número inteiro maior que 0;

  • Apenas a venda com o id presente na URL deve ser atualizada;

  • Observe as regras de negócio e coloque na camada certa;

O que será validado

👉 Para o endpoint PUT /sales/:id, quando a requisição é feita corretamente, a venda deve ser alterada.

  • Quando a requisição é feita e contém o seguinte body:
      [
        {
          "productId": 1,
          "quantity": 6
        }
      ]
    • sua API deve responder com status http 200 e o seguinte body:
      {
        "saleId": 1,
        "itemUpdated": [
          {
            "productId": 1,
            "quantity": 6
          }
        ]
      }

9 - Escreva testes para cobrir 40% das camadas da sua aplicação

  • Seus arquivos de teste devem ficar no diretório test/unit, como citado aqui

  • 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 utilize npm run test:mocha;

O que será validado

👉 Será validado que a cobertura total das linhas dos arquivos de CADA camada models, services e controllers é maior ou igual a 40%. Ou seja, cada uma das camadas tem de ter, ao menos, 40% de cobertura de testes.

👉 Será validado que ao menos 24 linhas são cobertas pelos testes.


Bônus

10 - Crie um endpoint para deletar uma venda

  • O endpoint deve ser acessível através do caminho (/sales/:id);

  • Apenas a venda com o id presente na URL deve ser deletado;

O que será validado

👉 Para o endpoint DELETE /sales/:id, será validado que é possível deletar uma venda com sucesso.

  • sua API deve responder com status http 204 e sem nenhuma resposta no body.

👉 Para o endpoint DELETE /sales/:id, será validado que não é possível deletar uma venda que não existe.

  • sua API deve responder com status http 404 e o seguinte body:
  { "message": "Sale not found" }

11 - Atualize a quantidade de produtos

  • Ao realizar uma venda, atualizá-la ou deletá-la, você deve também atualizar a quantidade do produto em questão presente na tabela responsável pelos produtos;

    • Exemplo 1: suponha que haja um produto chamado Bola de Futebol e a sua propriedade quantity tenha o valor 10. Caso seja feita uma venda com 8 unidades desse produto, a quantidade do produto deve ser atualizada para 2 , pois 10 - 8 = 2;
    • Exemplo 2: Suponha que esta venda tenha sido deletada, logo estas 8 unidades devem voltar ao quantity e seu valor voltará a 10, pois 2 + 8 = 10;
O que será validado

👉 Será validado que ao fazer uma determinada venda, a quantidade do produto deverá ser atualizada também na tabela responsável pelos produtos.

👉 Será validado que ao deletar uma determinada venda, a quantidade do produto deverá ser atualizada também na tabela responsável pelos produtos;.


12 - Valide a quantidade de produtos

  • Um produto nunca deve ter a quantidade em estoque menor que 0;

  • Quando uma venda for realizada, garanta que a quantidade sendo vendida está disponível no estoque

O que será validado

👉 Para o endpoint POST /sales, será validado que a quantidade de produtos em estoque nunca seja menor que 0 (zero).

  • Quando a requisição é feita com uma quantidade superior a quantidade em estoque:
      [
        {
          "productId": 1,
          "quantity": 100
        }
      ]
    • sua API deve responder com status http 422 e o seguinte body:
      { "message": "Such amount is not permitted to sell" }

13 - Escreva testes para cobrir 50% das camadas da sua aplicação

  • Seus arquivos de teste devem ficar no diretório test/unit, como citado aqui;

  • 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 utilize npm run test:mocha;

O que será validado

👉 Será validado que a cobertura total das linhas dos arquivos de CADA camada models, services e controllers é maior ou igual a 50%. Ou seja, cada uma das camadas tem de ter, ao menos, 50% de cobertura de testes.

👉 Será validado que ao menos 24 linhas são cobertas pelos testes.


14 - Escreva testes para cobrir 60% das camadas da sua aplicação

  • Seus arquivos de teste devem ficar no diretório test/unit, como citado aqui;

  • 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 utilize npm run test:mocha;

O que será validado

👉 Será validado que a cobertura total das linhas dos arquivos de CADA camada models, services e controllers é maior ou igual a 60%. Ou seja, cada uma das camadas tem de ter, ao menos, 60% de cobertura de testes.

👉 Será validado que ao menos 24 linhas são cobertas pelos testes.

About

This project is a REST API application developed with Node Js. It includes tests (Mocha, Chai and Sinon) and it is structured with MSC architectural pattern.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published