mirror of
https://github.com/hanzoai/team.git
synced 2026-10-30 14:49:35 +00:00
* 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]>
87 lines
4.1 KiB
TypeScript
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);
|
|
},
|
|
);
|