Automatic Merge
Этот коммит содержится в:
Julien Tant
2025-01-31 19:50:08 -07:00
коммит произвёл GitHub
родитель c079020e9e
Коммит 8fdb9ad358
7 изменённых файлов: 48 добавлений и 19 удалений

Просмотреть файл

@@ -32,7 +32,7 @@ export async function shouldHaveFeatureFlag(name: string, value: string | boolea
export async function shouldRunInLinux() { export async function shouldRunInLinux() {
const platform = os.platform(); const platform = os.platform();
await expect(platform, 'Run in Linux or Playwright docker image only').toBe('linux'); expect(platform, 'Run in Linux or Playwright docker image only').toBe('linux');
} }
export async function ensureLicense() { export async function ensureLicense() {
@@ -41,7 +41,7 @@ export async function ensureLicense() {
if (license?.IsLicensed !== 'true') { if (license?.IsLicensed !== 'true') {
const config = await adminClient.getClientConfigOld(); const config = await adminClient.getClientConfigOld();
await expect( expect(
config.ServiceEnvironment === 'dev', config.ServiceEnvironment === 'dev',
'The trial license request fails in the local development environment. Please manually upload the test license.', 'The trial license request fails in the local development environment. Please manually upload the test license.',
).toBeFalsy(); ).toBeFalsy();
@@ -51,7 +51,7 @@ export async function ensureLicense() {
license = await adminClient.getClientLicenseOld(); license = await adminClient.getClientLicenseOld();
} }
await expect(license?.IsLicensed === 'true', 'Ensure server has license').toBeTruthy(); expect(license?.IsLicensed === 'true', 'Ensure server has license').toBeTruthy();
} }
export async function requestTrialLicense() { export async function requestTrialLicense() {
@@ -75,3 +75,10 @@ export async function skipIfNoLicense() {
test.skip(license.IsLicensed === 'false', 'Skipping test - server not licensed'); test.skip(license.IsLicensed === 'false', 'Skipping test - server not licensed');
} }
export async function skipIfFeatureFlagNotSet(name: string, value: string | boolean) {
const {adminClient} = await getAdminClient();
const cfg = await adminClient.getConfig();
test.skip(cfg.FeatureFlags[name] !== value, `Skipping test - Feature Flag ${name} needs to be set to ${value}`);
}

Просмотреть файл

@@ -3,7 +3,14 @@ import {AxeResults} from 'axe-core';
import AxeBuilder from '@axe-core/playwright'; import AxeBuilder from '@axe-core/playwright';
import {TestBrowser} from './browser_context'; import {TestBrowser} from './browser_context';
import {shouldHaveCallsEnabled, shouldHaveFeatureFlag, shouldRunInLinux, ensureLicense, skipIfNoLicense} from './flag'; import {
shouldHaveCallsEnabled,
shouldHaveFeatureFlag,
shouldRunInLinux,
ensureLicense,
skipIfNoLicense,
skipIfFeatureFlagNotSet,
} from './flag';
import {initSetup, getAdminClient} from './server'; import {initSetup, getAdminClient} from './server';
import {hideDynamicChannelsContent, waitForAnimationEnd, waitUntil} from './test_action'; import {hideDynamicChannelsContent, waitForAnimationEnd, waitUntil} from './test_action';
import pages from './ui/pages'; import pages from './ui/pages';
@@ -46,6 +53,7 @@ class PlaywrightExtended {
readonly shouldRunInLinux; readonly shouldRunInLinux;
readonly ensureLicense; readonly ensureLicense;
readonly skipIfNoLicense; readonly skipIfNoLicense;
readonly skipIfFeatureFlagNotSet;
// ./server // ./server
readonly getAdminClient; readonly getAdminClient;
@@ -81,6 +89,7 @@ class PlaywrightExtended {
this.shouldRunInLinux = shouldRunInLinux; this.shouldRunInLinux = shouldRunInLinux;
this.ensureLicense = ensureLicense; this.ensureLicense = ensureLicense;
this.skipIfNoLicense = skipIfNoLicense; this.skipIfNoLicense = skipIfNoLicense;
this.skipIfFeatureFlagNotSet = skipIfFeatureFlagNotSet;
// ./server // ./server
this.initSetup = initSetup; this.initSetup = initSetup;

Просмотреть файл

@@ -47,6 +47,7 @@ export default class ScheduledDraftModal {
await this.dateInput.click(); await this.dateInput.click();
const pacificDate = this.getPacificDate(); const pacificDate = this.getPacificDate();
const originDate = new Date(pacificDate.getTime());
// If dayFromToday is provided, add days to the current date // If dayFromToday is provided, add days to the current date
if (dayFromToday) { if (dayFromToday) {
@@ -57,7 +58,13 @@ export default class ScheduledDraftModal {
const month = pacificDate.toLocaleString('default', {month: 'long'}); const month = pacificDate.toLocaleString('default', {month: 'long'});
const dayOfWeek = pacificDate.toLocaleDateString('en-US', {weekday: 'long'}); const dayOfWeek = pacificDate.toLocaleDateString('en-US', {weekday: 'long'});
await this.dateLocator(day, month, dayOfWeek).click(); const dl = this.dateLocator(day, month, dayOfWeek);
// If the date is not visible and the month has changed, click the next month button
if (!(await dl.isVisible()) && pacificDate.getMonth() !== originDate.getMonth()) {
this.container.locator('button[aria-label="Go to next month"]').click();
}
await dl.click();
} }
async confirm() { async confirm() {

Просмотреть файл

@@ -12,6 +12,7 @@ export default class SearchPopover {
readonly searchBoxClose; readonly searchBoxClose;
readonly selectedSuggestion; readonly selectedSuggestion;
readonly searchHints; readonly searchHints;
readonly clearButton;
constructor(container: Locator) { constructor(container: Locator) {
this.container = container; this.container = container;
@@ -22,6 +23,16 @@ export default class SearchPopover {
this.searchBoxClose = container.getByTestId('searchBoxClose'); this.searchBoxClose = container.getByTestId('searchBoxClose');
this.selectedSuggestion = container.locator('.suggestion--selected').locator('.suggestion-list__main'); this.selectedSuggestion = container.locator('.suggestion--selected').locator('.suggestion-list__main');
this.searchHints = container.locator('#searchHints'); this.searchHints = container.locator('#searchHints');
this.clearButton = container.locator('.input-clear-x');
}
// clearIfPossible clears the search input if the clear button is visible. Returns true if the clear button was clicked.
async clearIfPossible() {
if (await this.clearButton.isVisible()) {
await this.clearButton.click();
return true;
}
return false;
} }
async toBeVisible() { async toBeVisible() {

Просмотреть файл

@@ -29,7 +29,8 @@ export default class ChannelsSidebarRight {
this.scheduledDraftChannelInfoMessageText = container.locator('span:has-text("Message scheduled for")'); this.scheduledDraftChannelInfoMessageText = container.locator('span:has-text("Message scheduled for")');
this.rhsPostBody = container.locator('.post-message__text'); this.rhsPostBody = container.locator('.post-message__text');
this.postCreate = new components.ChannelsPostCreate(container.getByTestId('comment-create'), true); this.postCreate = new components.ChannelsPostCreate(container.getByTestId('comment-create'), true);
this.closeButton = container.locator('#rhsCloseButton'); this.closeButton = container.locator('.sidebar--right__close');
this.editTextbox = container.locator('#edit_textbox'); this.editTextbox = container.locator('#edit_textbox');
this.postEdit = new components.ChannelsPostEdit(container.locator('.post-edit__container')); this.postEdit = new components.ChannelsPostEdit(container.locator('.post-edit__container'));
this.currentVersionEditedPosttext = (postID: any) => container.locator(`#rhsPostMessageText_${postID} p`); this.currentVersionEditedPosttext = (postID: any) => container.locator(`#rhsPostMessageText_${postID} p`);

Просмотреть файл

@@ -22,7 +22,7 @@ test('Search box suggestion must be case insensitive', async ({pw}) => {
// Should work as expected when using lowercase // Should work as expected when using lowercase
// # Type in lowercase "off" to search for the "Off-Topic" channel // # Type in lowercase "off" to search for the "Off-Topic" channel
const {searchInput} = await channelsPage.searchPopover; const {searchInput} = channelsPage.searchPopover;
await searchInput.pressSequentially(`In:${searchWord}`); await searchInput.pressSequentially(`In:${searchWord}`);
// * The suggestion should be visible // * The suggestion should be visible
@@ -37,10 +37,12 @@ test('Search box suggestion must be case insensitive', async ({pw}) => {
await expect(channelsPage.globalHeader.searchBox.getByText(searchOutput, {exact: true})).toBeVisible(); await expect(channelsPage.globalHeader.searchBox.getByText(searchOutput, {exact: true})).toBeVisible();
// Should work as expected when using uppercase // Should work as expected when using uppercase
// # Close then open the search UI // # Open the search bar
await channelsPage.globalHeader.closeSearch();
await channelsPage.globalHeader.openSearch(); await channelsPage.globalHeader.openSearch();
// # Clear its content
await channelsPage.searchPopover.clearIfPossible();
// # Type in uppercase "OFF" to search for the "Off-Topic" channel // # Type in uppercase "OFF" to search for the "Off-Topic" channel
await searchInput.pressSequentially(`In:${searchWord.toUpperCase()}`); await searchInput.pressSequentially(`In:${searchWord.toUpperCase()}`);

Просмотреть файл

@@ -5,17 +5,9 @@ import {createRandomTeam} from '@e2e-support/server';
import {expect, test} from '@e2e-support/test_fixture'; import {expect, test} from '@e2e-support/test_fixture';
test('team selector must show all my teams', async ({pw}) => { test('team selector must show all my teams', async ({pw}) => {
const {adminClient, adminConfig, user, team} = await pw.initSetup(); pw.skipIfFeatureFlagNotSet('ExperimentalCrossTeamSearch', true);
// # Enable Cross Team Search Feature Flag const {adminClient, user, team} = await pw.initSetup();
const newConfig = {
...adminConfig,
FeatureFlags: {
...adminConfig.FeatureFlags,
ExperimentalCrossTeamSearch: true,
},
};
await adminClient.updateConfig(newConfig);
// # create 2 more teams and add the user to them // # create 2 more teams and add the user to them
const teams = [team]; const teams = [team];