[Tables] Subscribe to parent if a telemetry object, or children, but not both. Fixes #1464

This commit is contained in:
Henry 2017-03-01 18:54:45 -08:00
parent 6fa5a31217
commit a2bf92db97
2 changed files with 129 additions and 52 deletions

View File

@ -72,7 +72,7 @@ define(
* Create a new format object from legacy object, and replace it * Create a new format object from legacy object, and replace it
* when it changes * when it changes
*/ */
this.newObject = objectUtils.toNewFormat($scope.domainObject.getModel(), this.domainObject = objectUtils.toNewFormat($scope.domainObject.getModel(),
$scope.domainObject.getId()); $scope.domainObject.getId());
_.bindAll(this, [ _.bindAll(this, [
@ -144,9 +144,9 @@ define(
this.unobserveObject(); this.unobserveObject();
} }
this.unobserveObject = this.openmct.objects.observe(this.newObject, "*", this.unobserveObject = this.openmct.objects.observe(this.domainObject, "*",
function (domainObject) { function (domainObject) {
this.newObject = domainObject; this.domainObject = domainObject;
this.getData(); this.getData();
}.bind(this) }.bind(this)
); );
@ -399,6 +399,42 @@ define(
return objects; return objects;
}; };
/**
* Return an array of telemetry objects in this view that should be
* subscribed to.
* @private
* @returns {Promise<Array>} a promise that resolves with an array of
* telemetry objects in this view.
*/
TelemetryTableController.prototype.getTelemetryObjects = function () {
var telemetryApi = this.openmct.telemetry;
var compositionApi = this.openmct.composition;
function filterForTelemetry(objects) {
return objects.filter(telemetryApi.canProvideTelemetry.bind(telemetryApi));
}
/*
* If parent object is a telemetry object, subscribe to it. Do not
* test composees.
*/
if (telemetryApi.canProvideTelemetry(this.domainObject)) {
return Promise.resolve([this.domainObject]);
} else {
/*
* If parent object is not a telemetry object, subscribe to all
* composees that are telemetry producing objects.
*/
var composition = compositionApi.get(this.domainObject);
if (composition) {
return composition
.load()
.then(filterForTelemetry);
}
}
};
/** /**
* Request historical data, and subscribe to for real-time data. * Request historical data, and subscribe to for real-time data.
* @private * @private
@ -406,10 +442,7 @@ define(
* established, and historical telemetry is received and processed. * established, and historical telemetry is received and processed.
*/ */
TelemetryTableController.prototype.getData = function () { TelemetryTableController.prototype.getData = function () {
var telemetryApi = this.openmct.telemetry;
var compositionApi = this.openmct.composition;
var scope = this.$scope; var scope = this.$scope;
var newObject = this.newObject;
this.telemetry.clear(); this.telemetry.clear();
this.telemetry.bounds(this.openmct.conductor.bounds()); this.telemetry.bounds(this.openmct.conductor.bounds());
@ -421,28 +454,9 @@ define(
console.error(e.stack); console.error(e.stack);
} }
function filterForTelemetry(objects) {
return objects.filter(telemetryApi.canProvideTelemetry.bind(telemetryApi));
}
function getDomainObjects() {
var objects = [newObject];
var composition = compositionApi.get(newObject);
if (composition) {
return composition
.load()
.then(function (children) {
return objects.concat(children);
});
} else {
return Promise.resolve(objects);
}
}
scope.rows = []; scope.rows = [];
return getDomainObjects() return this.getTelemetryObjects()
.then(filterForTelemetry)
.then(this.loadColumns) .then(this.loadColumns)
.then(this.subscribeToNewData) .then(this.subscribeToNewData)
.then(this.getHistoricalData) .then(this.getHistoricalData)

View File

@ -161,7 +161,7 @@ define(
}); });
}); });
describe ('Subscribes to new data', function () { describe ('when getting telemetry', function () {
var mockComposition, var mockComposition,
mockTelemetryObject, mockTelemetryObject,
mockChildren, mockChildren,
@ -173,9 +173,7 @@ define(
"load" "load"
]); ]);
mockTelemetryObject = jasmine.createSpyObj("mockTelemetryObject", [ mockTelemetryObject = {};
"something"
]);
mockTelemetryObject.identifier = { mockTelemetryObject.identifier = {
key: "mockTelemetryObject" key: "mockTelemetryObject"
}; };
@ -192,22 +190,12 @@ define(
}); });
done = false; done = false;
controller.getData().then(function () {
done = true;
});
});
it('fetches historical data', function () {
waitsFor(function () {
return done;
}, "getData to return", 100);
runs(function () {
expect(mockTelemetryAPI.request).toHaveBeenCalledWith(mockTelemetryObject, jasmine.any(Object));
});
}); });
it('fetches historical data for the time period specified by the conductor bounds', function () { it('fetches historical data for the time period specified by the conductor bounds', function () {
controller.getData().then(function () {
done = true;
});
waitsFor(function () { waitsFor(function () {
return done; return done;
}, "getData to return", 100); }, "getData to return", 100);
@ -217,17 +205,11 @@ define(
}); });
}); });
it('subscribes to new data', function () { it('unsubscribes on view destruction', function () {
waitsFor(function () { controller.getData().then(function () {
return done; done = true;
}, "getData to return", 100);
runs(function () {
expect(mockTelemetryAPI.subscribe).toHaveBeenCalledWith(mockTelemetryObject, jasmine.any(Function), {});
}); });
});
it('and unsubscribes on view destruction', function () {
waitsFor(function () { waitsFor(function () {
return done; return done;
}, "getData to return", 100); }, "getData to return", 100);
@ -239,6 +221,87 @@ define(
expect(unsubscribe).toHaveBeenCalled(); expect(unsubscribe).toHaveBeenCalled();
}); });
}); });
it('fetches historical data for the time period specified by the conductor bounds', function () {
controller.getData().then(function () {
done = true;
});
waitsFor(function () {
return done;
}, "getData to return", 100);
runs(function () {
expect(mockTelemetryAPI.request).toHaveBeenCalledWith(mockTelemetryObject, mockBounds);
});
});
it('fetches data for, and subscribes to parent object if it is a telemetry object', function () {
controller.getData().then(function () {
done = true;
});
waitsFor(function () {
return done;
}, "getData to return", 100);
runs(function () {
expect(mockTelemetryAPI.subscribe).toHaveBeenCalledWith(mockTelemetryObject, jasmine.any(Function), {});
expect(mockTelemetryAPI.request).toHaveBeenCalledWith(mockTelemetryObject, jasmine.any(Object));
});
});
it('fetches data for, and subscribes to parent object if it is a telemetry object', function () {
controller.getData().then(function () {
done = true;
});
waitsFor(function () {
return done;
}, "getData to return", 100);
runs(function () {
expect(mockTelemetryAPI.subscribe).toHaveBeenCalledWith(mockTelemetryObject, jasmine.any(Function), {});
expect(mockTelemetryAPI.request).toHaveBeenCalledWith(mockTelemetryObject, jasmine.any(Object));
});
});
it('fetches data for, and subscribes to any composees that are telemetry objects if parent is not', function () {
mockChildren = [
{name: "child 1"}
];
var mockTelemetryChildren = [
{name: "child 2"},
{name: "child 3"},
{name: "child 4"}
];
mockChildren = mockChildren.concat(mockTelemetryChildren);
mockComposition.load.andReturn(Promise.resolve(mockChildren));
mockTelemetryAPI.canProvideTelemetry.andCallFake(function (object) {
if (object === mockTelemetryObject) {
return false;
} else {
return mockTelemetryChildren.indexOf(object) !== -1;
}
});
controller.getData().then(function () {
done = true;
});
waitsFor(function () {
return done;
}, "getData to return", 100);
runs(function () {
mockTelemetryChildren.forEach(function (child) {
expect(mockTelemetryAPI.subscribe).toHaveBeenCalledWith(child, jasmine.any(Function), {});
});
mockTelemetryChildren.forEach(function (child) {
expect(mockTelemetryAPI.request).toHaveBeenCalledWith(child, jasmine.any(Object));
});
expect(mockTelemetryAPI.subscribe).not.toHaveBeenCalledWith(mockChildren[0], jasmine.any(Function), {});
expect(mockTelemetryAPI.subscribe).not.toHaveBeenCalledWith(mockTelemetryObject[0], jasmine.any(Function), {});
});
});
}); });
it('When in real-time mode, enables auto-scroll', function () { it('When in real-time mode, enables auto-scroll', function () {