mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			408 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			408 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
const assert = require("node:assert/strict");
 | 
						|
 | 
						|
const {mock_esm, zrequire} = require("./lib/namespace.cjs");
 | 
						|
const {run_test} = require("./lib/test.cjs");
 | 
						|
const blueslip = require("./lib/zblueslip.cjs");
 | 
						|
const $ = require("./lib/zjquery.cjs");
 | 
						|
 | 
						|
mock_esm("../src/settings_data", {
 | 
						|
    user_can_access_all_other_users: () => true,
 | 
						|
});
 | 
						|
 | 
						|
const {PollData} = zrequire("../shared/src/poll_data");
 | 
						|
 | 
						|
const poll_widget = zrequire("poll_widget");
 | 
						|
 | 
						|
const people = zrequire("people");
 | 
						|
const {set_realm} = zrequire("state_data");
 | 
						|
 | 
						|
set_realm({});
 | 
						|
 | 
						|
const me = {
 | 
						|
    email: "me@zulip.com",
 | 
						|
    full_name: "Me Myself",
 | 
						|
    user_id: 99,
 | 
						|
};
 | 
						|
const alice = {
 | 
						|
    email: "alice@zulip.com",
 | 
						|
    full_name: "Alice Lee",
 | 
						|
    user_id: 100,
 | 
						|
};
 | 
						|
people.add_active_user(me);
 | 
						|
people.add_active_user(alice);
 | 
						|
people.initialize_current_user(me.user_id);
 | 
						|
 | 
						|
run_test("PollData my question", () => {
 | 
						|
    const is_my_poll = true;
 | 
						|
    const question = "Favorite color?";
 | 
						|
 | 
						|
    const data_holder = new PollData({
 | 
						|
        current_user_id: me.user_id,
 | 
						|
        message_sender_id: me.user_id,
 | 
						|
        is_my_poll,
 | 
						|
        question,
 | 
						|
        options: [],
 | 
						|
        comma_separated_names: people.get_full_names_for_poll_option,
 | 
						|
        report_error_function: blueslip.warn,
 | 
						|
    });
 | 
						|
 | 
						|
    let data = data_holder.get_widget_data();
 | 
						|
 | 
						|
    assert.deepEqual(data, {
 | 
						|
        options: [],
 | 
						|
        question: "Favorite color?",
 | 
						|
    });
 | 
						|
 | 
						|
    const question_event = {
 | 
						|
        type: "question",
 | 
						|
        question: "best plan?",
 | 
						|
    };
 | 
						|
 | 
						|
    data_holder.handle_event(me.user_id, question_event);
 | 
						|
    data = data_holder.get_widget_data();
 | 
						|
 | 
						|
    assert.deepEqual(data, {
 | 
						|
        options: [],
 | 
						|
        question: "best plan?",
 | 
						|
    });
 | 
						|
 | 
						|
    const option_event = {
 | 
						|
        type: "new_option",
 | 
						|
        idx: 1,
 | 
						|
        option: "release now",
 | 
						|
    };
 | 
						|
 | 
						|
    data_holder.handle_event(me.user_id, option_event);
 | 
						|
    data = data_holder.get_widget_data();
 | 
						|
 | 
						|
    assert.deepEqual(data, {
 | 
						|
        options: [
 | 
						|
            {
 | 
						|
                option: "release now",
 | 
						|
                names: "",
 | 
						|
                count: 0,
 | 
						|
                key: "99,1",
 | 
						|
                current_user_vote: false,
 | 
						|
            },
 | 
						|
        ],
 | 
						|
        question: "best plan?",
 | 
						|
    });
 | 
						|
 | 
						|
    let vote_event = {
 | 
						|
        type: "vote",
 | 
						|
        key: "99,1",
 | 
						|
        vote: 1,
 | 
						|
    };
 | 
						|
 | 
						|
    data_holder.handle_event(me.user_id, vote_event);
 | 
						|
    data = data_holder.get_widget_data();
 | 
						|
 | 
						|
    assert.deepEqual(data, {
 | 
						|
        options: [
 | 
						|
            {
 | 
						|
                option: "release now",
 | 
						|
                names: "Me Myself",
 | 
						|
                count: 1,
 | 
						|
                key: "99,1",
 | 
						|
                current_user_vote: true,
 | 
						|
            },
 | 
						|
        ],
 | 
						|
        question: "best plan?",
 | 
						|
    });
 | 
						|
 | 
						|
    vote_event = {
 | 
						|
        type: "vote",
 | 
						|
        key: "99,1",
 | 
						|
        vote: 1,
 | 
						|
    };
 | 
						|
 | 
						|
    data_holder.handle_event(alice.user_id, vote_event);
 | 
						|
    data = data_holder.get_widget_data();
 | 
						|
 | 
						|
    assert.deepEqual(data, {
 | 
						|
        options: [
 | 
						|
            {
 | 
						|
                option: "release now",
 | 
						|
                names: "Me Myself, Alice Lee",
 | 
						|
                count: 2,
 | 
						|
                key: "99,1",
 | 
						|
                current_user_vote: true,
 | 
						|
            },
 | 
						|
        ],
 | 
						|
        question: "best plan?",
 | 
						|
    });
 | 
						|
 | 
						|
    const invalid_vote_event = {
 | 
						|
        type: "vote",
 | 
						|
        key: "98,1",
 | 
						|
        vote: 1,
 | 
						|
    };
 | 
						|
 | 
						|
    blueslip.expect("warn", `unknown key for poll: ${invalid_vote_event.key}`);
 | 
						|
    data_holder.handle_event(me.user_id, invalid_vote_event);
 | 
						|
    data = data_holder.get_widget_data();
 | 
						|
 | 
						|
    const option_outbound_event = data_holder.handle.new_option.outbound("new option");
 | 
						|
    assert.deepEqual(option_outbound_event, {
 | 
						|
        type: "new_option",
 | 
						|
        idx: 2,
 | 
						|
        option: "new option",
 | 
						|
    });
 | 
						|
 | 
						|
    const new_question = "Any new plan?";
 | 
						|
    const question_outbound_event = data_holder.handle.question.outbound(new_question);
 | 
						|
    assert.deepEqual(question_outbound_event, {
 | 
						|
        type: "question",
 | 
						|
        question: new_question,
 | 
						|
    });
 | 
						|
 | 
						|
    const vote_outbound_event = data_holder.handle.vote.outbound("99,1");
 | 
						|
    assert.deepEqual(vote_outbound_event, {type: "vote", key: "99,1", vote: -1});
 | 
						|
 | 
						|
    vote_event = {
 | 
						|
        type: "vote",
 | 
						|
        key: "99,1",
 | 
						|
        vote: -1,
 | 
						|
    };
 | 
						|
 | 
						|
    data_holder.handle_event(me.user_id, vote_event);
 | 
						|
    data = data_holder.get_widget_data();
 | 
						|
 | 
						|
    assert.deepEqual(data, {
 | 
						|
        options: [
 | 
						|
            {
 | 
						|
                option: "release now",
 | 
						|
                names: "Alice Lee",
 | 
						|
                count: 1,
 | 
						|
                key: "99,1",
 | 
						|
                current_user_vote: false,
 | 
						|
            },
 | 
						|
        ],
 | 
						|
        question: "best plan?",
 | 
						|
    });
 | 
						|
});
 | 
						|
 | 
						|
