pusher-js
Version:
Pusher Channels JavaScript library for browsers, React Native, NodeJS and web workers
250 lines (192 loc) • 7.49 kB
JavaScript
var TransportStrategy = require('core/strategies/transport_strategy').default;
var Errors = require('core/errors');
var Handshake = require('core/connection/handshake').default;
var Mocks = require('mocks');
var Factory = require('core/utils/factory').default;
describe("TransportStrategy", function() {
var transport, transportClass, handshake;
var callback;
var strategy;
beforeEach(function() {
transport = Mocks.getTransport(true);
transportClass = Mocks.getTransportClass(true, transport);
spyOn(Factory, 'createHandshake').and.callFake(function(transport, callback) {
handshake = Mocks.getHandshake(transport, callback);
return handshake;
});
strategy = new TransportStrategy(
"name", 1, transportClass, { key: "foo" }
);
callback = jasmine.createSpy("connectCallback");
});
describe("#isSupported", function() {
it("should return true when transport is supported", function() {
var transportClass = Mocks.getTransportClass(true);
var strategy = new TransportStrategy("name", 1, transportClass);
expect(strategy.isSupported()).toBe(true);
});
it("should return false when transport is not supported", function() {
var strategy = new TransportStrategy(
"name", 1, Mocks.getTransportClass(false)
);
expect(strategy.isSupported()).toBe(false);
});
});
describe("#connect", function() {
beforeEach(() => {
jasmine.clock().install();
});
afterEach(() => {
jasmine.clock().uninstall();
});
it("should pass key and options to the transport", function() {
var options = {
key: "asdf",
foo: "bar"
};
var strategy = new TransportStrategy(
"name", 1, transportClass, options
);
strategy.connect(0, callback);
expect(transportClass.createConnection)
.toHaveBeenCalledWith("name", 1, "asdf", options);
});
it("should call connect on the transport after initializing", function() {
strategy.connect(0, callback);
expect(transport.initialize).toHaveBeenCalled();
expect(transport.connect).not.toHaveBeenCalled();
transport.state = "initialized";
transport.emit("initialized");
expect(transport.connect).toHaveBeenCalled();
});
it("should not call back before processing a handshake", function() {
strategy.connect(0, callback);
transport.state = "initialized";
transport.emit("initialized");
transport.state = "connecting";
transport.emit("connecting");
transport.state = "open";
transport.emit("open");
expect(callback).not.toHaveBeenCalled();
});
it("should call back with a 'connected' action, the transport and a connection after processing it successfully", function() {
strategy.connect(0, callback);
transport.state = "initialized";
transport.emit("initialized");
transport.state = "connecting";
transport.emit("connecting");
transport.state = "open";
transport.emit("open");
var handshakeResult = {
action: "connected",
transport: transport,
connection: Mocks.getConnection()
};
handshake._callback(handshakeResult);
expect(callback).toHaveBeenCalledWith(null, handshakeResult);
});
it("should call back with an error after getting an 'error' event", function() {
strategy.connect(0, callback);
transport.state = "initialized";
transport.emit("initialized");
transport.emit("error", {
type: "WebSocketError",
error: 123
});
expect(callback).toHaveBeenCalledWith({
type: "WebSocketError",
error: 123
});
});
it("should call back with an error when transport closes prematurely", function() {
strategy.connect(0, callback);
transport.state = "initialized";
transport.emit("initialized");
transport.state = "closed";
transport.emit("closed");
expect(callback)
.toHaveBeenCalledWith(jasmine.any(Errors.TransportClosed));
});
it("should call back with an error if transport's priority is too low", function() {
strategy.connect(2, callback);
jasmine.clock().tick(100);
expect(callback).toHaveBeenCalledWith(jasmine.any(Errors.TransportPriorityTooLow));
});
it("should call back with an error if transport is not supported", function() {
transportClass.isSupported.and.returnValue(false);
strategy.connect(0, callback);
jasmine.clock().tick(100);
expect(callback.calls.count()).toBeGreaterThan(0);
expect(callback).toHaveBeenCalledWith(jasmine.any(Errors.UnsupportedStrategy));
});
});
describe("runner.abort", function() {
it("should close transport in 'connecting' state", function() {
var runner = strategy.connect(0, callback);
transport.state = "initialized";
transport.emit("initialized");
transport.state = "connecting";
transport.emit("connecting");
runner.abort();
expect(transport.close).toHaveBeenCalled();
});
it("should close handshake before processing a it", function() {
var runner = strategy.connect(0, callback);
transport.state = "initialized";
transport.emit("initialized");
transport.state = "connecting";
transport.emit("connecting");
transport.state = "open";
transport.emit("open");
runner.abort();
expect(handshake.close).toHaveBeenCalled();
});
it("should not close transport after processing a handshake", function() {
var runner = strategy.connect(0, callback);
transport.state = "initialized";
transport.emit("initialized");
transport.state = "connecting";
transport.emit("connecting");
transport.state = "open";
transport.emit("open");
handshake._callback();
runner.abort();
expect(transport.close).not.toHaveBeenCalled();
});
});
describe("runner.forceMinPriority", function() {
it("should close the transport if transport's priority is too low", function() {
var runner = strategy.connect(0, callback);
runner.forceMinPriority(5);
expect(transport.close).toHaveBeenCalled();
});
it("should not close the transport if transport's priority is high enough", function() {
var runner = strategy.connect(0, callback);
runner.forceMinPriority(1);
expect(transport.close).not.toHaveBeenCalled();
});
it("should close the handshake with too low priority before processing it", function() {
var runner = strategy.connect(0, callback);
transport.state = "initialized";
transport.emit("initialized");
transport.state = "connecting";
transport.emit("connecting");
transport.state = "open";
transport.emit("open");
runner.forceMinPriority(5);
expect(handshake.close).toHaveBeenCalled();
});
it("should not close the transport with too low priority after processing a handshake", function() {
var runner = strategy.connect(0, callback);
transport.state = "initialized";
transport.emit("initialized");
transport.state = "connecting";
transport.emit("connecting");
transport.state = "open";
transport.emit("open");
handshake._callback();
runner.forceMinPriority(5);
expect(transport.close).not.toHaveBeenCalled();
});
});
});