pusher-js
Version:
Pusher Channels JavaScript library for browsers, React Native, NodeJS and web workers
156 lines (129 loc) • 4.61 kB
JavaScript
var timers = require('core/utils/timers');
describe("timers", function() {
afterEach(() => {
jasmine.clock().uninstall();
});
describe("Timer", function() {
var callback;
var timer;
beforeEach(function() {
jasmine.clock().uninstall();
jasmine.clock().install();
callback = jasmine.createSpy("callback");
timer = new timers.OneOffTimer(123, callback);
});
afterEach(function() {
timer.ensureAborted();
});
it("should execute the callback with the specified delay", function() {
expect(callback).not.toHaveBeenCalled();
jasmine.clock().tick(122);
expect(callback).not.toHaveBeenCalled();
jasmine.clock().tick(1);
expect(callback).toHaveBeenCalled();
});
it("should execute the callback exactly once", function() {
jasmine.clock().tick(1000);
expect(callback.calls.count()).toEqual(1);
});
describe("#isRunning", function() {
it("should return true before execution", function() {
jasmine.clock().tick(122);
expect(timer.isRunning()).toBe(true);
});
it("should return false after execution", function() {
jasmine.clock().tick(123);
expect(timer.isRunning()).toBe(false);
});
it("should return false after aborting", function() {
timer.ensureAborted();
expect(timer.isRunning()).toBe(false);
});
});
describe("#ensureAborted", function() {
it("should abort the timer before execution", function() {
timer.ensureAborted();
jasmine.clock().tick(1000);
expect(callback).not.toHaveBeenCalled();
});
it("should play nice after execution", function() {
jasmine.clock().tick(1000);
timer.ensureAborted();
});
it("should stop callback from being called even if clearTimeout is broken", function() {
// IE has some edge-case with clearTimeout not working, let's simulate it
spyOn(global, "clearTimeout");
timer.ensureAborted();
jasmine.clock().tick(1000);
expect(callback).not.toHaveBeenCalled();
});
});
});
describe("PeriodicTimer", function() {
var callback;
var timer;
beforeEach(function() {
jasmine.clock().uninstall();
jasmine.clock().install();
callback = jasmine.createSpy("callback");
timer = new timers.PeriodicTimer(123, callback);
});
afterEach(function() {
timer.ensureAborted();
});
it("should execute the callback with the specified delay", function() {
expect(callback).not.toHaveBeenCalled();
jasmine.clock().tick(122);
expect(callback).not.toHaveBeenCalled();
jasmine.clock().tick(1);
expect(callback).toHaveBeenCalled();
});
it("should execute the callback periodically", function() {
jasmine.clock().tick(123);
expect(callback.calls.count()).toEqual(1);
jasmine.clock().tick(123);
expect(callback.calls.count()).toEqual(2);
});
describe("#isRunning", function() {
it("should return true before execution", function() {
jasmine.clock().tick(122);
expect(timer.isRunning()).toBe(true);
});
it("should return true after execution", function() {
jasmine.clock().tick(123);
expect(timer.isRunning()).toBe(true);
});
it("should return false after aborting", function() {
timer.ensureAborted();
expect(timer.isRunning()).toBe(false);
});
});
describe("#ensureAborted", function() {
it("should abort the timer before execution", function() {
timer.ensureAborted();
jasmine.clock().tick(1000);
expect(callback).not.toHaveBeenCalled();
});
it("should abort the timer after first execution", function() {
jasmine.clock().tick(123);
expect(callback.calls.count()).toEqual(1);
timer.ensureAborted();
jasmine.clock().tick(1000);
expect(callback.calls.count()).toEqual(1);
});
it("should be idempotent", function() {
timer.ensureAborted();
timer.ensureAborted();
jasmine.clock().tick(1000);
expect(callback).not.toHaveBeenCalled();
});
it("should stop callback from being called even if clearTimeout is broken", function() {
// IE has some edge-case with clearTimeout not working, let's simulate it
spyOn(global, "clearTimeout");
timer.ensureAborted();
jasmine.clock().tick(1000);
expect(callback).not.toHaveBeenCalled();
});
});
});
});