run_test("wrong person editing question", () => {
 | 
						|
    const is_my_poll = true;
 | 
						|
    const question = "Favorite color?";
 | 
						|
 | 
						|
    const data_holder = new PollData({
 | 
						|
        current_user_id: me.user_id,
 | 
						|
        message_sender_id: me.user_id,
 | 
						|
        is_my_poll,
 | 
						|
        question,
 | 
						|
        options: [],
 | 
						|
        comma_separated_names: people.get_full_names_for_poll_option,
 | 
						|
        report_error_function: blueslip.warn,
 | 
						|
    });
 | 
						|
 | 
						|
    const question_event = {
 | 
						|
        type: "question",
 | 
						|
        question: "best plan?",
 | 
						|
    };
 | 
						|
 | 
						|
    blueslip.expect("warn", "user 100 is not allowed to edit the question");
 | 
						|
 | 
						|
    data_holder.handle_event(alice.user_id, question_event);
 | 
						|
 | 
						|
    assert.deepEqual(data_holder.get_widget_data(), {
 | 
						|
        options: [],
 | 
						|
        question: "Favorite color?",
 | 
						|
    });
 | 
						|
});
 | 
						|
 | 
						|
run_test("activate another person poll", ({mock_template}) => {
 | 
						|
    mock_template("widgets/poll_widget.hbs", false, () => "widgets/poll_widget");
 | 
						|
    mock_template("widgets/poll_widget_results.hbs", false, () => "widgets/poll_widget_results");
 | 
						|
 | 
						|
    const $widget_elem = $("<div>").addClass("widget-content");
 | 
						|
 | 
						|
    let out_data; // Used to check the event data sent to the server
 | 
						|
    const callback = (data) => {
 | 
						|
        out_data = data;
 | 
						|
    };
 | 
						|
 | 
						|
    const opts = {
 | 
						|
        $elem: $widget_elem,
 | 
						|
        callback,
 | 
						|
        message: {
 | 
						|
            sender_id: alice.user_id,
 | 
						|
        },
 | 
						|
        extra_data: {
 | 
						|
            question: "What do you want?",
 | 
						|
        },
 | 
						|
    };
 | 
						|
 | 
						|
    const set_widget_find_result = (selector) => {
 | 
						|
        const $elem = $.create(selector);
 | 
						|
        $widget_elem.set_find_results(selector, $elem);
 | 
						|
        return $elem;
 | 
						|
    };
 | 
						|
 | 
						|
    const $poll_option = set_widget_find_result("button.poll-option");
 | 
						|
    const $poll_option_input = set_widget_find_result("input.poll-option");
 | 
						|
    const $widget_option_container = set_widget_find_result("ul.poll-widget");
 | 
						|
 | 
						|
    const $poll_question_submit = set_widget_find_result("button.poll-question-check");
 | 
						|
    const $poll_edit_question = set_widget_find_result(".poll-edit-question");
 | 
						|
    const $poll_question_header = set_widget_find_result(".poll-question-header");
 | 
						|
    const $poll_question_container = set_widget_find_result(".poll-question-bar");
 | 
						|
    const $poll_option_container = set_widget_find_result(".poll-option-bar");
 | 
						|
 | 
						|
    const $poll_vote_button = set_widget_find_result("button.poll-vote");
 | 
						|
    const $poll_please_wait = set_widget_find_result(".poll-please-wait");
 | 
						|
    const $poll_author_help = set_widget_find_result(".poll-author-help");
 | 
						|
 | 
						|
    set_widget_find_result("button.poll-question-remove");
 | 
						|
    set_widget_find_result("input.poll-question");
 | 
						|
 | 
						|
    const handle_events = poll_widget.activate(opts);
 | 
						|
 | 
						|
    assert.ok($poll_option_container.visible());
 | 
						|
    assert.ok($poll_question_header.visible());
 | 
						|
 | 
						|
    assert.ok(!$poll_question_container.visible());
 | 
						|
    assert.ok(!$poll_question_submit.visible());
 | 
						|
    assert.ok(!$poll_edit_question.visible());
 | 
						|
    assert.ok(!$poll_please_wait.visible());
 | 
						|
    assert.ok(!$poll_author_help.visible());
 | 
						|
 | 
						|
    assert.equal($widget_elem.html(), "widgets/poll_widget");
 | 
						|
    assert.equal($widget_option_container.html(), "widgets/poll_widget_results");
 | 
						|
    assert.equal($poll_question_header.text(), "What do you want?");
 | 
						|
 | 
						|
    {
 | 
						|
        /* Testing data sent to server on adding option */
 | 
						|
        $poll_option_input.val("cool choice");
 | 
						|
        out_data = undefined;
 | 
						|
        $poll_option.trigger("click");
 | 
						|
        assert.deepEqual(out_data, {type: "new_option", idx: 1, option: "cool choice"});
 | 
						|
 | 
						|
        $poll_option_input.val("");
 | 
						|
        out_data = undefined;
 | 
						|
        $poll_option.trigger("click");
 | 
						|
        assert.deepEqual(out_data, undefined);
 | 
						|
    }
 | 
						|
 | 
						|
    const vote_events = [
 | 
						|
        {
 | 
						|
            sender_id: alice.user_id,
 | 
						|
            data: {
 | 
						|
                type: "new_option",
 | 
						|
                idx: 1,
 | 
						|
                option: "release now",
 | 
						|
            },
 | 
						|
        },
 | 
						|
        {
 | 
						|
            sender_id: alice.user_id,
 | 
						|
            data: {
 | 
						|
                type: "vote",
 | 
						|
                key: "100,1",
 | 
						|
                vote: 1,
 | 
						|
            },
 | 
						|
        },
 | 
						|
    ];
 | 
						|
 | 
						|
    handle_events(vote_events);
 | 
						|
 | 
						|
    {
 | 
						|
        /* Testing data sent to server on voting */
 | 
						|
        $poll_vote_button.attr("data-key", "100,1");
 | 
						|
        out_data = undefined;
 | 
						|
        $poll_vote_button.trigger("click");
 | 
						|
        assert.deepEqual(out_data, {type: "vote", key: "100,1", vote: 1});
 | 
						|
    }
 | 
						|
 | 
						|
    const add_question_event = [
 | 
						|
        {
 | 
						|
            sender_id: 100,
 | 
						|
            data: {
 | 
						|
                type: "question",
 | 
						|
                question: "best plan?",
 | 
						|
            },
 | 
						|
        },
 | 
						|
    ];
 | 
						|
 | 
						|
    handle_events(add_question_event);
 | 
						|
});
 | 
						|
 | 
						|
