Files
zulip/frontend_tests/casper_tests/03-narrow.js
Steve Howell 9986e41999 top left: Simplify markup for main links.
The following elements in the top left corner
are major components of our app:

    All messages
    Private messages
    Starred messages
    Mentions

We can now find them directly:

    $('.top_left_all_messages')
    $('.top_left_private_messages')
    $('.top_left_starred_messages')
    $('.top_left_mentions')

Before this, we had to build up complicated selectors
like below:

    exports.get_global_filter_li = function (filter_name) {
        var selector = "#global_filters li[data-name='"
            + filter_name + "']";
        return $(selector);
    };

I don't think any newbie would know to grep for "global_filter",
and I've seen a PR where somebody added specific markup here
to "Private messages" because they couldn't grok the old scheme.

Another thing to note is that we still have a "home-link"
class for "All messages", which overlapped with portico
code that had the same name.  (There were some inaccurate
comments in the code relating to the tab bar, but we don't
actually have a way to click to the home view in the tab
bar any more.)  I'll eliminate that cruft in another commit.

For this commit the four elements still have the
"global-filter" class, since there's some benefit to being
able to style them all as a group, although we should give
it a nicer name in a subsequent commit.

Most of this PR is basic search/replace, but I did add a
two-line helper: `top_left_corner.update_starred_count`
2019-01-30 13:53:20 -08:00

534 lines
17 KiB
JavaScript

