snapshot of https://github.com/mattermost/mattermost.git (master, 2026-09-16; blobs > 131072B omitted)
Some checks failed
Server CI / Postgres (shard 0) (push) Has been skipped
Server CI / Postgres (shard 3) (push) Has been skipped
BuildEnv Docker Image / build-image (push) Failing after 4s
BuildEnv Docker Image / build-image-fips (push) Failing after 4s
Migration Review & Release Notes / Generate migration review & release notes (push) Failing after 3s
Server CI / Build Environment (push) Failing after 3s
Server CI / Postgres (shard 1) (push) Has been skipped
Tools CI / check-style (mattermost-govet) (push) Failing after 4s
Server CI / Postgres (shard 2) (push) Has been skipped
Tools CI / check-style (mmgotool) (push) Failing after 3s
Server CI / Elasticsearch v8 Compatibility (push) Has been skipped
Server CI / OpenSearch v2 Compatibility (push) Has been skipped
Server CI / Postgres FIPS (shard 0) (push) Has been skipped
Tools CI / Test (mattermost-govet) (push) Failing after 3s
Server CI / Postgres FIPS (shard 1) (push) Has been skipped
Server CI / Postgres FIPS (shard 2) (push) Has been skipped
Tools CI / Test (mmgotool) (push) Failing after 3s
Server CI / Postgres FIPS (shard 3) (push) Has been skipped
Server CI / Run mmctl tests (push) Has been skipped
Server CI / Run mmctl tests (FIPS) (push) Has been skipped
Server CI / Merge Postgres Test Results (push) Has been skipped
Server CI / Merge Postgres FIPS Test Results (push) Has been skipped
Server CI / Check backport migrations (push) Has been skipped
Server CI / Check generated files (push) Has been skipped
Server CI / check-style (push) Has been skipped
Server CI / Vet API (push) Has been skipped
Server CI / Build mattermost server app (push) Has been skipped
Server CI / Server CI Complete (push) Failing after 2s
Server CI / Server CI Artifacts (push) Has been skipped
Server CI / Sentry Upload (push) Has been skipped
Server CI / Server CI Report (push) Failing after 5m1s
Server CI Nightly Race / Race Detector (push) Has been skipped
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
Webapp CI Cache Warm / Warm Webapp node_modules Cache (push) Has been cancelled
E2E CI Cache Warm / Warm E2E npm Registry Cache (push) Has been cancelled
API / build (push) Has been cancelled
Web App CI / check-types (push) Has been cancelled
Web App CI / check-lint (push) Has been cancelled
Web App CI / check-i18n (push) Has been cancelled
Web App CI / check-external-links (push) Has been cancelled
Web App CI / test (platform) (push) Has been cancelled
Web App CI / test (mattermost-redux) (push) Has been cancelled
Web App CI / test (channels shard 1/4) (push) Has been cancelled
Web App CI / test (channels shard 2/4) (push) Has been cancelled
Web App CI / test (channels shard 3/4) (push) Has been cancelled
Web App CI / test (channels shard 4/4) (push) Has been cancelled
Web App CI / upload-coverage (push) Has been cancelled
Web App CI / build (push) Has been cancelled
YAML Lint / yamllint (push) Has been cancelled
Push mirrored docker images / cd/Push mirrored docker images (push) Has been cancelled
docs-cd / Build and deploy docs (push) Has been cancelled
Docs CI / build (push) Has been cancelled
E2E Cache Warm: Cypress deps / Warm Cypress deps cache (push) Has been cancelled
Scorecards supply-chain security / Scorecard analysis (push) Has been cancelled
Server CI Weekly / Postgres FIPS (push) Has been skipped
Server CI Weekly / Run mmctl tests (FIPS) (push) Has been skipped
Server CI Weekly / Postgres with binary parameters (push) Has been skipped
Server CI Weekly / Build Environment (push) Failing after 1s
Server CI Cache Warm / Warm Go Module and Build Cache (push) Failing after 1s
Server CI Nightly Race / Build Environment (push) Failing after 1s

This commit is contained in:
upstream-mirror
2026-09-16 00:29:55 +05:00
commit 240db4e2a7
15309 changed files with 2173406 additions and 0 deletions

