Giter VIP home page Giter VIP logo

02-aplicando-testes-unitarios-em-uma-cli's Introduction

Parte 2

Aplicando testes unitários em uma CLI

Essa CLI foi desenvolvida com o objetivo de elucidar os exemplos de testes do Livro. A aplicação, basicamente, permite cadastro, remoção, atualização e leitura de usuários.

Para quem está lendo o livro

Ao clonar esse repositório enquanto acompanha o livro, não esqueça de apagar a pasta __tests__ e o arquivo jest.config.js para que você possa realizar os exemplos acompanhando o conteúdo.

Estrutura do projeto

Alguns comandos utilitários (como de criação da base de dados e gerar usuário) estão disponíveis na pasta commands, contendo seus respectivos arquivos.

Na raiz do projeto existe um arquivo cli.js que é, basicamente o arquivo que inicia a aplicação através da CLI e importa a função principal e fornece os argumentos informado em sua execução. Também a raíz está localizado o arquivo database.json que será utilizado para simularmos um banco de dados contendo os dados da aplicação.

A pasta src contém todo o código da aplicação. Embora não ocorra nenhum processo de transpilação/build, achei interessante manter essa estrutura por ser um padrão adotado no mercado. Essa pasta, por sua vez, contém a seguinte estrutura:

  • index.js: contém a função principal que inicia a aplicação;
  • constants: diretório que contém as constantes utilizadas ao longo do projeto que são, basicamente, as roles.js (diferentes níveis de usuário);
  • database: contém a "camada" que realiza a manipulação do arquivo database.json, sendo:
    • file.js: faz a leitura/escrita do arquivo database.json propriamente dito;
    • parser.js: faz a formatação de dados para JSON/String e vice-versa;
    • user: diretório contendo as operações de CRUD de usuário (create.js, read.js, remove.js, update.js).
  • middlewares: arquivos que funcionam como middlewares das operações, sendo:
    • index.js: que aplica a lógica da cadeia de middlewares;
    • user.js: middleware para validações de usuário (como validação de permissão);
    • data.js: middleware para validação do campo data em cada operação.
  • operations: diretório que contém o manuseio das operações de CRUD, onde serão executadas através da CLI e retornarão mensagens ao usuário (camada intermediária entre a CLI e as operações do diretório database), por isso contém uma estrutura de arquivos bem semelhante à da pasta database;
  • utils: diretório que contém alguns utilitários necessários para a aplicação, como o de logging (logger.js) e o que formata/valida os argumentos enviados via terminal (args.js).

Instalação

Para utilizar, basta instalar o projeto com:

npm i

Realizar o link do projeto para que a CLI possa ser executável:

npm link

Após isso, será possível executar o comando, faça o teste:

jsassertivo

E você verá a seguinte mensagem:

🚨 Você precisa fornecer os argumentos corretos para a CLI

Utilização

Para utilizar essa CLI, é necessário informar 4 argumentos:

  • username: nome de usuário admin para ser "autenticado" e realizar alguma operação;
  • password: senha de um usuário admin para para realizar a operação;
  • operation: operação a ser realizada (read/create/delete/update);
  • data: dados necessários para realizar tal operação.

A CLI é um CRUD simples de usuário, mas aplicando algumas validações por permissão. A ideia é que todos os usuários sejam capazes de verificar informações de qualquer usuário existente na base. Entretanto, somente usuários com permissões de administrador podem fazer qualquer modificação (como criar, deletar ou atualizar) qualquer registro.

Por isso, cada cadastro é composto das seguintes campos:

  • email: contendo o email do usuário;
  • userName: contendo um nome de usuário;
  • password: contendo a senha;
  • name: contendo o nome inicial;
  • lastName: contendo o sobrenome;
  • uid: campo contendo um identificador único para cada usuário;
  • avatar: (opcional) contendo uma URL de foto do usuário;
  • role: contém o tipo de permissão dou usuário no sistema (podendo ser USER ou ADMIN).

Dessa forma, um registro de usuário é formado da seguinte maneira:

{
  "email": "[email protected]",
  "userName": "Maybelle28",
  "password": "k0Ohk1xTBnz8TPC",
  "name": "Amy",
  "lastName": "Cruickshank",
  "uid": "91d1f470-83e3-44a3-a211-3ad7a8f5b853",
  "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/8d3k/128.jpg",
  "role": "USER"
}

