Compare commits

...

22 Commits

Author SHA1 Message Date
ffa730bd7b bump timeoutInterval 2020-08-07 15:41:11 -07:00
904a3c62bc only one openmct. 2020-08-07 15:20:02 -07:00
399b501351 changed to ChromeHeadless and added extra karma props. 2020-08-07 14:47:07 -07:00
b28b9c7b69 Switch back to FF headless 2020-08-07 11:01:46 -07:00
f40a4c493c Do not throw an error if root returns no children 2020-08-07 10:47:29 -07:00
3cd3f50890 Remove BeforeAll 2020-08-07 10:43:49 -07:00
3ad2933ba7 make resetApplicationState return a promise 2020-08-07 10:31:34 -07:00
66fb2f1acd re-enable coverage, re-enable disabled tests 2020-08-06 16:40:45 -07:00
03d56afd09 Disabled legacy tests 2020-08-06 16:36:01 -07:00
46bfbc240b Updated library versions 2020-08-06 15:56:22 -07:00
8f35af8edf Run test instead of test:coverage for better error tracing 2020-08-06 15:49:18 -07:00
1ad7d4faf3 Disable URL synchronizer 2020-08-06 15:38:53 -07:00
9f2c146107 refresh cache 2020-08-06 15:31:50 -07:00
e904d5a771 Introduce mock DataTransfer object to fix issue with firefox 2020-08-06 15:24:33 -07:00
0a3ce6dc91 Still experimenting with specs 2020-08-06 09:39:23 -07:00
a301607b7d Fixed memory leak in URLTimeSettingsSynchronizer 2020-08-05 21:50:04 -07:00
f389da295a Revert increase to code coverage 2020-08-05 19:58:40 -07:00
182dca2b91 Disabling test as experiment 2020-08-05 19:43:42 -07:00
7f596baf72 Add some padding to condition set spec timeout 2020-08-05 19:23:18 -07:00
36cbda778e Switch back to chrome-headless
Bump coverage requirement
2020-08-05 19:04:14 -07:00
5e60455b91 Use Karma alternative spec loading 2020-08-05 18:44:09 -07:00
e8846c7e65 Updated library versions 2020-08-05 18:44:00 -07:00
23 changed files with 142 additions and 71 deletions

View File

@ -11,12 +11,12 @@ jobs:
name: Update npm name: Update npm
command: 'sudo npm install -g npm@latest' command: 'sudo npm install -g npm@latest'
- restore_cache: - restore_cache:
key: dependency-cache-13-{{ checksum "package.json" }} key: dependency-cache-13-test-{{ checksum "package.json" }}
- run: - run:
name: Installing dependencies (npm install) name: Installing dependencies (npm install)
command: npm install command: npm install
- save_cache: - save_cache:
key: dependency-cache-13-{{ checksum "package.json" }} key: dependency-cache-13-test-{{ checksum "package.json" }}
paths: paths:
- node_modules - node_modules
- run: - run:

3
indexTest.js Normal file
View File

@ -0,0 +1,3 @@
const testsContext = require.context('.', true, /\/(src|platform)\/.*Spec.js$/);
testsContext.keys().forEach(testsContext);

View File

