MM-69003 Mostly share ESLint config between web app and E2E tests (#36767)

* Switch Cypress to use shared ESLint config

* Run --fix in Cypress

* Manually fix remaining lint issues in Cypress

* Switch Playwright to use shared ESLint config

* Run --fix in Playwright

* Manually fix remaining lint issues in Playwright

* Install and cache web app deps during Cypress CI builds

This also caches the types and client package. That isn't needed currently
since it uses prepackaged versions of those, but I imagine we might change
that at some point.

* Run e2e-tests-check when ESLint plugin is updated

* Change E2E test GHA caching to cache all of web app node_modules

* Fix mismatch between cache save and restore

* Try bumping cache keys

* Copy step to install dependencies to server.run_cypress.sh

I don't know how this must've worked before, but if this fixes the issue,
it seems like neither Cypress nor Playwright actually use the cached
depenendencies.

* Try disabling caching entirely for Cypress tests

* Try bypassing makefile?

* Try also manually building dependencies in run_specs.sh

I don't know why this appears to duplicate run_cypress.sh and
run_playwright.sh, both of which are called run_test.sh which
might not be used any more as best I can tell.

* Try installing the web app dependencies in yet another place

* Disable the extra steps in server.prepare.sh specifically for Cypress

* Revert changes to update cache key and disable web app depenedency cache on Cypress builds
This commit is contained in:
Harrison Healey
2026-06-09 16:50:58 -04:00
committed by GitHub
parent cc1547ac46
commit f3836530b7
388 changed files with 1229 additions and 3354 deletions
+6 -3
View File
@@ -5,6 +5,7 @@ on:
paths:
- "e2e-tests/**"
- "webapp/platform/client/**"
- "webapp/platform/eslint-plugin/**"
- "webapp/platform/types/**"
- ".github/workflows/e2e-*.yml"
@@ -38,6 +39,11 @@ jobs:
# failures in npm's cacache writer.
run: npm cache verify
# Set up web app subpackages and eslint plugin
- name: ci/get-webapp-node-modules
working-directory: webapp
run: make node_modules
# Cypress check
- name: ci/cypress/npm-install
working-directory: e2e-tests/cypress
@@ -47,9 +53,6 @@ jobs:
run: npm run check
# Playwright check
- name: ci/get-webapp-node-modules
working-directory: webapp
run: make node_modules
- name: ci/playwright/npm-install
working-directory: e2e-tests/playwright
run: npm ci
@@ -216,6 +216,25 @@ jobs:
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version-file: ".nvmrc"
- name: ci/cache-platform-pkgs
# `webapp/node_modules/@mattermost/{client,types}` are the workspace
# symlinks Node walks up to find when platform/client requires
# @mattermost/types. Without them, module resolution fails inside
# the slim slice.
id: cache-platform-pkgs
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: |
webapp/**/node_modules
webapp/platform/client/lib
webapp/platform/types/lib
key: e2e-platform-pkgs-${{ runner.os }}-${{ hashFiles('webapp/package-lock.json', 'webapp/platform/client/src/**', 'webapp/platform/client/tsconfig*.json', 'webapp/platform/types/src/**', 'webapp/platform/types/tsconfig*.json') }}
- name: ci/build-platform-pkgs
# Full webapp install is needed for tsc + workspace linking; the
# postinstall builds platform/{client,types}/lib. We only cache those.
if: steps.cache-platform-pkgs.outputs.cache-hit != 'true'
working-directory: webapp
run: make node_modules
- name: ci/cache-cypress-deps
# node_modules + the cypress binary (downloaded to ~/.cache/Cypress by
# cypress's postinstall, not into node_modules). Both must be cached;
@@ -317,6 +336,17 @@ jobs:
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version-file: ".nvmrc"
- name: ci/restore-platform-pkgs
# Built lib/ for @mattermost/client and @mattermost/types, plus the
# webapp workspace symlinks under webapp/node_modules/@mattermost/.
uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: |
webapp/**/node_modules
webapp/platform/client/lib
webapp/platform/types/lib
key: e2e-platform-pkgs-${{ runner.os }}-${{ hashFiles('webapp/package-lock.json', 'webapp/platform/client/src/**', 'webapp/platform/client/tsconfig*.json', 'webapp/platform/types/src/**', 'webapp/platform/types/tsconfig*.json') }}
fail-on-cache-miss: true
- name: ci/restore-cypress-deps
uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
@@ -222,6 +222,14 @@ jobs:
node-version-file: ".nvmrc"
cache: npm
cache-dependency-path: "e2e-tests/cypress/package-lock.json"
- name: ci/npm-cache-verify
# Heal any partial/dangling entries left in the restored ~/.npm cache
# before running `npm ci`. Avoids the intermittent EEXIST/ENOENT
# failures in npm's cacache writer.
run: npm cache verify
- name: ci/get-webapp-node-modules
working-directory: webapp
run: make node_modules
- name: ci/run-tests
run: |
make cloud-init
@@ -192,12 +192,9 @@ jobs:
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: |
webapp/node_modules/@mattermost/client
webapp/node_modules/@mattermost/types
webapp/**/node_modules
webapp/platform/client/lib
webapp/platform/client/node_modules
webapp/platform/types/lib
webapp/platform/types/node_modules
key: e2e-platform-pkgs-${{ runner.os }}-${{ hashFiles('webapp/package-lock.json', 'webapp/platform/client/src/**', 'webapp/platform/client/tsconfig*.json', 'webapp/platform/types/src/**', 'webapp/platform/types/tsconfig*.json') }}
- name: ci/build-platform-pkgs
# Full webapp install is needed for tsc + workspace linking; the
@@ -319,12 +316,9 @@ jobs:
uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: |
webapp/node_modules/@mattermost/client
webapp/node_modules/@mattermost/types
webapp/**/node_modules
webapp/platform/client/lib
webapp/platform/client/node_modules
webapp/platform/types/lib
webapp/platform/types/node_modules
key: e2e-platform-pkgs-${{ runner.os }}-${{ hashFiles('webapp/package-lock.json', 'webapp/platform/client/src/**', 'webapp/platform/client/tsconfig*.json', 'webapp/platform/types/src/**', 'webapp/platform/types/tsconfig*.json') }}
fail-on-cache-miss: true
- name: ci/restore-playwright-deps
+26 -26
View File
@@ -20,34 +20,34 @@ if [ -n "${MM_LICENSE:-}" ]; then
${MME2E_DC_SERVER} exec -T -- server mmctl --local license upload-string "$MM_LICENSE"
fi
if [ "$TEST" = "cypress" ]; then
mme2e_log "Prepare Cypress: install dependencies"
# Create user in Cypress container and work around the node image's assumption that the app files are owned by user 1000
mme2e_log "Creating user for Cypress container"
${MME2E_DC_SERVER} exec -T -u 0 -- cypress bash -c "id $MME2E_UID || useradd -u $MME2E_UID -m nodeci"
${MME2E_DC_SERVER} exec -T -u "$MME2E_UID" -- cypress npm i
${MME2E_DC_SERVER} exec -T -u "$MME2E_UID" -- cypress cypress install
mme2e_log "Prepare Cypress: populating fixtures"
${MME2E_DC_SERVER} exec -T -u "$MME2E_UID" -- cypress tee tests/fixtures/keycloak.crt >/dev/null <../../server/build/docker/keycloak/keycloak.crt
# Download plugins using wget in the Cypress container
for PLUGIN_URL in \
"https://github.com/mattermost/mattermost-plugin-gitlab/releases/download/v1.3.0/com.github.manland.mattermost-plugin-gitlab-1.3.0.tar.gz" \
"https://github.com/mattermost/mattermost-plugin-demo/releases/download/v0.9.0/com.mattermost.demo-plugin-0.9.0.tar.gz" \
"https://github.com/mattermost/mattermost-plugin-demo/releases/download/v0.8.0/com.mattermost.demo-plugin-0.8.0.tar.gz"; do
PLUGIN_NAME="${PLUGIN_URL##*/}"
PLUGIN_PATH="tests/fixtures/$PLUGIN_NAME"
# if [ "$TEST" = "cypress" ]; then
# mme2e_log "Prepare Cypress: install dependencies"
# # Create user in Cypress container and work around the node image's assumption that the app files are owned by user 1000
# mme2e_log "Creating user for Cypress container"
# ${MME2E_DC_SERVER} exec -T -u 0 -- cypress bash -c "id $MME2E_UID || useradd -u $MME2E_UID -m nodeci"
# ${MME2E_DC_SERVER} exec -T -u "$MME2E_UID" -- cypress npm i
# ${MME2E_DC_SERVER} exec -T -u "$MME2E_UID" -- cypress cypress install
# mme2e_log "Prepare Cypress: populating fixtures"
# ${MME2E_DC_SERVER} exec -T -u "$MME2E_UID" -- cypress tee tests/fixtures/keycloak.crt >/dev/null <../../server/build/docker/keycloak/keycloak.crt
# # Download plugins using wget in the Cypress container
# for PLUGIN_URL in \
# "https://github.com/mattermost/mattermost-plugin-gitlab/releases/download/v1.3.0/com.github.manland.mattermost-plugin-gitlab-1.3.0.tar.gz" \
# "https://github.com/mattermost/mattermost-plugin-demo/releases/download/v0.9.0/com.mattermost.demo-plugin-0.9.0.tar.gz" \
# "https://github.com/mattermost/mattermost-plugin-demo/releases/download/v0.8.0/com.mattermost.demo-plugin-0.8.0.tar.gz"; do
# PLUGIN_NAME="${PLUGIN_URL##*/}"
# PLUGIN_PATH="tests/fixtures/$PLUGIN_NAME"
# Check if file exists
if ${MME2E_DC_SERVER} exec -T -u "$MME2E_UID" -- cypress test -f "$PLUGIN_PATH"; then
mme2e_log "Skipping installation of plugin $PLUGIN_NAME: file exists"
continue
fi
# # Check if file exists
# if ${MME2E_DC_SERVER} exec -T -u "$MME2E_UID" -- cypress test -f "$PLUGIN_PATH"; then
# mme2e_log "Skipping installation of plugin $PLUGIN_NAME: file exists"
# continue
# fi
# Use wget in the Cypress container instead of curl in server (for distroless compatibility)
mme2e_log "Downloading $PLUGIN_NAME to fixtures directory"
${MME2E_DC_SERVER} exec -T -u "$MME2E_UID" -- cypress wget -q -O "/cypress/$PLUGIN_PATH" "$PLUGIN_URL"
done
fi
# # Use wget in the Cypress container instead of curl in server (for distroless compatibility)
# mme2e_log "Downloading $PLUGIN_NAME to fixtures directory"
# ${MME2E_DC_SERVER} exec -T -u "$MME2E_UID" -- cypress wget -q -O "/cypress/$PLUGIN_PATH" "$PLUGIN_URL"
# done
# fi
# Run service-specific initialization steps
for SERVICE in $ENABLED_DOCKER_SERVICES; do
+8
View File
@@ -18,6 +18,14 @@ firefox: $(firefox --version || true)
INNEREOF
EOF
mme2e_log "Prepare Cypress: install dependencies"
${MME2E_DC_SERVER} exec -T -u "$MME2E_UID" -- cypress bash <<EOF
cd webapp/
npm install --cache /tmp/empty-cache
cd ../e2e-tests/cypress
npm install --cache /tmp/empty-cache
EOF
# Initialize cypress report directory
mme2e_log "Prepare Cypress: clean and initialize report and logs directory"
${MME2E_DC_SERVER} exec -T -u "$MME2E_UID" -- cypress bash <<EOF
+9
View File
@@ -26,6 +26,15 @@ mkdir -p results/junit
mkdir -p results/mochawesome-report/json/tests
touch results/junit/empty.xml
echo '<?xml version="1.0" encoding="UTF-8"?>' > results/junit/empty.xml
EOF
# Install dependencies
mme2e_log "Prepare Cypress: install dependencies"
${MME2E_DC_SERVER} exec -T -u "$MME2E_UID" -- cypress bash <<EOF
cd webapp/
npm install --cache /tmp/empty-cache
cd ../e2e-tests/cypress
npm install --cache /tmp/empty-cache
EOF
# Run cypress with specific spec files and mochawesome reporter
+13 -29
View File
@@ -1,50 +1,31 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import typescriptEslint from '@typescript-eslint/eslint-plugin';
import globals from 'globals';
import tsParser from '@typescript-eslint/parser';
import path from 'node:path';
import {fileURLToPath} from 'node:url';
import js from '@eslint/js';
import {FlatCompat} from '@eslint/eslintrc';
import headers from 'eslint-plugin-headers';
import pluginCypress from 'eslint-plugin-cypress';
import noOnlyTest from 'eslint-plugin-no-only-tests';
import globals from 'globals';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all,
});
import eslintPlugin from '@mattermost/eslint-plugin';
export default [
{
ignores: ['**/node_modules', '**/logs', '**/results'],
},
...compat
.extends('eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:import/recommended')
.map((config) => ({
...config,
files: ['**/*.ts', '**/*.js'],
})),
...eslintPlugin.configs.base,
{
files: ['**/*.ts', '**/*.js'],
plugins: {
'@typescript-eslint': typescriptEslint,
headers,
cypress: pluginCypress,
'no-only-tests': noOnlyTest,
},
languageOptions: {
globals: {
...globals.chai,
...globals.node,
...globals.mocha,
Cypress: 'readonly',
cy: 'readonly',
},
parser: tsParser,
ecmaVersion: 5,
sourceType: 'module',
},
settings: {
'import/resolver': {
@@ -60,14 +41,17 @@ export default [
'cypress/no-unnecessary-waiting': 0,
'cypress/unsafe-to-chain-command': 0,
'func-names': 0,
'import/no-unresolved': 0,
'global-require': 0,
'lines-around-comment': 0,
'max-nested-callbacks': 0,
'no-await-in-loop': 0,
'no-loop-func': 0,
'no-unused-expressions': 0,
'no-process-env': 0,
'no-duplicate-imports': 0,
'no-undefined': 0,
'no-use-before-define': 0,
'no-only-tests/no-only-tests': ['error', {'focus': ['only']}],
'no-only-tests/no-only-tests': ['error', {focus: ['only']}],
'no-console': 'error',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/no-explicit-any': 'off',
@@ -92,7 +76,7 @@ export default [
},
],
'import/no-unresolved': 'off',
'max-lines': ['warn', {'max': 800, 'skipBlankLines': true, 'skipComments': true}],
'max-lines': ['warn', {max: 800, skipBlankLines: true, skipComments: true}],
'eol-last': ['error', 'always'],
'no-trailing-spaces': 'error',
},
+31 -1838
View File
File diff suppressed because it is too large Load Diff
+1 -5
View File
@@ -9,6 +9,7 @@
"@cypress/webpack-preprocessor": "7.1.0",
"@eslint/js": "9.39.3",
"@mattermost/client": "11.5.0",
"@mattermost/eslint-plugin": "file:../../webapp/platform/eslint-plugin",
"@mattermost/types": "11.5.0",
"@testing-library/cypress": "10.1.0",
"@types/async": "3.2.25",
@@ -42,13 +43,8 @@
"deepmerge": "4.3.1",
"dotenv": "17.4.2",
"eslint": "9.39.3",
"eslint-import-resolver-webpack": "0.13.11",
"eslint-plugin-cypress": "6.3.1",
"eslint-plugin-headers": "^1.3.4",
"eslint-plugin-import": "2.32.0",
"eslint-plugin-mattermost": "github:mattermost/eslint-plugin-mattermost#5b0c972eacf19286e4c66221b39113bf8728a99e",
"eslint-plugin-no-only-tests": "3.3.0",
"eslint-plugin-react": "7.37.5",
"express": "5.2.1",
"extract-zip": "2.0.1",
"globals": "17.5.0",
@@ -14,7 +14,7 @@
// Group: @channels @enterprise @ldap @saml @keycloak
import {LdapUser} from '@/support/ldap_server_commands';
import type {LdapUser} from '@/support/ldap_server_commands';
import {getAdminAccount} from '@/support/env';
import {getRandomId} from '@/utils';
import {getKeycloakServerSettings} from '@/utils/config';
@@ -15,7 +15,8 @@
// Group: @channels @enterprise @ldap @saml @keycloak
import {getAdminAccount} from '@/support/env';
import {generateLDAPUser, LdapUser} from '@/support/ldap_server_commands';
import type {LdapUser} from '@/support/ldap_server_commands';
import {generateLDAPUser} from '@/support/ldap_server_commands';
import {getKeycloakServerSettings} from '@/utils/config';
describe('AD / LDAP', () => {
@@ -14,7 +14,7 @@
// Group: @channels @enterprise @ldap @saml @keycloak
import {LdapUser} from '@/support/ldap_server_commands';
import type {LdapUser} from '@/support/ldap_server_commands';
import {getAdminAccount} from '@/support/env';
import {getRandomId} from '@/utils';
import {getKeycloakServerSettings} from '@/utils/config';
@@ -14,7 +14,6 @@ import {createArchivedChannel} from './helpers';
import {getRandomId} from '@/utils';
describe('archive channel search tests', () => {
let testTeam: Cypress.Team;
let testChannel: Cypress.Channel;
@@ -7,10 +7,12 @@
// - Use element ID when selecting an element. Create one if none.
// ***************************************************************
import type {
SimpleUser,
} from './helpers';
import {
getPostTextboxInput,
getQuickChannelSwitcherInput,
SimpleUser,
startAtMention,
verifySuggestionAtChannelSwitcher,
verifySuggestionAtPostTextbox,
@@ -11,7 +11,8 @@
// Group: @channels @autocomplete
import {doTestQuickChannelSwitcher} from '../common_test';
import {createSearchData, SimpleUser} from '../helpers';
import type {SimpleUser} from '../helpers';
import {createSearchData} from '../helpers';
import {getRandomLetter} from '@/utils';
@@ -11,7 +11,8 @@
// Group: @channels @autocomplete
import {doTestPostextbox} from '../common_test';
import {createSearchData, SimpleUser} from '../helpers';
import type {SimpleUser} from '../helpers';
import {createSearchData} from '../helpers';
import {getRandomLetter} from '@/utils';
@@ -11,7 +11,8 @@
// Group: @channels @autocomplete
import {doTestDMChannelSidebar, doTestUserChannelSection} from '../common_test';
import {createSearchData, SimpleUser} from '../helpers';
import type {SimpleUser} from '../helpers';
import {createSearchData} from '../helpers';
import {getRandomLetter} from '@/utils';
@@ -10,9 +10,9 @@
// Stage: @prod
// Group: @channels @bot_accounts @mfa
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import * as TIMEOUTS from '@/fixtures/timeouts';
@@ -10,9 +10,9 @@
// Stage: @prod
// Group: @channels @bot_accounts @mfa
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import * as TIMEOUTS from '@/fixtures/timeouts';
@@ -10,7 +10,7 @@
// Stage: @prod
// Group: @channels @not_cloud @bot_accounts
import {Team} from '@mattermost/types/teams';
import type {Team} from '@mattermost/types/teams';
import * as TIMEOUTS from '@/fixtures/timeouts';
@@ -10,8 +10,8 @@
// Stage: @prod
// Group: @channels @bot_accounts
import {Bot} from '@mattermost/types/bots';
import {Team} from '@mattermost/types/teams';
import type {Bot} from '@mattermost/types/bots';
import type {Team} from '@mattermost/types/teams';
import {createBotPatch} from '@/support/api/bots';
@@ -10,13 +10,12 @@
// Stage: @prod
// Group: @channels @not_cloud @bot_accounts
import {Team} from '@mattermost/types/teams';
import type {Team} from '@mattermost/types/teams';
import {createBotInteractive} from './helpers';
import {getRandomId} from '@/utils';
describe('Bot accounts - CRUD Testing', () => {
let newTeam: Team;
@@ -10,14 +10,13 @@
// Stage: @prod
// Group: @channels @bot_accounts
import {Bot} from '@mattermost/types/bots';
import {Team} from '@mattermost/types/teams';
import type {Bot} from '@mattermost/types/bots';
import type {Team} from '@mattermost/types/teams';
import {createBotInteractive} from './helpers';
import {getRandomId} from '@/utils';
describe('Bot accounts - CRUD Testing', () => {
let newTeam: Team;
let testBot: Bot & {fullDisplayName: string};
@@ -9,8 +9,8 @@
// Group: @channels @bot_accounts
import {Channel} from '@mattermost/types/channels';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {UserProfile} from '@mattermost/types/users';
describe('Bot display name', () => {
let offTopicChannel: Channel;
@@ -10,7 +10,7 @@
// Stage: @prod
// Group: @channels @bot_accounts
import {Team} from '@mattermost/types/teams';
import type {Team} from '@mattermost/types/teams';
import * as MESSAGES from '@/fixtures/messages';
import {getRandomId} from '@/utils';
@@ -10,7 +10,7 @@
// Stage: @prod
// Group: @channels @bot_accounts
import {Team} from '@mattermost/types/teams';
import type {Team} from '@mattermost/types/teams';
import * as TIMEOUTS from '@/fixtures/timeouts';
import {getRandomId} from '@/utils';
@@ -1,7 +1,7 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {Team} from '@mattermost/types/teams';
import type {Team} from '@mattermost/types/teams';
import * as TIMEOUTS from '@/fixtures/timeouts';
import {getRandomId} from '@/utils';
@@ -10,10 +10,10 @@
// Stage: @prod
// Group: @channels @bot_accounts
import {Bot} from '@mattermost/types/bots';
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Bot} from '@mattermost/types/bots';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import {createBotPatch} from '@/support/api/bots';
import {generateRandomUser} from '@/support/api/user';
@@ -9,10 +9,10 @@
// Group: @channels @bot_accounts
import {Bot} from '@mattermost/types/bots';
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Bot} from '@mattermost/types/bots';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import {createBotPatch} from '@/support/api/bots';
import {generateRandomUser} from '@/support/api/user';
@@ -10,8 +10,8 @@
// Stage: @prod
// Group: @channels @bot_accounts
import {Team} from '@mattermost/types/teams';
import {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {Channel} from '@mattermost/types/channels';
import {createBotPatch} from '@/support/api/bots';
import {createChannelPatch} from '@/support/api/channel';
@@ -10,7 +10,7 @@
// Stage: @prod
// Group: @channels @bot_accounts @plugin @not_cloud
import {Team} from '@mattermost/types/teams';
import type {Team} from '@mattermost/types/teams';
import * as TIMEOUTS from '@/fixtures/timeouts';
import {matterpollPlugin} from '@/utils/plugins';
@@ -10,7 +10,7 @@
// Stage: @prod
// Group: @channels @bot_accounts
import {Team} from '@mattermost/types/teams';
import type {Team} from '@mattermost/types/teams';
import * as TIMEOUTS from '@/fixtures/timeouts';
import {getRandomId} from '@/utils';
@@ -1,7 +1,7 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {Channel} from '@mattermost/types/channels';
import type {Channel} from '@mattermost/types/channels';
// ***************************************************************
// - [#] indicates a test step (e.g. # Go to a page)
@@ -10,7 +10,7 @@
// Stage: @prod
// Group: @channels @bot_accounts
import {Team} from '@mattermost/types/teams';
import type {Team} from '@mattermost/types/teams';
import {createBotPatch} from '@/support/api/bots';
@@ -10,10 +10,10 @@
// Stage: @prod
// Group: @channels @bot_accounts @not_cloud
import {Bot} from '@mattermost/types/bots';
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Bot} from '@mattermost/types/bots';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import {createBotPatch} from '@/support/api/bots';
import {generateRandomUser} from '@/support/api/user';
@@ -10,10 +10,10 @@
// Stage: @prod
// Group: @channels @bot_accounts
import {Bot} from '@mattermost/types/bots';
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Bot} from '@mattermost/types/bots';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import {createBotPatch} from '@/support/api/bots';
import * as TIMEOUTS from '@/fixtures/timeouts';
@@ -10,8 +10,8 @@
// Stage: @prod
// Group: @channels @channel
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import {getRandomId} from '@/utils';
@@ -10,9 +10,9 @@
// Stage: @prod
// Group: @channels @channel
import {Channel, ServerChannel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel, ServerChannel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import {getAdminAccount} from '@/support/env';
import {getRandomId} from '@/utils';
@@ -10,15 +10,14 @@
// Stage: @prod
// Group: @channels @channel
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import {createPrivateChannel} from '../enterprise/elasticsearch_autocomplete/helpers';
import * as TIMEOUTS from '@/fixtures/timeouts';
const channelType = {
all: 'Channel Type: All',
public: 'Channel Type: Public',
@@ -1,8 +1,8 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
// ***************************************************************
// - [#] indicates a test step (e.g. # Go to a page)
@@ -10,9 +10,9 @@
// Group: @channels @channel @channel_bookmarks
// node run_tests.js --group='@channel'
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import * as TIMEOUTS from '@/fixtures/timeouts';
import {getRandomId, stubClipboard} from '@/utils';
@@ -20,7 +20,6 @@ import {getRandomId, stubClipboard} from '@/utils';
describe('Channel Bookmarks', () => {
let testTeam: Team;
let user1: UserProfile;
let admin: UserProfile;
let publicChannel: Channel;
@@ -471,7 +470,6 @@ describe('Channel Bookmarks', () => {
cy.makeClient().then(async (client) => {
for (let i = 1; i <= OVERFLOW_COUNT; i++) {
// eslint-disable-next-line no-await-in-loop
await client.createChannelBookmark(overflowChannel.id, {
type: 'link',
display_name: `OvBm ${String(i).padStart(2, '0')}`,
@@ -530,20 +528,20 @@ describe('Channel Bookmarks', () => {
// # Select first item with Space, move down, confirm with Space
cy.get('#channelBookmarksBarMenuDropdown').within(() => {
cy.contains('[data-bookmark-id]', firstName).focus()
.trigger('keydown', {key: ' ', code: 'Space', bubbles: true});
cy.contains('[data-bookmark-id]', firstName).focus().
trigger('keydown', {key: ' ', code: 'Space', bubbles: true});
});
cy.wait(TIMEOUTS.HALF_SEC);
cy.get('#channelBookmarksBarMenuDropdown').within(() => {
cy.contains('[data-bookmark-id]', firstName)
.trigger('keydown', {key: 'ArrowDown', code: 'ArrowDown', bubbles: true});
cy.contains('[data-bookmark-id]', firstName).
trigger('keydown', {key: 'ArrowDown', code: 'ArrowDown', bubbles: true});
});
cy.wait(TIMEOUTS.HALF_SEC);
cy.get('#channelBookmarksBarMenuDropdown').within(() => {
cy.contains('[data-bookmark-id]', firstName)
.trigger('keydown', {key: ' ', code: 'Space', bubbles: true});
cy.contains('[data-bookmark-id]', firstName).
trigger('keydown', {key: ' ', code: 'Space', bubbles: true});
});
cy.wait(TIMEOUTS.ONE_SEC);
@@ -565,20 +563,20 @@ describe('Channel Bookmarks', () => {
// # Select, move, then Escape to cancel
cy.get('#channelBookmarksBarMenuDropdown').within(() => {
cy.contains('[data-bookmark-id]', firstName).focus()
.trigger('keydown', {key: ' ', code: 'Space', bubbles: true});
cy.contains('[data-bookmark-id]', firstName).focus().
trigger('keydown', {key: ' ', code: 'Space', bubbles: true});
});
cy.wait(TIMEOUTS.HALF_SEC);
cy.get('#channelBookmarksBarMenuDropdown').within(() => {
cy.contains('[data-bookmark-id]', firstName)
.trigger('keydown', {key: 'ArrowDown', code: 'ArrowDown', bubbles: true});
cy.contains('[data-bookmark-id]', firstName).
trigger('keydown', {key: 'ArrowDown', code: 'ArrowDown', bubbles: true});
});
cy.wait(TIMEOUTS.HALF_SEC);
cy.get('#channelBookmarksBarMenuDropdown').within(() => {
cy.contains('[data-bookmark-id]', firstName)
.trigger('keydown', {key: 'Escape', code: 'Escape', bubbles: true});
cy.contains('[data-bookmark-id]', firstName).
trigger('keydown', {key: 'Escape', code: 'Escape', bubbles: true});
});
cy.wait(TIMEOUTS.ONE_SEC);
@@ -719,8 +717,8 @@ describe('Channel Bookmarks', () => {
const lastName = text.trim();
// # Start reorder, move right to cross into overflow, confirm
cy.findByRole('link', {name: lastName}).focus()
.trigger('keydown', {key: ' ', code: 'Space', bubbles: true});
cy.findByRole('link', {name: lastName}).focus().
trigger('keydown', {key: ' ', code: 'Space', bubbles: true});
cy.focused().trigger('keydown', {key: 'ArrowRight', code: 'ArrowRight', bubbles: true});
cy.focused().trigger('keydown', {key: ' ', code: 'Space', bubbles: true});
@@ -733,10 +731,10 @@ describe('Channel Bookmarks', () => {
// * Verify DOM: item is present in the open overflow menu (menu stays
// open after confirm when item ends in overflow)
cy.get('#channelBookmarksBarMenuDropdown')
.should('be.visible')
.contains(lastName)
.should('be.visible');
cy.get('#channelBookmarksBarMenuDropdown').
should('be.visible').
contains(lastName).
should('be.visible');
// # Close menu to remove MUI backdrop covering the bar
dismissMenu();
@@ -760,10 +758,10 @@ describe('Channel Bookmarks', () => {
const firstOverflowName = text.trim();
cy.get('#channelBookmarksBarMenuDropdown').within(() => {
cy.contains('[data-bookmark-id]', firstOverflowName).focus()
.trigger('keydown', {key: ' ', code: 'Space', bubbles: true});
cy.contains('[data-bookmark-id]', firstOverflowName)
.trigger('keydown', {key: 'ArrowUp', code: 'ArrowUp', bubbles: true});
cy.contains('[data-bookmark-id]', firstOverflowName).focus().
trigger('keydown', {key: ' ', code: 'Space', bubbles: true});
cy.contains('[data-bookmark-id]', firstOverflowName).
trigger('keydown', {key: 'ArrowUp', code: 'ArrowUp', bubbles: true});
});
// * Verify overflow menu closed (transitioned to bar)
@@ -814,12 +812,12 @@ describe('Channel Bookmarks', () => {
// # Space to select, ArrowDown to move, Space to confirm
cy.get('#channelBookmarksBarMenuDropdown').within(() => {
cy.contains('[data-bookmark-id]', firstName).focus()
.trigger('keydown', {key: ' ', code: 'Space', bubbles: true});
cy.contains('[data-bookmark-id]', firstName)
.trigger('keydown', {key: 'ArrowDown', code: 'ArrowDown', bubbles: true});
cy.contains('[data-bookmark-id]', firstName)
.trigger('keydown', {key: ' ', code: 'Space', bubbles: true});
cy.contains('[data-bookmark-id]', firstName).focus().
trigger('keydown', {key: ' ', code: 'Space', bubbles: true});
cy.contains('[data-bookmark-id]', firstName).
trigger('keydown', {key: 'ArrowDown', code: 'ArrowDown', bubbles: true});
cy.contains('[data-bookmark-id]', firstName).
trigger('keydown', {key: ' ', code: 'Space', bubbles: true});
});
// * Verify we did NOT navigate (URL unchanged, no new tab)
@@ -896,8 +894,8 @@ describe('Channel Bookmarks', () => {
// # Press Enter on "Open" menu item — the keydown + ButtonBase synthetic click
// used to fire onClick twice. handledRef guard ensures single dispatch.
cy.findByRole('menuitem', {name: 'Open'}).should('exist').focus()
.trigger('keydown', {key: 'Enter', code: 'Enter', bubbles: true});
cy.findByRole('menuitem', {name: 'Open'}).should('exist').focus().
trigger('keydown', {key: 'Enter', code: 'Enter', bubbles: true});
// * Verify window.open called exactly once (no Menu.Item double-fire)
cy.get('@windowOpen').should('have.been.calledOnce');
@@ -1125,8 +1123,8 @@ function dismissMenu() {
* mode. force:true bypasses the visibility check.
*/
function clickOverflowDotMenu(item: Cypress.Chainable) {
item.scrollIntoView()
.find('.channelBookmarksDotMenuButton--overflow').click({force: true});
item.scrollIntoView().
find('.channelBookmarksDotMenuButton--overflow').click({force: true});
}
/**
@@ -10,9 +10,9 @@
// Stage: @prod
// Group: @channels @channel @rhs @channel_info
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import {stubClipboard} from '@/utils';
@@ -1,9 +1,9 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
const {generateRandomUser} = require('../../../support/api/user');
@@ -144,7 +144,6 @@ describe('Channel members RHS', () => {
cy.uiCloseRHS();
for (let i = 0; i < 20; i++) {
cy.apiCreateUser().then(({user: newUser}) => {
cy.apiAddUserToTeam(testTeam.id, newUser.id).then(() => {
cy.apiAddUserToChannel(channel.id, newUser.id);
@@ -291,7 +290,6 @@ describe('Channel members RHS', () => {
cy.apiCreateChannel(testTeam.id, 'big-search-test-channel', 'Big Search Test Channel', 'O').then(({channel}) => {
// # create 100 random users
for (let i = 0; i < 100; i++) {
cy.apiCreateUser().then(({user: newUser}) => {
cy.apiAddUserToTeam(testTeam.id, newUser.id).then(() => {
cy.apiAddUserToChannel(channel.id, newUser.id);
@@ -10,9 +10,9 @@
// Stage: @prod
// Group: @channels @channel
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import * as TIMEOUTS from '@/fixtures/timeouts';
@@ -10,9 +10,9 @@
// Stage: @prod
// Group: @channels @channel @not_cloud
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import * as TIMEOUTS from '@/fixtures/timeouts';
@@ -1,8 +1,8 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
// ***************************************************************
// - [#] indicates a test step (e.g. # Go to a page)
@@ -10,9 +10,9 @@
// Stage: @prod
// Group: @channels @channel @channel_settings @permissions
import {Team} from '@mattermost/types/teams';
import {Channel} from '@mattermost/types/channels';
import {UserProfile} from '@mattermost/types/users';
import type {Team} from '@mattermost/types/teams';
import type {Channel} from '@mattermost/types/channels';
import type {UserProfile} from '@mattermost/types/users';
describe('Channel Settings Menu Permissions', () => {
let testTeam: Team;
@@ -10,9 +10,9 @@
// Stage: @prod
// Group: @channels @channel @channel_settings
import {Team} from '@mattermost/types/teams';
import {Channel} from '@mattermost/types/channels';
import {UserProfile} from '@mattermost/types/users';
import type {Team} from '@mattermost/types/teams';
import type {Channel} from '@mattermost/types/channels';
import type {UserProfile} from '@mattermost/types/users';
describe('Channel Settings Modal', () => {
let testTeam: Team;
@@ -10,7 +10,7 @@
// Stage: @prod
// Group: @channels @channel @channel_settings
import {Team} from '@mattermost/types/teams';
import type {Team} from '@mattermost/types/teams';
import {
beMuted,
@@ -1,8 +1,8 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
// ***************************************************************
// - [#] indicates a test step (e.g. # Go to a page)
@@ -1,11 +1,11 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import {ChainableT} from '@/types';
import type {ChainableT} from '@/types';
// ***************************************************************
// - [#] indicates a test step (e.g. # Go to a page)
@@ -1,9 +1,9 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import {getAdminAccount} from '@/support/env';
@@ -1,9 +1,9 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {Channel} from '@mattermost/types/channels';
import {Team, TeamMembership} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team, TeamMembership} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
// ***************************************************************
// - [#] indicates a test step (e.g. # Go to a page)
@@ -10,9 +10,9 @@
// Stage: @prod
// Group: @channels @channel
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import * as TIMEOUTS from '@/fixtures/timeouts';
@@ -9,7 +9,7 @@
// Group: @channels @channel
import {UserProfile} from '@mattermost/types/users';
import type {UserProfile} from '@mattermost/types/users';
import {getAdminAccount} from '@/support/env';
@@ -11,7 +11,7 @@
// Group: @channels @channel_settings
// node run_tests.js --group='@channel_settings'
import {ChannelType} from '@mattermost/types/channels';
import type {ChannelType} from '@mattermost/types/channels';
import * as TIMEOUTS from '@/fixtures/timeouts';
import {getRandomId} from '@/utils';
@@ -15,7 +15,6 @@ import {clickCategoryMenuItem} from './helpers';
import {getAdminAccount} from '@/support/env';
import {getRandomId} from '@/utils';
describe('Category muting', () => {
let testTeam: Cypress.Team;
let testUser: Cypress.UserProfile;
@@ -15,7 +15,6 @@ import {clickSortCategoryMenuItem} from './helpers';
import * as TIMEOUTS from '@/fixtures/timeouts';
import {getRandomId} from '@/utils';
let testTeam: Cypress.Team;
let testUser: Cypress.UserProfile;
@@ -15,7 +15,6 @@ import {clickCategoryMenuItem} from './helpers';
import * as TIMEOUTS from '@/fixtures/timeouts';
import {getRandomId} from '@/utils';
describe('Channel sidebar', () => {
before(() => {
// # Login as test user and visit town-square
@@ -5,7 +5,6 @@ import {clickCategoryMenuItem} from './helpers';
import * as TIMEOUTS from '@/fixtures/timeouts';
// ***************************************************************
// - [#] indicates a test step (e.g. # Go to a page)
// - [*] indicates an assertion (e.g. * Check the title)
@@ -9,10 +9,10 @@
// Group: @channels @collapsed_reply_threads
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import {PostMessageResp} from '@/support/task_commands';
import type {PostMessageResp} from '@/support/task_commands';
import {spyNotificationAs} from '@/support/notification';
describe('CRT Desktop notifications', () => {
@@ -1,7 +1,7 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {Team} from '@mattermost/types/teams';
import type {Team} from '@mattermost/types/teams';
// ***************************************************************
// - [#] indicates a test step (e.g. # Go to a page)
@@ -10,9 +10,9 @@
// Stage: @prod
// Group: @channels @collapsed_reply_threads @not_cloud
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import {interceptFileUpload} from '../files_and_attachments/helpers';
@@ -10,15 +10,14 @@
// Stage: @prod
// Group: @channels @collapsed_reply_threads
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import {waitUntilUploadComplete, interceptFileUpload} from '../files_and_attachments/helpers';
import * as MESSAGES from '@/fixtures/messages';
describe('Collapsed Reply Threads', () => {
let testTeam: Team;
let testChannel: Channel;
@@ -9,13 +9,13 @@
// Group: @channels @collapsed_reply_threads
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import * as TIMEOUTS from '@/fixtures/timeouts';
import {isMac} from '@/utils';
import {ChainableT} from '@/types';
import type {ChainableT} from '@/types';
describe('Collapsed Reply Threads', () => {
let testTeam: Team;
@@ -9,11 +9,11 @@
// Group: @channels @collapsed_reply_threads
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import {PostMessageResp} from '@/support/task_commands';
import type {PostMessageResp} from '@/support/task_commands';
describe('Collapsed Reply Threads', () => {
let testTeam: Team;
@@ -1,9 +1,9 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import * as TIMEOUTS from '@/fixtures/timeouts';
@@ -1,8 +1,8 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
// ***************************************************************
// - [#] indicates a test step (e.g. # Go to a page)
@@ -10,11 +10,11 @@
// Stage: @prod
// Group: @channels @collapsed_reply_threads
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import {PostMessageResp} from '@/support/task_commands';
import type {PostMessageResp} from '@/support/task_commands';
import * as TIMEOUTS from '@/fixtures/timeouts';
describe('Collapsed Reply Threads', () => {
@@ -9,9 +9,9 @@
// Group: @channels @collapsed_reply_threads
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import * as TIMEOUTS from '@/fixtures/timeouts';
@@ -13,7 +13,6 @@ import {getCustomEmoji, verifyLastPostedEmoji} from './helpers';
import * as TIMEOUTS from '@/fixtures/timeouts';
describe('Custom emojis', () => {
let testTeam: Cypress.Team;
let testUser: Cypress.UserProfile;
@@ -14,7 +14,6 @@ import {getCustomEmoji} from './helpers';
import * as TIMEOUTS from '@/fixtures/timeouts';
describe('Custom emojis', () => {
let testTeam: Cypress.Team;
let testUser: Cypress.UserProfile;
@@ -13,7 +13,6 @@ import {getCustomEmoji, verifyLastPostedEmoji} from './helpers';
import * as TIMEOUTS from '@/fixtures/timeouts';
describe('Custom emojis', () => {
let testTeam: Cypress.Team;
let testUser: Cypress.UserProfile;
@@ -14,7 +14,6 @@ import {getCustomEmoji} from './helpers';
import * as TIMEOUTS from '@/fixtures/timeouts';
describe('Custom emojis', () => {
let testTeam: Cypress.Team;
let testUser: Cypress.UserProfile;
@@ -17,8 +17,6 @@ import {getCustomEmoji} from './helpers';
import * as TIMEOUTS from '@/fixtures/timeouts';
import * as MESSAGES from '@/fixtures/messages';
describe('Custom emojis', () => {
let testTeam: Cypress.Team;
let testUser: Cypress.UserProfile;
@@ -15,7 +15,6 @@ import {getCustomEmoji} from './helpers';
import * as TIMEOUTS from '@/fixtures/timeouts';
import * as MESSAGES from '@/fixtures/messages';
describe('Recent Emoji', () => {
const largeEmojiFile = 'gif-image-file.gif';
@@ -10,8 +10,8 @@
// Stage: @prod
// Group: @channels @enterprise @accessibility
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import * as TIMEOUTS from '@/fixtures/timeouts';
@@ -9,9 +9,9 @@
// Group: @channels @enterprise @accessibility
import {Channel} from '@mattermost/types/channels';
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import * as TIMEOUTS from '@/fixtures/timeouts';
@@ -10,7 +10,7 @@
// Stage: @prod
// Group: @channels @enterprise @system_console @authentication
import {Team} from '@mattermost/types/teams';
import type {Team} from '@mattermost/types/teams';
import * as TIMEOUTS from '@/fixtures/timeouts';
import {getRandomId, newTestPassword} from '@/utils';
@@ -9,7 +9,7 @@
// Group: @channels @enterprise @system_console @authentication @mfa
import {UserProfile} from '@mattermost/types/users';
import type {UserProfile} from '@mattermost/types/users';
import * as authenticator from 'authenticator';
import * as TIMEOUTS from '@/fixtures/timeouts';
@@ -10,8 +10,8 @@
// Stage: @prod
// Group: @channels @enterprise @elasticsearch @autocomplete @not_cloud
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import {
createPrivateChannel,
@@ -22,7 +22,6 @@ import {
import {getAdminAccount} from '@/support/env';
describe('Autocomplete with Elasticsearch - Channel', () => {
let testTeam: Team;
let testUser: UserProfile;
@@ -10,7 +10,7 @@
// Stage: @prod
// Group: @channels @enterprise @elasticsearch @autocomplete @not_cloud
import {Channel} from '@mattermost/types/channels';
import type {Channel} from '@mattermost/types/channels';
import {
enableElasticSearch,
@@ -1,14 +1,14 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {Channel} from '@mattermost/types/channels';
import type {Channel} from '@mattermost/types/channels';
import {SimpleUser} from '../../autocomplete/helpers';
import type {SimpleUser} from '../../autocomplete/helpers';
import * as TIMEOUTS from '@/fixtures/timeouts';
import {getAdminAccount} from '@/support/env';
import {newTestPassword} from '@/utils';
import {ChainableT} from '@/types';
import type {ChainableT} from '@/types';
const admin = getAdminAccount();
@@ -10,8 +10,8 @@
// Stage: @prod
// Group: @channels @enterprise @elasticsearch @autocomplete @not_cloud
import {Channel} from '@mattermost/types/channels';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {UserProfile} from '@mattermost/types/users';
import {
enableElasticSearch,
@@ -21,7 +21,6 @@ import {
import {getRandomId} from '@/utils';
describe('Autocomplete with Elasticsearch - Renaming', () => {
let testUser: UserProfile;
let testChannel: Channel;
@@ -10,8 +10,8 @@
// Stage: @prod
// Group: @channels @enterprise @elasticsearch @autocomplete @not_cloud
import {Channel} from '@mattermost/types/channels';
import {UserProfile} from '@mattermost/types/users';
import type {Channel} from '@mattermost/types/channels';
import type {UserProfile} from '@mattermost/types/users';
import {
enableElasticSearch,
@@ -21,7 +21,6 @@ import {
import {getRandomId} from '@/utils';
describe('Autocomplete with Elasticsearch - Renaming Team', () => {
const randomId = getRandomId();
let testUser: UserProfile;
@@ -11,7 +11,8 @@
// Group: @channels @enterprise @elasticsearch @autocomplete @not_cloud
import {doTestQuickChannelSwitcher} from '../../autocomplete/common_test';
import {createSearchData, SimpleUser} from '../../autocomplete/helpers';
import type {SimpleUser} from '../../autocomplete/helpers';
import {createSearchData} from '../../autocomplete/helpers';
import {enableElasticSearch} from './helpers';
@@ -11,7 +11,8 @@
// Group: @channels @enterprise @elasticsearch @autocomplete @not_cloud
import {doTestPostextbox} from '../../autocomplete/common_test';
import {createSearchData, SimpleUser} from '../../autocomplete/helpers';
import type {SimpleUser} from '../../autocomplete/helpers';
import {createSearchData} from '../../autocomplete/helpers';
import {enableElasticSearch} from './helpers';
@@ -10,10 +10,11 @@
// Stage: @prod
// Group: @channels @enterprise @elasticsearch @autocomplete @not_cloud
import {Team} from '@mattermost/types/teams';
import type {Team} from '@mattermost/types/teams';
import {doTestDMChannelSidebar, doTestUserChannelSection} from '../../autocomplete/common_test';
import {createSearchData, SimpleUser} from '../../autocomplete/helpers';
import type {SimpleUser} from '../../autocomplete/helpers';
import {createSearchData} from '../../autocomplete/helpers';
import {enableElasticSearch} from './helpers';
@@ -9,7 +9,7 @@
// Group: @channels @enterprise @not_cloud @extend_session
import {UserProfile} from '@mattermost/types/users';
import type {UserProfile} from '@mattermost/types/users';
import {verifyExtendedSession, verifyNotExtendedSession} from './helpers';
@@ -9,13 +9,12 @@
// Group: @channels @enterprise @not_cloud @extend_session @ldap
import {UserProfile} from '@mattermost/types/users';
import type {UserProfile} from '@mattermost/types/users';
import {verifyExtendedSession, verifyNotExtendedSession} from './helpers';
import ldapUsers from '@/fixtures/ldap_users.json';
describe('Extended Session Length', () => {
const sessionLengthInHours = 1;
const setting = {
@@ -14,14 +14,13 @@
// Group: @channels @enterprise @not_cloud @extend_session @ldap @saml @keycloak
import {UserProfile} from '@mattermost/types/users';
import type {UserProfile} from '@mattermost/types/users';
import {verifyExtendedSession, verifyNotExtendedSession} from './helpers';
import {LdapUser} from '@/support/ldap_server_commands';
import type {LdapUser} from '@/support/ldap_server_commands';
import {getKeycloakServerSettings} from '@/utils/config';
describe('Extended Session Length', () => {
const sessionLengthInDays = 1;
const samlConfig = getKeycloakServerSettings();
@@ -9,9 +9,9 @@
// Group: @channels @enterprise @system_console @group_mentions
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import {Group} from '@mattermost/types/groups';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import type {Group} from '@mattermost/types/groups';
import {
disablePermission,
@@ -23,8 +23,6 @@ import {enableGroupMention} from './helpers';
import ldapUsers from '@/fixtures/ldap_users.json';
import * as TIMEOUTS from '@/fixtures/timeouts';
describe('Group Mentions', () => {
let groupID: string;
let boardUser: Cypress.UserProfile;
@@ -9,16 +9,15 @@
// Group: @channels @enterprise @system_console @group_mentions
import {UserProfile} from '@mattermost/types/users';
import {Team} from '@mattermost/types/teams';
import {Group} from '@mattermost/types/groups';
import type {UserProfile} from '@mattermost/types/users';
import type {Team} from '@mattermost/types/teams';
import type {Group} from '@mattermost/types/groups';
import {enableGroupMention} from './helpers';
import ldapUsers from '@/fixtures/ldap_users.json';
import * as TIMEOUTS from '@/fixtures/timeouts';
describe('Group Mentions', () => {
let groupID1: string;
let groupID2: string;
@@ -9,10 +9,9 @@
// Group: @channels @enterprise @system_console @group_mentions
import {Team} from '@mattermost/types/teams';
import {UserProfile} from '@mattermost/types/users';
import {Group} from '@mattermost/types/groups';
import type {Team} from '@mattermost/types/teams';
import type {UserProfile} from '@mattermost/types/users';
import type {Group} from '@mattermost/types/groups';
import {
disablePermission,
@@ -18,7 +18,6 @@ import {createPrivateChannel} from '../elasticsearch_autocomplete/helpers';
import * as TIMEOUTS from '@/fixtures/timeouts';
describe('Guest Account - Guest User Experience', () => {
let guestUser: Cypress.UserProfile;
let privateChannel: Cypress.Channel;
@@ -14,7 +14,7 @@
*/
import authenticator from 'authenticator';
import {UserProfile} from '@mattermost/types/users';
import type {UserProfile} from '@mattermost/types/users';
import * as TIMEOUTS from '@/fixtures/timeouts';
import {
@@ -15,7 +15,7 @@
* (email retrieval), so it is restricted to non-cloud editions.
*/
import {UserProfile} from '@mattermost/types/users';
import type {UserProfile} from '@mattermost/types/users';
import {
changeGuestFeatureSettings,
@@ -22,7 +22,6 @@ import {
import {getRandomId} from '@/utils';
describe('Guest Account - Guest User Invitation Flow', () => {
let testTeam: Cypress.Team;
let newUser: Cypress.UserProfile;
@@ -14,7 +14,6 @@ import {verifyGuest} from './helpers';
import * as TIMEOUTS from '@/fixtures/timeouts';
describe('Guest Account - Verify Manage Guest Users', () => {
let guestUser: Cypress.UserProfile;
let testTeam: Cypress.Team;

Some files were not shown because too many files have changed in this diff Show More