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 2s
Server CI Nightly Race / Build Environment (push) Failing after 1s
241 lines
8.7 KiB
TypeScript
241 lines
8.7 KiB
TypeScript
// 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();
|
|
});
|