Files
zulip/frontend_tests/node_tests/subs.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

192 lines
6.3 KiB
JavaScript

global.stub_out_jquery();
set_global('ui', {
update_scrollbar: function () {},
});
set_global('i18n', global.stub_i18n);
set_global('channel', {});
zrequire('stream_data');
zrequire('Handlebars', 'handlebars');
zrequire('templates');
zrequire('subs');
var jsdom = require("jsdom");
var window = jsdom.jsdom().defaultView;
global.$ = require('jquery')(window);
set_global('window', window);
zrequire('bootstrap', 'third/bootstrap/js/bootstrap');
subs.stream_name_match_stream_ids = [];
subs.stream_description_match_stream_ids = [];
run_test('filter_table', () => {
var denmark = {
subscribed: false,
name: 'Denmark',
stream_id: 1,
description: 'Copenhagen',
};
var poland = {
subscribed: true,
name: 'Poland',
stream_id: 2,
description: 'monday',
};
var pomona = {
subscribed: true,
name: 'Pomona',
stream_id: 3,
description: 'college',
};
var cpp = {
subscribed: true,
name: 'C++',
stream_id: 4,
};
var elem_1 = $(global.render_template("subscription", denmark));
var elem_2 = $(global.render_template("subscription", poland));
var elem_3 = $(global.render_template("subscription", pomona));
var elem_4 = $(global.render_template("subscription", cpp));
$("body").empty();
$("body").append('<div id="subscriptions_table"></div>');
var streams_list = $('<div class="streams-list"></div>');
$("#subscriptions_table").append(streams_list);
stream_data.add_sub("Denmark", denmark);
stream_data.add_sub("Poland", poland);
stream_data.add_sub("Pomona", pomona);
stream_data.add_sub("C++", cpp);
streams_list.append(elem_1);
streams_list.append(elem_2);
streams_list.append(elem_3);
// Search with single keyword
subs.filter_table({input: "Po", subscribed_only: false});
assert(elem_1.hasClass("notdisplayed"));
assert(!elem_2.hasClass("notdisplayed"));
assert(!elem_3.hasClass("notdisplayed"));
// Search with multiple keywords
subs.filter_table({input: "Denmark, Pol", subscribed_only: false});
assert(!elem_1.hasClass("notdisplayed"));
assert(!elem_2.hasClass("notdisplayed"));
assert(elem_3.hasClass("notdisplayed"));
subs.filter_table({input: "Den, Pol", subscribed_only: false});
assert(!elem_1.hasClass("notdisplayed"));
assert(!elem_2.hasClass("notdisplayed"));
assert(elem_3.hasClass("notdisplayed"));
// Search is case-insensitive
subs.filter_table({input: "po", subscribed_only: false});
assert(elem_1.hasClass("notdisplayed"));
assert(!elem_2.hasClass("notdisplayed"));
assert(!elem_3.hasClass("notdisplayed"));
// Search handles unusual characters like C++
subs.filter_table({input: "c++", subscribed_only: false});
assert(elem_1.hasClass("notdisplayed"));
assert(elem_2.hasClass("notdisplayed"));
assert(elem_3.hasClass("notdisplayed"));
assert(!elem_4.hasClass("notdisplayed"));
// Search subscribed streams only
subs.filter_table({input: "d", subscribed_only: true});
assert(elem_1.hasClass("notdisplayed"));
assert(!elem_2.hasClass("notdisplayed"));
assert(elem_3.hasClass("notdisplayed"));
// data-temp-view condition
elem_1.attr("data-temp-view", "true");
subs.filter_table({input: "d", subscribed_only: true});
assert(!elem_1.hasClass("notdisplayed"));
assert(!elem_2.hasClass("notdisplayed"));
assert(elem_3.hasClass("notdisplayed"));
elem_1.attr("data-temp-view", "false");
subs.filter_table({input: "d", subscribed_only: true});
assert(elem_1.hasClass("notdisplayed"));
assert(!elem_2.hasClass("notdisplayed"));
assert(elem_3.hasClass("notdisplayed"));
elem_1.removeAttr("data-temp-view");
// active stream-row is not included in results
elem_1.addClass("active");
$("#subscriptions_table").append($('<div class="right"></div>'));
$(".right").append($('<div class="settings"></div>'));
$(".right").append($('<div class="nothing-selected"></div>').hide());
subs.filter_table({input: "d", subscribed_only: true});
assert(!elem_1.hasClass("active"));
assert.equal($(".right .settings").css("display"), "none");
assert.notEqual($(".right .nothing-selected").css("display"), "none");
// Search terms match stream description
subs.filter_table({input: "Co", subscribed_only: false});
assert(!elem_1.hasClass("notdisplayed"));
assert(elem_2.hasClass("notdisplayed"));
assert(!elem_3.hasClass("notdisplayed"));
subs.filter_table({input: "Mon", subscribed_only: false});
assert(elem_1.hasClass("notdisplayed"));
assert(!elem_2.hasClass("notdisplayed"));
assert(!elem_3.hasClass("notdisplayed"));
subs.filter_table({input: "p", subscribed_only: false});
assert.equal(subs.stream_name_match_stream_ids.length, 2);
assert.equal(subs.stream_description_match_stream_ids, 1);
assert.equal(subs.stream_name_match_stream_ids[0], 2);
assert.equal(subs.stream_name_match_stream_ids[1], 3);
assert.equal(subs.stream_description_match_stream_ids[0], 1);
subs.filter_table({input: "d", subscribed_only: false});
assert.equal(subs.stream_name_match_stream_ids.length, 2);
assert.equal(subs.stream_description_match_stream_ids, 0);
assert.equal(subs.stream_name_match_stream_ids[0], 1);
assert.equal(subs.stream_name_match_stream_ids[1], 2);
});
run_test('sub_or_unsub', () => {
var denmark = {
subscribed: false,
name: 'Denmark',
stream_id: 1,
description: 'Copenhagen',
};
stream_data.clear_subscriptions();
stream_data.add_sub("Denmark", denmark);
var post_params;
global.channel.post = function (params) {
post_params = params;
};
subs.sub_or_unsub(denmark);
assert.equal(post_params.url, '/json/users/me/subscriptions');
assert.deepEqual(post_params.data,
{subscriptions: '[{"name":"Denmark"}]'});
global.channel.post = undefined;
global.channel.del = function (params) {
post_params = params;
};
stream_data.get_sub_by_id(denmark.stream_id).subscribed = true;
subs.sub_or_unsub(denmark);
assert.equal(post_params.url, '/json/users/me/subscriptions');
assert.deepEqual(post_params.data,
{subscriptions: '["Denmark"]'});
});