Valide o contrato da sua API

No nosso último artigo Jest + Supertest para teste de API GraphQL — Parte 3: Abstraindo o request para um método nos aprendemos a começar a abstrair os nossos métodos para as devidas classes. Hoje vamos começar a trabalhar com um dos principais tipos de validação que devemos ter implementado nos nossos testes de API, o teste de contrato. Este tipo de teste irá ajudar a validar se a sua API está sempre cumprido com o contrato pré estabelecido e com isso evitando problemas de integração.

E para isso agora vamos começar com a mão no nosso código, começando com a criação da pasta graphql, dentro desta pasta irei colocar uma segunda pasta chamada schema, pensando em organização do nosso código irei criar uma outra pasta dentro do schema chamada states porque dentro dela irei colocar os schemas relacionados ao estados, abaixo está a organização de pasta para vocês relembrarem.

├── __Test__
├── coverage
├── environment
├── graphql
    ├── query/
    ├── schema/
├── helpers
    ├── date/
    ├── utils/
├── README.md

Fase 1: Criar o contrato

Agora vamos começar com a criação do schema. Com o auxilio da documentação nos temos o modelo de como irá retornar os dados.





{
  "data": {
    "states": {
      "totalCount": 4,
      "edges": [
        {
          "cursor": "eyJjdXJzb3IiOjQ2NTV9",
          "node": {
            "name": "California",
            "state_code": "CA",
            "country_code": "US",
            "latitude": 36.778261,
            "longitude": -119.4179324
          }
        },
        {
          "cursor": "eyJjdXJzb3IiOjQ2NTZ9",
          "node": {
            "name": "Colorado",
            "state_code": "CO",
            "country_code": "US",
            "latitude": 39.5500507,
            "longitude": -105.7820674
          }
        },
        {
          "cursor": "eyJjdXJzb3IiOjQ2NTd9",
          "node": {
            "name": "Connecticut",
            "state_code": "CT",
            "country_code": "US",
            "latitude": 41.6032207,
            "longitude": -73.087749
          }
        },
        {
          "cursor": "eyJjdXJzb3IiOjQ2NTh9",
          "node": {
            "name": "Delaware",
            "state_code": "DE",
            "country_code": "US",
            "latitude": 38.9108325,
            "longitude": -75.5276699
          }
        }
      ],
      "pageInfo": {
        "hasNextPage": true,
        "hasPreviousPage": true,
        "endCursor": "eyJjdXJzb3IiOjQ2NTh9",
        "startCursor": "eyJjdXJzb3IiOjQ2NTV9"
      }
    }
  }
}

Ire abrir o site Free Online JSON to JSON Schema Converter porque ele irá criar o contrato através do response retornado facilitando a nossa vida na hora da criação dele.


Com o resultado retornado iremos adicionar ele dentro da classe states.schema.jsondentro da pasta schema/states.

Fase 2: Criar a função de validação do contrato

Agora precisamos instalar uma dependência para realizar a validação de contrato.

yarn add  jsonschema

Agora podemos criar o nosso código de validação de contrato. Dentro da pasta helpers/utils iremos criar um arquivo chamado schemaValidator.js

  • Importar a dependência jsonschema
var Validator = require("jsonschema").Validator;
var v = new Validator();
  • Importar a dependência de validação: chai
var chai = require("chai"),
  expect = chai.expect;
  • Criação da função para realizar a validação do contrato: a função irá receber dois parâmetros response onde você vai passar o valor retornado da query e o schema que foi criado. Depois o método irá fazer todo o trabalho de validação não precisa alterar.

var Validator = require("jsonschema").Validator;
var v = new Validator();
var chai = require("chai"),
  expect = chai.expect;

export function schemaValidator(response, schema) {
  const res = v.validate(response, schema);
  expect(
    res.valid,
    "schema não é valido \nResponse: " +
      JSON.stringify(response) +
      "\nErro:" +
      JSON.stringify(res.errors)
  ).to.be.true;
}

E agora por fim, precisamos deixar este arquivo visivel para todo o projeto então acesse o index.js que está dentro da pasta utils e adicione a exportação.

export * from "./request";
export * from "./schemaValidator";

Fase 3: Adicionando a validação do contrato ao teste

Dentro da nossa spec iremos realizar a importação do nosso arquivo de schema e a função para validar o schema

import { schemaValidator } from "../helpers/utils/schemaValidator";
const schema = require("../../graphql/schema/states/states.schema.json")

E dentro do nosso teste basta chamarmos o nosso método e passarmos o response.body e o schema

import { requestGraphqlTutorial } from "../../helpers/utils/request";
import { schemaValidator } from "../../helpers/utils/schemaValidator";
const schema = require("../../graphql/schema/states/states.schema.json")

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)
    schemaValidator(response.body, schema)
    console.log(JSON.stringify(response.body))
  });
});

Ao rodar os teste, vemos a execução realizada com sucesso.

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 *