pokemon-showdown/test/application/users.js
Guangcong Luo 1a1530f4ff Refactor Connection#rooms to Set
Connection#rooms, previously a null-prototype roomid:room Object,
is now Connection#inRooms, a roomid Set.

This, incidentally, makes it stop retaining rooms, which may make the
GC's job easier and may also lead to unexpected bugs if we get
inconsistent state (we often do get inconsistent state, so look
forward to that!)

The rename is mostly to put it in line with the new User#inRooms,
and for ease of greppability without running into Rooms.rooms.
2016-08-22 03:57:52 -05:00

150 lines
4.5 KiB
JavaScript

'use strict';
const assert = require('assert');
let userUtils = require('./../../dev-tools/users-utils.js');
let Connection = userUtils.Connection;
let User = userUtils.User;
describe('Users features', function () {
describe('Users', function () {
describe('get', function () {
it('should be a function', function () {
assert.strictEqual(typeof Users.get, 'function');
});
it('should be equal to `Users`', function () {
assert.strictEqual(Users.get, Users);
});
});
describe('connections', function () {
it('should be a Map', function () {
assert.ok(Users.connections instanceof Map);
});
});
describe('users', function () {
it('should be a Map', function () {
assert.ok(Users.users instanceof Map);
});
});
describe('Connection', function () {
describe('#onDisconnect', function () {
beforeEach(function () {
this.connection = new Connection('127.0.0.1');
this.connection.user = new User(this.connection);
this.connection.user.name = 'Morfent';
this.connection.user.userid = 'morfent';
});
afterEach(function () {
this.connection.destroy();
});
it('should remove the connection from Users.connections', function () {
let connectionid = Users.connections.id;
this.connection.destroy();
assert.strictEqual(Users.connections.has(connectionid), false);
});
it('should destroy any user on the connection as well', function () {
let userid = this.connection.user.userid;
this.connection.destroy();
assert.strictEqual(Users.users.has(userid), false);
});
});
describe('#joinRoom', function () {
beforeEach(function () {
this.connection = new Connection('127.0.0.1');
});
afterEach(function () {
this.connection.destroy();
});
it('should join a room if not already present', function () {
this.connection.joinRoom(Rooms.lobby);
assert.ok(this.connection.inRooms.has('lobby'));
});
});
describe('#leaveRoom', function () {
it('should leave a room that is present', function () {
this.connection = new Connection('127.0.0.1');
this.connection.joinRoom(Rooms.lobby);
this.connection.leaveRoom(Rooms.lobby);
assert.ok(!this.connection.inRooms.has('lobby'));
});
});
});
describe('User', function () {
describe('#disconnectAll', function () {
for (let totalConnections of [1, 2]) {
it('should drop all ' + totalConnections + ' connection(s) and mark as inactive', function () {
let user = new User();
let iterations = totalConnections;
while (--iterations) user.mergeConnection(new Connection());
user.disconnectAll();
assert.strictEqual(user.connections.length, 0);
assert.strictEqual(user.connected, false);
});
it('should unref all ' + totalConnections + ' connection(s)', function () {
let user = new User();
let iterations = totalConnections;
while (--iterations) user.mergeConnection(new Connection());
let connections = user.connections.slice();
user.disconnectAll();
for (let i = 0; i < totalConnections; i++) {
assert.ok(!Users.connections.has(connections[i].id));
}
});
it('should clear `user` property for all ' + totalConnections + ' connection(s)', function () {
let user = new User();
let iterations = totalConnections;
while (--iterations) user.mergeConnection(new Connection());
let connections = user.connections.slice();
user.disconnectAll();
for (let i = 0; i < totalConnections; i++) {
assert.strictEqual(connections[i].user, null);
}
});
}
});
describe('#ban', function () {
afterEach(function () {
for (let ip in Users.bannedIps) {
delete Users.bannedIps[ip];
}
});
it('should disconnect every user at that IP', function () {
let users = ['127.0.0.1', '127.0.0.1'].map(ip => new User(new Connection(ip)));
Punishments.ban(users[0]);
assert.strictEqual(users[0].connected, false);
assert.strictEqual(users[1].connected, false);
});
it('should not disconnect users at other IPs', function () {
let users = ['127.0.0.1', '127.0.0.2'].map(ip => new User(new Connection(ip)));
Punishments.ban(users[0]);
assert.strictEqual(users[1].connected, true);
});
it('should update IP count properly', function () {
let user = new User();
Punishments.ban(user);
for (let ip in user.ips) {
assert.strictEqual(user.ips[ip], 0);
}
});
});
});
});
});