diff --git a/src/api/objects/RootObjectProvider.js b/src/api/objects/RootObjectProvider.js index fce0d26704..4b44d66f9c 100644 --- a/src/api/objects/RootObjectProvider.js +++ b/src/api/objects/RootObjectProvider.js @@ -37,7 +37,7 @@ define([ composition: roots }; }); - } + }; return RootObjectProvider; }); diff --git a/src/api/objects/RootRegistry.js b/src/api/objects/RootRegistry.js index b2971be176..cb0ff5d167 100644 --- a/src/api/objects/RootRegistry.js +++ b/src/api/objects/RootRegistry.js @@ -38,11 +38,14 @@ define([ .then(_.flatten); }; + function isKey(key) { + return _.isObject(key) && _.has(key, 'key') && _.has(key, 'namespace'); + } RootRegistry.prototype.addRoot = function (key) { - if (_.isObject(key) && _.has(key, 'identifier') && _.has(key, 'namespace')) { + if (isKey(key) || (_.isArray(key) && _.every(key, isKey))) { this.providers.push(function () { - return Promise.resolve(key); + return key; }); } else if (_.isFunction(key)) { this.providers.push(key); diff --git a/src/api/objects/test/RootObjectProviderSpec.js b/src/api/objects/test/RootObjectProviderSpec.js new file mode 100644 index 0000000000..2734c2e55f --- /dev/null +++ b/src/api/objects/test/RootObjectProviderSpec.js @@ -0,0 +1,59 @@ +/***************************************************************************** + * Open MCT, Copyright (c) 2014-2016, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +define([ + '../RootObjectProvider' +], function ( + RootObjectProvider +) { + describe('RootObjectProvider', function () { + var rootRegistry, + rootObjectProvider; + + function done() { + var isDone = false; + waitsFor(function () { + return isDone; + }); + return function () { + isDone = true; + }; + } + + beforeEach(function () { + rootRegistry = jasmine.createSpyObj('rootRegistry', ['getRoots']); + rootRegistry.getRoots.andReturn(Promise.resolve(['some root'])); + rootObjectProvider = new RootObjectProvider(rootRegistry); + }); + + it('supports fetching root', function () { + rootObjectProvider.get() + .then(function (root) { + expect(root).toEqual({ + name: 'The root object', + type: 'root', + composition: ['some root'] + }); + }) + .then(done()); + }); + }); +}); diff --git a/src/api/objects/test/RootRegistrySpec.js b/src/api/objects/test/RootRegistrySpec.js new file mode 100644 index 0000000000..4f918b9eb0 --- /dev/null +++ b/src/api/objects/test/RootRegistrySpec.js @@ -0,0 +1,102 @@ +/***************************************************************************** + * Open MCT, Copyright (c) 2014-2016, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +define([ + '../RootRegistry' +], function ( + RootRegistry +) { + describe('RootRegistry', function () { + var idA, + idB, + idC, + registry; + + function done() { + var isDone = false; + waitsFor(function () { + return isDone; + }); + return function () { + isDone = true; + }; + } + + beforeEach(function () { + idA = {key: 'keyA', namespace: 'something'}; + idB = {key: 'keyB', namespace: 'something'}; + idC = {key: 'keyC', namespace: 'something'}; + registry = new RootRegistry(); + }); + + it('can register a root by key', function () { + registry.addRoot(idA); + registry.getRoots() + .then(function (roots) { + expect(roots).toEqual([idA]); + }) + .then(done()); + }); + + it('can register multiple roots by key', function () { + registry.addRoot([idA, idB]); + registry.getRoots() + .then(function (roots) { + expect(roots).toEqual([idA, idB]); + }) + .then(done()); + }); + + it('can register an asynchronous root ', function () { + registry.addRoot(function () { + return Promise.resolve(idA); + }); + registry.getRoots() + .then(function (roots) { + expect(roots).toEqual([idA]); + }) + .then(done()); + }); + + it('can register multiple asynchronous roots', function () { + registry.addRoot(function () { + return Promise.resolve([idA, idB]); + }); + registry.getRoots() + .then(function (roots) { + expect(roots).toEqual([idA, idB]); + }) + .then(done()); + }); + + it('can combine different types of registration', function () { + registry.addRoot([idA, idB]); + registry.addRoot(function () { + return Promise.resolve([idC]); + }); + registry.getRoots() + .then(function (roots) { + expect(roots).toEqual([idA, idB, idC]); + }) + .then(done()); + }); + }); +});