Files
zulip/frontend_tests/node_tests/presence.js
Steve Howell 42435db492 Add run_test helper for individual tests.
This run_test helper sets up a convention that allows
us to give really short tracebacks for errors, and
eventually we can have more control over running
individual tests.  (The latter goal has some
complications, since we often intentionally leak
setup in tests.)
2018-05-15 08:24:44 -07:00

224 lines
6.1 KiB
JavaScript

zrequire('people');
zrequire('presence');
set_global('server_events', {});
set_global('blueslip', {});
var OFFLINE_THRESHOLD_SECS = 140;
var me = {
email: 'me@zulip.com',
user_id: 999,
full_name: 'Me Myself',
};
var alice = {
email: 'alice@zulip.com',
user_id: 1,
full_name: 'Alice Smith',
};
var fred = {
email: 'fred@zulip.com',
user_id: 2,
full_name: "Fred Flintstone",
};
var zoe = {
email: 'zoe@example.com',
user_id: 6,
full_name: 'Zoe Yang',
};
var bot = {
email: 'bot@zulip.com',
user_id: 7,
full_name: 'The Bot',
is_bot: true,
};
people.add_in_realm(me);
people.add_in_realm(alice);
people.add_in_realm(fred);
people.add_in_realm(zoe);
people.add_in_realm(bot);
people.initialize_current_user(me.user_id);
run_test('on_mobile_property', () => {
// TODO: move this test to a new test module directly testing presence.js
var status_from_timestamp = presence._status_from_timestamp;
var base_time = 500;
var info = {
website: {
status: "active",
timestamp: base_time,
},
};
var status = status_from_timestamp(
base_time + OFFLINE_THRESHOLD_SECS - 1, info);
assert.equal(status.mobile, false);
info.Android = {
status: "active",
timestamp: base_time + OFFLINE_THRESHOLD_SECS / 2,
pushable: false,
};
status = status_from_timestamp(
base_time + OFFLINE_THRESHOLD_SECS, info);
assert.equal(status.mobile, true);
assert.equal(status.status, "active");
status = status_from_timestamp(
base_time + OFFLINE_THRESHOLD_SECS - 1, info);
assert.equal(status.mobile, false);
assert.equal(status.status, "active");
status = status_from_timestamp(
base_time + OFFLINE_THRESHOLD_SECS * 2, info);
assert.equal(status.mobile, false);
assert.equal(status.status, "offline");
info.Android = {
status: "idle",
timestamp: base_time + OFFLINE_THRESHOLD_SECS / 2,
pushable: true,
};
status = status_from_timestamp(
base_time + OFFLINE_THRESHOLD_SECS, info);
assert.equal(status.mobile, true);
assert.equal(status.status, "idle");
status = status_from_timestamp(
base_time + OFFLINE_THRESHOLD_SECS - 1, info);
assert.equal(status.mobile, false);
assert.equal(status.status, "active");
status = status_from_timestamp(
base_time + OFFLINE_THRESHOLD_SECS * 2, info);
assert.equal(status.mobile, true);
assert.equal(status.status, "offline");
info.Android = {
status: "offline",
timestamp: base_time + OFFLINE_THRESHOLD_SECS / 2,
pushable: true,
};
status = status_from_timestamp(
base_time + OFFLINE_THRESHOLD_SECS, info);
assert.equal(status.mobile, true);
assert.equal(status.status, "offline");
status = status_from_timestamp(
base_time + OFFLINE_THRESHOLD_SECS - 1, info);
assert.equal(status.mobile, false);
assert.equal(status.status, "active"); // website
status = status_from_timestamp(
base_time + OFFLINE_THRESHOLD_SECS * 2, info);
assert.equal(status.mobile, true);
assert.equal(status.status, "offline");
info.Android = {
status: "unknown",
timestamp: base_time + OFFLINE_THRESHOLD_SECS / 2,
pushable: true,
};
var called = false;
blueslip.error = function () {
assert.equal(arguments[0], 'Unexpected status');
assert.deepEqual(arguments[1].presence_object, info.Android);
assert.equal(arguments[2], undefined);
called = true;
};
status = status_from_timestamp(
base_time + OFFLINE_THRESHOLD_SECS - 1, info);
assert.equal(status.mobile, false);
assert.equal(status.status, "active"); // website
assert(called);
});
run_test('set_presence_info', () => {
var presences = {};
var base_time = 500;
presences[alice.email] = {
website: {
status: 'active',
timestamp: base_time,
},
};
presences[fred.email] = {
website: {
status: 'idle',
timestamp: base_time,
},
};
presence.set_info(presences, base_time);
assert.deepEqual(presence.presence_info[alice.user_id],
{ status: 'active', mobile: false, last_active: 500}
);
assert.deepEqual(presence.presence_info[fred.user_id],
{ status: 'idle', mobile: false, last_active: 500}
);
assert.deepEqual(presence.presence_info[zoe.user_id],
{ status: 'offline', mobile: false, last_active: undefined}
);
assert(!presence.presence_info[bot.user_id]);
// Make it seem like realm has a lot of people
var get_realm_count = people.get_realm_count;
people.get_realm_count = function () { return 1000; };
assert.equal(presence.set_info(presences, base_time), undefined);
people.get_realm_count = get_realm_count;
var unknown = {
email: 'unknown@zulip.com',
user_id: 42,
full_name: 'Unknown Name',
};
presences[unknown.email] = {};
server_events.suspect_offline = false;
blueslip.error = function (msg) {
assert.equal(msg, 'Unknown email in presence data: unknown@zulip.com');
};
presence.set_info(presences, base_time);
});
run_test('last_active_date', () => {
var unknown_id = 42;
presence.presence_info = {
1: { last_active: 500 }, // alice.user_id
2: {}, // fred.user_id
};
set_global('XDate', function (ms) { return {seconds: ms}; });
assert.equal(presence.last_active_date(unknown_id), undefined);
assert.equal(presence.last_active_date(fred.user_id), undefined);
assert.deepEqual(presence.last_active_date(alice.user_id), {seconds: 500000});
});
run_test('set_user_status', () => {
var server_time = 500;
var info = {
website: {
status: "active",
timestamp: server_time,
},
};
presence.presence_info[alice.user_id] = undefined;
presence.set_user_status(alice.user_id, info, server_time);
var expected = { status: 'active', mobile: false, last_active: 500 };
assert.deepEqual(presence.presence_info[alice.user_id], expected);
});