2017-11-08 17:22:58 +01:00
|
|
|
zrequire('people');
|
|
|
|
zrequire('hash_util');
|
|
|
|
zrequire('hashchange');
|
2018-02-15 21:02:47 +01:00
|
|
|
zrequire('stream_data');
|
2017-03-18 18:29:20 +01:00
|
|
|
|
2018-04-11 13:14:39 +02:00
|
|
|
set_global('document', 'document-stub');
|
|
|
|
set_global('history', {});
|
|
|
|
set_global('window', {
|
|
|
|
location: {
|
|
|
|
protocol: 'http:',
|
|
|
|
host: 'example.com',
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
set_global('admin', {});
|
|
|
|
set_global('drafts', {});
|
|
|
|
set_global('favicon', {});
|
|
|
|
set_global('floating_recipient_bar', {});
|
|
|
|
set_global('info_overlay', {});
|
|
|
|
set_global('narrow', {});
|
|
|
|
set_global('overlays', {});
|
|
|
|
set_global('settings', {});
|
|
|
|
set_global('subs', {});
|
|
|
|
set_global('ui_util', {});
|
|
|
|
|
|
|
|
function blueslip_wrap(f) {
|
|
|
|
return function (e) {
|
|
|
|
return f(e);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
set_global('blueslip', {
|
|
|
|
wrap_function: blueslip_wrap,
|
|
|
|
});
|
|
|
|
|
2017-01-05 22:04:33 +01:00
|
|
|
(function test_operators_round_trip() {
|
2014-02-19 22:19:16 +01:00
|
|
|
var operators;
|
|
|
|
var hash;
|
2017-01-05 22:04:33 +01:00
|
|
|
var narrow;
|
2014-02-19 22:19:16 +01:00
|
|
|
|
|
|
|
operators = [
|
|
|
|
{operator: 'stream', operand: 'devel'},
|
2016-12-03 23:17:57 +01:00
|
|
|
{operator: 'topic', operand: 'algol'},
|
2014-02-19 22:19:16 +01:00
|
|
|
];
|
|
|
|
hash = hashchange.operators_to_hash(operators);
|
|
|
|
assert.equal(hash, '#narrow/stream/devel/topic/algol');
|
|
|
|
|
2017-01-05 22:04:33 +01:00
|
|
|
narrow = hashchange.parse_narrow(hash.split('/'));
|
|
|
|
assert.deepEqual(narrow, [
|
|
|
|
{operator: 'stream', operand: 'devel', negated: false},
|
|
|
|
{operator: 'topic', operand: 'algol', negated: false},
|
|
|
|
]);
|
|
|
|
|
2014-02-19 22:19:16 +01:00
|
|
|
operators = [
|
|
|
|
{operator: 'stream', operand: 'devel'},
|
2016-12-03 23:17:57 +01:00
|
|
|
{operator: 'topic', operand: 'visual c++', negated: true},
|
2014-02-19 22:19:16 +01:00
|
|
|
];
|
|
|
|
hash = hashchange.operators_to_hash(operators);
|
|
|
|
assert.equal(hash, '#narrow/stream/devel/-topic/visual.20c.2B.2B');
|
2017-01-05 22:04:33 +01:00
|
|
|
|
|
|
|
narrow = hashchange.parse_narrow(hash.split('/'));
|
|
|
|
assert.deepEqual(narrow, [
|
|
|
|
{operator: 'stream', operand: 'devel', negated: false},
|
|
|
|
{operator: 'topic', operand: 'visual c++', negated: true},
|
|
|
|
]);
|
|
|
|
|
2018-02-15 21:02:47 +01:00
|
|
|
// test new encodings, where we have a stream id
|
|
|
|
var florida_stream = {
|
|
|
|
name: 'Florida, USA',
|
|
|
|
stream_id: 987,
|
|
|
|
};
|
|
|
|
stream_data.add_sub(florida_stream.name, florida_stream);
|
|
|
|
operators = [
|
|
|
|
{operator: 'stream', operand: 'Florida, USA'},
|
|
|
|
];
|
|
|
|
hash = hashchange.operators_to_hash(operators);
|
|
|
|
assert.equal(hash, '#narrow/stream/987-Florida.2C-USA');
|
|
|
|
narrow = hashchange.parse_narrow(hash.split('/'));
|
|
|
|
assert.deepEqual(narrow, [
|
|
|
|
{operator: 'stream', operand: 'Florida, USA', negated: false},
|
|
|
|
]);
|
2014-02-19 22:19:16 +01:00
|
|
|
}());
|
2017-01-19 03:53:50 +01:00
|
|
|
|
|
|
|
(function test_people_slugs() {
|
|
|
|
var operators;
|
|
|
|
var hash;
|
|
|
|
var narrow;
|
|
|
|
|
|
|
|
var alice = {
|
|
|
|
email: 'alice@example.com',
|
|
|
|
user_id: 42,
|
|
|
|
full_name: 'Alice Smith',
|
|
|
|
};
|
|
|
|
|
|
|
|
people.add(alice);
|
|
|
|
operators = [
|
|
|
|
{operator: 'sender', operand: 'alice@example.com'},
|
|
|
|
];
|
|
|
|
hash = hashchange.operators_to_hash(operators);
|
|
|
|
assert.equal(hash, '#narrow/sender/42-alice');
|
|
|
|
narrow = hashchange.parse_narrow(hash.split('/'));
|
|
|
|
assert.deepEqual(narrow, [
|
|
|
|
{operator: 'sender', operand: 'alice@example.com', negated: false},
|
|
|
|
]);
|
|
|
|
|
|
|
|
operators = [
|
|
|
|
{operator: 'pm-with', operand: 'alice@example.com'},
|
|
|
|
];
|
|
|
|
hash = hashchange.operators_to_hash(operators);
|
|
|
|
assert.equal(hash, '#narrow/pm-with/42-alice');
|
|
|
|
}());
|
2018-04-11 13:14:39 +02:00
|
|
|
|
|
|
|
function stub_trigger(f) {
|
|
|
|
set_global('$', () => {
|
|
|
|
return {
|
|
|
|
trigger: f,
|
|
|
|
};
|
|
|
|
});
|
|
|
|
$.Event = (name) => {
|
|
|
|
assert.equal(name, 'zuliphashchange.zulip');
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function test_helper() {
|
|
|
|
var events = [];
|
|
|
|
var narrow_terms;
|
|
|
|
|
|
|
|
function stub(module_name, func_name) {
|
|
|
|
global[module_name][func_name] = () => {
|
|
|
|
events.push(module_name + '.' + func_name);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
stub('admin', 'setup_page');
|
|
|
|
stub('drafts', 'launch');
|
|
|
|
stub('favicon', 'reset');
|
|
|
|
stub('floating_recipient_bar', 'update');
|
|
|
|
stub('narrow', 'deactivate');
|
|
|
|
stub('overlays', 'close_for_hash_change');
|
|
|
|
stub('settings', 'setup_page');
|
|
|
|
stub('subs', 'launch');
|
|
|
|
stub('ui_util', 'blur_active_element');
|
|
|
|
|
|
|
|
stub_trigger(() => { events.push('trigger event'); });
|
|
|
|
|
|
|
|
ui_util.change_tab_to = (hash) => {
|
|
|
|
events.push('change_tab_to ' + hash);
|
|
|
|
};
|
|
|
|
|
|
|
|
narrow.activate = (terms) => {
|
|
|
|
narrow_terms = terms;
|
|
|
|
events.push('narrow.activate');
|
|
|
|
};
|
|
|
|
|
|
|
|
info_overlay.show = (name) => {
|
|
|
|
events.push('info: ' + name);
|
|
|
|
};
|
|
|
|
|
|
|
|
return {
|
|
|
|
clear_events: () => {
|
|
|
|
events = [];
|
|
|
|
},
|
|
|
|
assert_events: (expected_events) => {
|
|
|
|
assert.deepEqual(expected_events, events);
|
|
|
|
},
|
|
|
|
get_narrow_terms: () => {
|
|
|
|
return narrow_terms;
|
|
|
|
},
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
(function test_hash_interactions() {
|
|
|
|
var helper = test_helper();
|
|
|
|
|
|
|
|
window.location.hash = '#';
|
|
|
|
|
|
|
|
helper.clear_events();
|
|
|
|
hashchange.initialize();
|
|
|
|
helper.assert_events([
|
|
|
|
'overlays.close_for_hash_change',
|
|
|
|
'trigger event',
|
|
|
|
'change_tab_to #home',
|
|
|
|
'narrow.deactivate',
|
|
|
|
'floating_recipient_bar.update',
|
|
|
|
]);
|
|
|
|
|
|
|
|
helper.clear_events();
|
|
|
|
window.onhashchange();
|
|
|
|
helper.assert_events([
|
|
|
|
'overlays.close_for_hash_change',
|
|
|
|
'trigger event',
|
|
|
|
'change_tab_to #home',
|
|
|
|
'narrow.deactivate',
|
|
|
|
'floating_recipient_bar.update',
|
|
|
|
]);
|
|
|
|
|
|
|
|
window.location.hash = '#narrow/stream/Denmark';
|
|
|
|
|
|
|
|
helper.clear_events();
|
|
|
|
window.onhashchange();
|
|
|
|
helper.assert_events([
|
|
|
|
'overlays.close_for_hash_change',
|
|
|
|
'trigger event',
|
|
|
|
'change_tab_to #home',
|
|
|
|
'narrow.activate',
|
|
|
|
'floating_recipient_bar.update',
|
|
|
|
]);
|
|
|
|
var terms = helper.get_narrow_terms();
|
|
|
|
assert.equal(terms[0].operand, 'Denmark');
|
|
|
|
|
|
|
|
window.location.hash = '#narrow';
|
|
|
|
|
|
|
|
helper.clear_events();
|
|
|
|
window.onhashchange();
|
|
|
|
helper.assert_events([
|
|
|
|
'overlays.close_for_hash_change',
|
|
|
|
'trigger event',
|
|
|
|
'change_tab_to #home',
|
|
|
|
'narrow.activate',
|
|
|
|
'floating_recipient_bar.update',
|
|
|
|
]);
|
|
|
|
terms = helper.get_narrow_terms();
|
|
|
|
assert.equal(terms.length, 0);
|
|
|
|
|
|
|
|
window.location.hash = '#streams/whatever';
|
|
|
|
|
|
|
|
helper.clear_events();
|
|
|
|
window.onhashchange();
|
|
|
|
helper.assert_events([
|
|
|
|
'overlays.close_for_hash_change',
|
|
|
|
'subs.launch',
|
|
|
|
]);
|
|
|
|
|
|
|
|
window.location.hash = '#keyboard-shortcuts/whatever';
|
|
|
|
|
|
|
|
helper.clear_events();
|
|
|
|
window.onhashchange();
|
|
|
|
helper.assert_events([
|
|
|
|
'overlays.close_for_hash_change',
|
|
|
|
'trigger event',
|
|
|
|
'info: keyboard-shortcuts',
|
|
|
|
]);
|
|
|
|
|
|
|
|
window.location.hash = '#markdown-help/whatever';
|
|
|
|
|
|
|
|
helper.clear_events();
|
|
|
|
window.onhashchange();
|
|
|
|
helper.assert_events([
|
|
|
|
'overlays.close_for_hash_change',
|
|
|
|
'trigger event',
|
|
|
|
'info: markdown-help',
|
|
|
|
]);
|
|
|
|
|
|
|
|
window.location.hash = '#search-operators/whatever';
|
|
|
|
|
|
|
|
helper.clear_events();
|
|
|
|
window.onhashchange();
|
|
|
|
helper.assert_events([
|
|
|
|
'overlays.close_for_hash_change',
|
|
|
|
'trigger event',
|
|
|
|
'info: search-operators',
|
|
|
|
]);
|
|
|
|
|
|
|
|
window.location.hash = '#drafts';
|
|
|
|
|
|
|
|
helper.clear_events();
|
|
|
|
window.onhashchange();
|
|
|
|
helper.assert_events([
|
|
|
|
'overlays.close_for_hash_change',
|
|
|
|
'drafts.launch',
|
|
|
|
]);
|
|
|
|
|
|
|
|
window.location.hash = '#settings/alert-words';
|
|
|
|
|
|
|
|
helper.clear_events();
|
|
|
|
window.onhashchange();
|
|
|
|
helper.assert_events([
|
|
|
|
'overlays.close_for_hash_change',
|
|
|
|
'settings.setup_page',
|
|
|
|
'admin.setup_page',
|
|
|
|
]);
|
|
|
|
|
|
|
|
window.location.hash = '#organization/user-list-admin';
|
|
|
|
|
|
|
|
helper.clear_events();
|
|
|
|
window.onhashchange();
|
|
|
|
helper.assert_events([
|
|
|
|
'settings.setup_page',
|
|
|
|
'admin.setup_page',
|
|
|
|
]);
|
|
|
|
|
|
|
|
var called_back;
|
|
|
|
|
|
|
|
helper.clear_events();
|
|
|
|
hashchange.exit_overlay(() => {
|
|
|
|
called_back = true;
|
|
|
|
});
|
|
|
|
|
|
|
|
helper.assert_events([
|
|
|
|
'ui_util.blur_active_element',
|
|
|
|
]);
|
|
|
|
assert(called_back);
|
|
|
|
|
|
|
|
}());
|
|
|
|
|
|
|
|
(function test_save_narrow() {
|
|
|
|
var helper = test_helper();
|
|
|
|
|
|
|
|
var operators = [
|
|
|
|
{operator: 'is', operand: 'private'},
|
|
|
|
];
|
|
|
|
|
|
|
|
hashchange.save_narrow(operators);
|
|
|
|
helper.assert_events([
|
|
|
|
'trigger event',
|
|
|
|
'favicon.reset',
|
|
|
|
]);
|
|
|
|
assert.equal(window.location.hash, '#narrow/is/private');
|
|
|
|
|
|
|
|
var url_pushed;
|
|
|
|
global.history.pushState = (state, title, url) => {
|
|
|
|
url_pushed = url;
|
|
|
|
};
|
|
|
|
|
|
|
|
operators = [
|
|
|
|
{operator: 'is', operand: 'starred'},
|
|
|
|
];
|
|
|
|
|
|
|
|
helper.clear_events();
|
|
|
|
hashchange.save_narrow(operators);
|
|
|
|
helper.assert_events([
|
|
|
|
'trigger event',
|
|
|
|
'favicon.reset',
|
|
|
|
]);
|
|
|
|
assert.equal(url_pushed, 'http://example.com/#narrow/is/starred');
|
|
|
|
}());
|
|
|
|
|