Padrão de projetos para automação de API

Se você completou o tutorial Jest + Supertest para teste de API GraphQL — Parte 2: Criando a Primeira Spec agora chegou a hora de abstrairmos a função do request para um método só dele e assim não precisarmos mais gerar duplicidade de código.

No tutorial passado nosso código ficou assim:

const request = require("supertest");
var chai = require("chai"),
  expect = chai.expect;


describe('Criando a nova primeira spec', () => {
  var response = null

  test('Vamos criar a primeira request ', async () => {
    response = await request("https://api.geographql.rudio.dev")
      .post("/graphql")
      .send({
        query: `query states($filter: StateFilterInput, $pagination: PaginationInput) {
                states(filter: $filter, page: $pagination) {
                  totalCount
                  edges {
                    cursor
                    node {
                      name
                      state_code
                      country_code
                      latitude
                      longitude
                    }
                  }
                  pageInfo {
                    hasNextPage
                    hasPreviousPage
                    endCursor
                    startCursor
                  }
                }
              }`,
        variables: {
          filter: {
            ciso2: "US",
          },
          pagination: {
            first: 5,
          },
        },
      })
      .expect("Content-Type", "application/json; charset=utf-8")
      .expect(200);

    console.log(JSON.stringify(response.body))
  });
});

Tudo dentro da nossa classe de teste, porém isso não é nem um pouco performatico ou com boas práticas de código. Mas para um primeiro momento e entendimento dos conceitos ele é necessário. Mas vamos arregaçar as mangas e começar.

Passo 1: Vamos criar a nossa pasta helpers e criar a “carcaça” do nosso request

Está pasta irá conter todos os códigos que irão nos auxiliar durante os testes, inclusive o nosso request.js.

Dentro da pasta helpers criada iremos criar uma nova pasta chamada utils porque iremos adicionar a ela todos os utilitários do nosso teste. Criada as pastas agora vamos criar os arquivos.

Na raiz da pasta helpers precisamos criar o arquivo index.js ele irá indexar todas os métodos criados e deixando eles assim disponiveis para o nosso projeto todo visualizar e utilizar.

Dentro deste arquivo index.js iremos exportar a nossa pasta criada, deixando claro para todo o nosso projeto que tem uma pasta utils que pode ser vista e utilizada.

export * from "./utils";

Agora dentro da nossa pasta utils também precisamos criar um arquivo index.js para mostrar para o projeto que além de visualizar a pasta eles podem visualizar e utilizar os arquivos que estão dentro delas.

export * from "./request";

Mas você deve estar se pergutando: “Mas Pri! Eu não tenho este arquivo dentro da minha pasta utils”. E sim você está certo, por isso iremos criar ele agora e começar a “jogar” nosso código para dentro dele.

Crie o arquivo request.js e deixe ele dentro da pasta utils, dentro dele iremos adicionar todo o código da nossa spec relacionado ao request. As importações como supertest e as bibliotecas de asserções dos testes.

const request = require("supertest");
var chai = require("chai"),
  expect = chai.expect;

Agora iremos precisar criar um método que irá executar a ação do request.

  • O comando export async function informa que está sendo criada uma função asyncrona que será exportada e assim visivel em nosso projeto.
  • o nosso método foi chamado de requestGraphqlTutorial ele irá receber 2 parâmetros a baseURL (url a ser utilizada) e o payload (query e variables)




const request = require("supertest");
var chai = require("chai"),
  expect = chai.expect;

export async function requestGraphqlTutorial(baseURL, payload) {
  const response = await request(baseURL)
    .post("/graphql")
    .send(payload)
    .expect("Content-Type", "application/json; charset=utf-8")
    .expect(200);
  return response;
}

Parte 1, foi finalizada. Agora vamos melhorar a nossa spec.

Parte 2: Evoluindo a nossa Spec

Primeira coisa que precisamos fazer agora é dizer para a nossa spec que criamos uma função chamada requestGraphql e que ela será utilizada no nosso código, para isso adicione o comando abaixo.

 import { requestGraphqlTutorial} from "../../helpers/utils/request";

Depois de importar precisamos criar algumas declarações, e a primeira delas será a variavel payload que vai receber a query e a variable que será enviada.

E a variável baseURL, informando a url do nosso teste.





import { requestGraphqlTutorial} from "../../helpers/utils/request";

describe('Criando a nova primeira spec', () => {
  var response = null
  var payload  = {
    query: `query states($filter: StateFilterInput, $pagination: PaginationInput) {
            states(filter: $filter, page: $pagination) {
              totalCount
              edges {
                cursor
                node {
                  name
                  state_code
                  country_code
                  latitude
                  longitude
                }
              }
              pageInfo {
                hasNextPage
                hasPreviousPage
                endCursor
                startCursor
              }
            }
          }`,
    variables: {
      filter: {
        ciso2: "US",
      },
      pagination: {
        first: 5,
      },
    }
}
var baseURL = "https://api.geographql.rudio.dev";

});

Agora iremos substituir o nosso bloco de código “chumbado” pelo nosso método criado.





import { requestGraphql } from "../../helpers/utils/request";

describe('Criando a nova primeira spec', () => {
  var response = null
  var payload  = {
    query: `query states($filter: StateFilterInput, $pagination: PaginationInput) {
            states(filter: $filter, page: $pagination) {
              totalCount
              edges {
                cursor
                node {
                  name
                  state_code
                  country_code
                  latitude
                  longitude
                }
              }
              pageInfo {
                hasNextPage
                hasPreviousPage
                endCursor
                startCursor
              }
            }
          }`,
    variables: {
      filter: {
        ciso2: "US",
      },
      pagination: {
        first: 5,
      },
    }
}
var baseURL = "https://api.geographql.rudio.dev";

  test('Vamos criar a primeira request ', async() => {
    response = await requestGraphqlTutorial(baseURL, payload) 
    
    console.log(JSON.stringify(response.body))
  });
});

Agora vocês rodando o teste, vocês irão ver o mesmo resultado de sucesso anterior, porém agora você possui uma função “generica” de request que pode utilizar nos seus outros testes, passando apenas a url e o payload de envio que ela irá fazer todo o trabalho por você.

Agora de uma olhadinha no comparativo de antes e depois do código. Olha a quantidade de código que foi diminuida da nossa classe de teste.

E se você quer ver como o repositório final se encontra só acessar o meu portfolio no Github https://github.com/pricaimiTech/geographqlJestAPI

E não esqueça de me seguir nas minhas redes sociais https://linktr.ee/priscilacaimi

Gostou do conteúdo? Não deixe de compartilhar!

Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *