Arquitetura do projeto

API em rails com autenticação usando JWT para treinamento de automação.

Esse projeto tem como objetivo disponibilizar uma API para automação de teste com autenticação, criando desafios para quem utilizar.

Essa API também está disponível em produção, vou disponibilizar a collection do Postman ao final do post.

1. O que precisamos?

2. Vamos começar?

Se vc tem o docker instalado e também o postman é bem simples inicializar a aplicação, eu criei o dockerfile e o script que faz isso para nós.

3. Vamos fazer o clone do projeto

Primeiro passo a ser feito é clonar o projeto para a nossa máquina:

git clone https://github.com/felipeqa/loans-api.git

Eu por exemplo clonei dentro de um diretório chamado rails

Passo 1

Obs: Se vc não tiver o git instalado, vc pode baixar o zip e descompactar em algum diretório.

4. Agora vamos até a raiz do projeto

cd loans-api

Passo 2

5. Execução do script

Agora que estamos na raiz do projeto, vamos executar o script:

sh scripts/setup

Isso deve demorar um pouco pois é preciso baixar algumas dependências

Passo 3

Passo 4

Quando exibir "Successfully tagged loan-api/rails:latest" é por que a API está de pé.

Obs: Se vc não conseguir executar o script, vc pode executar diretamente os camandos no seu terminal:

docker build -t loan-api/rails .
docker run -p 3000:3000 loan-api/rails

Para verificar, vc só precisa acessar essa url

O projeto sobe na url http://localhost:3000

Passo 5

6. Importando as collections no Postman

  • Collection para o ambiente local:

https://www.getpostman.com/collections/fd3039c516e6e537264a

  • Collection para o ambiente de produção:

https://www.getpostman.com/collections/2c862f1f7f5b501ad915

Para importar a collection é bem simples, clica em Import:

Passo 6

Clicar em "Import From Link" e colar a url acima:

Passo 7

Agora que importamos as collections, vou explicar como utilizar cada verbo da api.

7. Detalhando cada endpoint

Se saber todas as rotas da api:

rake routes

Passo 8

  • Server URL:

Local: http://localhost:3000

Produção: https://loans-api-felipe-qa.herokuapp.com

Endpoints:

  • GET / ou root (Não necessita autenticação)

Esse endpoint é apenas para verificar se a API está respondendo

  • GET /auth (Necessita autenticação)

Esse endpoint é apenas para saber se o token é valido e retorna o usuário e o email

Usar o header:

"Authorization": "Bearer ${token_jwt_gerado}"
HTTP: Status
200
401
  • POST /user_token (Necessita de um usuário cadastrado)

Esse endpoint é responsável de obter um token dado um usuário e senha

Body:

{
	"auth":{
		"email": "admin@admin.com",
		"password": "password"
	}
}

Response:

{
    "jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NDEwOTA3NTQsInN1YiI6Mn0.dZ7HV37hhZFuTeUVp5ZsZEdRpw06gukbUkorXkvAEvs"
}
HTTP: Status
200
401
404
  • GET /users (Necessita autenticação)

Esse endpoint lista todos os usuários cadastrados na aplicação

Usar o header:

"Authorization": "Bearer ${token_jwt_gerado}"
HTTP: Status
200
401
  • GET /users/current (Necessita autenticação)

Esse endpoint lista as informações do usuário atual com base no token

Usar o header:

"Authorization": "Bearer ${token_jwt_gerado}"
HTTP: Status
200
401
  • POST /users/create (Necessita autenticação)

Esse endpoint é responsável por criar um usuários

Usar o header:

"Authorization": "Bearer ${token_jwt_gerado}"
"Content-Type": "application/json"

Usuário padrão:

{
	"user":{
		"email": "test{{$timestamp}}@teste.com",
		"password": "password",
		"username": "teste{{$timestamp}}"
	}
 }

Usuário admin adicionar a role:"admin" :

{
	"user":{
		"email": "test{{$timestamp}}@teste.com",
		"password": "password",
		"username": "teste{{$timestamp}}",
        "role": "admin"
	}
 }
HTTP: Status
200
401
204

Obs: 204 se vc tentar cadastrar o mesmo email ou username, eu não tratei o http code e também não coloquei uma mensagem apropriada.

  • PUT /user/:id (Necessita autenticação)

Esse endpoint é responsável por fazer a atualização de um usuário e senha com base no seu id

REGRA:

1* Usuário comum só pode alterar a ele mesmo, ou seja, o token só atualiza o usuário com o seu respectivo id. 2* Usuário com a rule admin pode alterar qualquer usuário.

Usar o header:

"Authorization": "Bearer ${token_jwt_gerado}"
"Content-Type": "application/json"

Body:

{
	"user":{
		"email": "test{{$timestamp}}@teste.com",
		"password": "password",
		"username": "teste{{$timestamp}}"
	}
 }
HTTP: Status
200
401
404
  • DELETE /user/:id (Necessita autenticação)

Esse endpoint é responsável por fazer deletar um usuário com base no seu id

REGRA:

1* Usuário comum só pode deleter a ele mesmo, ou seja, o token só deleta o usuário com o seu respectivo id. 2* Usuário com a rule admin pode deletar qualquer usuário.

Usar o header:

"Authorization": "Bearer ${token_jwt_gerado}"
HTTP: Status
200
401
404
  • GET /api/v1/loans (Necessita autenticação)

Esse endpoint é responsável por listar todos os empréstimos existentes de todos os cliente

Usar o header:

"Authorization": "Bearer ${token_jwt_gerado}"
HTTP: Status
200
401
  • POST /api/v1/loans (Necessita autenticação)

Esse endpoint é responsável por cadastrar os empréstimos de cada cliente

OBS: O próprio endpoint calcula a parcela para o cliente, ou seja, dado um valo e quantidade parcela o endpoint retorna o valor da parcela (calculo sem juros hoje)

Usar o header:

"Authorization": "Bearer ${token_jwt_gerado}"
"Content-Type": "application/json"

Body:

{
  "name": "felipe",
  "cpf": "33333333333",
  "total_loans": 100,
  "quantity_quotas": 10
 }
HTTP: Status
200
401
  • GET /api/v1/loans/:id (Necessita autenticação)

Esse endpoint recuperar um empréstimo dado o seu id

Usar o header:

"Authorization": "Bearer ${token_jwt_gerado}"
HTTP: Status
200
401
404
  • DEL /api/v1/loans/:id (Necessita autenticação)

Esse endpoint deleta um empréstimo dado o seu id

REGRA: Somente o admin pode remover um empréstimo

Usar o header:

"Authorization": "Bearer ${token_jwt_gerado}"
HTTP: Status
200
401
404

Então galera é isso!

Essa é apenas a primeira parte do post!

Vou criar um novo projeto mostranto como eu faria estes testes, esse aqui é apenas o desafio para vc que quer fazer testes em api ou contrato.

O intuíto é fornecer essa api como interface para testes, se vc quiser um ambiente mais reservado, faça o clone do projeto e suba a aplicação com o docker, se vc quer apenas fazer algumas brincadeira e talz use a de produção mesmo.

Agora escolha seu framework favorito e mão-na-massa.

Até o próximo!!!!!

Contato

Estou aberto a sugestões, elogios, críticas ou qualquer outro tipo de comentário.

Licença

Esse código é livre para ser usado dentro dos termos da licença MIT license.