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.json
dentro 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
Deixe um comentário