mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 14:03:30 +00:00
The reason for the flake was we were not waiting enough time for the deactivation row to render. To fix this, We are relying on the input from the user deactivation screen to focus.
142 lines
5.9 KiB
TypeScript
142 lines
5.9 KiB
TypeScript
import {strict as assert} from "assert";
|
|
|
|
import type {Page} from "puppeteer";
|
|
|
|
import common from "../puppeteer_lib/common";
|
|
|
|
async function navigate_to_user_list(page: Page): Promise<void> {
|
|
const menu_selector = "#settings-dropdown";
|
|
await page.waitForSelector(menu_selector, {visible: true});
|
|
await page.click(menu_selector);
|
|
await page.click('.dropdown-menu a[href="#organization"]');
|
|
await page.waitForSelector("#settings_overlay_container.show", {visible: true});
|
|
await page.click("li[data-section='user-list-admin']");
|
|
}
|
|
|
|
async function user_row(page: Page, name: string): Promise<string> {
|
|
const user_id = await common.get_user_id_from_name(page, name);
|
|
return `.user_row[data-user-id="${CSS.escape(user_id.toString())}"]`;
|
|
}
|
|
|
|
async function test_reactivation_confirmation_modal(page: Page, fullname: string): Promise<void> {
|
|
await common.wait_for_micromodal_to_open(page);
|
|
|
|
assert.strictEqual(
|
|
await common.get_text_from_selector(page, ".dialog_heading"),
|
|
"Reactivate " + fullname,
|
|
"Unexpected title for reactivate user modal",
|
|
);
|
|
assert.strictEqual(
|
|
await common.get_text_from_selector(page, "#dialog_widget_modal .dialog_submit_button"),
|
|
"Confirm",
|
|
"Reactivate button has incorrect text.",
|
|
);
|
|
await page.click("#dialog_widget_modal .dialog_submit_button");
|
|
await common.wait_for_micromodal_to_close(page);
|
|
}
|
|
|
|
async function test_deactivate_user(page: Page): Promise<void> {
|
|
const cordelia_user_row = await user_row(page, "cordelia");
|
|
await page.waitForSelector(cordelia_user_row, {visible: true});
|
|
await page.waitForSelector(cordelia_user_row + " .fa-user-times");
|
|
await page.click(cordelia_user_row + " .deactivate");
|
|
await common.wait_for_micromodal_to_open(page);
|
|
|
|
assert.strictEqual(
|
|
await common.get_text_from_selector(page, ".dialog_heading"),
|
|
"Deactivate " + common.fullname.cordelia + "?",
|
|
"Unexpected title for deactivate user modal",
|
|
);
|
|
assert.strictEqual(
|
|
await common.get_text_from_selector(page, "#dialog_widget_modal .dialog_submit_button"),
|
|
"Deactivate",
|
|
"Deactivate button has incorrect text.",
|
|
);
|
|
await page.click("#dialog_widget_modal .dialog_submit_button");
|
|
await common.wait_for_micromodal_to_close(page);
|
|
}
|
|
|
|
async function test_reactivate_user(page: Page): Promise<void> {
|
|
let cordelia_user_row = await user_row(page, "cordelia");
|
|
await page.waitForSelector(cordelia_user_row + ".deactivated_user");
|
|
await page.waitForSelector(cordelia_user_row + " .fa-user-plus");
|
|
await page.click(cordelia_user_row + " .reactivate");
|
|
|
|
await test_reactivation_confirmation_modal(page, common.fullname.cordelia);
|
|
|
|
await page.waitForSelector(cordelia_user_row + ":not(.deactivated_user)", {visible: true});
|
|
cordelia_user_row = await user_row(page, "cordelia");
|
|
await page.waitForSelector(cordelia_user_row + " .fa-user-times");
|
|
}
|
|
|
|
async function test_deactivated_users_section(page: Page): Promise<void> {
|
|
const cordelia_user_row = await user_row(page, "cordelia");
|
|
await test_deactivate_user(page);
|
|
|
|
// "Deactivated users" section doesn't render just deactivated users until reloaded.
|
|
await page.reload();
|
|
const deactivated_users_section = "li[data-section='deactivated-users-admin']";
|
|
await page.waitForSelector(deactivated_users_section, {visible: true});
|
|
await page.click(deactivated_users_section);
|
|
|
|
// Instead of waiting for reactivate button using the `waitForSelector` function,
|
|
// we wait until the input is focused because the `waitForSelector` function
|
|
// doesn't guarantee that element is interactable.
|
|
await page.waitForSelector("input[aria-label='Filter deactivated users']", {visible: true});
|
|
await page.click("input[aria-label='Filter deactivated users']");
|
|
await page.waitForFunction(
|
|
() => document.activeElement?.classList?.contains("search") === true,
|
|
);
|
|
await page.click("#admin_deactivated_users_table " + cordelia_user_row + " .reactivate");
|
|
|
|
await test_reactivation_confirmation_modal(page, common.fullname.cordelia);
|
|
|
|
await page.waitForSelector(
|
|
"#admin_deactivated_users_table " + cordelia_user_row + " button:not(.reactivate)",
|
|
{visible: true},
|
|
);
|
|
}
|
|
|
|
async function test_bot_deactivation_and_reactivation(page: Page): Promise<void> {
|
|
await page.click("li[data-section='bot-list-admin']");
|
|
|
|
const default_bot_user_row = await user_row(page, "Zulip Default Bot");
|
|
|
|
await page.click(default_bot_user_row + " .deactivate");
|
|
await common.wait_for_micromodal_to_open(page);
|
|
|
|
assert.strictEqual(
|
|
await common.get_text_from_selector(page, ".dialog_heading"),
|
|
"Deactivate Zulip Default Bot?",
|
|
"Unexpected title for deactivate bot modal",
|
|
);
|
|
assert.strictEqual(
|
|
await common.get_text_from_selector(page, "#dialog_widget_modal .dialog_submit_button"),
|
|
"Deactivate",
|
|
"Deactivate button has incorrect text.",
|
|
);
|
|
await page.click("#dialog_widget_modal .dialog_submit_button");
|
|
await common.wait_for_micromodal_to_close(page);
|
|
|
|
await page.waitForSelector(default_bot_user_row + ".deactivated_user", {visible: true});
|
|
await page.waitForSelector(default_bot_user_row + " .fa-user-plus");
|
|
|
|
await page.click(default_bot_user_row + " .reactivate");
|
|
await test_reactivation_confirmation_modal(page, "Zulip Default Bot");
|
|
await page.waitForSelector(default_bot_user_row + ":not(.deactivated_user)", {visible: true});
|
|
await page.waitForSelector(default_bot_user_row + " .fa-user-times");
|
|
}
|
|
|
|
async function user_deactivation_test(page: Page): Promise<void> {
|
|
await common.log_in(page);
|
|
await navigate_to_user_list(page);
|
|
await test_deactivate_user(page);
|
|
await test_reactivate_user(page);
|
|
await test_deactivated_users_section(page);
|
|
await test_bot_deactivation_and_reactivation(page);
|
|
}
|
|
|
|
// Test temporarily disabled due to nondeterminsitic failures
|
|
|
|
common.run_test(user_deactivation_test);
|