UNPKG

pusher-js

Version:

Pusher Channels JavaScript library for browsers, React Native, NodeJS and web workers

213 lines (163 loc) 7.29 kB
var Mocks = require("mocks"); var SequentialStrategy = require('core/strategies/sequential_strategy').default; describe("SequentialStrategy", function() { beforeEach(function() { this.callback = jasmine.createSpy(); this.substrategies = Mocks.getStrategies([true, true]); this.strategy = new SequentialStrategy(this.substrategies, {}); jasmine.clock().install(); }); afterEach(function() { jasmine.clock().uninstall(); }); describe("after calling isSupported", function() { it("should return true when one of substrategies is supported", function() { var substrategies = Mocks.getStrategies([false, true]); var strategy = new SequentialStrategy(substrategies, {}); expect(strategy.isSupported()).toBe(true); }); it("should return false when none of substrategies are supported", function() { var substrategies = Mocks.getStrategies([false, false]); var strategy = new SequentialStrategy(substrategies, {}); expect(strategy.isSupported()).toBe(false); }); }); describe("on connect", function() { it("should finish on first successful substrategy", function() { this.strategy.connect(0, this.callback); expect(this.substrategies[0].connect).toHaveBeenCalled(); expect(this.substrategies[1].connect).not.toHaveBeenCalled(); var handshake = {}; this.substrategies[0]._callback(null, handshake); expect(this.callback).toHaveBeenCalledWith(null, handshake); expect(this.substrategies[0]._abort).not.toHaveBeenCalled(); expect(this.substrategies[1].connect).not.toHaveBeenCalled(); }); it("should fail after trying all supported substrategies", function() { this.strategy.connect(0, this.callback); expect(this.substrategies[0].connect).toHaveBeenCalled(); expect(this.substrategies[1].connect).not.toHaveBeenCalled(); this.substrategies[0]._callback(true); expect(this.substrategies[1].connect).toHaveBeenCalled(); this.substrategies[1]._callback(true); expect(this.substrategies[1]._abort).not.toHaveBeenCalled(); expect(this.callback).toHaveBeenCalledWith(true); expect(this.callback.calls.count()).toEqual(1); }); it("should support looping", function() { var strategy = new SequentialStrategy(this.substrategies, { loop: true }); var runner = strategy.connect(0, this.callback); expect(this.substrategies[0].connect.calls.count()).toEqual(1); expect(this.substrategies[1].connect.calls.count()).toEqual(0); this.substrategies[0]._callback(true); expect(this.substrategies[0].connect.calls.count()).toEqual(1); expect(this.substrategies[1].connect.calls.count()).toEqual(1); this.substrategies[1]._callback(true); expect(this.substrategies[0].connect.calls.count()).toEqual(2); expect(this.substrategies[1].connect.calls.count()).toEqual(1); runner.abort(); expect(this.substrategies[0]._abort).toHaveBeenCalled(); }); }); describe("on abort", function() { it("should send abort to first tried substrategy", function() { var runner = this.strategy.connect(0, this.callback); expect(this.substrategies[0].connect).toHaveBeenCalled(); expect(this.substrategies[1].connect).not.toHaveBeenCalled(); runner.abort(); expect(this.substrategies[0]._abort).toHaveBeenCalled(); expect(this.substrategies[1].connect).not.toHaveBeenCalled(); }); it("should send abort to second tried substrategy", function() { var runner = this.strategy.connect(0, this.callback); this.substrategies[0]._callback(true); expect(this.substrategies[1].connect).toHaveBeenCalled(); runner.abort(); expect(this.substrategies[1]._abort).toHaveBeenCalled(); }); it("should stop retrying with timeouts", function() { var strategy = new SequentialStrategy(this.substrategies, { timeout: 100 }); var runner = strategy.connect(0, this.callback); expect(this.substrategies[0].connect).toHaveBeenCalled(); expect(this.substrategies[1].connect).not.toHaveBeenCalled(); runner.abort(); jasmine.clock().tick(100); expect(this.substrategies[1].connect).not.toHaveBeenCalled(); }); }); describe("on error", function() { it("should wait for the timeout before calling back", function() { var substrategy = Mocks.getStrategy(true); var strategy = new SequentialStrategy([substrategy], { timeout: 100 }); strategy.connect(0, this.callback); substrategy._callback(true); jasmine.clock().tick(99); expect(this.callback).not.toHaveBeenCalled(); jasmine.clock().tick(1); expect(this.callback).toHaveBeenCalled(); }); it("should not wait for the timeout before calling back if failFast is on", function() { var substrategy = Mocks.getStrategy(true); var strategy = new SequentialStrategy([substrategy], { timeout: 100, failFast: true }); strategy.connect(0, this.callback); substrategy._callback(true); expect(this.callback).toHaveBeenCalled(); }); }); describe("on timeout", function() { it("should try substrategies with exponential timeouts", function() { var substrategies = Mocks.getStrategies( [true, true, true, true, true] ); var strategy = new SequentialStrategy(substrategies, { timeout: 100, timeoutLimit: 400 }); strategy.connect(0, this.callback); expect(substrategies[0].connect).toHaveBeenCalled(); expect(substrategies[1].connect).not.toHaveBeenCalled(); jasmine.clock().tick(99); expect(substrategies[1].connect).not.toHaveBeenCalled(); jasmine.clock().tick(1); expect(substrategies[1].connect).toHaveBeenCalled(); expect(substrategies[2].connect).not.toHaveBeenCalled(); jasmine.clock().tick(199); expect(substrategies[2].connect).not.toHaveBeenCalled(); jasmine.clock().tick(1); expect(substrategies[2].connect).toHaveBeenCalled(); expect(substrategies[3].connect).not.toHaveBeenCalled(); jasmine.clock().tick(399); expect(substrategies[3].connect).not.toHaveBeenCalled(); jasmine.clock().tick(1); expect(substrategies[3].connect).toHaveBeenCalled(); expect(substrategies[4].connect).not.toHaveBeenCalled(); jasmine.clock().tick(399); expect(substrategies[4].connect).not.toHaveBeenCalled(); jasmine.clock().tick(1); expect(substrategies[4].connect).toHaveBeenCalled(); }); }); describe("on forceMinPriority", function() { it("should force the priority on the running substrategy", function() { var runner = this.strategy.connect(0, this.callback); runner.forceMinPriority(5); expect(this.substrategies[0]._forceMinPriority).toHaveBeenCalledWith(5); }); it("should keep connecting with the new priority", function() { var runner = this.strategy.connect(0, this.callback); runner.forceMinPriority(5); this.substrategies[0]._callback(true); expect(this.substrategies[1].connect) .toHaveBeenCalledWith(5, jasmine.any(Function)); }); }); });