/* * angular-socket-io v0.4.1 * (c) 2014 Brian Ford http://briantford.com * License: MIT */ 'use strict'; describe('socketFactory', function () { beforeEach(module('btford.socket-io')); var socket, scope, $timeout, $browser, mockIoSocket, spy; beforeEach(inject(function (socketFactory, _$browser_, $rootScope, _$timeout_) { $browser = _$browser_; $timeout = _$timeout_; scope = $rootScope.$new(); spy = jasmine.createSpy('emitSpy'); mockIoSocket = io.connect(); socket = socketFactory({ ioSocket: mockIoSocket, scope: scope }); })); describe('#on', function () { it('should apply asynchronously', function () { socket.on('event', spy); mockIoSocket.emit('event'); expect(spy).not.toHaveBeenCalled(); $timeout.flush(); expect(spy).toHaveBeenCalled(); }); }); describe('#disconnect', function () { it('should call the underlying socket.disconnect', function () { mockIoSocket.disconnect = spy; socket.disconnect(); expect(spy).toHaveBeenCalled(); }); }); describe('#connect', function () { it('should call the underlying socket.connect', function () { mockIoSocket.connect = spy; socket.connect(); expect(spy).toHaveBeenCalled(); }); }); describe('#once', function () { it('should apply asynchronously', function () { socket.once('event', spy); mockIoSocket.emit('event'); expect(spy).not.toHaveBeenCalled(); $timeout.flush(); expect(spy).toHaveBeenCalled(); }); it('should only run once', function () { var counter = 0; socket.once('event', function () { counter += 1; }); mockIoSocket.emit('event'); mockIoSocket.emit('event'); $timeout.flush(); expect(counter).toBe(1); }); }); describe('#emit', function () { it('should call the delegate socket\'s emit', function () { spyOn(mockIoSocket, 'emit'); socket.emit('event', {foo: 'bar'}); expect(mockIoSocket.emit).toHaveBeenCalled(); }); it('should allow multiple data arguments', function () { spyOn(mockIoSocket, 'emit'); socket.emit('event', 'x', 'y'); expect(mockIoSocket.emit).toHaveBeenCalledWith('event', 'x', 'y'); }); it('should wrap the callback with multiple data arguments', function () { spyOn(mockIoSocket, 'emit'); socket.emit('event', 'x', 'y', spy); expect(mockIoSocket.emit.mostRecentCall.args[3]).toNotBe(spy); mockIoSocket.emit.mostRecentCall.args[3](); expect(spy).not.toHaveBeenCalled(); $timeout.flush(); expect(spy).toHaveBeenCalled(); }); }); describe('#removeListener', function () { it('should not call after removing an event', function () { socket.on('event', spy); socket.removeListener('event', spy); mockIoSocket.emit('event'); expect($browser.deferredFns.length).toBe(0); }); }); describe('#removeAllListeners', function () { it('should not call after removing listeners for an event', function () { socket.on('event', spy); socket.removeAllListeners('event'); mockIoSocket.emit('event'); expect($browser.deferredFns.length).toBe(0); }); it('should not call after removing all listeners', function () { socket.on('event', spy); socket.on('event2', spy); socket.removeAllListeners(); mockIoSocket.emit('event'); mockIoSocket.emit('event2'); expect($browser.deferredFns.length).toBe(0); }); }); describe('#forward', function () { it('should forward events', function () { socket.forward('event'); scope.$on('socket:event', spy); mockIoSocket.emit('event'); $timeout.flush(); expect(spy).toHaveBeenCalled(); }); it('should forward an array of events', function () { socket.forward(['e1', 'e2']); scope.$on('socket:e1', spy); scope.$on('socket:e2', spy); mockIoSocket.emit('e1'); mockIoSocket.emit('e2'); $timeout.flush(); expect(spy.callCount).toBe(2); }); it('should remove watchers when the scope is removed', function () { socket.forward('event'); scope.$on('socket:event', spy); mockIoSocket.emit('event'); $timeout.flush(); expect(spy).toHaveBeenCalled(); scope.$destroy(); spy.reset(); mockIoSocket.emit('event'); expect(spy).not.toHaveBeenCalled(); }); it('should use the specified prefix', inject(function (socketFactory) { var socket = socketFactory({ ioSocket: mockIoSocket, scope: scope, prefix: 'custom:' }); socket.forward('event'); scope.$on('custom:event', spy); mockIoSocket.emit('event'); $timeout.flush(); expect(spy).toHaveBeenCalled(); })); it('should use an empty prefix if specified', inject(function (socketFactory) { var socket = socketFactory({ ioSocket: mockIoSocket, scope: scope, prefix: '' }); socket.forward('event'); scope.$on('event', spy); mockIoSocket.emit('event'); $timeout.flush(); expect(spy).toHaveBeenCalled(); })); it('should forward to the specified scope when one is provided', function () { var child = scope.$new(); spyOn(child, '$broadcast'); socket.forward('event', child); scope.$on('socket:event', spy); mockIoSocket.emit('event'); $timeout.flush(); expect(child.$broadcast).toHaveBeenCalled(); }); it('should pass all arguments to scope.$on', function () { socket.forward('event'); scope.$on('socket:event', spy); mockIoSocket.emit('event', 1, 2, 3); $timeout.flush(); expect(spy.calls[0].args.slice(1)).toEqual([1, 2, 3]); }); }); });