mirror of https://github.com/zulip/zulip.git
419 lines
11 KiB
JavaScript
419 lines
11 KiB
JavaScript
zrequire('poll_widget');
|
|
|
|
set_global('$', global.make_zjquery());
|
|
|
|
set_global('people', {});
|
|
set_global('blueslip', global.make_zblueslip());
|
|
|
|
const noop = () => {};
|
|
const return_false = () => false;
|
|
const return_true = () => true;
|
|
|
|
run_test('poll_data_holder my question', () => {
|
|
const is_my_poll = true;
|
|
const question = 'Favorite color?';
|
|
|
|
const sender_id = 99;
|
|
people.my_current_user_id = () => sender_id;
|
|
|
|
const data_holder = poll_widget.poll_data_holder(is_my_poll, question, []);
|
|
|
|
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(sender_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',
|
|
};
|
|
|
|
people.safe_full_names = () => '';
|
|
|
|
data_holder.handle_event(sender_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(sender_id, vote_event);
|
|
data = data_holder.get_widget_data();
|
|
|
|
assert.deepEqual(data, {
|
|
options: [
|
|
{
|
|
option: 'release now',
|
|
names: '',
|
|
count: 1,
|
|
key: '99,1',
|
|
current_user_vote: true,
|
|
},
|
|
],
|
|
question: 'best plan?',
|
|
});
|
|
|
|
const invalid_vote_event = {
|
|
type: 'vote',
|
|
key: '98,1',
|
|
vote: 1,
|
|
};
|
|
|
|
blueslip.set_test_data('warn', `unknown key for poll: ${invalid_vote_event.key}`);
|
|
data_holder.handle_event(sender_id, invalid_vote_event);
|
|
data = data_holder.get_widget_data();
|
|
assert.equal(blueslip.get_test_logs('warn').length, 1);
|
|
blueslip.clear_test_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(sender_id, vote_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?',
|
|
});
|
|
});
|
|
|
|
run_test('activate another person poll', () => {
|
|
people.is_my_user_id = return_false;
|
|
global.stub_templates((template_name) => {
|
|
if (template_name === 'widgets/poll_widget') {
|
|
return 'widgets/poll_widget';
|
|
}
|
|
if (template_name === 'widgets/poll_widget_results') {
|
|
return '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: callback,
|
|
message: {
|
|
sender_id: 100,
|
|
},
|
|
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');
|
|
|
|
let option_button_callback;
|
|
let vote_button_callback;
|
|
|
|
poll_option.on = (event, func) => {
|
|
assert.equal(event, 'click');
|
|
option_button_callback = func;
|
|
};
|
|
|
|
poll_vote_button.on = (event, func) => {
|
|
assert.equal(event, 'click');
|
|
vote_button_callback = func;
|
|
};
|
|
|
|
poll_question_header.toggle = (show) => {
|
|
assert(show);
|
|
};
|
|
|
|
poll_edit_question.toggle = (show) => {
|
|
assert(!show);
|
|
};
|
|
|
|
const show_submit = false;
|
|
poll_question_submit.toggle = (show) => {
|
|
assert.equal(show, show_submit);
|
|
};
|
|
|
|
poll_question_container.toggle = (show) => {
|
|
assert(!show);
|
|
};
|
|
|
|
poll_option_container.toggle = (show) => {
|
|
assert.equal(show, true);
|
|
};
|
|
|
|
poll_please_wait.toggle = (show) => {
|
|
assert.equal(show, false);
|
|
};
|
|
|
|
poll_author_help.toggle = (show) => {
|
|
assert(!show);
|
|
};
|
|
|
|
poll_widget.activate(opts);
|
|
|
|
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?');
|
|
|
|
const e = {
|
|
stopPropagation: noop,
|
|
};
|
|
|
|
{
|
|
/* Testing data sent to server on adding option */
|
|
poll_option_input.val('cool choice');
|
|
out_data = undefined;
|
|
option_button_callback(e);
|
|
assert.deepEqual(out_data, { type: 'new_option', idx: 1, option: 'cool choice' });
|
|
|
|
poll_option_input.val('');
|
|
out_data = undefined;
|
|
option_button_callback(e);
|
|
assert.deepEqual(out_data, undefined);
|
|
}
|
|
|
|
const vote_events = [
|
|
{
|
|
sender_id: 100,
|
|
data: {
|
|
type: 'new_option',
|
|
idx: 1,
|
|
option: 'release now',
|
|
},
|
|
},
|
|
{
|
|
sender_id: 100,
|
|
data: {
|
|
type: 'vote',
|
|
key: '100,1',
|
|
vote: 1,
|
|
},
|
|
},
|
|
];
|
|
|
|
widget_elem.handle_events(vote_events);
|
|
|
|
{
|
|
/* Testing data sent to server on voting */
|
|
poll_vote_button.attr('data-key', '100,1');
|
|
const e = {
|
|
stopPropagation: noop,
|
|
target: poll_vote_button,
|
|
};
|
|
out_data = undefined;
|
|
vote_button_callback(e);
|
|
assert.deepEqual(out_data, { type: 'vote', key: '100,1', vote: 1 });
|
|
}
|
|
|
|
const add_question_event = [
|
|
{
|
|
sender_id: 100,
|
|
data: {
|
|
type: 'question',
|
|
question: 'best plan?',
|
|
},
|
|
},
|
|
];
|
|
|
|
widget_elem.handle_events(add_question_event);
|
|
});
|
|
|
|
run_test('activate own poll', () => {
|
|
$.clear_all_elements();
|
|
|
|
people.is_my_user_id = return_true;
|
|
global.stub_templates((template_name) => {
|
|
if (template_name === 'widgets/poll_widget') {
|
|
return 'widgets/poll_widget';
|
|
}
|
|
if (template_name === 'widgets/poll_widget_results') {
|
|
return '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: callback,
|
|
message: {
|
|
sender_id: 100,
|
|
},
|
|
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;
|
|
};
|
|
|
|
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_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');
|
|
|
|
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');
|
|
|
|
let question_button_callback;
|
|
|
|
poll_question_submit.on = (event, func) => {
|
|
assert.equal(event, 'click');
|
|
question_button_callback = func;
|
|
};
|
|
|
|
// Following event handler are already tested and doesn't make sense
|
|
// to test them again
|
|
poll_option.on = noop;
|
|
poll_vote_button.on = noop;
|
|
|
|
poll_question_header.toggle = (show) => {
|
|
assert(show);
|
|
};
|
|
|
|
poll_edit_question.toggle = (show) => {
|
|
assert(show);
|
|
};
|
|
|
|
let show_submit = false;
|
|
poll_question_submit.toggle = (show) => {
|
|
assert.equal(show, show_submit);
|
|
};
|
|
|
|
poll_question_container.toggle = (show) => {
|
|
assert(!show);
|
|
};
|
|
|
|
poll_option_container.toggle = (show) => {
|
|
assert(show);
|
|
};
|
|
|
|
poll_please_wait.toggle = (show) => {
|
|
assert(!show);
|
|
};
|
|
|
|
poll_author_help.toggle = (show) => {
|
|
assert(!show);
|
|
};
|
|
|
|
poll_widget.activate(opts);
|
|
|
|
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 */
|
|
const e = {
|
|
stopPropagation: noop,
|
|
};
|
|
|
|
poll_question_input.val('Is it new?');
|
|
out_data = undefined;
|
|
show_submit = true;
|
|
question_button_callback(e);
|
|
assert.deepEqual(out_data, { type: 'question', question: 'Is it new?' });
|
|
|
|
poll_option_input.val('');
|
|
out_data = undefined;
|
|
question_button_callback(e);
|
|
assert.deepEqual(out_data, undefined);
|
|
}
|
|
});
|