From 136969bf1856030e58bcf83774729ac77c5965e3 Mon Sep 17 00:00:00 2001 From: Igor Date: Fri, 15 Nov 2019 09:26:34 -0300 Subject: [PATCH] Add servicesManager test and registerServices method --- platform/core/src/services/ServicesManager.js | 42 ++++++++++- .../core/src/services/ServicesManager.test.js | 70 +++++++++++++++++++ platform/viewer/src/App.js | 2 +- 3 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 platform/core/src/services/ServicesManager.test.js diff --git a/platform/core/src/services/ServicesManager.js b/platform/core/src/services/ServicesManager.js index 0e38e5695..4b71a580a 100644 --- a/platform/core/src/services/ServicesManager.js +++ b/platform/core/src/services/ServicesManager.js @@ -1,9 +1,49 @@ +import log from './../log.js'; + export default class ServicesManager { constructor() { this.services = {}; + this.registeredServiceNames = []; } - register(service) { + /** + * + * @param {Object} service + */ + registerService(service) { + if (!service) { + log.warn( + 'Attempting to register a null/undefined service. Exiting early.' + ); + return; + } + + let serviceName = service.name; + + if (!serviceName) { + log.warn(`Service name not set. Exiting early.`); + return; + } + + if (this.registeredServiceNames.includes(serviceName)) { + log.warn( + `Extension name ${serviceName} has already been registered. Exiting before duplicating services.` + ); + return; + } + this.services[service.name] = service; + + // Track service registration + this.registeredServiceNames.push(serviceName); + } + + /** + * An array of services. + * + * @param {Object[]} services - Array of services + */ + registerServices(services) { + services.forEach(service => this.registerService(service)); } } diff --git a/platform/core/src/services/ServicesManager.test.js b/platform/core/src/services/ServicesManager.test.js new file mode 100644 index 000000000..71ec25432 --- /dev/null +++ b/platform/core/src/services/ServicesManager.test.js @@ -0,0 +1,70 @@ +import ServicesManager from './ServicesManager.js'; +import log from '../log.js'; + +jest.mock('./../log.js'); + +describe('ServicesManager.js', () => { + let servicesManager; + + beforeEach(() => { + servicesManager = new ServicesManager(); + log.warn.mockClear(); + jest.clearAllMocks(); + }); + + describe('registerServices()', () => { + it('calls registerService() for each service', () => { + servicesManager.registerService = jest.fn(); + + const fakeServices = [ + { name: 'UINotificationTestService', hide: jest.fn() }, + { name: 'UIModalTestService', hide: jest.fn() }, + ]; + + servicesManager.registerServices(fakeServices); + + expect(servicesManager.registerService.mock.calls.length).toBe(2); + }); + }); + + describe('registerService()', () => { + it('logs a warning if the service is null or undefined', () => { + const undefinedService = undefined; + const nullService = null; + + servicesManager.registerService(undefinedService); + servicesManager.registerService(nullService); + + expect(log.warn.mock.calls.length).toBe(2); + }); + + it('logs a warning if the service does not have a name', () => { + const serviceWithEmptyName = { name: '', hide: jest.fn() }; + const serviceWithoutName = { hide: jest.fn() }; + + servicesManager.registerService(serviceWithEmptyName); + servicesManager.registerService(serviceWithoutName); + + expect(log.warn.mock.calls.length).toBe(2); + }); + + it('tracks which services have been registered', () => { + const service = { + name: 'UINotificationService', + }; + + servicesManager.registerService(service); + + expect(servicesManager.registeredServiceNames).toContain(service.name); + }); + + it('logs a warning if the service has an name that has already been registered', () => { + const service = { name: 'UINotificationService' }; + + servicesManager.registerService(service); + servicesManager.registerService(service); + + expect(log.warn.mock.calls.length).toBe(1); + }); + }); +}); diff --git a/platform/viewer/src/App.js b/platform/viewer/src/App.js index c496b5428..7dc1f0bcf 100644 --- a/platform/viewer/src/App.js +++ b/platform/viewer/src/App.js @@ -185,7 +185,7 @@ class App extends Component { } function _initServices(services) { - services.forEach(service => servicesManager.register(service)); + servicesManager.registerServices(services); } /**