Skip to main content

Test guidelines and tooling

tip

Test functionality not implementation

Implementation should change, tests should warn you when the functionality is broken.

Unit tests

  • jest
foo.ts
export const bar = (value: number) => {
return value+1;
}
foo.test.ts
import {bar} from './foo';

describe('foo module', () => {
it('should work as expected', () => {
expect(bar(0)).toBe(1);
});
});

API tests

  • supertest
myRouter.ts
import express from 'express';
import doc from './base/apiDoc';
import license from './base/licence';

const router = express.Router();

router.get('/foo', (req, res) => {
res.status(200).send({value: 42})
});

export default router;
myRouter.test.ts
import request from 'supertest';
import router from './myRouter';
import { setupServer } from 'src/server';

const server = setupServer(app);

describe('My router', () => {
it('should give the correct response', () => {
return request(server).get('/foo')
.expect(200)
.then(res => {
expect(res.body).toMatchObject({value: 42})
})
});
});

Persistency tests

  • mongodb-memory-server
someRepository.ts
import mongoose from 'mongoose';
const schema = new mongoose.Schema({ name: 'string' });
export const User = mongoose.model('User', schema);
someRepository.test.ts
import initdb from 'src/db';
import mongoose from 'mongoose';
import { MongoMemoryServer } from 'mongodb-memory-server';
import { User } from './someRepository';

describe('db connection', () => {
let dbServer: MongoMemoryServer;
let connection: mongoose.Connection;

beforeAll(async () => {
dbServer = await MongoMemoryServer.create();
connection = await initdb(dbServer.getUri());
});

afterAll(() => {
connection.close();
dbServer.stop();
});

it('should insert a doc into collection', async () => {
const mockUser = { name: 'John' };
const user = new User(mockUser);
const { _id } = await user.save();

const insertedUser = await User.findOne({ _id });
expect(insertedUser).toMatchObject(mockUser);
});
});

Test setup

See jest.config.ts for test settings.

Test configuration options are defined in config/test.yaml and can be optionally overriden in config/local-test.yaml.

Coverage and Qualimetry

Coverage report is generated when running tests and it's available under the coverage folder (see coverage/lcov-report/index.html for a comprehensive report)

TODO setup sonarqube