set_global('$', global.make_zjquery());
set_global('i18n', global.stub_i18n);

zrequire('hash_util');
zrequire('narrow');
zrequire('narrow_state');
zrequire('people');
zrequire('presence');
zrequire('buddy_data');
zrequire('user_status');
zrequire('settings_org');
zrequire('feature_flags');
zrequire('message_edit');
zrequire('util');

var noop =  function () {};
$.fn.popover = noop; // this will get wrapped by our code

zrequire('popovers');
popovers.hide_user_profile = noop;

set_global('current_msg_list', {});
set_global('page_params', {
    custom_profile_fields: [],
});
set_global('rows', {});
set_global('templates', {});


set_global('message_viewport', {
    height: () => 500,
});

set_global('emoji_picker', {
    hide_emoji_popover: noop,
});

set_global('stream_popover', {
    hide_stream_popover: noop,
    hide_topic_popover: noop,
    hide_all_messages_popover: noop,
    hide_starred_messages_popover: noop,
    restore_stream_list_size: noop,
});

set_global('stream_data', {});

set_global('ClipboardJS', function (sel) {
    assert.equal(sel, '.copy_link');
});

var alice = {
    email: 'alice@example.com',
    full_name: 'Alice Smith',
    user_id: 42,
    is_guest: false,
    is_admin: false,
};

var me = {
    email: 'me@example.com',
    user_id: 30,
    full_name: 'Me Myself',
    timezone: 'US/Pacific',
};

var target = $.create('click target');
target.offset = () => {
    return {
        top: 10,
    };
};

var e = {
    stopPropagation: noop,
};

function initialize_people() {
    people.init();
    people.add_in_realm(me);
    people.add_in_realm(alice);
    people.initialize_current_user(me.user_id);
}

initialize_people();

function make_image_stubber() {
    var images = [];

    function stub_image() {
        var image = {};
        image.to_$ = () => {
            return {
                on: (name, f) => {
                    assert.equal(name, "load");
                    image.load_f = f;
                },
            };
        };
        images.push(image);
        return image;
    }

    set_global('Image', function () {
        return stub_image();
    });

    return {
        get: (i) => images[i],
    };
}

popovers.register_click_handlers();

run_test('sender_hover', () => {
    var selection = ".sender_name, .sender_name-in-status, .inline_profile_picture";
    var handler = $('#main_div').get_on_handler('click', selection);

    var message = {
        id: 999,
        sender_id: alice.user_id,
    };

    user_status.set_status_text({
        user_id: alice.user_id,
        status_text: 'on the beach',
    });

    rows.id = () => message.id;

    current_msg_list.get = (msg_id) => {
        assert.equal(msg_id, message.id);
        return message;
    };

    current_msg_list.select_id = (msg_id) => {
        assert.equal(msg_id, message.id);
    };

    target.closest = (sel) => {
        assert.equal(sel, '.message_row');
        return {};
    };

    templates.render = function (fn, opts) {
        switch (fn) {
        case 'no_arrow_popover':
            assert.deepEqual(opts, {
                class: 'message-info-popover',
            });
            return 'popover-html';

        case 'user_info_popover_title':
            assert.deepEqual(opts, {
                user_avatar: 'avatar/alice@example.com',
                user_is_guest: false,
            });
            return 'title-html';

        case 'user_info_popover_content':
            assert.deepEqual(opts, {
                can_set_away: false,
                can_revoke_away: false,
                user_full_name: 'Alice Smith',
                user_email: 'alice@example.com',
                user_id: 42,
                user_time: undefined,
                user_type: i18n.t('Member'),
                user_circle_class: 'user_circle_empty',
                user_last_seen_time_status: 'translated: More than 2 weeks ago',
                pm_with_uri: '#narrow/pm-with/42-alice',
                sent_by_uri: '#narrow/sender/42-alice',
                private_message_class: 'respond_personal_button',
                show_email: false,
                show_user_profile: false,
                is_me: false,
                is_active: true,
                is_bot: undefined,
                is_sender_popover: true,
                status_text: 'on the beach',
            });
            return 'content-html';

        default:
            throw Error('unrecognized template: ' + fn);
        }
    };

    $('.user_popover_email').each = noop;

    var image_stubber = make_image_stubber();

    handler.call(target, e);

    var avatar_img = image_stubber.get(0);
    assert.equal(avatar_img.src, 'avatar/42/medium');

    // todo: load image
});

run_test('actions_popover', () => {
    var handler = $('#main_div').get_on_handler('click', '.actions_hover');

    window.location = {
        protocol: 'http:',
        host: 'chat.zulip.org',
        pathname: '/',
    };

    var message = {
        id: 999,
        topic: 'Actions (1)',
        type: 'stream',
        stream_id: 123,
    };

    current_msg_list.get = (msg_id) => {
        assert.equal(msg_id, message.id);
        return message;
    };

    message_edit.get_editability = () => 4;

    stream_data.id_to_slug = (stream_id) => {
        assert.equal(stream_id, 123);
        return 'Bracket ( stream';
    };

    target.closest = (sel) => {
        assert.equal(sel, '.message_row');
        return {
            toggleClass: noop,
        };
    };

    templates.render = function (fn, opts) {
        // TODO: Test all the properties of the popover
        switch (fn) {
        case 'actions_popover_content':
            assert.equal(
                opts.conversation_time_uri,
                'http://chat.zulip.org/#narrow/stream/Bracket.20%28.20stream/topic/Actions.20%281%29/near/999');
            return 'actions-content';
        default:
            throw Error('unrecognized template: ' + fn);
        }
    };

    handler.call(target, e);
});

@@ -932,22 +932,19 @@
     
-restor
+hid
 e_stream
 _lis
@@ -943,18 +943,20 @@
 ream
-_
 list_si
-ze
+debar
 : no

Fix mock for hide_streamlist_popover.