UNPKG

pusher-js

Version:

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

331 lines (257 loc) 9.91 kB
var Errors = require('core/errors'); var Factory = require('core/utils/factory').default; var Mocks = require("mocks"); describe("Channel", function() { var pusher; var channel; var Channel = require('core/channels/channel').default; beforeEach(function() { pusher = Mocks.getPusher(); channel = new Channel("test", pusher); }); describe("after construction", function() { it("#subscribed should be false", function() { expect(channel.subscribed).toEqual(false); }); it("#subscriptionPending should be false", function() { expect(channel.subscriptionPending).toEqual(false); }); it("#subscriptionCancelled should be false", function() { expect(channel.subscriptionCancelled).toEqual(false); }); }); describe("#authorize", function() { it("should call back with null, {} immediately", function() { var callback = jasmine.createSpy("callback"); channel.authorize("1.1", callback); expect(callback).toHaveBeenCalledWith(null, {auth: ''}); }); }); describe("#trigger", function() { beforeEach(function() { channel.subscribed = true; }); it("should raise an exception if the event name does not start with client-", function() { expect(() => channel.trigger('whatever', {})).toThrow(jasmine.any(Errors.BadEventName)); }); it("should call send_event on connection", function() { channel.trigger("client-test", { k: "v" }); expect(pusher.send_event) .toHaveBeenCalledWith("client-test", { k: "v" }, "test"); }); it("should return true if connection sent the event", function() { pusher.send_event.and.returnValue(true); expect(channel.trigger("client-test", {})).toBe(true); }); it("should return false if connection didn't send the event", function() { pusher.send_event.and.returnValue(false); expect(channel.trigger("client-test", {})).toBe(false); }); }); describe("#disconnect", function() { it("should set subscribed to false", function() { channel.handleEvent({ event: "pusher_internal:subscription_succeeded" }); channel.disconnect(); expect(channel.subscribed).toEqual(false); }); it("should set subscriptionPending to false", function() { channel.subscriptionPending = true; channel.disconnect(); expect(channel.subscriptionPending).toEqual(false); }); }); describe("#handleEvent", function() { it("should not emit pusher_internal:* events", function() { var callback = jasmine.createSpy("callback"); channel.bind("pusher_internal:test", callback); channel.bind_global(callback); channel.handleEvent({ event: "pusher_internal:test" }); expect(callback).not.toHaveBeenCalled(); }); describe("on pusher_internal:subscription_succeeded", function() { it("should emit pusher:subscription_succeeded", function() { var callback = jasmine.createSpy("callback"); channel.bind("pusher:subscription_succeeded", callback); channel.handleEvent({ event: "pusher_internal:subscription_succeeded", data: "123" }); expect(callback).toHaveBeenCalledWith("123"); }); it("should set #subscribed to true", function() { channel.handleEvent({ event: "pusher_internal:subscription_succeeded", data: "123" }); expect(channel.subscribed).toEqual(true); }); it("should set #subscriptionPending to false", function() { channel.handleEvent({ event: "pusher_internal:subscription_succeeded", data: "123" }); expect(channel.subscriptionPending).toEqual(false); }); }); describe("pusher_internal:subscription_succeeded but subscription cancelled", function() { it("should not emit pusher:subscription_succeeded", function() { var callback = jasmine.createSpy("callback"); channel.bind("pusher:subscription_succeeded", callback); channel.cancelSubscription(); channel.handleEvent({ event: "pusher_internal:subscription_succeeded", data: "123" }); expect(callback).not.toHaveBeenCalled(); }); it("should set #subscribed to true", function() { channel.cancelSubscription(); channel.handleEvent({ event: "pusher_internal:subscription_succeeded", data: "123" }); expect(channel.subscribed).toEqual(true); }); it("should set #subscriptionPending to false", function() { channel.cancelSubscription(); channel.handleEvent({ event: "pusher_internal:subscription_succeeded", data: "123" }); expect(channel.subscriptionPending).toEqual(false); }); it("should call #pusher.unsubscribe", function() { expect(pusher.unsubscribe).not.toHaveBeenCalled(); channel.cancelSubscription(); channel.handleEvent({ event: "pusher_internal:subscription_succeeded", data: "123" }); expect(pusher.unsubscribe).toHaveBeenCalledWith(channel.name); }); }); describe("on other events", function() { it("should emit the event", function() { var callback = jasmine.createSpy("callback"); channel.bind("something", callback); channel.handleEvent({ event: "something", data: 9 }); expect(callback).toHaveBeenCalledWith(9, {}); }); it("should emit the event even if it's named like JS built-in", function() { var callback = jasmine.createSpy("callback"); channel.bind("toString", callback); channel.handleEvent({ event: "toString", data: "works" }); expect(callback).toHaveBeenCalledWith("works", {}); }); }); }); describe("#subscribe", function() { beforeEach(function() { pusher.connection = { socket_id: "9.37" }; channel.authorize = jasmine.createSpy("authorize"); }); it("should authorize the connection first", function() { expect(channel.authorize.calls.count()).toEqual(0); channel.subscribe(); expect(channel.authorize.calls.count()).toEqual(1); expect(channel.authorize).toHaveBeenCalledWith( "9.37", jasmine.any(Function) ); }); it("should send a pusher:subscribe message on successful authorization", function() { expect(pusher.send_event).not.toHaveBeenCalled(); channel.subscribe(); var authorizeCallback = channel.authorize.calls.first().args[1]; authorizeCallback(false, { auth: "one", channel_data: "two" }); expect(pusher.send_event).toHaveBeenCalledWith( "pusher:subscribe", { auth: "one", channel_data: "two", channel: "test" } ); }); it("should emit pusher:subscription_error event on unsuccessful authorization", function() { var onSubscriptionError = jasmine.createSpy("onSubscriptionError"); channel.bind("pusher:subscription_error", onSubscriptionError); channel.subscribe(); var authorizeCallback = channel.authorize.calls.first().args[1]; authorizeCallback(new Error("test error"), {auth: ""}) expect(onSubscriptionError).toHaveBeenCalledWith( { type: "AuthError", error: "test error" } ); expect(pusher.send_event).not.toHaveBeenCalled(); }); it("should set #subscriptionPending to true if previously unsubscribed", function() { expect(channel.subscriptionPending).toEqual(false); channel.subscribe(); expect(channel.subscriptionPending).toEqual(true); }); it("should set #subscriptionPending to false on unsuccessful authorization", function() { expect(channel.subscriptionPending).toEqual(false); channel.subscribe(); var authorizeCallback = channel.authorize.calls.first().args[1]; authorizeCallback(new Error("test error"), {auth: ""}) expect(channel.subscriptionPending).toEqual(false); }); it("should keep #subscriptionPending set as true after a successful authorization", function() { expect(channel.subscriptionPending).toEqual(false); channel.subscribe(); var authorizeCallback = channel.authorize.calls.first().args[1]; authorizeCallback(false, { auth: "one", channel_data: "two" }); expect(channel.subscriptionPending).toEqual(true); }); it("should do nothing if already subscribed", function() { channel.subscribed = true; channel.subscribe(); expect(channel.subscriptionPending).toEqual(false); }); }); describe("#unsubscribe", function() { it("should send a pusher:unsubscribe message", function() { expect(pusher.send_event).not.toHaveBeenCalled(); channel.unsubscribe(); expect(pusher.send_event).toHaveBeenCalledWith( "pusher:unsubscribe", { channel: "test" } ); }); it("should set #subscribed to false", function() { channel.subscribed = true; channel.unsubscribe(); expect(channel.subscribed).toEqual(false); }); }); describe("#cancelSubscription", function() { it("should set #subscriptionCancelled to true", function() { expect(channel.subscriptionCancelled).toEqual(false); channel.cancelSubscription(); expect(channel.subscriptionCancelled).toEqual(true); }); }); describe("#reinstateSubscription", function() { it("should set #subscriptionCancelled to false", function() { channel.cancelSubscription() expect(channel.subscriptionCancelled).toEqual(true); channel.reinstateSubscription(); expect(channel.subscriptionCancelled).toEqual(false); }); }); });