diff --git a/platform/features/conductor/test/ConductorTelemetryDecoratorSpec.js b/platform/features/conductor/test/ConductorTelemetryDecoratorSpec.js index 39b6436131..84812b541a 100644 --- a/platform/features/conductor/test/ConductorTelemetryDecoratorSpec.js +++ b/platform/features/conductor/test/ConductorTelemetryDecoratorSpec.js @@ -28,7 +28,109 @@ define( "use strict"; describe("ConductorTelemetryDecorator", function () { + var mockTelemetryService, + mockConductorService, + mockConductor, + mockPromise, + mockSeries, + decorator; + function seriesIsInWindow(series) { + var i, v, inWindow = true; + for (i = 0; i < series.getPointCount(); i += 1) { + v = series.getDomainValue(i); + inWindow = inWindow && (v >= mockConductor.displayStart()); + inWindow = inWindow && (v <= mockConductor.displayEnd()); + } + return inWindow; + } + + beforeEach(function () { + mockTelemetryService = jasmine.createSpyObj( + 'telemetryService', + [ 'requestTelemetry', 'subscribe' ] + ); + mockConductorService = jasmine.createSpyObj( + 'conductorService', + ['getConductor'] + ); + mockConductor = jasmine.createSpyObj( + 'conductor', + [ 'queryStart', 'queryEnd', 'displayStart', 'displayEnd' ] + ); + mockPromise = jasmine.createSpyObj( + 'promise', + ['then'] + ); + mockSeries = jasmine.createSpyObj( + 'series', + [ 'getPointCount', 'getDomainValue', 'getRangeValue' ] + ); + + mockTelemetryService.requestTelemetry.andReturn(mockPromise); + mockConductorService.getConductor.andReturn(mockConductor); + + // Prepare test series; make sure it has a broad range of + // domain values, with at least some in the query-able range + mockSeries.getPointCount.andReturn(1000); + mockSeries.getDomainValue.andCallFake(function (i) { + var j = i - 500; + return j * j * j; + }); + + mockConductor.queryStart.andReturn(-12321); + mockConductor.queryEnd.andReturn(-12321); + mockConductor.displayStart.andReturn(42); + mockConductor.displayEnd.andReturn(1977); + + decorator = new ConductorTelemetryDecorator( + mockConductorService, + mockTelemetryService + ); + }); + + it("adds display start/end times to historical requests", function () { + decorator.requestTelemetry([{ someKey: "some value" }]); + expect(mockTelemetryService.requestTelemetry) + .toHaveBeenCalledWith([{ + someKey: "some value", + start: mockConductor.displayStart(), + end: mockConductor.displayEnd() + }]); + }); + + it("adds display start/end times to subscription requests", function () { + var mockCallback = jasmine.createSpy('callback'); + decorator.subscribe(mockCallback, [{ someKey: "some value" }]); + expect(mockTelemetryService.subscribe) + .toHaveBeenCalledWith(jasmine.any(Function), [{ + someKey: "some value", + start: mockConductor.displayStart(), + end: mockConductor.displayEnd() + }]); + }); + + it("prunes historical values to the displayable range", function () { + var packagedTelemetry; + decorator.requestTelemetry([{ source: "abc", key: "xyz" }]); + packagedTelemetry = mockPromise.then.mostRecentCall.args[0]({ + "abc": { "xyz": mockSeries } + }); + expect(seriesIsInWindow(packagedTelemetry.abc.xyz)) + .toBeTruthy(); + }); + + it("prunes subscribed values to the displayable range", function () { + var mockCallback = jasmine.createSpy('callback'), + packagedTelemetry; + decorator.subscribe(mockCallback, [{ source: "abc", key: "xyz" }]); + mockTelemetryService.subscribe.mostRecentCall.args[0]({ + "abc": { "xyz": mockSeries } + }); + packagedTelemetry = mockCallback.mostRecentCall.args[0]; + expect(seriesIsInWindow(packagedTelemetry.abc.xyz)) + .toBeTruthy(); + }); }); }