remove global export from SmartInterval
This commit is contained in:
parent
1d298e4939
commit
f3ae99fa9d
|
@ -3,7 +3,7 @@
|
|||
* and controllable by a public API.
|
||||
*/
|
||||
|
||||
class SmartInterval {
|
||||
export default class SmartInterval {
|
||||
/**
|
||||
* @param { function } opts.callback Function to be called on each iteration (required)
|
||||
* @param { milliseconds } opts.startingInterval `currentInterval` is set to this initially
|
||||
|
@ -168,4 +168,3 @@ class SmartInterval {
|
|||
}
|
||||
}
|
||||
|
||||
window.gl.SmartInterval = SmartInterval;
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import SmartInterval from '~/smart_interval';
|
||||
import Flash from '../flash';
|
||||
import {
|
||||
WidgetHeader,
|
||||
|
@ -97,7 +98,7 @@ export default {
|
|||
});
|
||||
},
|
||||
initPolling() {
|
||||
this.pollingInterval = new gl.SmartInterval({
|
||||
this.pollingInterval = new SmartInterval({
|
||||
callback: this.checkStatus,
|
||||
startingInterval: 10000,
|
||||
maxInterval: 30000,
|
||||
|
@ -106,7 +107,7 @@ export default {
|
|||
});
|
||||
},
|
||||
initDeploymentsPolling() {
|
||||
this.deploymentsInterval = new gl.SmartInterval({
|
||||
this.deploymentsInterval = new SmartInterval({
|
||||
callback: this.fetchDeployments,
|
||||
startingInterval: 30000,
|
||||
maxInterval: 120000,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import '~/smart_interval';
|
||||
import SmartInterval from '~/smart_interval';
|
||||
|
||||
(() => {
|
||||
describe('SmartInterval', function () {
|
||||
const DEFAULT_MAX_INTERVAL = 100;
|
||||
const DEFAULT_STARTING_INTERVAL = 5;
|
||||
const DEFAULT_SHORT_TIMEOUT = 75;
|
||||
|
@ -22,170 +22,168 @@ import '~/smart_interval';
|
|||
_.extend(defaultParams, config);
|
||||
}
|
||||
|
||||
return new gl.SmartInterval(defaultParams);
|
||||
return new SmartInterval(defaultParams);
|
||||
}
|
||||
|
||||
describe('SmartInterval', function () {
|
||||
describe('Increment Interval', function () {
|
||||
beforeEach(function () {
|
||||
this.smartInterval = createDefaultSmartInterval();
|
||||
});
|
||||
|
||||
it('should increment the interval delay', function (done) {
|
||||
const interval = this.smartInterval;
|
||||
setTimeout(() => {
|
||||
const intervalConfig = this.smartInterval.cfg;
|
||||
const iterationCount = 4;
|
||||
const maxIntervalAfterIterations = intervalConfig.startingInterval *
|
||||
(intervalConfig.incrementByFactorOf ** (iterationCount - 1)); // 40
|
||||
const currentInterval = interval.getCurrentInterval();
|
||||
|
||||
// Provide some flexibility for performance of testing environment
|
||||
expect(currentInterval).toBeGreaterThan(intervalConfig.startingInterval);
|
||||
expect(currentInterval <= maxIntervalAfterIterations).toBeTruthy();
|
||||
|
||||
done();
|
||||
}, DEFAULT_SHORT_TIMEOUT); // 4 iterations, increment by 2x = (5 + 10 + 20 + 40)
|
||||
});
|
||||
|
||||
it('should not increment past maxInterval', function (done) {
|
||||
const interval = this.smartInterval;
|
||||
|
||||
setTimeout(() => {
|
||||
const currentInterval = interval.getCurrentInterval();
|
||||
expect(currentInterval).toBe(interval.cfg.maxInterval);
|
||||
|
||||
done();
|
||||
}, DEFAULT_LONG_TIMEOUT);
|
||||
});
|
||||
|
||||
it('does not increment while waiting for callback', function (done) {
|
||||
const smartInterval = createDefaultSmartInterval({
|
||||
callback: () => new Promise($.noop),
|
||||
});
|
||||
|
||||
setTimeout(() => {
|
||||
const oneInterval = smartInterval.cfg.startingInterval * DEFAULT_INCREMENT_FACTOR;
|
||||
expect(smartInterval.getCurrentInterval()).toEqual(oneInterval);
|
||||
done();
|
||||
}, DEFAULT_SHORT_TIMEOUT);
|
||||
});
|
||||
describe('Increment Interval', function () {
|
||||
beforeEach(function () {
|
||||
this.smartInterval = createDefaultSmartInterval();
|
||||
});
|
||||
|
||||
describe('Public methods', function () {
|
||||
beforeEach(function () {
|
||||
this.smartInterval = createDefaultSmartInterval();
|
||||
});
|
||||
it('should increment the interval delay', function (done) {
|
||||
const interval = this.smartInterval;
|
||||
setTimeout(() => {
|
||||
const intervalConfig = this.smartInterval.cfg;
|
||||
const iterationCount = 4;
|
||||
const maxIntervalAfterIterations = intervalConfig.startingInterval *
|
||||
(intervalConfig.incrementByFactorOf ** (iterationCount - 1)); // 40
|
||||
const currentInterval = interval.getCurrentInterval();
|
||||
|
||||
it('should cancel an interval', function (done) {
|
||||
const interval = this.smartInterval;
|
||||
// Provide some flexibility for performance of testing environment
|
||||
expect(currentInterval).toBeGreaterThan(intervalConfig.startingInterval);
|
||||
expect(currentInterval <= maxIntervalAfterIterations).toBeTruthy();
|
||||
|
||||
setTimeout(() => {
|
||||
interval.cancel();
|
||||
|
||||
const intervalId = interval.state.intervalId;
|
||||
const currentInterval = interval.getCurrentInterval();
|
||||
const intervalLowerLimit = interval.cfg.startingInterval;
|
||||
|
||||
expect(intervalId).toBeUndefined();
|
||||
expect(currentInterval).toBe(intervalLowerLimit);
|
||||
|
||||
done();
|
||||
}, DEFAULT_SHORT_TIMEOUT);
|
||||
});
|
||||
|
||||
it('should resume an interval', function (done) {
|
||||
const interval = this.smartInterval;
|
||||
|
||||
setTimeout(() => {
|
||||
interval.cancel();
|
||||
|
||||
interval.resume();
|
||||
|
||||
const intervalId = interval.state.intervalId;
|
||||
|
||||
expect(intervalId).toBeTruthy();
|
||||
|
||||
done();
|
||||
}, DEFAULT_SHORT_TIMEOUT);
|
||||
});
|
||||
done();
|
||||
}, DEFAULT_SHORT_TIMEOUT); // 4 iterations, increment by 2x = (5 + 10 + 20 + 40)
|
||||
});
|
||||
|
||||
describe('DOM Events', function () {
|
||||
beforeEach(function () {
|
||||
// This ensures DOM and DOM events are initialized for these specs.
|
||||
setFixtures('<div></div>');
|
||||
it('should not increment past maxInterval', function (done) {
|
||||
const interval = this.smartInterval;
|
||||
|
||||
this.smartInterval = createDefaultSmartInterval();
|
||||
setTimeout(() => {
|
||||
const currentInterval = interval.getCurrentInterval();
|
||||
expect(currentInterval).toBe(interval.cfg.maxInterval);
|
||||
|
||||
done();
|
||||
}, DEFAULT_LONG_TIMEOUT);
|
||||
});
|
||||
|
||||
it('does not increment while waiting for callback', function (done) {
|
||||
const smartInterval = createDefaultSmartInterval({
|
||||
callback: () => new Promise($.noop),
|
||||
});
|
||||
|
||||
it('should pause when page is not visible', function (done) {
|
||||
const interval = this.smartInterval;
|
||||
|
||||
setTimeout(() => {
|
||||
expect(interval.state.intervalId).toBeTruthy();
|
||||
|
||||
// simulates triggering of visibilitychange event
|
||||
interval.handleVisibilityChange({ target: { visibilityState: 'hidden' } });
|
||||
|
||||
expect(interval.state.intervalId).toBeUndefined();
|
||||
done();
|
||||
}, DEFAULT_SHORT_TIMEOUT);
|
||||
});
|
||||
|
||||
it('should change to the hidden interval when page is not visible', function (done) {
|
||||
const HIDDEN_INTERVAL = 1500;
|
||||
const interval = createDefaultSmartInterval({ hiddenInterval: HIDDEN_INTERVAL });
|
||||
|
||||
setTimeout(() => {
|
||||
expect(interval.state.intervalId).toBeTruthy();
|
||||
expect(interval.getCurrentInterval() >= DEFAULT_STARTING_INTERVAL &&
|
||||
interval.getCurrentInterval() <= DEFAULT_MAX_INTERVAL).toBeTruthy();
|
||||
|
||||
// simulates triggering of visibilitychange event
|
||||
interval.handleVisibilityChange({ target: { visibilityState: 'hidden' } });
|
||||
|
||||
expect(interval.state.intervalId).toBeTruthy();
|
||||
expect(interval.getCurrentInterval()).toBe(HIDDEN_INTERVAL);
|
||||
done();
|
||||
}, DEFAULT_SHORT_TIMEOUT);
|
||||
});
|
||||
|
||||
it('should resume when page is becomes visible at the previous interval', function (done) {
|
||||
const interval = this.smartInterval;
|
||||
|
||||
setTimeout(() => {
|
||||
expect(interval.state.intervalId).toBeTruthy();
|
||||
|
||||
// simulates triggering of visibilitychange event
|
||||
interval.handleVisibilityChange({ target: { visibilityState: 'hidden' } });
|
||||
|
||||
expect(interval.state.intervalId).toBeUndefined();
|
||||
|
||||
// simulates triggering of visibilitychange event
|
||||
interval.handleVisibilityChange({ target: { visibilityState: 'visible' } });
|
||||
|
||||
expect(interval.state.intervalId).toBeTruthy();
|
||||
|
||||
done();
|
||||
}, DEFAULT_SHORT_TIMEOUT);
|
||||
});
|
||||
|
||||
it('should cancel on page unload', function (done) {
|
||||
const interval = this.smartInterval;
|
||||
|
||||
setTimeout(() => {
|
||||
$(document).triggerHandler('beforeunload');
|
||||
expect(interval.state.intervalId).toBeUndefined();
|
||||
expect(interval.getCurrentInterval()).toBe(interval.cfg.startingInterval);
|
||||
done();
|
||||
}, DEFAULT_SHORT_TIMEOUT);
|
||||
});
|
||||
|
||||
it('should execute callback before first interval', function () {
|
||||
const interval = createDefaultSmartInterval({ immediateExecution: true });
|
||||
expect(interval.cfg.immediateExecution).toBeFalsy();
|
||||
});
|
||||
setTimeout(() => {
|
||||
const oneInterval = smartInterval.cfg.startingInterval * DEFAULT_INCREMENT_FACTOR;
|
||||
expect(smartInterval.getCurrentInterval()).toEqual(oneInterval);
|
||||
done();
|
||||
}, DEFAULT_SHORT_TIMEOUT);
|
||||
});
|
||||
});
|
||||
})(window.gl || (window.gl = {}));
|
||||
|
||||
describe('Public methods', function () {
|
||||
beforeEach(function () {
|
||||
this.smartInterval = createDefaultSmartInterval();
|
||||
});
|
||||
|
||||
it('should cancel an interval', function (done) {
|
||||
const interval = this.smartInterval;
|
||||
|
||||
setTimeout(() => {
|
||||
interval.cancel();
|
||||
|
||||
const intervalId = interval.state.intervalId;
|
||||
const currentInterval = interval.getCurrentInterval();
|
||||
const intervalLowerLimit = interval.cfg.startingInterval;
|
||||
|
||||
expect(intervalId).toBeUndefined();
|
||||
expect(currentInterval).toBe(intervalLowerLimit);
|
||||
|
||||
done();
|
||||
}, DEFAULT_SHORT_TIMEOUT);
|
||||
});
|
||||
|
||||
it('should resume an interval', function (done) {
|
||||
const interval = this.smartInterval;
|
||||
|
||||
setTimeout(() => {
|
||||
interval.cancel();
|
||||
|
||||
interval.resume();
|
||||
|
||||
const intervalId = interval.state.intervalId;
|
||||
|
||||
expect(intervalId).toBeTruthy();
|
||||
|
||||
done();
|
||||
}, DEFAULT_SHORT_TIMEOUT);
|
||||
});
|
||||
});
|
||||
|
||||
describe('DOM Events', function () {
|
||||
beforeEach(function () {
|
||||
// This ensures DOM and DOM events are initialized for these specs.
|
||||
setFixtures('<div></div>');
|
||||
|
||||
this.smartInterval = createDefaultSmartInterval();
|
||||
});
|
||||
|
||||
it('should pause when page is not visible', function (done) {
|
||||
const interval = this.smartInterval;
|
||||
|
||||
setTimeout(() => {
|
||||
expect(interval.state.intervalId).toBeTruthy();
|
||||
|
||||
// simulates triggering of visibilitychange event
|
||||
interval.handleVisibilityChange({ target: { visibilityState: 'hidden' } });
|
||||
|
||||
expect(interval.state.intervalId).toBeUndefined();
|
||||
done();
|
||||
}, DEFAULT_SHORT_TIMEOUT);
|
||||
});
|
||||
|
||||
it('should change to the hidden interval when page is not visible', function (done) {
|
||||
const HIDDEN_INTERVAL = 1500;
|
||||
const interval = createDefaultSmartInterval({ hiddenInterval: HIDDEN_INTERVAL });
|
||||
|
||||
setTimeout(() => {
|
||||
expect(interval.state.intervalId).toBeTruthy();
|
||||
expect(interval.getCurrentInterval() >= DEFAULT_STARTING_INTERVAL &&
|
||||
interval.getCurrentInterval() <= DEFAULT_MAX_INTERVAL).toBeTruthy();
|
||||
|
||||
// simulates triggering of visibilitychange event
|
||||
interval.handleVisibilityChange({ target: { visibilityState: 'hidden' } });
|
||||
|
||||
expect(interval.state.intervalId).toBeTruthy();
|
||||
expect(interval.getCurrentInterval()).toBe(HIDDEN_INTERVAL);
|
||||
done();
|
||||
}, DEFAULT_SHORT_TIMEOUT);
|
||||
});
|
||||
|
||||
it('should resume when page is becomes visible at the previous interval', function (done) {
|
||||
const interval = this.smartInterval;
|
||||
|
||||
setTimeout(() => {
|
||||
expect(interval.state.intervalId).toBeTruthy();
|
||||
|
||||
// simulates triggering of visibilitychange event
|
||||
interval.handleVisibilityChange({ target: { visibilityState: 'hidden' } });
|
||||
|
||||
expect(interval.state.intervalId).toBeUndefined();
|
||||
|
||||
// simulates triggering of visibilitychange event
|
||||
interval.handleVisibilityChange({ target: { visibilityState: 'visible' } });
|
||||
|
||||
expect(interval.state.intervalId).toBeTruthy();
|
||||
|
||||
done();
|
||||
}, DEFAULT_SHORT_TIMEOUT);
|
||||
});
|
||||
|
||||
it('should cancel on page unload', function (done) {
|
||||
const interval = this.smartInterval;
|
||||
|
||||
setTimeout(() => {
|
||||
$(document).triggerHandler('beforeunload');
|
||||
expect(interval.state.intervalId).toBeUndefined();
|
||||
expect(interval.getCurrentInterval()).toBe(interval.cfg.startingInterval);
|
||||
done();
|
||||
}, DEFAULT_SHORT_TIMEOUT);
|
||||
});
|
||||
|
||||
it('should execute callback before first interval', function () {
|
||||
const interval = createDefaultSmartInterval({ immediateExecution: true });
|
||||
expect(interval.cfg.immediateExecution).toBeFalsy();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -121,24 +121,28 @@ describe('mrWidgetOptions', () => {
|
|||
|
||||
describe('initPolling', () => {
|
||||
it('should call SmartInterval', () => {
|
||||
spyOn(gl, 'SmartInterval').and.returnValue({
|
||||
resume() {},
|
||||
stopTimer() {},
|
||||
});
|
||||
spyOn(vm, 'checkStatus').and.returnValue(Promise.resolve());
|
||||
jasmine.clock().install();
|
||||
vm.initPolling();
|
||||
|
||||
expect(vm.checkStatus).not.toHaveBeenCalled();
|
||||
|
||||
jasmine.clock().tick(10000);
|
||||
|
||||
expect(vm.pollingInterval).toBeDefined();
|
||||
expect(gl.SmartInterval).toHaveBeenCalled();
|
||||
expect(vm.checkStatus).toHaveBeenCalled();
|
||||
|
||||
jasmine.clock().uninstall();
|
||||
});
|
||||
});
|
||||
|
||||
describe('initDeploymentsPolling', () => {
|
||||
it('should call SmartInterval', () => {
|
||||
spyOn(gl, 'SmartInterval');
|
||||
spyOn(vm, 'fetchDeployments').and.returnValue(Promise.resolve());
|
||||
vm.initDeploymentsPolling();
|
||||
|
||||
expect(vm.deploymentsInterval).toBeDefined();
|
||||
expect(gl.SmartInterval).toHaveBeenCalled();
|
||||
expect(vm.fetchDeployments).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
|
|
Loading…
Reference in New Issue