DEV Community

Cover image for Testando API com Unirest em Node.js
Gustavo Cardoso
Gustavo Cardoso

Posted on • Edited on

Testando API com Unirest em Node.js

Olhando o code snippet no Postman, me deparei com exemplos usando Unirest em Node.js. Fiquei curioso e resolvi dar uma olhada mais de perto.

Unirest é uma biblioteca HTTP client, desenvolvida e mantida pelo Kong, disponível em várias linguagens.

A documentação do Unirest Node.js contém vários exemplos de Requests e Responses com a descrição de uso.

Com base nos exemplos, criei um projeto simples de testes automatizados de API. O framework de teste utilizado foi o Vitest entre outras dependências como: dotenv e o prettier , para gerenciamento de variáveis de ambiente e formatação de código, respectivamente.


Iniciando o projeto

Assumindo que Node.js está ou foi instalado na máquina, podemos dar inicio ao projeto.
Crie o diretório com o nome e local que desejar, acesse-o, inicie um projeto node e instale as dependências.

No diretório do projeto execute o comando:

npm init -y
Enter fullscreen mode Exit fullscreen mode

Com o arquivo package.json presente, instale as dependências:

  • Unirest
npm install unirest
Enter fullscreen mode Exit fullscreen mode
  • Vitest
npm install -D vitest
Enter fullscreen mode Exit fullscreen mode
  • Dotenv
npm i dotenv
Enter fullscreen mode Exit fullscreen mode
  • Prettier - Opcional para este exemplo
npm install --save-dev --save-exact prettier
Enter fullscreen mode Exit fullscreen mode

Definindo a estrutura

Como disse é um projeto simples, motivado por curiosidade e estudo pessoal e aplicação de conhecimento.

Apesar de simples, serve como boilerplate e claro adaptar e escalar de acordo com a necessidade.

Incialmente o projeto está organizado em dois diretórios:

  • data

Destinado a criação de dados em JSON utilizado nos testes. Use essa massa dados exemplificada.

{
  "books": {
    "create": {
      "firstname": "Richard",
      "lastname": "Bandler",
      "totalprice": 111,
      "depositpaid": true,
      "bookingdates": {
        "checkin": "2018-01-01",
        "checkout": "2019-01-01"
      },
      "additionalneeds": "Breakfast"
    },
    "update": {
      "firstname": "John",
      "lastname": "Grinder",
      "totalprice": 111,
      "depositpaid": true,
      "bookingdates": {
        "checkin": "2018-01-01",
        "checkout": "2019-01-01"
      },
      "additionalneeds": "Breakfast"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode
  • tests

Aqui encontra-se o os arquivos de testes. Onde podemos organizar, como preferirmos. Nesse exemplo, criei apenas uma arquivo, no padrão .test.js.

Tendo apenas um arquivo, agrupei os testes dentro de uma suíte, então ficou dessa forma:

describe("Testing restful-booker API with Unirest", () => {
  test("Should generate token", async () => {

  });

  test("Should register a book", async () => {

  });
...
});
Enter fullscreen mode Exit fullscreen mode

Implementando os testes

A API usada no projeto foi a restful-booker bem conhecida pela comunidade, para fins de estudo.

Criando o arquivo .env
Antes de adentrar aos testes crie na raiz do projeto o arquivo .env com as variáveis e seus valores, conforme a documentação.

BASE_URL=https://restful-booker.herokuapp.com
USERNAME=admin
PASSWORD=password123
Enter fullscreen mode Exit fullscreen mode

Imports e variáveis
Próximo passo é o import das libs e declaração das variáveis, ficando dessa forma:

import { describe, expect, test } from 'vitest';
const unirest = require('unirest');
const { books } = require('../data/books.json');
const dotenv = require('dotenv');
dotenv.config({ override: true });

let token;
let bookingId;

const BASE_URL = process.env.BASE_URL;
const USERNAME = process.env.USERNAME;
const PASSWORD = process.env.PASSWORD;
Enter fullscreen mode Exit fullscreen mode

O primeiro teste é um método POST para criação do token, que será atribuído ao cookie em outros métodos.

Por ser uma estrutura base, mantive a autenticação como um teste. Uma melhor opção, pensando na evolução do projeto, seria criar uma função com a finalidade de obter o token e usa-lá sempre que precisarmos

test('Should generate token', async () => {
    await unirest
      .post(`${BASE_URL}/auth`)
      .headers({
        Accept: 'application/json',
        'Content-Type': 'application/json',
      })
      .send({ username: USERNAME, password: PASSWORD })
      .then(function (res) {
        token = res.body.token;
        expect(res.status).toBe(200);
      });
  });
Enter fullscreen mode Exit fullscreen mode

O próximo teste é o registro de um livro(book), também com o método POST. Neste usamos a massa de dados passando o path books.create

 test('Should register a book', async () => {
    await unirest
      .post(`${BASE_URL}/booking`)
      .headers({
        'Content-Type': 'application/json',
        Accept: 'application/json',
      })
      .send(JSON.stringify(books.create))
      .then(function (res) {
        bookingId = res.body.bookingid;
        expect(res.status).toBe(200);
      });
  });
Enter fullscreen mode Exit fullscreen mode

Agora é o teste de atualização de livros(book) com o método PUT. Usaremos massa de dados de books.update e conforme requerido o token.

 test('Should update a book', async () => {
    await unirest
      .put(`${BASE_URL}/booking/${bookingId}`)
      .headers({
        Accept: 'application/json',
        'Content-Type': 'application/json',
        Cookie: `token=${token}`,
      })
      .send(JSON.stringify(books.update))
      .then(function (res) {
        expect(res.status).toBe(200);
      });
  });
Enter fullscreen mode Exit fullscreen mode

Finalizando com método DELETE onde é passado o bookingid no path da URL. Esse valor é obtido no response ao criarmos um livro.

test('Should remove a book', async () => {
    await unirest
      .delete(`${BASE_URL}/booking/${bookingId}`)
      .headers({
        Accept: 'application/json',
        'Content-Type': 'application/json',
        Cookie: `token=${token}`,
      })
      .then(function (res) {
        expect(res.status).toBe(201);
      });
  });
Enter fullscreen mode Exit fullscreen mode

Executando os testes

Além de asserções de status code, podemos fazer outras, então explore a vontade de acordo com os objetivos de cada teste.

No package.json adicione aos scripts:

"scripts": {
    "test": "vitest"
  },
Enter fullscreen mode Exit fullscreen mode

No terminal execute o comando:

npm test
Enter fullscreen mode Exit fullscreen mode

O output com o resultado dos testes será esse:

Image description


Concluindo

Minha principal intenção com esse material, além de contribuir de alguma forma com a comunidade, foi a organização das informações, aplicação e transferência de conhecimento.

Top comments (0)