You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

263 lines
5.8 KiB

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