Por exemplo, para realizar a criação de um usuário, basta informar os dados de autenticação, a operação e, no campo "data", informar a string JSON do usuário a ser cadastrado:

jsassertivo --username=admin --password=admin --operation=create --data=string-json-do-usuario

Read

Para verificar os dados de um usuário, basta informar seu uid no campo data.

Por exemplo, um usuário com o seguinte UID:

{
  "uid": "3511baa5-2939-43f1-bb2c-70b80702770d",
}

Para ler seus dados, basta executar:

jsassertivo --username=admin --password=admin --operation=read --data='{"uid": "3511baa5-2939-43f1-bb2c-70b80702770d"}'

Observação

Caso você utilize Windows PowerShell, pode ser que ocorra um erro ao fornecer os dados como JSON fazendo com que a função JSON.parse dentro do arquivo src/database/parser.js não funcione como esperado. Isso é uma particularidade do PowerShell que pode ser facilmente contornada.

Caso você tenha esse problema, será necessário escapar as aspas duplas do JSON fornecido no campo data usando uma barra (\) antes de cada uma das aspas duplas (").

Ao invés de fornecer o campo assim:

--data='{"uid": "3511baa5-2939-43f1-bb2c-70b80702770d"}'

Para que funcione corretamente, pode ser que você precise fornecer assim:

--data='{\"uid\": \"3511baa5-2939-43f1-bb2c-70b80702770d\"}'

E isso deverá ser repetido para as demais operações.

Create

Por exemplo, pensando em um usuário com a seguinte estrutura:

{
  "email": "[email protected]",
  "userName": "Lenna71",
  "password": "D7Karr5SaC4bMw_",
  "name": "Athena",
  "lastName": "Stark",
  "role": "USER"
}

Basta executar a CLI da seguinte forma:

jsassertivo --username=admin --password=admin --operation=create --data='
{"email": "[email protected]", "userName": "Lenna71", "password": "D7Karr5SaC4bMw_", "name": "Athena", "lastName": "Stark", "role": "USER"}'

Caso a role não seja informada, o padrão será USER.

Remove

Para remover um usuário, basta executar o mesmo comando mas com a operação remove e informar o uid do usuário no campo data.

Por exemplo, um usuário com o seguinte UID:

{
  "uid": "3511baa5-2939-43f1-bb2c-70b80702770d",
}

Para atualizar qualquer campo como, por exemplo, sua role, bastaria informar o seguinte JSON:

jsassertivo --username=admin --password=admin --operation=create --data='{"uid":"3511baa5-2939-43f1-bb2c-70b80702770d", "role": "ADMIN"}'

Para facilitar os testes locais, um existe um usuário com username/password admin criado, para que você possa executar os exemplos.

Caso tente realizar a operação de criação/remoção de usuário com algum usuário que não é do tipo ADMIN, a operação não será efetuada.

Update

Para atualizar um usuário, no campo data, basta informar seu uid e os campos que deseja atualizar. Por exemplo, um usuário com a seguinte estrutra:

{
  "email": "[email protected]",
  "userName": "Maybelle28",
  "password": "k0Ohk1xTBnz8TPC",
  "name": "Aubree",
  "lastName": "Cruickshank",
  "uid": "91d1f470-83e3-44a3-a211-3ad7a8f5b853",
  "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/8d3k/128.jpg",
  "role": "USER"
}

Para ter algum campo alterado, como, por exemplo name, basta informar os campo como valor, e também seu uid:

{
  "uid": "91d1f470-83e3-44a3-a211-3ad7a8f5b853",
  "name": "NovoNome"
}

Executando a CLI da seguinte maneira:

jsassertivo --username=admin --password=admin --operation=create --data='{"uid": "91d1f470-83e3-44a3-a211-3ad7a8f5b853","name": "NovoNome"}'

Utilitários

Gerar nova base de dados

Você consegue consultar todos os usuários existentes no arquivo database.json. Caso queira redefinir a base de dados, basta rodar o comando:

npm run db:create

Que uma nova base será gerada no mesmo arquivo.

Gerar dados de um novo usuário

Você consegue gerar os dados de um novo usuário através do comando:

npm run user:generate

Após isso, só copiar o JSON gerado e informar no campo data.

02-aplicando-testes-unitarios-em-uma-cli's People

Contributors

rotcivdev avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.