Во время работы над PR #7998 мне пришлось написать каспер-тест, чтобы проверить правильность реализации настройки Add as Administrators.

Что такое тесты Casper?

Для тестов пользовательского интерфейса Zulip использует тесты Casper. Эти тесты находятся в frontent_tests/casper_tests/. Они используются для проверки функциональности, например, может ли пользователь войти в систему, может ли он изменить этот параметр и т. д.

Как правило, для тестирования ваших веб-приложений вам нужен какой-то инструмент. Одним из таких инструментов является Selenium, который существует с незапамятных времен. Другой — Casper, легкий, безголовый, запускаемый из терминала.

Итак, как написать тест Casper?

var common = require('../casper_lib/common.js').common; common.start_and_log_in();

Таким образом, эти строки используют функцию start_and_log_in(), определенную в common.js, для запуска приложения и входа в систему.

casper.then(function () {
    var menu_selector = '#settings-dropdown';
    casper.test.info('Invite page');
    casper.waitUntilVisible(menu_selector, function () {
         casper.click(menu_selector);
         casper.then(function () {
         

После входа в систему мы хотим щелкнуть значок настроек, а затем выбрать параметр Invite Users в раскрывающемся меню.

casper.waitUntilVisible('#invite_user_form', function () {
    casper.fill('form#invite_user_form', {invitee_emails: '[email protected]'});
    casper.click('input[name="invite_as_admin"] ~ span');
    casper.test.assertVisible("#add_invite_stream_input", "Stream input visible");
    common.select_item_via_typeahead('#add_invite_stream_input', 'D', 'Denmark');
});

Это будет ждать появления формы приглашения пользователя, а затем заполнить форму, установив флажок с опцией «Пригласить как администраторов».

casper.then(function () {
    casper.waitUntilVisible("div .pill", function () {
        casper.click('#submit-invitation');
    });
});

casper.waitUntilVisible("#invite_status.alert.alert-success", function () {
    casper.test.assertExists('#invite_status.alert.alert-success', 'User invited');
});

После заполнения формы он будет ждать появления div с классом pill в DOM документа, а затем нажмет кнопку отправки в модальном окне приглашения.

casper.then(function () {
    var menu_selector = '#settings-dropdown';

    casper.test.info('Invitations page');

    casper.waitUntilVisible(menu_selector, function () {
        casper.click(menu_selector);
        casper.then(function () {
            casper.click('a[href^="#organization"]');
            casper.test.assertUrlMatch(
                /^http:\/\/[^/]+\/#organization/,
                'URL suggests we are on organisation settings page');
            casper.waitUntilVisible('#settings_page.new-style', function () {
                casper.test.assertExists('#settings_page.new-style', 'Settings page is active');
                casper.click('.admin[data-section="invites-list-admin"]');
            });
        });
    });
});

После отправки формы приглашения он выберет Organisation settings в раскрывающемся меню настроек и перейдет на вкладку Invitations.

casper.waitUntilVisible("#admin_invites_table", function () {
    casper.test.assertExists('#admin_invites_table', 'Invitations page is active');
    casper.test.assertEval(function () {
        var table_cells = $("#admin_invites_table tr.invite_row td:nth-child(1)");
        for (var i = 0; i < table_cells.length; i += 1) {
            var td = table_cells[i];
            var email = td.children[0].textContent;
            if (email === "[email protected]") {
                var title = td.children[1].title;
                return title === "Invited as administrator";
            }
        }
    }, 'User invited as admin');
});

Затем он будет ждать, пока не появится таблица со списком приглашенных, а затем проверит, что ранее приглашенный пользователь должен быть приглашен в качестве администратора.

Как запустить эти тесты?

В среде разработки Zulip вы можете запустить тест, используя `./tools/test-js-with-casper`, или, если вы хотите запустить определенный тестовый файл, вы можете использовать `./tools/test-js-with- casper 16` или `./tools/test-js-with-casper 16-invitations.js`.

Как отлаживать эти тесты?

Среда разработки Zulip предоставляет вывод отладки в формате var/casper.

  • Вы можете проверить скриншоты того, как выглядел пользовательский интерфейс во время сбоев на var/casper/casper-failure*.png.
  • var/casper/server.log есть логи сервера от каспера, можете глянуть там, если застряли.

Кроме того, во время отладки вы можете включить код для создания снимков экрана, например casper.capture('var/casper/screenshot-1.png');.