/// import Installation from '../../../build/server/modules/installation'; import {LoggerMock, WebSocketMock, childProcessMock, PluginSystemMock, DepManagerMock} from '../../support/servermocks'; import * as proxyquire from 'proxyquire'; import * as q from 'q'; describe('Server - Modules - Installation:', () => { let module: Installation; let websocket: WebSocketMock; let logger: LoggerMock; let ps: PluginSystemMock; let depManager: DepManagerMock; beforeEach(() => { websocket = new WebSocketMock(); logger = new LoggerMock(); ps = new PluginSystemMock(); depManager = new DepManagerMock(); let installMod = proxyquire('../../../build/server/modules/installation', { 'child_process': childProcessMock }).default; module = new installMod(websocket, logger, ps, depManager); }); it('register websocket listener for install, fileUpload & fileUploadStart', () => { expect(websocket.clientListener['install']).toBeDefined(); expect(websocket.clientListener['fileUpload']).toBeDefined(); expect(websocket.clientListener['fileUploadStart']).toBeDefined(); }); it('install npm package', () => { spyOn(childProcessMock, 'spawn').and.callThrough(); spyOn(logger, 'log'); module.installListener('myModule'); let options: any = {}; if (process.platform === 'win32') { options.shell = true; } expect(childProcessMock.spawn) .toHaveBeenCalledWith('npm', ['install', '--save', 'myModule'], options); expect(logger.log).toHaveBeenCalledWith('stdout'); expect(logger.log).toHaveBeenCalledWith('stderr'); }); it('merge configs on successful installations', () => { module.installListener('myModule'); expect(childProcessMock.events['close']).toBeDefined(); spyOn(module, 'mergeConfigs'); childProcessMock.events['close'](0); expect(module.mergeConfigs).toHaveBeenCalled(); }); it('failed log + no config merge on failed installations', () => { module.installListener('myModule'); expect(childProcessMock.events['close']).toBeDefined(); spyOn(logger, 'log'); spyOn(module, 'mergeConfigs'); childProcessMock.events['close'](1); expect(logger.log).toHaveBeenCalledWith('Installation failed with Error Code: 1'); expect(module.mergeConfigs).not.toHaveBeenCalled(); }); it('exit on installtion escape with &&', () => { spyOn(childProcessMock, 'spawn'); module.installListener('myModule && echo "hacked"'); expect(childProcessMock.spawn).not.toHaveBeenCalled(); }); it('merge configs successfully', (done) => { depManager.initialise = () => { let deffered = q.defer(); deffered.resolve({ a: 'a', b: 'b' }); return deffered.promise; }; let checkFake = () => {return true; }; spyOn(module, 'checkConfigsforAllDeps').and.callFake(checkFake); spyOn(logger, 'log'); spyOn(ps, 'restart'); spyOn(depManager, 'initialise').and.callThrough(); module.mergeConfigs().then(() => { expect(module.checkConfigsforAllDeps).toHaveBeenCalledWith(['a', 'b']); expect(logger.log).toHaveBeenCalledWith('Installation succesfully completed'); expect(ps.restart).toHaveBeenCalled(); expect(depManager.initialise).toHaveBeenCalledTimes(2); done(); }); }); it('merge configs failed', (done) => { depManager.initialise = () => { let deffered = q.defer(); deffered.resolve({}); return deffered.promise; }; let checkFake = () => {throw Error('failed'); }; spyOn(module, 'checkConfigsforAllDeps').and.callFake(checkFake); spyOn(logger, 'log'); spyOn(ps, 'restart'); spyOn(depManager, 'initialise').and.callThrough(); module.mergeConfigs().then(() => { expect(logger.log).toHaveBeenCalledWith('Installation failed'); expect(ps.restart).not.toHaveBeenCalled(); done(); }); }); it('checkConfigsforAllDeps', () => { let mergeFake = () => {return {then: (fn: Function) => {fn(); }}; }; spyOn(module, 'mergeConfigForPlugin').and.callFake(mergeFake); let deps = [ {webendConfig: 'a config', name: 'a'}, {name: 'b'}, {webendConfig: 'c config', name: 'c'} ]; module.checkConfigsforAllDeps(deps); expect(module.mergeConfigForPlugin).toHaveBeenCalledTimes(2); expect(module.mergeConfigForPlugin).toHaveBeenCalledWith('a', 'a config'); expect(module.mergeConfigForPlugin).toHaveBeenCalledWith('c', 'c config'); }); it('mergeConfigForPlugin not empty', () => { let conf = { //readed config from config file enabled: 'plugins activation', plugins: { webend_server: 'some configs' } }; let config = 'new config'; //new config from installation (module).configuration = { readConfigFile: () => {return {then: (fn: Function) => {fn(conf); }}; }, writeConfigFile: () => {} }; spyOn(module, 'assignConfigToDefault'); spyOn((module).configuration, 'writeConfigFile'); module.mergeConfigForPlugin('webend_server', config); expect(module.assignConfigToDefault).toHaveBeenCalledWith(config, 'some configs'); expect((module).configuration.writeConfigFile).toHaveBeenCalledWith({ enabled: 'plugins activation', plugins: { webend_server: 'new config' } }); }); it('mergeConfigForPlugin -> entry does not exist -> create', () => { let conf = { //readed config from config file enabled: 'plugins activation', plugins: {} }; let config = 'new config'; //new config from installation (module).configuration = { readConfigFile: () => {return {then: (fn: Function) => {fn(conf); }}; }, writeConfigFile: () => {} }; spyOn(module, 'assignConfigToDefault'); spyOn((module).configuration, 'writeConfigFile'); module.mergeConfigForPlugin('webend_server', config); expect(module.assignConfigToDefault).toHaveBeenCalledWith(config, {}); expect((module).configuration.writeConfigFile).toHaveBeenCalledWith({ enabled: 'plugins activation', plugins: { webend_server: 'new config' } }); }); it('assignConfigToDefault -> no parameter empty', () => { let def = { a: 'abc', b: { c: 123, d: 'new' } }; let existing = { a: 'xyz', b: { c: 789 }, e: 'old' }; module.assignConfigToDefault(def, existing); expect(def.a).toEqual('xyz'); expect(def.b.c).toEqual(789); expect(def.b.d).toEqual('new'); expect((def).e).toBeUndefined(); }); it('assignConfigToDefault -> def undefined', () => { //should not throw an error module.assignConfigToDefault(undefined, {a: 'myConfig'}); }); it('assignConfigToDefault -> def {}', () => { let def = {}; module.assignConfigToDefault(def, {a: 'myConfig'}); expect(def).toEqual({}); }); it('assignConfigToDefault -> my undefined', () => { let def = {new: 'myConfig'}; module.assignConfigToDefault(def, null); expect(def).toEqual({new: 'myConfig'}); }); });