Files
b6f80ae12e E2E/Playwright: Migrate RFQA browser tests (batch 5, 81-100) (#37417)
* E2E/Playwright: Migrate RFQA browser tests (batch 4, 61-80)

Migrate the fourth batch of Rainforest QA browser tests into Playwright
(migration plan None-core #34-53, keys MM-T480..MM-T1257): 17 new/covered
specs across notifications, search, channel_settings, sidebar_left,
keyboard_shortcuts, and direct_messages_modal, plus 3 duplicate keys folded
into existing tests (MM-T480, MM-T1256, MM-T1257).

POM/infra: add a ChannelMenu page object for the channel header dropdown, an
EditChannelHeaderModal, a header field on the channel-settings info tab, a
channel-wide-mentions checkbox on NotificationsSettings, a getConfirmModal
helper, and a clickNotification browser-API mock helper. Give the channel
header menu and the confirm modal proper accessible names so they can be
targeted semantically. Notification specs run on all browsers now that the
Notification API stub works headless on Chromium and Firefox.

* E2E/Playwright: Migrate RFQA browser tests (batch 5, 81-100)

Migrate the fifth batch of Rainforest QA browser tests into Playwright across
keyboard_shortcuts, search, archived_channels, channel_settings,
plugin_marketplace, messaging, and emoji_picker (keys MM-T1247..MM-T2365),
folding duplicate coverage into existing keyboard-shortcut specs and
documenting skipped cases inline.

POM/infra: add AddPeopleToChannelModal and MarketplaceModal page objects,
manage/add member buttons on the channel members RHS, and an App Marketplace
entry on the global header; target the search "Jump" link through the existing
SearchResultsPanel POM.

Also fix a webapp bug where a post body disappeared when an inline edit was
cancelled mid-animation (found via the up-arrow edit shortcut spec).

* E2E/Playwright: Fail on missing scroll bounding boxes

* E2E/Playwright: Group related batch 5 specs

* E2E/Playwright: Avoid duplicate creator membership

* E2E/Playwright: Group Rainforest batches 1 through 4

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-13 17:14:42 +08:00

87 lines
4.1 KiB
TypeScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {expect, test} from '@mattermost/playwright-lib';
/**
* @objective Verify that a user viewing a thread in the right-hand side can no longer reply once they are
* removed from the channel.
*/
test(
'MM-T843 removes the reply box in the right-hand side after the user is removed from the channel',
{tag: '@channel_settings'},
async ({pw}) => {
const {adminClient, adminUser, team, user} = await pw.initSetup();
// # Create a channel, add the user, and post a root message as the admin
const channel = await adminClient.createPublicChannel(team.id, `Remove ${pw.random.id()}`);
await adminClient.addToChannel(user.id, channel.id);
const rootMessage = `root ${pw.random.id()}`;
await adminClient.createPost({channel_id: channel.id, user_id: adminUser.id, message: rootMessage});
// # Log in as the user and open the thread in the right-hand side
const {channelsPage} = await pw.testBrowser.login(user);
await channelsPage.goto(team.name, channel.name);
await channelsPage.toBeVisible();
const rootPost = await channelsPage.getLastPost();
await rootPost.reply();
await channelsPage.sidebarRight.toBeVisible();
// # Post a reply in the right-hand side
const reply = `reply ${pw.random.id()}`;
await channelsPage.sidebarRight.postMessage(reply);
await channelsPage.sidebarRight.toContainText(reply);
// * Verify the reply box is available before removal
await expect(channelsPage.sidebarRight.postCreate.input).toBeVisible();
// # Remove the user from the channel
await adminClient.removeFromChannel(user.id, channel.id);
// * Verify the reply box in the right-hand side is no longer available
await expect(channelsPage.sidebarRight.postCreate.input).not.toBeVisible({timeout: pw.duration.ten_sec});
},
);
/**
* @objective Verify that users added to a public channel in one batch are combined into a single system
* message, while a user added after an intervening post produces a separate system message.
*/
test(
'MM-T858 combines consecutive join messages and separates them across posts',
{tag: '@channel_settings'},
async ({pw}) => {
const {adminClient, team, user} = await pw.initSetup();
const [member1, member2, member3] = await adminClient.createUsers(team.id, 3, 'join-leave');
const channel = await adminClient.createPublicChannel(team.id, `Messages ${pw.random.id()}`);
await adminClient.addToChannel(user.id, channel.id);
const {channelsPage} = await pw.testBrowser.login(user);
await channelsPage.goto(team.name, channel.name);
await channelsPage.toBeVisible();
// # Post a message to seal the setup system messages into their own group
await channelsPage.postMessage(`setup ${pw.random.id()}`);
// # Add two members to the channel in quick succession
await adminClient.addToChannel(member1.id, channel.id);
await adminClient.addToChannel(member2.id, channel.id);
// * Verify both members are combined into a single "added to the channel" system message
await channelsPage.centerView.waitUntilLastPostContains('added to the channel');
const combinedPost = await channelsPage.getLastPost();
await combinedPost.toContainText(member1.username);
await combinedPost.toContainText(member2.username);
// # Post a message, then add a third member after it
await channelsPage.postMessage(`divider ${pw.random.id()}`);
await adminClient.addToChannel(member3.id, channel.id);
// * Verify the third member produces a separate system message that does not include the earlier members
await channelsPage.centerView.waitUntilLastPostContains('added to the channel');
const separatePost = await channelsPage.getLastPost();
await separatePost.toContainText(member3.username);
await separatePost.toNotContainText(member1.username);
},
);