Files
shields/services/service-tester.js
Paul Melnikow ea4b758612 Move service tests alongside code (#1563)
Per discussion in #1543
2018-03-20 18:32:48 -07:00

74 lines
1.9 KiB
JavaScript

'use strict';
const frisby = require('icedfrisby-nock')(require('icedfrisby'));
const config = require('../lib/test-config');
/**
* Encapsulate a suite of tests. Create new tests using create() and register
* them with Mocha using toss().
*/
class ServiceTester {
/**
* @param attrs { id, title, pathPrefix } The `id` is used to specify which
* tests to run from the CLI or pull requests. The `title` prints in the
* Mocha output. The `path` is the path prefix which is automatically
* prepended to each tested URI. The default is `/${attrs.id}`.
*/
constructor (attrs) {
Object.assign(this, {
id: attrs.id,
title: attrs.title,
pathPrefix: attrs.pathPrefix === undefined
? `/${attrs.id}`
: attrs.pathPrefix,
specs: [],
_only: false
});
}
/**
* Invoked before each test. This is a stub which can be overridden on
* instances.
*/
beforeEach () {}
/**
* Create a new test. The hard work is delegated to IcedFrisby.
* https://github.com/MarkHerhold/IcedFrisby/#show-me-some-code
*
* Note: The caller should not invoke toss() on the Frisby chain, as it's
* invoked automatically by the tester.
* @param msg The name of the test
*/
create (msg) {
const spec = frisby.create(msg)
.baseUri(`http://localhost:${config.port}${this.pathPrefix}`)
.before(() => { this.beforeEach(); });
this.specs.push(spec);
return spec;
}
/**
* Run only this tester. This can be invoked using the --only argument to
* the CLI, or directly on the tester.
*/
only () {
this._only = true;
}
/**
* Register the tests with Mocha.
*/
toss () {
const specs = this.specs;
const fn = this._only ? describe.only : describe;
fn(this.title, function () {
specs.forEach(spec => { spec.toss(); });
});
}
}
module.exports = ServiceTester;