Files
openmct/platform/features/timeline/test/controllers/swimlane/TimelineSwimlanePopulatorSpec.js
Andrew Henry 433dee0314 Update test specs to use Jasmine 3 (#2089)
* Updated Karma and Jasmine versions

* Added DOMObserver class. Supports promise-based testing of DOM changes

Update asynchronous test specs to use promises or done() instead of waitsFor/runs

* Modified ActionCapability to duplicate context object properties as own properties for better object equality comparisons

* Global find + replace to fix syntax issues

* Fixed various issues caused by non-deterministic runtime order of tests in Jasmine 3. Fixed issues caused by changes to determination of object equality

* Addressed review comments

* Resolved merge conflicts with master

* Fixed style errors

* Use spy.calls.count() instead of manually tracking
2018-06-29 17:32:59 -07:00

164 lines
6.3 KiB
JavaScript

/*****************************************************************************
* Open MCT, Copyright (c) 2009-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(
['../../../src/controllers/swimlane/TimelineSwimlanePopulator'],
function (TimelineSwimlanePopulator) {
describe("A Timeline swimlane populator", function () {
var mockLoader,
mockSelection,
testConfiguration,
mockDomainObject,
mockDomainObjects,
mockCallback,
populator;
function asPromise(value) {
return (value || {}).then ? value : {
then: function (callback) {
return asPromise(callback(value));
}
};
}
function makeMockDomainObject(id, composition) {
var mockDomainObj = jasmine.createSpyObj(
'domainObject-' + id,
['getId', 'getModel', 'getCapability', 'useCapability']
);
mockDomainObj.getId.and.returnValue(id);
mockDomainObj.getModel.and.returnValue({ composition: composition });
mockDomainObj.useCapability.and.returnValue(asPromise(false));
return mockDomainObj;
}
function subgraph(domainObject, objects) {
function lookupSubgraph(id) {
return subgraph(objects[id], objects);
}
return {
domainObject: domainObject,
composition: domainObject.getModel().composition
.map(lookupSubgraph)
};
}
beforeEach(function () {
mockLoader = jasmine.createSpyObj('objectLoader', ['load']);
mockDomainObject = makeMockDomainObject('a', ['b', 'c']);
mockDomainObjects = {
a: mockDomainObject,
b: makeMockDomainObject('b', ['d']),
c: makeMockDomainObject('c', ['e', 'f']),
d: makeMockDomainObject('d', []),
e: makeMockDomainObject('e', []),
f: makeMockDomainObject('f', [])
};
mockSelection = jasmine.createSpyObj(
'selection',
['get', 'select', 'proxy']
);
mockCallback = jasmine.createSpy('callback');
testConfiguration = {};
mockLoader.load.and.returnValue(asPromise(subgraph(
mockDomainObject,
mockDomainObjects
)));
populator = new TimelineSwimlanePopulator(
mockLoader,
testConfiguration,
mockSelection
);
});
it("uses the loader to find subgraph", function () {
populator.populate(mockDomainObject);
expect(mockLoader.load).toHaveBeenCalledWith(
mockDomainObject,
'timespan'
);
});
it("provides a list of swimlanes", function () {
populator.populate(mockDomainObject);
// Ensure swimlane order matches depth-first search
expect(populator.get().map(function (swimlane) {
return swimlane.domainObject;
})).toEqual([
mockDomainObjects.a,
mockDomainObjects.b,
mockDomainObjects.d,
mockDomainObjects.c,
mockDomainObjects.e,
mockDomainObjects.f
]);
});
it("clears swimlanes if no object is provided", function () {
populator.populate();
expect(populator.get()).toEqual([]);
});
it("preserves selection state when possible", function () {
// Repopulate swimlanes
populator.populate(mockDomainObject);
// Act as if something is already selected
mockSelection.get.and.returnValue(populator.get()[1]);
// Verify precondition
expect(mockSelection.select).not.toHaveBeenCalled();
// Repopulate swimlanes
populator.populate(mockDomainObject);
// Selection should have been preserved
expect(mockSelection.select).toHaveBeenCalled();
expect(mockSelection.select.calls.mostRecent().args[0].domainObject)
.toEqual(mockDomainObjects.b);
});
it("exposes a selection proxy for the timeline", function () {
populator.populate(mockDomainObject);
expect(mockSelection.proxy).toHaveBeenCalled();
});
it("allows selection object to be changed", function () {
var mockNewSelectionObject = jasmine.createSpyObj(
'new-selection',
['get', 'select', 'proxy']
);
populator.selection(mockNewSelectionObject);
expect(mockNewSelectionObject.proxy)
.toHaveBeenCalled();
});
});
}
);