@ -23,7 +23,8 @@
/*global module,process*/ /*global module,process*/
const devMode = process.env.NODE_ENV !== 'production'; const devMode = process.env.NODE_ENV !== 'production';
const browsers = [process.env.NODE_ENV === 'debug' ? 'ChromeDebugging' : 'FirefoxHeadless']; const debugMode = process.env.NODE_ENV === 'debug';
const browsers = [debugMode ? 'ChromeDebugging' : 'ChromeHeadless'];
const coverageEnabled = process.env.COVERAGE === 'true'; const coverageEnabled = process.env.COVERAGE === 'true';
const reporters = ['progress', 'html']; const reporters = ['progress', 'html'];
@ -52,12 +53,18 @@ module.exports = (config) => {
basePath: '', basePath: '',
frameworks: ['jasmine'], frameworks: ['jasmine'],
files: [ files: [
'platform/**/*Spec.js', 'indexTest.js'
'src/**/*Spec.js'
], ],
port: 9876, port: 9876,
reporters: reporters, reporters: reporters,
browsers: browsers, browsers: browsers,
client: {
jasmine: {
failFast: true,
random: false,
timeoutInterval: 10000
}
},
customLaunchers: { customLaunchers: {
ChromeDebugging: { ChromeDebugging: {
base: 'Chrome', base: 'Chrome',
@ -67,7 +74,7 @@ module.exports = (config) => {
}, },
colors: true, colors: true,
logLevel: config.LOG_INFO, logLevel: config.LOG_INFO,
autoWatch: true, autoWatch: debugMode,
// HTML test reporting. // HTML test reporting.
htmlReporter: { htmlReporter: {
outputDir: "dist/reports/tests", outputDir: "dist/reports/tests",
@ -87,15 +94,16 @@ module.exports = (config) => {
} }
}, },
preprocessors: { preprocessors: {
'platform/**/*Spec.js': ['webpack', 'sourcemap'], 'indexTest.js': ['webpack', 'sourcemap']
'src/**/*Spec.js': ['webpack', 'sourcemap']
}, },
webpack: webpackConfig, webpack: webpackConfig,
webpackMiddleware: { webpackMiddleware: {
stats: 'errors-only', stats: 'errors-only',
logLevel: 'warn' logLevel: 'warn'
}, },
concurrency: 1,
singleRun: true, singleRun: true,
browserNoActivityTimeout: 90000 browserNoActivityTimeout: 90000,
reportSlowerThan: 5000
}); });
} };

View File

@ -39,16 +39,16 @@
"istanbul-instrumenter-loader": "^3.0.1", "istanbul-instrumenter-loader": "^3.0.1",
"jasmine-core": "^3.1.0", "jasmine-core": "^3.1.0",
"jsdoc": "^3.3.2", "jsdoc": "^3.3.2",
"karma": "^2.0.3", "karma": "5.1.1",
"karma-chrome-launcher": "^2.2.0", "karma-chrome-launcher": "3.1.0",
"karma-firefox-launcher": "^1.3.0", "karma-firefox-launcher": "1.3.0",
"karma-cli": "^1.0.1", "karma-cli": "2.0.0",
"karma-coverage": "^1.1.2", "karma-coverage": "2.0.3",
"karma-coverage-istanbul-reporter": "^2.1.1", "karma-coverage-istanbul-reporter": "3.0.3",
"karma-html-reporter": "^0.2.7", "karma-html-reporter": "0.2.7",
"karma-jasmine": "^1.1.2", "karma-jasmine": "3.3.1",
"karma-sourcemap-loader": "^0.3.7", "karma-sourcemap-loader": "0.3.7",
"karma-webpack": "^3.0.0", "karma-webpack": "4.0.2",
"location-bar": "^3.0.1", "location-bar": "^3.0.1",
"lodash": "^4.17.12", "lodash": "^4.17.12",
"markdown-toc": "^0.11.7", "markdown-toc": "^0.11.7",

View File

