mirror of
https://github.com/zulip/zulip.git
synced 2025-11-13 02:17:19 +00:00
Just verifying that a `message-list` is rendered is not enough to ensure that we are in the correct narrow. We need to check if we are narrowed to the correct message list id. This prevents CI from failing unexpectedly.
178 lines
7.4 KiB
TypeScript
178 lines
7.4 KiB
TypeScript
import {strict as assert} from "assert";
|
|
|
|
import type {Page} from "puppeteer";
|
|
|
|
import * as common from "./lib/common";
|
|
|
|
async function copy_messages(
|
|
page: Page,
|
|
start_message: string,
|
|
end_message: string,
|
|
): Promise<string[]> {
|
|
return await page.evaluate(
|
|
(start_message: string, end_message: string) => {
|
|
function get_message_node(message: string): Element {
|
|
return [...document.querySelectorAll(".message-list .message_content")].find(
|
|
(node) => node.textContent?.trim() === message,
|
|
)!;
|
|
}
|
|
|
|
// select messages from start_message to end_message
|
|
const selectedRange = document.createRange();
|
|
selectedRange.setStartAfter(get_message_node(start_message));
|
|
selectedRange.setEndBefore(get_message_node(end_message));
|
|
window.getSelection()!.removeAllRanges();
|
|
window.getSelection()!.addRange(selectedRange);
|
|
|
|
// Remove existing copy/paste divs, which may linger from the previous
|
|
// example. (The code clears these out with a zero-second timeout, which
|
|
// is probably sufficient for human users, but which causes problems here.)
|
|
document.querySelector("#copytempdiv")?.remove();
|
|
|
|
// emulate copy event
|
|
document.dispatchEvent(
|
|
new KeyboardEvent("keydown", {
|
|
key: "c",
|
|
code: "KeyC",
|
|
ctrlKey: true,
|
|
keyCode: 67,
|
|
which: 67,
|
|
}),
|
|
);
|
|
|
|
// find temp div with copied text
|
|
return [...document.querySelectorAll("#copytempdiv > p")].map((p) => p.textContent!);
|
|
},
|
|
start_message,
|
|
end_message,
|
|
);
|
|
}
|
|
|
|
async function test_copying_first_message_from_topic(page: Page): Promise<void> {
|
|
const actual_copied_lines = await copy_messages(page, "copy paste test C", "copy paste test C");
|
|
const expected_copied_lines: string[] = [];
|
|
assert.deepStrictEqual(actual_copied_lines, expected_copied_lines);
|
|
}
|
|
|
|
async function test_copying_last_message_from_topic(page: Page): Promise<void> {
|
|
const actual_copied_lines = await copy_messages(page, "copy paste test E", "copy paste test E");
|
|
const expected_copied_lines: string[] = [];
|
|
assert.deepStrictEqual(actual_copied_lines, expected_copied_lines);
|
|
}
|
|
|
|
async function test_copying_first_two_messages_from_topic(page: Page): Promise<void> {
|
|
const actual_copied_lines = await copy_messages(page, "copy paste test C", "copy paste test D");
|
|
const expected_copied_lines = ["Desdemona: copy paste test C", "Desdemona: copy paste test D"];
|
|
assert.deepStrictEqual(actual_copied_lines, expected_copied_lines);
|
|
}
|
|
|
|
async function test_copying_all_messages_from_topic(page: Page): Promise<void> {
|
|
const actual_copied_lines = await copy_messages(page, "copy paste test C", "copy paste test E");
|
|
const expected_copied_lines = [
|
|
"Desdemona: copy paste test C",
|
|
"Desdemona: copy paste test D",
|
|
"Desdemona: copy paste test E",
|
|
];
|
|
assert.deepStrictEqual(actual_copied_lines, expected_copied_lines);
|
|
}
|
|
|
|
async function test_copying_last_from_prev_first_from_next(page: Page): Promise<void> {
|
|
const actual_copied_lines = await copy_messages(page, "copy paste test B", "copy paste test C");
|
|
const expected_copied_lines = [
|
|
"Verona > copy-paste-topic #1 Today",
|
|
"Desdemona: copy paste test B",
|
|
"Verona > copy-paste-topic #2 Today",
|
|
"Desdemona: copy paste test C",
|
|
];
|
|
assert.deepStrictEqual(actual_copied_lines, expected_copied_lines);
|
|
}
|
|
|
|
async function test_copying_last_from_prev_all_from_next(page: Page): Promise<void> {
|
|
const actual_copied_lines = await copy_messages(page, "copy paste test B", "copy paste test E");
|
|
const expected_copied_lines = [
|
|
"Verona > copy-paste-topic #1 Today",
|
|
"Desdemona: copy paste test B",
|
|
"Verona > copy-paste-topic #2 Today",
|
|
"Desdemona: copy paste test C",
|
|
"Desdemona: copy paste test D",
|
|
"Desdemona: copy paste test E",
|
|
];
|
|
assert.deepStrictEqual(actual_copied_lines, expected_copied_lines);
|
|
}
|
|
|
|
async function test_copying_all_from_prev_first_from_next(page: Page): Promise<void> {
|
|
const actual_copied_lines = await copy_messages(page, "copy paste test A", "copy paste test C");
|
|
const expected_copied_lines = [
|
|
"Verona > copy-paste-topic #1 Today",
|
|
"Desdemona: copy paste test A",
|
|
"Desdemona: copy paste test B",
|
|
"Verona > copy-paste-topic #2 Today",
|
|
"Desdemona: copy paste test C",
|
|
];
|
|
assert.deepStrictEqual(actual_copied_lines, expected_copied_lines);
|
|
}
|
|
|
|
async function test_copying_messages_from_several_topics(page: Page): Promise<void> {
|
|
const actual_copied_lines = await copy_messages(page, "copy paste test B", "copy paste test F");
|
|
const expected_copied_lines = [
|
|
"Verona > copy-paste-topic #1 Today",
|
|
"Desdemona: copy paste test B",
|
|
"Verona > copy-paste-topic #2 Today",
|
|
"Desdemona: copy paste test C",
|
|
"Desdemona: copy paste test D",
|
|
"Desdemona: copy paste test E",
|
|
"Verona > copy-paste-topic #3 Today",
|
|
"Desdemona: copy paste test F",
|
|
];
|
|
assert.deepStrictEqual(actual_copied_lines, expected_copied_lines);
|
|
}
|
|
|
|
async function copy_paste_test(page: Page): Promise<void> {
|
|
await common.log_in(page);
|
|
await page.click("#left-sidebar-navigation-list .top_left_all_messages");
|
|
let message_list_id = await common.get_current_msg_list_id(page, true);
|
|
await page.waitForSelector(
|
|
`.message-list[data-message-list-id='${message_list_id}'] .message_row`,
|
|
{visible: true},
|
|
);
|
|
|
|
await common.send_multiple_messages(page, [
|
|
{stream_name: "Verona", topic: "copy-paste-topic #1", content: "copy paste test A"},
|
|
|
|
{stream_name: "Verona", topic: "copy-paste-topic #1", content: "copy paste test B"},
|
|
|
|
{stream_name: "Verona", topic: "copy-paste-topic #2", content: "copy paste test C"},
|
|
|
|
{stream_name: "Verona", topic: "copy-paste-topic #2", content: "copy paste test D"},
|
|
|
|
{stream_name: "Verona", topic: "copy-paste-topic #2", content: "copy paste test E"},
|
|
|
|
{stream_name: "Verona", topic: "copy-paste-topic #3", content: "copy paste test F"},
|
|
|
|
{stream_name: "Verona", topic: "copy-paste-topic #3", content: "copy paste test G"},
|
|
]);
|
|
|
|
await page.click("#left-sidebar-navigation-list .top_left_all_messages");
|
|
message_list_id = await common.get_current_msg_list_id(page, true);
|
|
await common.check_messages_sent(page, message_list_id, [
|
|
["Verona > copy-paste-topic #1", ["copy paste test A", "copy paste test B"]],
|
|
[
|
|
"Verona > copy-paste-topic #2",
|
|
["copy paste test C", "copy paste test D", "copy paste test E"],
|
|
],
|
|
["Verona > copy-paste-topic #3", ["copy paste test F", "copy paste test G"]],
|
|
]);
|
|
console.log("Messages were sent successfully");
|
|
|
|
await test_copying_first_message_from_topic(page);
|
|
await test_copying_last_message_from_topic(page);
|
|
await test_copying_first_two_messages_from_topic(page);
|
|
await test_copying_all_messages_from_topic(page);
|
|
await test_copying_last_from_prev_first_from_next(page);
|
|
await test_copying_last_from_prev_all_from_next(page);
|
|
await test_copying_all_from_prev_first_from_next(page);
|
|
await test_copying_messages_from_several_topics(page);
|
|
}
|
|
|
|
common.run_test(copy_paste_test);
|