Skip to content

Testing Igo Applications

Testing your application is super important. Igo helps to write efficient tests easily.

Igo uses Mocha test framework, and offers more features:

  • Testing controllers layer with superagent
  • Automatic test database reinitialization before first test
  • Test isolation: each test runs in a transaction that is rollbacked

Introduction

All tests run in the test environment, which allows you to define specific configuration for your tests.

All the tests must include this Igo Test init instruction:

js
require('@igojs/server').dev.test();

This function will initialize the Mocha test suite, and do the following:

  • reinitialize the 'test' database : drop, create, and execute all the /sql/*.sql files
  • Flush the cache (Redis)
  • Begin a DB transaction before each test
  • Rollback the DB transaction after each test

How to write a test

Here is a basic test example

js

require('@igojs/server').dev.test();

var assert    = require('assert');
var DateUtils = require('../../app/utils/DateUtils');

describe('utils/DateUtils', () => {
  describe('startOfDay', () => {
    it('should return start of day', async () => {
      var d     = new Date();
      var start = DateUtils.startOfDay(d);
      assert.strictEqual(start.getHours(), 0);
      assert.strictEqual(start.getMinutes(), 0);
      assert.strictEqual(start.getSeconds(), 0);
    });
  });
});

Testing the Controller Layer

Here are some basic tests for controllers.

Test redirection

js
require('@igojs/server').dev.test();

var assert = require('assert');
var agent = require('@igojs/server').dev.agent;

describe('controllers/IndexController', () => {
  describe('/', () => {
    // redirection test
    it('should redirect to /foo', async () => {
      const res = await agent.get('/');
      assert.strictEqual(res.statusCode, 302);
      assert.strictEqual(res.redirectUrl, '/foo');
    });
  });
});

Test body in HTML response

The HTML response is set in res.body.

js
//...
it('should show form', async () => {
  const res = await agent.get('/foo');
  assert.strictEqual(res.statusCode, 200);
  assert(res.body.match(/<form /));
  done();
});
//...

Test JSON response

The JSON response is set in res.data.

js
//...
it('should return user and login', async () => {
  const user = await User.create({login: 'John'});
  var req = {
    body: {
      login: user.login,
    }
  };
  const res = await agent.post('/api/login', req);
  assert(res.data.id);
  assert.strictEqual(res.data.login, user.login);
  done();
});
//...

Released under the ISC license.