@@ -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];
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user