UNPKG

asch-redeploy

Version:

A hassle-free local asch environment

281 lines (246 loc) 7.68 kB
const DI = require('../../src/DI') const should = require('should') const mockFs = require('mock-fs') const EventEmitter = require('events') describe('service', function () { const container = DI.container const registerConstant = DI.helpers.registerConstantValue(container) beforeEach('setup', function () { // logger const Logger = { info (text, config) { }, verbose (text, config) { }, warn (test, config) { }, error (text, config) { } } DI.container.unbind(DI.DEPENDENCIES.Logger) registerConstant(DI.DEPENDENCIES.Logger, Logger) }) afterEach('cleanup', function () { DI.resetConstants() mockFs.restore() }) describe('happy path', function () { it('DI worked', function (done) { let service = container.get(DI.FILETYPES.Service) should(service).be.ok() should(service).have.property('config') should(service).have.property('logger') should(service).have.property('moment') should(service).have.property('path') should(service).have.property('fs') should(service).have.property('EventEmitter') should(service).have.property('createLogDir') should(service).have.property('fork') should(service).have.property('pathResolution') done() }) it('service forks new process that writes to log file', function (done) { mockFs({ '/home/user/asch': { 'app.js': 'write_to_appjs' }, '/home/user/dapp': { 'logs': {} } }) let Config = { node: { directory: '/home/user/asch' }, userDevDir: '/home/user/dapp' } container.unbind(DI.DEPENDENCIES.Config) registerConstant(DI.DEPENDENCIES.Config, Config) let CreateLogDir = function (config, fs, path, moment) { this.config = config this.fs = fs this.path = path this.moment = moment CreateLogDir.createdLogDir = false CreateLogDir.returnedFileDescriptor = false this.createDirSync = () => { CreateLogDir.createdLogDir = true return '/home/user/dapp/logs' } this.createLogFileNameHandleSync = (logDir) => { CreateLogDir.returnedFileDescriptor = true return 'asch-node-2017-01-01.log' } } container.unbind(DI.FILETYPES.CreateLogDir) DI.helpers.annotate(CreateLogDir, [DI.DEPENDENCIES.Config, DI.DEPENDENCIES.Fs, DI.DEPENDENCIES.Path, DI.DEPENDENCIES.Moment]) container.bind(DI.FILETYPES.CreateLogDir).to(CreateLogDir) let Fork = (path, args, option) => { return new EventEmitter() } container.unbind(DI.DEPENDENCIES.Fork) registerConstant(DI.DEPENDENCIES.Fork, Fork) // overwrite let service = container.get(DI.FILETYPES.Service) service.start() .then((result) => { should(CreateLogDir).have.property('createdLogDir') should(CreateLogDir.createdLogDir).equals(true) should(CreateLogDir).have.property('returnedFileDescriptor') should(CreateLogDir.returnedFileDescriptor).equals(true) done() }) .catch((error) => { throw error }) }) it('stopping service kills forked process and sends SIGTERM to forked process', function (done) { mockFs({ '/home/user/asch': { 'app.js': 'write_to_appjs' }, '/home/user/dapp': { 'logs': {} } }) let Config = { node: { directory: '/home/user/asch' }, userDevDir: '/home/user/dapp' } container.unbind(DI.DEPENDENCIES.Config) registerConstant(DI.DEPENDENCIES.Config, Config) let Fork = (path, args, option) => { Fork.killed = false Fork.killVerb = '' Fork.called = 0 let eventEmitter = new EventEmitter() eventEmitter.kill = function (verb) { Fork.killed = true Fork.killVerb = verb Fork.called += 1 } return eventEmitter } container.unbind(DI.DEPENDENCIES.Fork) registerConstant(DI.DEPENDENCIES.Fork, Fork) let service = container.get(DI.FILETYPES.Service) service.start() .then(() => { return service.stop() }) .then((result) => { should(Fork).have.property('killed') should(Fork.killed).equals(true) should(Fork).have.property('killVerb') should(Fork.killVerb).equals('SIGTERM') should(Fork).have.property('called') should(Fork.called).equals(1) done() }) .catch((error) => { throw error }) }) it('stopping service emits exit with exit code', function (done) { let exitCode = 1 mockFs({ '/home/user/asch': { 'app.js': 'write_to_appjs' }, '/home/user/dapp': { 'logs': {} } }) let Config = { node: { directory: '/home/user/asch' }, userDevDir: '/home/user/dapp' } container.unbind(DI.DEPENDENCIES.Config) registerConstant(DI.DEPENDENCIES.Config, Config) let Fork = (path, args, option) => { let eventEmitter = new EventEmitter() eventEmitter.kill = function (verb) { eventEmitter.emit('exit', exitCode) } return eventEmitter } container.unbind(DI.DEPENDENCIES.Fork) registerConstant(DI.DEPENDENCIES.Fork, Fork) let service = container.get(DI.FILETYPES.Service) service.notifier.on('exit', function (code) { should(code).equals(exitCode) done() }) service.start() .then(() => { return service.stop() }) .catch((error) => { throw error }) }) }) describe('sad path', function () { it('call stop() without start() throws exception', function (done) { let service = container.get(DI.FILETYPES.Service) service.stop() .then((result) => { throw new Error() }) .catch((error) => { should(error.message).startWith('no_process_started') done() }) }) it('call start() stop() and again stop() should throw exception', function (done) { mockFs({ '/home/user/asch': { 'app.js': 'write_to_appjs' }, '/home/user/dapp': { 'logs': {} } }) let Config = { node: { directory: '/home/user/asch' }, userDevDir: '/home/user/dapp' } container.unbind(DI.DEPENDENCIES.Config) registerConstant(DI.DEPENDENCIES.Config, Config) let Fork = (path, args, option) => { let eventEmitter = new EventEmitter() Fork.killedTimes = 0 eventEmitter.kill = function () { Fork.killedTimes += 1 eventEmitter.emit('exit', 1) } return eventEmitter } container.unbind(DI.DEPENDENCIES.Fork) registerConstant(DI.DEPENDENCIES.Fork, Fork) let service = container.get(DI.FILETYPES.Service) service.start() .then(() => { return service.stop() }) .then(() => { return service.stop() }) .then(() => { throw new Error('shouldnt come to here') }) .catch((error) => { should(error.message).startWith('no_process_started') should(Fork).have.property('killedTimes') should(Fork.killedTimes).equals(1) done() }) }) }) })