///
import * as proxyquire from 'proxyquire';
let config: any = {plugins: {}};
let system = proxyquire('../../build/pluginsystem/system', {
'../helper': {getPluginConfig: () => {return config; }}
}).System;
describe('PluginSystem - System:', () => {
beforeEach(() => {
//dont show up console logs which are informing control system
spyOn(console, 'log');
});
it('check injector bindings on startup', () => {
let module = new system();
console.log((module).pluginInjector.get('injector'));
console.log((module).pluginInjector.get('status'));
console.log((module).pluginInjector.get('config'));
expect((module).pluginInjector.get('injector')).toBeDefined();
expect((module).pluginInjector.get('status')).toBeDefined();
expect((module).pluginInjector.get('config')).toBeDefined();
});
it('start - deps already initialised', () => {
let scope = {
depManager: {
isInitialised: () => {return true; },
getPlugins: () => {return 'plugins'; }
},
loadPlugins: () => {},
addManualStartListener: () => {}
};
spyOn(scope, 'loadPlugins');
system.prototype.start.bind(scope)();
expect(scope.loadPlugins).toHaveBeenCalledWith('plugins');
});
it('start - deps needs to be initialised', () => {
let scope = {
depManager: {
isInitialised: () => {return false; },
initialise: () => {return {then: (fn: Function) => {fn('test'); }}; }
},
loadPlugins: () => {},
addManualStartListener: () => {}
};
spyOn(scope, 'loadPlugins');
system.prototype.start.bind(scope)();
expect(scope.loadPlugins).toHaveBeenCalledWith('test');
});
it('loadPlugins', () => {
let deps = {
webend_server: {},
webend_testpage: {}
};
let scope = {
startPlugin: () => {},
changePluginStatus: () => {},
pluginInjector: {bind: () => {return {to: () => {}}; }}
};
config.enabled = {
webend_server: true,
webend_testpage: false
};
spyOn(scope, 'startPlugin');
spyOn(scope, 'changePluginStatus');
system.prototype.loadPlugins.bind(scope)(deps);
expect(scope.startPlugin).toHaveBeenCalledWith('webend_server');
expect(scope.changePluginStatus).toHaveBeenCalledWith('webend_testpage', false);
});
it('startPlugin', () => {
let scope = {
status: {webend: true},
depManager: {getPlugins: () => {return {
webend_server: {main: 'index.js'}
}; }},
pluginInjector: {bind: () => {return {load: () => {return true; }}; }},
changePluginStatus: () => {},
loadDependencies: () => {return true; }
};
spyOn(scope.pluginInjector, 'bind').and.callThrough();
spyOn(scope, 'changePluginStatus');
let started = system.prototype.startPlugin.bind(scope)('webend_server');
expect(started).toBeTruthy();
expect(scope.pluginInjector.bind).toHaveBeenCalledWith('webend_server');
expect(scope.changePluginStatus).toHaveBeenCalledWith('webend_server', true);
});
it('startPlugin -> failed to laod module', () => {
let scope = {
status: {webend: true},
depManager: {getPlugins: () => {return {
webend_server: {main: 'index.js'}
}; }},
pluginInjector: {bind: () => {return {load: () => {
throw Error('Module not found');
}}; }},
changePluginStatus: () => {},
loadDependencies: () => {return true; }
};
spyOn(scope, 'changePluginStatus');
let started = system.prototype.startPlugin.bind(scope)('webend_server');
expect(started).toBeFalsy();
expect(scope.changePluginStatus).toHaveBeenCalledWith('webend_server', false);
expect(console.log).toHaveBeenCalledWith('Could not load plugin: webend_server');
});
it('startPlugin -> frontend plugin only', () => {
let scope = {
status: {webend: true},
depManager: {getPlugins: () => {return {
webend_server: {}
}; }},
pluginInjector: {bind: () => {return {load: () => {}}; }},
changePluginStatus: () => {},
loadDependencies: () => {return true; }
};
spyOn(scope.pluginInjector, 'bind').and.callThrough();
spyOn(scope, 'changePluginStatus');
let started = system.prototype.startPlugin.bind(scope)('webend_server');
expect(started).toBeTruthy();
expect(scope.pluginInjector.bind).not.toHaveBeenCalled();
expect(scope.changePluginStatus).toHaveBeenCalledWith('webend_server', true);
});
it('startPlugin -> dependencies not available', () => {
let scope = {
status: {webend: true},
depManager: {getPlugins: () => {return {
webend_server: {main: 'index.js'}
}; }},
changePluginStatus: () => {},
loadDependencies: () => {return false; }
};
spyOn(scope, 'changePluginStatus');
let started = system.prototype.startPlugin.bind(scope)('webend_server');
expect(started).toBeFalsy();
expect(scope.changePluginStatus).toHaveBeenCalledWith('webend_server', false);
expect(console.log)
.toHaveBeenCalledWith('Dependencies coudn\'t be loaded for webend_server');
});
it('startPlugin -> System not started', () => {
let scope = {
status: {webend: false},
changePluginStatus: () => {}
};
spyOn(scope, 'changePluginStatus');
let started = system.prototype.startPlugin.bind(scope)('webend_server');
expect(started).toBeFalsy();
expect(scope.changePluginStatus).toHaveBeenCalledWith('webend_server', false);
expect(console.log)
.toHaveBeenCalledWith('System not started -> Couldn\'t start Plugin webend_server');
});
it('loadDependencies', () => {
let scope = {
status: {},
startPlugin: () => {return true; }
};
let deps = {dependencies: {
a: {},
b: {}
}};
spyOn(scope, 'startPlugin').and.callThrough();
let success = system.prototype.loadDependencies.bind(scope)(deps, 'my');
expect(success).toBeTruthy();
expect(scope.startPlugin).toHaveBeenCalledWith('a');
expect(scope.startPlugin).toHaveBeenCalledWith('b');
});
it('loadDependencies -> one not available', () => {
let scope = {
status: {},
startPlugin: (p: string) => {
if (p === 'b') return false;
return true;
}
};
let deps = {dependencies: {
a: {},
b: {}
}};
let success = system.prototype.loadDependencies.bind(scope)(deps, 'my');
expect(success).toBeFalsy();
});
it('loadDependencies -> dep required but deactivated', () => {
//status of deactivated deps will be setted to false
//required by another plugin -> load
let scope = {
status: {b: false},
startPlugin: () => {
return true;
}
};
let deps = {dependencies: {
a: {dependencies: {b: {}}},
b: {}
}};
spyOn(scope, 'startPlugin').and.callThrough();
let success = system.prototype.loadDependencies.bind(scope)(deps, 'my');
expect(success).toBeTruthy();
expect(scope.startPlugin).toHaveBeenCalledWith('a');
expect(scope.startPlugin).toHaveBeenCalledWith('b');
});
it('loadDependencies -> dep optional and deactivated', () => {
//dont start deactivated optional deps
let scope = {
status: {b: false},
startPlugin: () => {
return true;
}
};
let deps = {
dependencies: {
a: {
dependencies: {b: {}},
optionalDependencies: {b: {}}
},
b: {}
},
optionalDependencies: {b: {}}
};
spyOn(scope, 'startPlugin').and.callThrough();
let success = system.prototype.loadDependencies.bind(scope)(deps, 'my');
expect(success).toBeTruthy();
expect(scope.startPlugin).toHaveBeenCalledWith('a');
expect(scope.startPlugin).not.toHaveBeenCalledWith('b');
});
it('loadDependencies -> empty deps', () => {
let success = system.prototype.loadDependencies();
expect(success).toBeTruthy();
success = system.prototype.loadDependencies({}, 'abc');
expect(success).toBeTruthy();
});
it('loadDependencies -> dep already loaded', () => {
let scope = {
status: {a: true},
startPlugin: () => {return true; }
};
let deps = {dependencies: {
a: {}
}};
spyOn(scope, 'startPlugin').and.callThrough();
let success = system.prototype.loadDependencies.bind(scope)(deps, 'my');
expect(success).toBeTruthy();
expect(scope.startPlugin).not.toHaveBeenCalled();
expect(console.log).not.toHaveBeenCalled();
});
it('changePluginStatus', () => {
let scope: any = {
status: {},
socket: {changedStatus: () => {}}
};
spyOn(scope.socket, 'changedStatus');
system.prototype.changePluginStatus.bind(scope)('a', true);
expect(scope.status['a']).toBeTruthy();
expect(scope.socket.changedStatus).toHaveBeenCalledWith(scope.status);
});
});