CheatSheetExtra

A ideia aqui é realmente funcionar como uma colinha para mim!

Testes de integração -> testes de rotas/endpoints -> utiliza do supertest

exemplo de teste de endpoint:

/* eslint-disable prefer-arrow-callback */
const Sails = require('sails');
const supertest = require('supertest');
const assert = require('assert');

let sailsApp;

before(function (done) {
  this.timeout(20000); // Aumentar o timeout para 20 segundos

  Sails.lift(
    {
      hooks: { grunt: false, csrf: false },
      log: { level: 'warn' },
      models: { migrate: 'drop' },
    },
    function (err, server) {
      if (err) {return done(err);}
      sailsApp = server;
      done();
    }
  );
});

after(function (done) {
  Sails.lower(done);
});

describe('ProductController', function () {
  let productId;

  it('Deve criar um novo produto', function (done) {
    supertest(sailsApp.hooks.http.app)
      .post('/product/create')
      .send({ name: 'Produto 1', description: 'Descrição do Produto 1', price: 10 })
      .expect(200)
      .end(function (err, res) {
        if (err) {return done(err);}
        assert.strictEqual(typeof res.body, 'object');
        assert.ok(res.body.id);
        assert.strictEqual(res.body.name, 'Produto 1');
        assert.strictEqual(res.body.description, 'Descrição do Produto 1');
        assert.strictEqual(res.body.price, 10);
        productId = res.body.id;
        done();
      });
  });

  it('Deve retornar o produto criado', function (done) {
    supertest(sailsApp.hooks.http.app)
      .get(`/product/${productId}`)
      .expect(200)
      .end(function (err, res) {
        if (err) {return done(err);}
        assert.strictEqual(typeof res.body, 'object');
        assert.strictEqual(res.body.id, productId);
        assert.strictEqual(res.body.name, 'Produto 1');
        done();
      });
  });

  it('Deve retornar todos os produtos', function (done) {
    supertest(sailsApp.hooks.http.app)
      .get('/products')
      .expect(200)
      .end(function (err, res) {
        if (err) {return done(err);}
        assert.ok(Array.isArray(res.body));
        assert.strictEqual(res.body.length, 1); // Esperamos apenas um produto
        done();
      });
  });

  it('Deve atualizar o produto', function (done) {
    supertest(sailsApp.hooks.http.app)
      .put(`/product/${productId}`)
      .send({ name: 'Produto Atualizado', price: 20 })
      .expect(200)
      .end(function (err, res) {
        if (err) {return done(err);}
        assert.strictEqual(typeof res.body, 'object');
        assert.strictEqual(res.body.id, productId);
        assert.strictEqual(res.body.name, 'Produto Atualizado');
        assert.strictEqual(res.body.price, 20);
        done();
      });
  });

  it('Deve deletar o produto', function (done) {
    supertest(sailsApp.hooks.http.app)
      .delete(`/product/${productId}`)
      .expect(200)
      .end(function (err, res) {
        if (err) {return done(err);}
        assert.strictEqual(typeof res.body, 'object');
        assert.strictEqual(res.body.id, productId);
        done();
      });
  });

  it('Deve retornar 404 para produto não encontrado', function (done) {
    supertest(sailsApp.hooks.http.app)
      .get(`/product/${productId}`)
      .expect(404)
      .end(function (err, res) {
        if (err) {return done(err);}
        assert.strictEqual(typeof res.text, 'string');
        assert.strictEqual(res.text, '{\n  "error": "não encontrado"\n}'
);
        done();
      });
  });
});