run_test("activate own poll", ({mock_template}) => {
 | 
						|
    mock_template("widgets/poll_widget.hbs", false, () => "widgets/poll_widget");
 | 
						|
    mock_template("widgets/poll_widget_results.hbs", false, () => "widgets/poll_widget_results");
 | 
						|
 | 
						|
    const $widget_elem = $("<div>").addClass("widget-content");
 | 
						|
    let out_data;
 | 
						|
    const callback = (data) => {
 | 
						|
        out_data = data;
 | 
						|
    };
 | 
						|
    const opts = {
 | 
						|
        $elem: $widget_elem,
 | 
						|
        callback,
 | 
						|
        message: {
 | 
						|
            sender_id: me.user_id,
 | 
						|
        },
 | 
						|
        extra_data: {
 | 
						|
            question: "Where to go?",
 | 
						|
        },
 | 
						|
    };
 | 
						|
 | 
						|
    const set_widget_find_result = (selector) => {
 | 
						|
        const $elem = $.create(selector);
 | 
						|
        $widget_elem.set_find_results(selector, $elem);
 | 
						|
        return $elem;
 | 
						|
    };
 | 
						|
 | 
						|
    set_widget_find_result("button.poll-option");
 | 
						|
    const $poll_option_input = set_widget_find_result("input.poll-option");
 | 
						|
    const $widget_option_container = set_widget_find_result("ul.poll-widget");
 | 
						|
 | 
						|
    const $poll_question_submit = set_widget_find_result("button.poll-question-check");
 | 
						|
    const $poll_edit_question = set_widget_find_result(".poll-edit-question");
 | 
						|
    const $poll_question_input = set_widget_find_result("input.poll-question");
 | 
						|
    const $poll_question_header = set_widget_find_result(".poll-question-header");
 | 
						|
    const $poll_question_container = set_widget_find_result(".poll-question-bar");
 | 
						|
    const $poll_option_container = set_widget_find_result(".poll-option-bar");
 | 
						|
 | 
						|
    set_widget_find_result("button.poll-vote");
 | 
						|
    const $poll_please_wait = set_widget_find_result(".poll-please-wait");
 | 
						|
    const $poll_author_help = set_widget_find_result(".poll-author-help");
 | 
						|
 | 
						|
    set_widget_find_result("button.poll-question-remove");
 | 
						|
 | 
						|
    function assert_visibility() {
 | 
						|
        assert.ok($poll_option_container.visible());
 | 
						|
        assert.ok($poll_question_header.visible());
 | 
						|
        assert.ok(!$poll_question_container.visible());
 | 
						|
        assert.ok($poll_edit_question.visible());
 | 
						|
        assert.ok(!$poll_please_wait.visible());
 | 
						|
        assert.ok(!$poll_author_help.visible());
 | 
						|
    }
 | 
						|
 | 
						|
    poll_widget.activate(opts);
 | 
						|
 | 
						|
    assert_visibility();
 | 
						|
    assert.ok(!$poll_question_submit.visible());
 | 
						|
 | 
						|
    assert.equal($widget_elem.html(), "widgets/poll_widget");
 | 
						|
    assert.equal($widget_option_container.html(), "widgets/poll_widget_results");
 | 
						|
    assert.equal($poll_question_header.text(), "Where to go?");
 | 
						|
 | 
						|
    {
 | 
						|
        /* Testing data sent to server on editing question */
 | 
						|
        $poll_question_input.val("Is it new?");
 | 
						|
        out_data = undefined;
 | 
						|
        $poll_question_submit.trigger("click");
 | 
						|
        assert.deepEqual(out_data, {type: "question", question: "Is it new?"});
 | 
						|
 | 
						|
        assert_visibility();
 | 
						|
        assert.ok($poll_question_submit.visible());
 | 
						|
 | 
						|
        $poll_option_input.val("");
 | 
						|
        out_data = undefined;
 | 
						|
        $poll_question_submit.trigger("click");
 | 
						|
        assert.deepEqual(out_data, undefined);
 | 
						|
    }
 | 
						|
});
 |