/*
|
|
* 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]);
|
|
});
|
|
});
|
|
|
|
});
|