var common = require('../casper_lib/common.js').common;
common.start_and_log_in();
// We could use the messages sent by 02-site.js, but we want to
// make sure each test file can be run individually (which the
// 'run' script provides for).
casper.then(function () {
casper.test.info('Sending messages');
});
common.then_send_many([
{ stream: 'Verona', subject: 'frontend test',
content: 'test message A' },
{ stream: 'Verona', subject: 'frontend test',
content: 'test message B' },
{ stream: 'Verona', subject: 'other subject',
content: 'test message C' },
{ stream: 'Denmark', subject: 'frontend test',
content: 'other message' },
{ recipient: 'cordelia@zulip.com, hamlet@zulip.com',
content: 'personal A' },
{ recipient: 'cordelia@zulip.com, hamlet@zulip.com',
content: 'personal B' },
{ recipient: 'cordelia@zulip.com',
content: 'personal C' },
{ stream: 'Verona', subject: 'frontend test',
content: 'test message D' },
{ recipient: 'cordelia@zulip.com, hamlet@zulip.com',
content: 'personal D' },
{ recipient: 'cordelia@zulip.com',
content: 'personal E' },
]);
// Define the messages we expect to see when narrowed.
function expect_home() {
casper.then(function () {
casper.waitUntilVisible('#zhome', function () {
common.expected_messages('zhome', [
'Verona > frontend test',
'You and Cordelia Lear, King Hamlet',
'You and Cordelia Lear',
], [
'<p>test message D</p>',
'<p>personal D</p>',
'<p>personal E</p>',
]);
});
});
}
function expect_stream() {
casper.then(function () {
casper.waitUntilVisible('#zfilt', function () {
common.expected_messages('zfilt', [
'Verona > frontend test',
'Verona > other subject',
'Verona > frontend test',
], [
'<p>test message A</p>',
'<p>test message B</p>',
'<p>test message C</p>',
'<p>test message D</p>',
]);
});
});
}
function expect_stream_subject() {
casper.then(function () {
casper.waitUntilVisible('#zfilt', function () {
common.expected_messages('zfilt', [
'Verona > frontend test',
], [
'<p>test message A</p>',
'<p>test message B</p>',
'<p>test message D</p>',
]);
casper.test.assertEquals(casper.fetchText('#left_bar_compose_stream_button_big'), 'New topic');
});
});
}
function expect_subject() {
casper.then(function () {
casper.waitUntilVisible('#zfilt', function () {
common.expected_messages('zfilt', [
'Verona > frontend test',
'Denmark > frontend test',
'Verona > frontend test',
], [
'<p>test message A</p>',
'<p>test message B</p>',
'<p>other message</p>',
'<p>test message D</p>',
]);
});
});
}
function expect_huddle() {
casper.then(function () {
casper.waitUntilVisible('#zfilt', function () {
common.expected_messages('zfilt', [
'You and Cordelia Lear, King Hamlet',
], [
'<p>personal A</p>',
'<p>personal B</p>',
'<p>personal D</p>',
]);
});
});
}
function expect_1on1() {
casper.then(function () {
casper.waitUntilVisible('#zfilt', function () {
common.expected_messages('zfilt', [
'You and Cordelia Lear',
], [
'<p>personal C</p>',
'<p>personal E</p>',
]);
});
});
}
function expect_all_pm() {
casper.then(function () {
casper.waitUntilVisible('#zfilt', function () {
common.expected_messages('zfilt', [
'You and Cordelia Lear, King Hamlet',
'You and Cordelia Lear',
], [
'<p>personal A</p>',
'<p>personal B</p>',
'<p>personal C</p>',
'<p>personal D</p>',
'<p>personal E</p>',
]);
casper.test.assertEquals(casper.fetchText('#left_bar_compose_stream_button_big'), 'New stream message');
});
});
}
function check_narrow_title(title) {
return function () {
// need to get title tag from HTML
// test if it's equal to some string passed in to function
casper.test.assertSelectorHasText('title', title, 'Got expected narrow title');
};
}
function un_narrow() {
casper.then(common.un_narrow);
expect_home();
casper.then(check_narrow_title('home - Zulip Dev - Zulip'));
}
function search_and_check(str, item, check, narrow_title) {
common.select_item_via_typeahead('#search_query', str, item);
check();
casper.then(check_narrow_title(narrow_title));
un_narrow();
}
function search_silent_user(str, item) {
common.select_item_via_typeahead('#search_query', str, item);
casper.then(function () {
casper.waitUntilVisible('#silent_user', function () {
casper.test.info("Empty feed for silent user visible.");
var expected_message = "\n You haven't received any messages sent by this user yet!" +
"\n ";
this.test.assertEquals(casper.fetchText('#silent_user'), expected_message);
});
});
un_narrow();
}
function search_non_existing_user(str, item) {
common.select_item_via_typeahead('#search_query', str, item);
casper.then(function () {
casper.waitUntilVisible('#non_existing_user', function () {
casper.test.info("Empty feed for non existing user visible.");
var expected_message = "\n This user does not exist!" +
"\n ";
this.test.assertEquals(casper.fetchText('#non_existing_user'), expected_message);
});
});
un_narrow();
}
// Narrow by clicking links.
casper.then(function () {
common.wait_for_receive(function () {
casper.test.info('Narrowing by clicking stream');
casper.click('*[title="Narrow to stream \\"Verona\\""]');
});
});
expect_stream();
casper.then(check_narrow_title('Verona - Zulip Dev - Zulip'));
un_narrow();
expect_home();
casper.then(function () {
casper.test.info('Narrowing by clicking subject');
casper.click('*[title="Narrow to stream \\"Verona\\", topic \\"frontend test\\""]');
});
expect_stream_subject();
casper.then(check_narrow_title('frontend test - Zulip Dev - Zulip'));
casper.then(function () {
// This time, un-narrow by hitting the search 'x'
casper.test.info('Un-narrowing');
casper.click('#search_exit');
});
expect_home();
casper.then(function () {
casper.test.info('Narrowing by clicking personal');
casper.click('*[title="Narrow to your private messages with Cordelia Lear, King Hamlet"]');
});
expect_huddle();
casper.then(check_narrow_title('private - Zulip Dev - Zulip'));
casper.then(function () {
// Un-narrow by clicking "Zulip"
casper.test.info('Un-narrowing');
casper.click('.brand');
});
expect_home();
// Narrow by typing in search strings or operators.
// Test stream / recipient autocomplete in the search bar
search_and_check('Verona', 'Stream', expect_stream,
'Verona - Zulip Dev - Zulip');
search_and_check('Cordelia', 'Private', expect_1on1,
'private - Zulip Dev - Zulip');
// Test operators
search_and_check('stream:Verona', '', expect_stream,
'Verona - Zulip Dev - Zulip');
search_and_check('stream:Verona subject:frontend+test', '', expect_stream_subject,
'frontend test - Zulip Dev - Zulip');
search_and_check('stream:Verona topic:frontend+test', '', expect_stream_subject,
'frontend test - Zulip Dev - Zulip');
search_and_check('subject:frontend+test', '', expect_subject,
'home - Zulip Dev - Zulip');
search_silent_user('sender:emailgateway@zulip.com', '');
search_non_existing_user('sender:dummyuser@zulip.com', '');
// Narrow by clicking the left sidebar.
casper.then(function () {
casper.test.info('Narrowing with left sidebar');
casper.click('#stream_filters [data-stream-name="Verona"] a');
});
expect_stream();
casper.then(check_narrow_title('Verona - Zulip Dev - Zulip'));
casper.thenClick('.top_left_all_messages a');
expect_home();
casper.then(check_narrow_title('home - Zulip Dev - Zulip'));
casper.thenClick('.top_left_private_messages a');
expect_all_pm();
casper.then(check_narrow_title('private - Zulip Dev - Zulip'));
un_narrow();
// Make sure stream search filters the stream list
casper.then(function () {
casper.test.info('Search streams using left sidebar');
casper.test.assertExists('.input-append.notdisplayed', 'Stream filter box not visible initially');
casper.click('#streams_header .sidebar-title');
});
casper.waitWhileSelector('#streams_list .input-append.notdisplayed', function () {
casper.test.assertExists('#stream_filters [data-stream-name="Denmark"]',
'Original stream list contains Denmark');
casper.test.assertExists('#stream_filters [data-stream-name="Scotland"]',
'Original stream list contains Scotland');
casper.test.assertExists('#stream_filters [data-stream-name="Verona"]',
'Original stream list contains Verona');
});
// Enter the search box and test highlighted suggestion navigation
casper.then(function () {
casper.evaluate(function () {
$('.stream-list-filter').expectOne()
.focus()
.trigger($.Event('click'));
});
});
casper.waitForSelector('#stream_filters .highlighted_stream', function () {
casper.test.info('Suggestion highlighting - initial situation');
casper.test.assertExist('#stream_filters [data-stream-name="Denmark"].highlighted_stream',
'Stream Denmark is highlighted');
casper.test.assertDoesntExist('#stream_filters [data-stream-name="Scotland"].highlighted_stream',
'Stream Scotland is not highlighted');
casper.test.assertDoesntExist('#stream_filters [data-stream-name="Verona"].highlighted_stream',
'Stream Verona is not highlighted');
});
// Use arrow keys to navigate through suggestions
casper.then(function () {
function arrow(key) {
casper.sendKeys('.stream-list-filter',
casper.page.event.key[key],
{keepFocus: true});
}
arrow('Down'); // Denmark -> Scotland
arrow('Up'); // Scotland -> Denmark
arrow('Up'); // Denmark -> Denmark
arrow('Down'); // Denmark -> Scotland
});
casper.waitForSelector('#stream_filters [data-stream-name="Scotland"].highlighted_stream', function () {
casper.test.info('Suggestion highlighting - after arrow key navigation');
casper.test.assertDoesntExist(
'#stream_filters [data-stream-name="Denmark"].highlighted_stream',
'Stream Denmark is not highlighted');
casper.test.assertExist(
'#stream_filters [data-stream-name="Scotland"].highlighted_stream',
'Stream Scotland is highlighted');
casper.test.assertDoesntExist(
'#stream_filters [data-stream-name="Verona"].highlighted_stream',
'Stream Verona is not highlighted');
});
// We search for the beginning of "Scotland", not case sensitive
casper.then(function () {
casper.evaluate(function () {
$('.stream-list-filter').expectOne()
.focus()
.val('sCoT')
.trigger($.Event('input'))
.trigger($.Event('click'));
});
});
// There will be no race condition between these two waits because we
// expect them to happen in parallel.
casper.waitWhileVisible('#stream_filters [data-stream-name="Denmark"]', function () {
casper.test.info('Search term entered');
casper.test.assertDoesntExist('#stream_filters [data-stream-name="Denmark"]',
'Filtered stream list does not contain Denmark');
});
casper.waitWhileVisible('#stream_filters [data-stream-name="Verona"]', function () {
casper.test.assertDoesntExist('#stream_filters [data-stream-name="Verona"]',
'Filtered stream list does not contain Verona');
});
casper.then(function () {
casper.test.assertExists('#stream_filters [data-stream-name="Scotland"]',
'Filtered stream list does contain Scotland');
casper.test.assertExists('#stream_filters [data-stream-name="Scotland"].highlighted_stream',
'Stream Scotland is highlighted');
});
// Clearing the list should give us back all the streams in the list
casper.then(function () {
casper.evaluate(function () {
$('.stream-list-filter').expectOne()
.focus()
.val('')
.trigger($.Event('input'));
});
});
// There will be no race condition between these waits because we
// expect them to happen in parallel.
casper.waitUntilVisible('#stream_filters [data-stream-name="Denmark"]', function () {
casper.test.assertExists('#stream_filters [data-stream-name="Denmark"]',
'Restored stream list contains Denmark');
});
casper.waitUntilVisible('#stream_filters [data-stream-name="Scotland"]', function () {
casper.test.assertExists('#stream_filters [data-stream-name="Denmark"]',
'Restored stream list contains Scotland');
});
casper.waitUntilVisible('#stream_filters [data-stream-name="Verona"]', function () {
casper.test.assertExists('#stream_filters [data-stream-name="Denmark"]',
'Restored stream list contains Verona');
});
casper.thenClick('#streams_header .sidebar-title');
casper.waitForSelector('.input-append.notdisplayed', function () {
casper.test.assertExists('.input-append.notdisplayed',
'Stream filter box not visible after second click');
});
// We search for the beginning of "Verona", not case sensitive
casper.then(function () {
casper.evaluate(function () {
$('.stream-list-filter').expectOne()
.focus()
.val('ver')
.trigger($.Event('input'));
});
});
casper.waitWhileVisible('#stream_filters [data-stream-name="Denmark"]', function () {
// Clicking the narrowed list should clear the search
casper.click('#stream_filters [data-stream-name="Verona"] a');
expect_stream();
casper.test.assertEquals(casper.fetchText('.stream-list-filter'), '', 'Clicking on a stream clears the search');
});
un_narrow();
function assert_in_list(name) {
casper.test.assertExists(
'#user_presences li [data-name="' + name + '"]',
'User ' + name + ' is IN buddy list'
);
}
function assert_selected(name) {
casper.test.assertExists(
'#user_presences li.highlighted_user [data-name="' + name + '"]',
'User ' + name + ' is SELECTED IN buddy list'
);
}
function assert_not_selected(name) {
assert_in_list(name);
casper.test.assertDoesntExist(
'#user_presences li.highlighted_user [data-name="' + name + '"]',
'User ' + name + ' is NOT SELECTED buddy list'
);
}
// User search at the right sidebar
casper.then(function () {
casper.test.info('Search users using right sidebar');
assert_in_list('Iago');
assert_in_list('Cordelia Lear');
assert_in_list('King Hamlet');
assert_in_list('aaron');
});
// Enter the search box and test selected suggestion navigation
// Click on search icon
casper.then(function () {
casper.evaluate(function () {
$('#user_filter_icon').expectOne()
.focus()
.trigger($.Event('click'));
});
});
casper.waitForSelector('#user_presences .highlighted_user', function () {
casper.test.info('Suggestion highlighting - initial situation');
assert_selected('Iago');
assert_not_selected('Cordelia Lear');
assert_not_selected('King Hamlet');
assert_not_selected('aaron');
});
// Use arrow keys to navigate through suggestions
casper.then(function () {
function arrow(key) {
casper.sendKeys('.user-list-filter',
casper.page.event.key[key],
{keepFocus: true});
}
// go down 2, up 3 (which is really 2), then down 2
// Iago
// Cordelia
// Hamlet
arrow('Down');
arrow('Down');
arrow('Up');
arrow('Up');
arrow('Up'); // does nothing
arrow('Down');
arrow('Down');
});
casper.waitForSelector('#user_presences li.highlighted_user [data-name="King Hamlet"]', function () {
casper.test.info('Suggestion highlighting - after arrow key navigation');
assert_not_selected('Iago');
assert_not_selected('Cordelia Lear');
assert_selected('King Hamlet');
});
common.then_log_out();
// Run the above queued actions.
casper.run(function () {
casper.test.done();
});