zrequire('people'); zrequire('presence'); const return_false = function () { return false; }; set_global('server_events', {}); set_global('reload_state', { is_in_progress: return_false, }); const OFFLINE_THRESHOLD_SECS = 140; const me = { email: 'me@zulip.com', user_id: 101, full_name: 'Me Myself', }; const alice = { email: 'alice@zulip.com', user_id: 1, full_name: 'Alice Smith', }; const fred = { email: 'fred@zulip.com', user_id: 2, full_name: "Fred Flintstone", }; const zoe = { email: 'zoe@example.com', user_id: 6, full_name: 'Zoe Yang', }; const bot = { email: 'bot@zulip.com', user_id: 7, full_name: 'The Bot', is_bot: true, }; people.add(me); people.add(alice); people.add(fred); people.add(zoe); people.add(bot); people.initialize_current_user(me.user_id); run_test('my user', () => { assert.equal(presence.get_status(me.user_id), 'active'); }); run_test('unknown user', () => { const unknown_user_id = 999; const now = 888888; const presences = {}; presences[unknown_user_id.toString()] = 'does-not-matter'; blueslip.expect('error', 'Unknown user ID in presence data: 999'); presence.set_info(presences, now); blueslip.reset(); // If the server is suspected to be offline or reloading, // then we suppress errors. The use case here is that we // haven't gotten info for a brand new user yet. server_events.suspect_offline = true; presence.set_info(presences, now); server_events.suspect_offline = false; reload_state.is_in_progress = () => true; presence.set_info(presences, now); reload_state.is_in_progress = () => false; }); run_test('status_from_timestamp', () => { const status_from_timestamp = presence._status_from_timestamp; const base_time = 500; const info = { website: { status: "active", timestamp: base_time, }, }; let status = status_from_timestamp( base_time + OFFLINE_THRESHOLD_SECS - 1, info); info.random_client = { status: "active", timestamp: base_time + OFFLINE_THRESHOLD_SECS / 2, pushable: false, }; status = status_from_timestamp( base_time + OFFLINE_THRESHOLD_SECS, info); assert.equal(status.status, "active"); status = status_from_timestamp( base_time + OFFLINE_THRESHOLD_SECS - 1, info); assert.equal(status.status, "active"); status = status_from_timestamp( base_time + OFFLINE_THRESHOLD_SECS * 2, info); assert.equal(status.status, "offline"); info.random_client = { status: "idle", timestamp: base_time + OFFLINE_THRESHOLD_SECS / 2, pushable: true, }; status = status_from_timestamp( base_time + OFFLINE_THRESHOLD_SECS, info); assert.equal(status.status, "idle"); status = status_from_timestamp( base_time + OFFLINE_THRESHOLD_SECS - 1, info); assert.equal(status.status, "active"); status = status_from_timestamp( base_time + OFFLINE_THRESHOLD_SECS * 2, info); assert.equal(status.status, "offline"); info.random_client = { status: "offline", timestamp: base_time + OFFLINE_THRESHOLD_SECS / 2, pushable: true, }; status = status_from_timestamp( base_time + OFFLINE_THRESHOLD_SECS, info); assert.equal(status.status, "offline"); status = status_from_timestamp( base_time + OFFLINE_THRESHOLD_SECS - 1, info); assert.equal(status.status, "active"); // website status = status_from_timestamp( base_time + OFFLINE_THRESHOLD_SECS * 2, info); assert.equal(status.status, "offline"); info.random_client = { status: "unknown", timestamp: base_time + OFFLINE_THRESHOLD_SECS / 2, pushable: true, }; blueslip.expect('error', 'Unexpected status'); status = status_from_timestamp( base_time + OFFLINE_THRESHOLD_SECS - 1, info); blueslip.reset(); assert.equal(status.status, "active"); // website }); run_test('set_presence_info', () => { const presences = {}; const base_time = 500; presences[alice.user_id.toString()] = { website: { status: 'active', timestamp: base_time, }, }; presences[fred.user_id.toString()] = { website: { status: 'idle', timestamp: base_time, }, }; presences[me.user_id.toString()] = { website: { status: 'active', timestamp: base_time, }, }; const params = {}; params.presences = presences; params.initial_servertime = base_time; presence.initialize(params); assert.deepEqual(presence.presence_info.get(alice.user_id), { status: 'active', last_active: 500} ); assert.deepEqual(presence.presence_info.get(fred.user_id), { status: 'idle', last_active: 500} ); assert.deepEqual(presence.presence_info.get(me.user_id), { status: 'active', last_active: 500} ); assert.deepEqual(presence.presence_info.get(zoe.user_id), { status: 'offline', last_active: undefined} ); assert(!presence.presence_info.has(bot.user_id)); // Make it seem like realm has a lot of people const get_active_human_count = people.get_active_human_count; people.get_active_human_count = function () { return 1000; }; assert.equal(presence.set_info(presences, base_time), undefined); people.get_active_human_count = get_active_human_count; }); run_test('last_active_date', () => { const unknown_id = 42; presence.presence_info.clear(); presence.presence_info.set(alice.user_id, { last_active: 500 }); presence.presence_info.set(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('update_info_from_event', () => { const server_time = 500; const info = { website: { status: "active", timestamp: server_time, }, }; presence.presence_info.delete(alice.user_id); presence.update_info_from_event(alice.user_id, info, server_time); const expected = { status: 'active', last_active: 500 }; assert.deepEqual(presence.presence_info.get(alice.user_id), expected); });