c145413d1a
Change airbnb eslint config package to `eslint-config-airbnb-base` and update plugins. Change `airbnb` to `airbnb-base` for .eslintrc `extends` value. Added changelog entry Made sure all plugins and envs are set Corrected new failing specs
159 lines
4.8 KiB
JavaScript
159 lines
4.8 KiB
JavaScript
//= require jquery
|
|
//= require smart_interval
|
|
|
|
(() => {
|
|
const DEFAULT_MAX_INTERVAL = 100;
|
|
const DEFAULT_STARTING_INTERVAL = 5;
|
|
const DEFAULT_SHORT_TIMEOUT = 75;
|
|
const DEFAULT_LONG_TIMEOUT = 1000;
|
|
const DEFAULT_INCREMENT_FACTOR = 2;
|
|
|
|
function createDefaultSmartInterval(config) {
|
|
const defaultParams = {
|
|
callback: () => {},
|
|
startingInterval: DEFAULT_STARTING_INTERVAL,
|
|
maxInterval: DEFAULT_MAX_INTERVAL,
|
|
incrementByFactorOf: DEFAULT_INCREMENT_FACTOR,
|
|
delayStartBy: 0,
|
|
lazyStart: false,
|
|
};
|
|
|
|
if (config) {
|
|
_.extend(defaultParams, config);
|
|
}
|
|
|
|
return new gl.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);
|
|
});
|
|
});
|
|
|
|
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.
|
|
fixture.set('<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.state.pageVisibility = 'hidden';
|
|
interval.handleVisibilityChange();
|
|
|
|
expect(interval.state.intervalId).toBeUndefined();
|
|
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.state.pageVisibility = 'hidden';
|
|
interval.handleVisibilityChange();
|
|
|
|
expect(interval.state.intervalId).toBeUndefined();
|
|
|
|
// simulates triggering of visibilitychange event
|
|
interval.state.pageVisibility = 'visible';
|
|
interval.handleVisibilityChange();
|
|
|
|
expect(interval.state.intervalId).toBeTruthy();
|
|
|
|
done();
|
|
}, DEFAULT_SHORT_TIMEOUT);
|
|
});
|
|
|
|
it('should cancel on page unload', function (done) {
|
|
const interval = this.smartInterval;
|
|
|
|
setTimeout(() => {
|
|
$(document).trigger('page:before-unload');
|
|
expect(interval.state.intervalId).toBeUndefined();
|
|
expect(interval.getCurrentInterval()).toBe(interval.cfg.startingInterval);
|
|
done();
|
|
}, DEFAULT_SHORT_TIMEOUT);
|
|
});
|
|
});
|
|
});
|
|
})(window.gl || (window.gl = {}));
|