View File

@@ -0,0 +1,240 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {expect, test} from '@mattermost/playwright-lib';
test('MM-65630-1 Search results should show popout button that opens results in a new window', async ({pw}) => {
const {adminClient, user, team} = await pw.initSetup();
const channel = await adminClient.createChannel(
pw.random.channel({
teamId: team.id,
displayName: 'Search Popout Channel',
name: 'search-popout-channel',
}),
);
await adminClient.addToChannel(user.id, channel.id);
const uniqueText = `popout-search-test-${pw.random.id()}`;
await adminClient.createPost({
channel_id: channel.id,
message: uniqueText,
});
const {channelsPage} = await pw.testBrowser.login(user);
await channelsPage.goto(team.name, channel.name);
await channelsPage.toBeVisible();
const page = channelsPage.page;
await channelsPage.globalHeader.openSearch();
await channelsPage.searchBox.searchInput.fill(uniqueText);
await channelsPage.searchBox.searchInput.press('Enter');
await expect(page.locator('#searchContainer')).toBeVisible();
await expect(page.locator('#searchContainer').getByText(uniqueText)).toBeVisible();
const popoutButton = page.locator('#searchContainer .PopoutButton');
await expect(popoutButton).toBeVisible();
const [popoutPage] = await Promise.all([page.waitForEvent('popup'), popoutButton.click()]);
await popoutPage.waitForLoadState('domcontentloaded');
const popoutUrl = popoutPage.url();
expect(popoutUrl).toContain('/_popout/rhs/');
expect(popoutUrl).toContain('/search');
expect(popoutUrl).toContain(`q=${encodeURIComponent(uniqueText)}`);
expect(popoutUrl).toContain('mode=search');
await expect(popoutPage.locator('#searchContainer')).toBeVisible({timeout: 10000});
await expect(popoutPage.locator('#searchContainer').getByText(uniqueText)).toBeVisible({timeout: 10000});
await popoutPage.close();
});
test('MM-65630-2 Recent mentions popout should open with the right results', async ({pw}) => {
const {adminClient, user, team} = await pw.initSetup();
const channel = await adminClient.createChannel(
pw.random.channel({
teamId: team.id,
displayName: 'Mentions Popout Channel',
name: 'mentions-popout-channel',
}),
);
await adminClient.addToChannel(user.id, channel.id);
const mentionText = `hey @${user.username} check this mention-${pw.random.id()}`;
await adminClient.createPost({
channel_id: channel.id,
message: mentionText,
});
const {channelsPage} = await pw.testBrowser.login(user);
await channelsPage.goto(team.name, channel.name);
await channelsPage.toBeVisible();
const page = channelsPage.page;
await channelsPage.globalHeader.openRecentMentions();
await expect(page.locator('#searchContainer')).toBeVisible();
await expect(page.locator('#searchContainer').getByRole('heading', {name: 'Recent Mentions'})).toBeVisible();
await expect(page.locator('#searchContainer').getByText(mentionText)).toBeVisible();
const popoutButton = page.locator('#searchContainer .PopoutButton');
await expect(popoutButton).toBeVisible();
const [popoutPage] = await Promise.all([page.waitForEvent('popup'), popoutButton.click()]);
await popoutPage.waitForLoadState('domcontentloaded');
const popoutUrl = popoutPage.url();
expect(popoutUrl).toContain('/_popout/rhs/');
expect(popoutUrl).toContain('/search');
expect(popoutUrl).toContain('mode=mention');
await expect(popoutPage.locator('#searchContainer')).toBeVisible({timeout: 10000});
await expect(popoutPage.locator('#searchContainer').getByText(mentionText)).toBeVisible({timeout: 10000});
await popoutPage.close();
});
test('MM-65630-3 Saved messages popout should open with the right results', async ({pw}) => {
const {adminClient, user, userClient, team} = await pw.initSetup();
const channel = await adminClient.createChannel(
pw.random.channel({
teamId: team.id,
displayName: 'Saved Popout Channel',
name: 'saved-popout-channel',
}),
);
await adminClient.addToChannel(user.id, channel.id);
const savedText = `saved-message-test-${pw.random.id()}`;
const post = await adminClient.createPost({
channel_id: channel.id,
message: savedText,
});
await userClient.savePreferences(user.id, [
{
user_id: user.id,
category: 'flagged_post',
name: post.id,
value: 'true',
},
]);
const {channelsPage} = await pw.testBrowser.login(user);
await channelsPage.goto(team.name, channel.name);
await channelsPage.toBeVisible();
const page = channelsPage.page;
await channelsPage.globalHeader.savedMessagesButton.click();
await expect(page.locator('#searchContainer')).toBeVisible();
await expect(page.locator('#searchContainer').getByRole('heading', {name: 'Saved messages'})).toBeVisible();
await expect(page.locator('#searchContainer').getByText(savedText)).toBeVisible();
const popoutButton = page.locator('#searchContainer .PopoutButton');
await expect(popoutButton).toBeVisible();
const [popoutPage] = await Promise.all([page.waitForEvent('popup'), popoutButton.click()]);
await popoutPage.waitForLoadState('domcontentloaded');
const popoutUrl = popoutPage.url();
expect(popoutUrl).toContain('/_popout/rhs/');
expect(popoutUrl).toContain('/search');
expect(popoutUrl).toContain('mode=flag');
await expect(popoutPage.locator('#searchContainer')).toBeVisible({timeout: 10000});
await expect(popoutPage.locator('#searchContainer').getByText(savedText)).toBeVisible({timeout: 10000});
await popoutPage.close();
});
test('MM-65630-4 Search popout should not show popout button in the popout window itself', async ({pw}) => {
const {adminClient, user, team} = await pw.initSetup();
const channel = await adminClient.createChannel(
pw.random.channel({
teamId: team.id,
displayName: 'Popout No Button Channel',
name: 'popout-no-button-channel',
}),
);
await adminClient.addToChannel(user.id, channel.id);
const uniqueText = `no-button-test-${pw.random.id()}`;
await adminClient.createPost({
channel_id: channel.id,
message: uniqueText,
});
const {channelsPage} = await pw.testBrowser.login(user);
await channelsPage.goto(team.name, channel.name);
await channelsPage.toBeVisible();
const page = channelsPage.page;
await channelsPage.globalHeader.openSearch();
await channelsPage.searchBox.searchInput.fill(uniqueText);
await channelsPage.searchBox.searchInput.press('Enter');
await expect(page.locator('#searchContainer')).toBeVisible();
const [popoutPage] = await Promise.all([
page.waitForEvent('popup'),
page.locator('#searchContainer .PopoutButton').click(),
]);
await popoutPage.waitForLoadState('domcontentloaded');
await expect(popoutPage.locator('#searchContainer')).toBeVisible({timeout: 10000});
await expect(popoutPage.locator('.PopoutButton')).not.toBeVisible();
await expect(popoutPage.locator('#searchResultsCloseButton')).not.toBeVisible();
await popoutPage.close();
});
test('MM-65630-5 Search popout should preserve search type (files) in the URL', async ({pw}) => {
const {adminClient, user, team} = await pw.initSetup();
const channel = await adminClient.createChannel(
pw.random.channel({
teamId: team.id,
displayName: 'Files Search Channel',
name: 'files-search-channel',
}),
);
await adminClient.addToChannel(user.id, channel.id);
const {channelsPage} = await pw.testBrowser.login(user);
await channelsPage.goto(team.name, channel.name);
await channelsPage.toBeVisible();
const page = channelsPage.page;
await channelsPage.globalHeader.openSearch();
await channelsPage.searchBox.searchInput.fill('test');
await channelsPage.searchBox.searchInput.press('Enter');
await expect(page.locator('#searchContainer')).toBeVisible();
const filesTab = page.locator('#searchContainer').getByRole('tab', {name: /Files/});
await filesTab.click();
const popoutButton = page.locator('#searchContainer .PopoutButton');
await expect(popoutButton).toBeVisible();
const [popoutPage] = await Promise.all([page.waitForEvent('popup'), popoutButton.click()]);
await popoutPage.waitForLoadState('domcontentloaded');
const popoutUrl = popoutPage.url();
expect(popoutUrl).toContain('type=files');
await popoutPage.close();
});