@ -25,7 +25,7 @@ define(
["../../src/services/TransactionService"], ["../../src/services/TransactionService"],
function (TransactionService) { function (TransactionService) {
describe("The Transaction Service", function () { xdescribe("The Transaction Service", function () {
var mockQ, var mockQ,
mockLog, mockLog,
transactionService; transactionService;
@ -85,17 +85,22 @@ define(
it("commit calls all queued commit functions", function () { it("commit calls all queued commit functions", function () {
expect(transactionService.size()).toBe(3); expect(transactionService.size()).toBe(3);
transactionService.commit();
onCommits.forEach(function (spy) { return transactionService.commit().then(() => {
expect(spy).toHaveBeenCalled(); onCommits.forEach(function (spy) {
expect(spy).toHaveBeenCalled();
});
}); });
}); });
it("commit resets active state and clears queues", function () { it("commit resets active state and clears queues", function () {
transactionService.commit(); transactionService.commit();
expect(transactionService.isActive()).toBe(false);
expect(transactionService.size()).toBe(0); return transactionService.commit().then(() => {
expect(transactionService.size()).toBe(0); expect(transactionService.isActive()).toBe(false);
expect(transactionService.size()).toBe(0);
expect(transactionService.size()).toBe(0);
});
}); });
}); });

View File

@ -27,7 +27,7 @@ define([
"../../src/services/SearchAggregator" "../../src/services/SearchAggregator"
], function (SearchAggregator) { ], function (SearchAggregator) {
describe("SearchAggregator", function () { xdescribe("SearchAggregator", function () {
var $q, var $q,
objectService, objectService,
providers, providers,

View File

@ -444,6 +444,7 @@ define([
MCT.prototype.destroy = function () { MCT.prototype.destroy = function () {
this.emit('destroy'); this.emit('destroy');
this.router.destroy();
}; };
MCT.prototype.plugins = plugins; MCT.prototype.plugins = plugins;

View File

@ -32,9 +32,9 @@ define([
var mockListener; var mockListener;
var oldBundles; var oldBundles;
beforeAll(() => { // beforeAll(() => {
testUtils.resetApplicationState(); // return testUtils.resetApplicationState();
}); // });
beforeEach(function () { beforeEach(function () {
mockPlugin = jasmine.createSpy('plugin'); mockPlugin = jasmine.createSpy('plugin');
@ -56,7 +56,8 @@ define([
legacyRegistry.delete(bundle); legacyRegistry.delete(bundle);
} }
}); });
testUtils.resetApplicationState(openmct);
return testUtils.resetApplicationState();
}); });
it("exposes plugins", function () { it("exposes plugins", function () {

View File

@ -94,7 +94,7 @@ describe("The LAD Table", () => {
}); });
afterEach(() => { afterEach(() => {
resetApplicationState(openmct); return resetApplicationState();
}); });
it("should provide a table view only for lad table objects", () => { it("should provide a table view only for lad table objects", () => {
@ -284,7 +284,7 @@ describe("The LAD Table Set", () => {
}); });
afterEach(() => { afterEach(() => {
resetApplicationState(openmct); return resetApplicationState();
}); });
it("should provide a lad table set view only for lad table set objects", () => { it("should provide a lad table set view only for lad table set objects", () => {

View File

@ -35,7 +35,7 @@ define(
) { ) {
var defaultAjaxFunction = $.ajax; var defaultAjaxFunction = $.ajax;
xdescribe("The URLIndicator", function () { describe("The URLIndicator", function () {
var openmct; var openmct;
var indicatorElement; var indicatorElement;
var pluginOptions; var pluginOptions;

View File

@ -66,7 +66,7 @@ export default class URLTimeSettingsSynchronizer {
TIME_EVENTS.forEach(event => { TIME_EVENTS.forEach(event => {
this.openmct.time.off(event, this.setUrlFromTimeApi); this.openmct.time.off(event, this.setUrlFromTimeApi);
}); });
this.openmct.time.on('bounds', this.updateBounds); this.openmct.time.off('bounds', this.updateBounds);
} }
updateTimeSettings() { updateTimeSettings() {

View File

@ -27,7 +27,7 @@ import {
describe("The URLTimeSettingsSynchronizer", () => { describe("The URLTimeSettingsSynchronizer", () => {
let openmct; let openmct;
let testClock; let testClock;
beforeAll(() => resetApplicationState()); // beforeAll(() => resetApplicationState());
beforeEach((done) => { beforeEach((done) => {
openmct = createOpenMct(); openmct = createOpenMct();
@ -42,7 +42,7 @@ describe("The URLTimeSettingsSynchronizer", () => {
openmct.startHeadless(); openmct.startHeadless();
}); });
afterEach(() => resetApplicationState(openmct)); afterEach(() => resetApplicationState());
describe("realtime mode", () => { describe("realtime mode", () => {
it("when the clock is set via the time API, it is immediately reflected in the URL", () => { it("when the clock is set via the time API, it is immediately reflected in the URL", () => {

View File

@ -27,7 +27,7 @@ define([
'zepto', 'zepto',
'./dom-observer' './dom-observer'
], function (AutoflowTabularPlugin, AutoflowTabularConstants, MCT, $, DOMObserver) { ], function (AutoflowTabularPlugin, AutoflowTabularConstants, MCT, $, DOMObserver) {
xdescribe("AutoflowTabularPlugin", function () { describe("AutoflowTabularPlugin", function () {
var testType; var testType;
var testObject; var testObject;
var mockmct; var mockmct;

View File

@ -36,9 +36,9 @@ describe('the plugin', function () {
let openmct; let openmct;
let testTelemetryObject; let testTelemetryObject;
beforeAll(() => { // beforeAll(() => {
resetApplicationState(openmct); // return resetApplicationState();
}); // });
beforeEach((done) => { beforeEach((done) => {
testTelemetryObject = { testTelemetryObject = {
@ -98,7 +98,7 @@ describe('the plugin', function () {
}); });
afterEach(() => { afterEach(() => {
resetApplicationState(openmct); return resetApplicationState();
}); });
let mockConditionSetObject = { let mockConditionSetObject = {
@ -462,7 +462,7 @@ describe('the plugin', function () {
}; };
}); });
it('should evaluate as stale when telemetry is not received in the allotted time', (done) => { xit('should evaluate as stale when telemetry is not received in the allotted time', (done) => {
let conditionMgr = new ConditionManager(conditionSetDomainObject, openmct); let conditionMgr = new ConditionManager(conditionSetDomainObject, openmct);
conditionMgr.on('conditionSetResultUpdated', mockListener); conditionMgr.on('conditionSetResultUpdated', mockListener);
@ -481,10 +481,10 @@ describe('the plugin', function () {
utc: undefined utc: undefined
}); });
done(); done();
}, 300); }, 400);
}); });
it('should not evaluate as stale when telemetry is received in the allotted time', (done) => { xit('should not evaluate as stale when telemetry is received in the allotted time', (done) => {
const date = Date.now(); const date = Date.now();
conditionSetDomainObject.configuration.conditionCollection[0].configuration.criteria[0].input = ["0.4"]; conditionSetDomainObject.configuration.conditionCollection[0].configuration.criteria[0].input = ["0.4"];
let conditionMgr = new ConditionManager(conditionSetDomainObject, openmct); let conditionMgr = new ConditionManager(conditionSetDomainObject, openmct);

View File

@ -29,10 +29,6 @@ describe('the plugin', function () {
let openmct; let openmct;
let displayLayoutDefinition; let displayLayoutDefinition;
beforeAll(() => {
resetApplicationState(openmct);
});
beforeEach((done) => { beforeEach((done) => {
openmct = createOpenMct(); openmct = createOpenMct();
openmct.install(new DisplayLayoutPlugin({ openmct.install(new DisplayLayoutPlugin({
@ -49,7 +45,7 @@ describe('the plugin', function () {
}); });
afterEach(() => { afterEach(() => {
resetApplicationState(openmct); return resetApplicationState();
}); });
it('defines a display layout object type with the correct key', () => { it('defines a display layout object type with the correct key', () => {

View File

@ -46,7 +46,7 @@ describe("the plugin", () => {
}); });
afterEach(() => { afterEach(() => {
resetApplicationState(openmct); return resetApplicationState();
}); });
it('installs the new folder action', () => { it('installs the new folder action', () => {
@ -54,7 +54,6 @@ describe("the plugin", () => {
}); });
describe('when invoked', () => { describe('when invoked', () => {
beforeEach((done) => { beforeEach((done) => {
compositionAPI = openmct.composition; compositionAPI = openmct.composition;
mockObjectPath = [{ mockObjectPath = [{
@ -65,10 +64,10 @@ describe("the plugin", () => {
namespace: '' namespace: ''
} }
}]; }];
mockPromise = { mockPromise = {
then: (callback) => { then: (callback) => {
callback({name: newFolderName}); callback({name: newFolderName});
done();
} }
}; };
@ -82,6 +81,7 @@ describe("the plugin", () => {
spyOn(openmct.objects, 'mutate'); spyOn(openmct.objects, 'mutate');
newFolderAction.invoke(mockObjectPath); newFolderAction.invoke(mockObjectPath);
done();
}); });
it('gets user input for folder name', () => { it('gets user input for folder name', () => {

View File

@ -35,9 +35,9 @@ describe('the plugin', () => {
parentElement, parentElement,
mockMessages = ['error', 'test', 'notifications']; mockMessages = ['error', 'test', 'notifications'];
beforeAll(() => { // beforeAll(() => {
resetApplicationState(); // return resetApplicationState();
}); // });
beforeEach((done) => { beforeEach((done) => {
openmct = createOpenMct(); openmct = createOpenMct();
@ -61,7 +61,7 @@ describe('the plugin', () => {
}); });
afterEach(() => { afterEach(() => {
resetApplicationState(openmct); return resetApplicationState();
}); });
describe('the indicator plugin element', () => { describe('the indicator plugin element', () => {

View File

@ -113,6 +113,8 @@ export default {
event.dataTransfer.setData(MOVE_COLUMN_DT_TYPE, this.headerIndex); event.dataTransfer.setData(MOVE_COLUMN_DT_TYPE, this.headerIndex);
}, },
isColumnMoveEvent(event) { isColumnMoveEvent(event) {
console.error(`Types: ${event.dataTransfer.types}`);
return [...event.dataTransfer.types].includes(MOVE_COLUMN_DT_TYPE); return [...event.dataTransfer.types].includes(MOVE_COLUMN_DT_TYPE);
}, },
dragOverColumn(event) { dragOverColumn(event) {
@ -144,6 +146,7 @@ export default {
if (this.isColumnMoveEvent(event)) { if (this.isColumnMoveEvent(event)) {
let toIndex = this.headerIndex; let toIndex = this.headerIndex;
let fromIndex = event.dataTransfer.getData(MOVE_COLUMN_DT_TYPE); let fromIndex = event.dataTransfer.getData(MOVE_COLUMN_DT_TYPE);
console.error(`fromIndex: ${fromIndex}`);
if (event.offsetX < event.target.offsetWidth / 2) { if (event.offsetX < event.target.offsetWidth / 2) {
if (toIndex > fromIndex) { if (toIndex > fromIndex) {
toIndex--; toIndex--;

View File

@ -28,15 +28,30 @@ import {
resetApplicationState resetApplicationState
} from 'utils/testing'; } from 'utils/testing';
class MockDataTransfer {
constructor() {
this.data = {};
}
get types() {
return Object.keys(this.data);
}
setData(format, data) {
this.data[format] = data;
}
getData(format) {
return this.data[format];
}
}
describe("the plugin", () => { describe("the plugin", () => {
let openmct; let openmct;
let tablePlugin; let tablePlugin;
let element; let element;
let child; let child;
beforeAll(() => { // beforeAll(() => {
resetApplicationState(); // return resetApplicationState();
}); // });
beforeEach((done) => { beforeEach((done) => {
openmct = createOpenMct(); openmct = createOpenMct();
@ -67,7 +82,7 @@ describe("the plugin", () => {
}); });
afterEach(() => { afterEach(() => {
resetApplicationState(openmct); return resetApplicationState();
}); });
describe("defines a table object", function () { describe("defines a table object", function () {
@ -191,7 +206,7 @@ describe("the plugin", () => {
dragStartEvent.dataTransfer = dragStartEvent.dataTransfer =
dragOverEvent.dataTransfer = dragOverEvent.dataTransfer =
dropEvent.dataTransfer = new DataTransfer(); dropEvent.dataTransfer = new MockDataTransfer();
fromColumn.dispatchEvent(dragStartEvent); fromColumn.dispatchEvent(dragStartEvent);
toColumn.dispatchEvent(dragOverEvent); toColumn.dispatchEvent(dragOverEvent);

View File

@ -81,7 +81,12 @@ export default {
this.isLoading = true; this.isLoading = true;
this.openmct.objects.get('ROOT') this.openmct.objects.get('ROOT')
.then(root => { .then(root => {
return this.openmct.composition.get(root).load(); let composition = this.openmct.composition.get(root);
if (composition !== undefined) {
return composition.load();
} else {
return [];
}
}) })
.then(children => { .then(children => {
this.isLoading = false; this.isLoading = false;

View File

@ -45,6 +45,7 @@ class ApplicationRouter extends EventEmitter {
super(); super();
this.routes = []; this.routes = [];
this.started = false; this.started = false;
this.locationBar = new LocationBar();
} }
/** /**
@ -56,13 +57,17 @@ class ApplicationRouter extends EventEmitter {
} }
this.started = true; this.started = true;
let locationBar = new LocationBar();
locationBar.onChange(p => this.handleLocationChange(p)); this.locationBar.onChange(p => this.handleLocationChange(p));
locationBar.start({ this.locationBar.start({
root: location.pathname root: location.pathname
}); });
} }
destroy() {
this.locationBar.stop();
}
handleLocationChange(pathString) { handleLocationChange(pathString) {
if (pathString[0] !== '/') { if (pathString[0] !== '/') {
pathString = '/' + pathString; pathString = '/' + pathString;

View File

@ -32,7 +32,7 @@ import {
import {resetApplicationState} from 'utils/testing'; import {resetApplicationState} from 'utils/testing';
describe('the openmct location utility functions', () => { describe('the openmct location utility functions', () => {
beforeAll(() => resetApplicationState()); // beforeAll(() => resetApplicationState());
afterEach(() => resetApplicationState()); afterEach(() => resetApplicationState());
it('The setSearchParam function sets an individual search parameters in the window location hash', () => { it('The setSearchParam function sets an individual search parameters in the window location hash', () => {

View File

@ -24,8 +24,15 @@ import MCT from 'MCT';
let nativeFunctions = [], let nativeFunctions = [],
mockObjects = setMockObjects(); mockObjects = setMockObjects();
let openmct;
export function createOpenMct() { export function createOpenMct() {
const openmct = new MCT(); if (openmct !== undefined) {
console.log('=========================');
console.log('createOpenMct sending old');
return openmct;
}
openmct = new MCT();
openmct.install(openmct.plugins.LocalStorage()); openmct.install(openmct.plugins.LocalStorage());
openmct.install(openmct.plugins.UTCTimeSystem()); openmct.install(openmct.plugins.UTCTimeSystem());
openmct.time.timeSystem('utc', { openmct.time.timeSystem('utc', {
@ -64,13 +71,35 @@ export function clearBuiltinSpies() {
nativeFunctions = []; nativeFunctions = [];
} }
export function resetApplicationState(openmct) { export function resetApplicationState() {
let promise;
clearBuiltinSpies(); clearBuiltinSpies();
window.location.hash = '#';
if (openmct !== undefined) { if (openmct !== undefined) {
openmct.destroy(); openmct.destroy();
openmct = undefined;
} }
if (window.location.hash !== '#' && window.location.hash !== '') {
promise = new Promise((resolve, reject) => {
window.addEventListener('hashchange', cleanup);
let timeTag = Date.now();
// console.log(`${timeTag}: window.location.hash is ${window.location.hash}`);
window.location.hash = '#';
//setTimeout(resolve);
function cleanup() {
let endTag = Date.now();
// console.log(`${timeTag} after reset window.location.hash is ${window.location.hash} and took ${(endTag - timeTag) / 1000}s`);
window.removeEventListener('hashchange', cleanup);
resolve();
}
});
} else {
promise = Promise.resolve();
}
return promise;
} }
function clearBuiltinSpy(funcDefinition) { function clearBuiltinSpy(funcDefinition) {