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 2s
Server CI Nightly Race / Build Environment (push) Failing after 1s
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
This commit is contained in:
36
e2e-tests/cypress/tests/plugins/client_request.js
Normal file
36
e2e-tests/cypress/tests/plugins/client_request.js
Normal file
@@ -0,0 +1,36 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
const axios = require('axios');
|
||||
|
||||
module.exports = async ({data = {}, headers, method = 'get', url}) => {
|
||||
let response;
|
||||
|
||||
try {
|
||||
response = await axios({
|
||||
data,
|
||||
headers,
|
||||
method,
|
||||
url,
|
||||
});
|
||||
} catch (error) {
|
||||
// If we have a response for the error, pull out the relevant parts
|
||||
if (error.response) {
|
||||
response = {
|
||||
status: error.response.status,
|
||||
statusText: error.response.statusText,
|
||||
data: error.response.data,
|
||||
};
|
||||
} else {
|
||||
// If we get here something else went wrong, so throw
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
data: response.data,
|
||||
headers: response.headers,
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
};
|
||||
};
|
||||
139
e2e-tests/cypress/tests/plugins/db_request.js
Normal file
139
e2e-tests/cypress/tests/plugins/db_request.js
Normal file
@@ -0,0 +1,139 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
const mapKeys = require('lodash.mapkeys');
|
||||
|
||||
function convertKeysToLowercase(obj) {
|
||||
return mapKeys(obj, (_, k) => {
|
||||
return k.toLowerCase();
|
||||
});
|
||||
}
|
||||
|
||||
function getKnexClient({client, connection}) {
|
||||
return require('knex')({client, connection});
|
||||
}
|
||||
|
||||
// Reuse DB client connection
|
||||
let knexClient;
|
||||
|
||||
const dbGetActiveUserSessions = async ({dbConfig, params: {username, userId, limit}}) => {
|
||||
if (!knexClient) {
|
||||
knexClient = getKnexClient(dbConfig);
|
||||
}
|
||||
|
||||
const maxLimit = 50;
|
||||
|
||||
try {
|
||||
let user;
|
||||
if (username) {
|
||||
user = await knexClient('users').where('username', username).first();
|
||||
user = convertKeysToLowercase(user);
|
||||
}
|
||||
|
||||
const now = Date.now();
|
||||
const sessions = await knexClient('sessions').
|
||||
where('userid', user ? user.id : userId).
|
||||
where('expiresat', '>', now).
|
||||
orderBy('lastactivityat', 'desc').
|
||||
limit(limit && limit <= maxLimit ? limit : maxLimit);
|
||||
|
||||
return {
|
||||
user,
|
||||
sessions: sessions.map((session) => convertKeysToLowercase(session)),
|
||||
};
|
||||
} catch (error) {
|
||||
const errorMessage = 'Failed to get active user sessions from the database.';
|
||||
return {error, errorMessage};
|
||||
}
|
||||
};
|
||||
|
||||
const dbGetUser = async ({dbConfig, params: {username}}) => {
|
||||
if (!knexClient) {
|
||||
knexClient = getKnexClient(dbConfig);
|
||||
}
|
||||
|
||||
try {
|
||||
const user = await knexClient('users').where('username', username).first();
|
||||
|
||||
return {user: convertKeysToLowercase(user)};
|
||||
} catch (error) {
|
||||
const errorMessage = 'Failed to get a user from the database.';
|
||||
return {error, errorMessage};
|
||||
}
|
||||
};
|
||||
|
||||
const dbGetUserSession = async ({dbConfig, params: {sessionId}}) => {
|
||||
if (!knexClient) {
|
||||
knexClient = getKnexClient(dbConfig);
|
||||
}
|
||||
|
||||
try {
|
||||
const session = await knexClient('sessions').
|
||||
where('id', '=', sessionId).
|
||||
first();
|
||||
|
||||
return {session: convertKeysToLowercase(session)};
|
||||
} catch (error) {
|
||||
const errorMessage = 'Failed to get a user session from the database.';
|
||||
return {error, errorMessage};
|
||||
}
|
||||
};
|
||||
|
||||
const dbUpdateUserSession = async ({dbConfig, params: {sessionId, userId, fieldsToUpdate = {}}}) => {
|
||||
if (!knexClient) {
|
||||
knexClient = getKnexClient(dbConfig);
|
||||
}
|
||||
|
||||
try {
|
||||
let user = await knexClient('users').where('id', userId).first();
|
||||
if (!user) {
|
||||
return {errorMessage: `No user found with id: ${userId}.`};
|
||||
}
|
||||
|
||||
delete fieldsToUpdate.id;
|
||||
delete fieldsToUpdate.userid;
|
||||
|
||||
user = convertKeysToLowercase(user);
|
||||
|
||||
await knexClient('sessions').
|
||||
where('id', '=', sessionId).
|
||||
where('userid', '=', user.id).
|
||||
update(fieldsToUpdate);
|
||||
|
||||
const session = await knexClient('sessions').
|
||||
where('id', '=', sessionId).
|
||||
where('userid', '=', user.id).
|
||||
first();
|
||||
|
||||
return {session: convertKeysToLowercase(session)};
|
||||
} catch (error) {
|
||||
const errorMessage = 'Failed to update a user session from the database.';
|
||||
return {error, errorMessage};
|
||||
}
|
||||
};
|
||||
|
||||
const dbRefreshPostStats = async ({dbConfig}) => {
|
||||
if (!knexClient) {
|
||||
knexClient = getKnexClient(dbConfig);
|
||||
}
|
||||
|
||||
try {
|
||||
await knexClient.raw('REFRESH MATERIALIZED VIEW posts_by_team_day;');
|
||||
await knexClient.raw('REFRESH MATERIALIZED VIEW bot_posts_by_team_day;');
|
||||
|
||||
return {
|
||||
success: true,
|
||||
};
|
||||
} catch (error) {
|
||||
const errorMessage = 'Failed to refresh post statistics materialized views.';
|
||||
return {error, errorMessage};
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
dbGetActiveUserSessions,
|
||||
dbGetUser,
|
||||
dbGetUserSession,
|
||||
dbUpdateUserSession,
|
||||
dbRefreshPostStats,
|
||||
};
|
||||
83
e2e-tests/cypress/tests/plugins/external_request.ts
Normal file
83
e2e-tests/cypress/tests/plugins/external_request.ts
Normal file
@@ -0,0 +1,83 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
import type {AxiosError} from 'axios';
|
||||
import axios from 'axios';
|
||||
|
||||
import * as timeouts from '../fixtures/timeouts';
|
||||
|
||||
export interface ExternalRequestUser {
|
||||
username: string;
|
||||
password: string;
|
||||
}
|
||||
interface ExternalRequestArg {
|
||||
baseUrl: string;
|
||||
user: ExternalRequestUser;
|
||||
method: 'get' | 'post' | 'put' | 'delete' | 'patch';
|
||||
path: string;
|
||||
data: any;
|
||||
}
|
||||
type ExternalRequestResult = {status: number; statusText: string; data: any; isError?: boolean} | {data: {id: string; isTimeout: boolean}; status?: undefined; statusText?: undefined; isError?: undefined};
|
||||
export default async function externalRequest(arg: ExternalRequestArg): Promise<ExternalRequestResult> {
|
||||
const {baseUrl, user, method = 'get', path, data = {}} = arg;
|
||||
const loginUrl = `${baseUrl}/api/v4/users/login`;
|
||||
|
||||
// First we need to login with our external user to get cookies/tokens
|
||||
let cookieString = '';
|
||||
try {
|
||||
const response = await axios({
|
||||
url: loginUrl,
|
||||
headers: {'X-Requested-With': 'XMLHttpRequest'},
|
||||
method: 'post',
|
||||
timeout: timeouts.TEN_SEC,
|
||||
data: {login_id: user.username, password: user.password},
|
||||
});
|
||||
|
||||
const setCookie = response.headers['set-cookie'];
|
||||
(setCookie as any).forEach((cookie: string) => {
|
||||
const nameAndValue = cookie.split(';')[0];
|
||||
cookieString += nameAndValue + ';';
|
||||
});
|
||||
} catch (error) {
|
||||
return getErrorResponse(error as AxiosError);
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await axios({
|
||||
method,
|
||||
url: `${baseUrl}/api/v4/${path}`,
|
||||
headers: {
|
||||
'Content-Type': 'text/plain',
|
||||
Cookie: cookieString,
|
||||
'X-Requested-With': 'XMLHttpRequest',
|
||||
},
|
||||
timeout: timeouts.TEN_SEC,
|
||||
data,
|
||||
});
|
||||
|
||||
return {
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
data: response.data,
|
||||
};
|
||||
} catch (error) {
|
||||
// If we have a response for the error, pull out the relevant parts
|
||||
return getErrorResponse(error as AxiosError);
|
||||
}
|
||||
}
|
||||
|
||||
function getErrorResponse(error: AxiosError) {
|
||||
if (error.response) {
|
||||
return {
|
||||
status: error.response.status,
|
||||
statusText: error.response.statusText,
|
||||
data: error.response.data,
|
||||
isError: true,
|
||||
};
|
||||
} else if (error.code === 'ECONNABORTED') {
|
||||
return {data: {id: error.code, isTimeout: true}};
|
||||
}
|
||||
|
||||
// If we get here something else went wrong, so throw
|
||||
throw error;
|
||||
}
|
||||
38
e2e-tests/cypress/tests/plugins/file_util.js
Normal file
38
e2e-tests/cypress/tests/plugins/file_util.js
Normal file
@@ -0,0 +1,38 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
/**
|
||||
* Checks whether a file exist in the fixtures folder
|
||||
* @param {string} filename - filename to check if it exists
|
||||
*/
|
||||
const fileExist = (filename) => {
|
||||
const filePath = path.resolve(__dirname, `../fixtures/${filename}`);
|
||||
|
||||
return fs.existsSync(filePath);
|
||||
};
|
||||
|
||||
/**
|
||||
* Write data to a file in the fixtures folder
|
||||
* @param {string} filename - filename where to write data into
|
||||
* @param {string} fixturesFolder - folder at tests/fixtures
|
||||
* @param {string} data - The data to write
|
||||
*/
|
||||
const writeToFile = ({filename, fixturesFolder, data = ''}) => {
|
||||
const folder = path.resolve(__dirname, `../fixtures/${fixturesFolder}`);
|
||||
if (!fs.existsSync(folder)) {
|
||||
fs.mkdirSync(folder, {recursive: true});
|
||||
}
|
||||
|
||||
const filePath = `${folder}/${filename}`;
|
||||
|
||||
fs.writeFileSync(filePath, data);
|
||||
return null;
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
fileExist,
|
||||
writeToFile,
|
||||
};
|
||||
22
e2e-tests/cypress/tests/plugins/get_pdf_content.js
Normal file
22
e2e-tests/cypress/tests/plugins/get_pdf_content.js
Normal file
@@ -0,0 +1,22 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
const fs = require('fs');
|
||||
|
||||
const {PDFParse} = require('pdf-parse');
|
||||
|
||||
/**
|
||||
* Checks whether a file exist in the tests/downloads folder and return the content of it.
|
||||
* @param {string} filePath - pdf file path
|
||||
*/
|
||||
module.exports = async (filePath) => {
|
||||
const dataBuffer = fs.readFileSync(filePath);
|
||||
const parser = new PDFParse({data: dataBuffer});
|
||||
try {
|
||||
const text = await parser.getText();
|
||||
const info = await parser.getInfo();
|
||||
return {text, info, numpages: info.numPages};
|
||||
} finally {
|
||||
await parser.destroy();
|
||||
}
|
||||
};
|
||||
32
e2e-tests/cypress/tests/plugins/get_recent_email.js
Normal file
32
e2e-tests/cypress/tests/plugins/get_recent_email.js
Normal file
@@ -0,0 +1,32 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
const axios = require('axios');
|
||||
|
||||
module.exports = async ({username, mailUrl}) => {
|
||||
const mailboxUrl = `${mailUrl}/${username}`;
|
||||
let response;
|
||||
let recentEmail;
|
||||
|
||||
try {
|
||||
response = await axios({url: mailboxUrl, method: 'get'});
|
||||
recentEmail = response.data[response.data.length - 1];
|
||||
} catch (error) {
|
||||
return {status: error.status, data: null};
|
||||
}
|
||||
|
||||
if (!recentEmail || !recentEmail.id) {
|
||||
return {status: 501, data: null};
|
||||
}
|
||||
|
||||
let recentEmailMessage;
|
||||
const mailMessageUrl = `${mailboxUrl}/${recentEmail.id}`;
|
||||
try {
|
||||
response = await axios({url: mailMessageUrl, method: 'get'});
|
||||
recentEmailMessage = response.data;
|
||||
} catch (error) {
|
||||
return {status: error.status, data: null};
|
||||
}
|
||||
|
||||
return {status: response.status, data: recentEmailMessage};
|
||||
};
|
||||
94
e2e-tests/cypress/tests/plugins/index.js
Normal file
94
e2e-tests/cypress/tests/plugins/index.js
Normal file
@@ -0,0 +1,94 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
/* eslint-disable no-console */
|
||||
|
||||
const fs = require('fs');
|
||||
|
||||
const clientRequest = require('./client_request');
|
||||
const {
|
||||
dbGetActiveUserSessions,
|
||||
dbGetUser,
|
||||
dbGetUserSession,
|
||||
dbUpdateUserSession,
|
||||
dbRefreshPostStats,
|
||||
} = require('./db_request');
|
||||
const externalRequest = require('./external_request').default;
|
||||
const {fileExist, writeToFile} = require('./file_util');
|
||||
const getPdfContent = require('./get_pdf_content');
|
||||
const getRecentEmail = require('./get_recent_email');
|
||||
const keycloakRequest = require('./keycloak_request');
|
||||
const oktaRequest = require('./okta_request');
|
||||
const postBotMessage = require('./post_bot_message');
|
||||
const postIncomingWebhook = require('./post_incoming_webhook');
|
||||
const postMessageAs = require('./post_message_as');
|
||||
const postListOfMessages = require('./post_list_of_messages');
|
||||
const reactToMessageAs = require('./react_to_message_as');
|
||||
const {
|
||||
shellFind,
|
||||
shellRm,
|
||||
shellUnzip,
|
||||
} = require('./shell');
|
||||
const urlHealthCheck = require('./url_health_check');
|
||||
|
||||
const log = (message) => {
|
||||
console.log(message);
|
||||
return null;
|
||||
};
|
||||
|
||||
module.exports = (on, config) => {
|
||||
on('task', {
|
||||
clientRequest,
|
||||
dbGetActiveUserSessions,
|
||||
dbGetUser,
|
||||
dbGetUserSession,
|
||||
dbUpdateUserSession,
|
||||
dbRefreshPostStats,
|
||||
externalRequest,
|
||||
fileExist,
|
||||
writeToFile,
|
||||
getPdfContent,
|
||||
getRecentEmail,
|
||||
keycloakRequest,
|
||||
log,
|
||||
oktaRequest,
|
||||
postBotMessage,
|
||||
postIncomingWebhook,
|
||||
postMessageAs,
|
||||
postListOfMessages,
|
||||
urlHealthCheck,
|
||||
reactToMessageAs,
|
||||
shellFind,
|
||||
shellRm,
|
||||
shellUnzip,
|
||||
});
|
||||
|
||||
on('before:browser:launch', (browser = {}, launchOptions) => {
|
||||
if (browser.name === 'chrome' && !config.chromeWebSecurity) {
|
||||
launchOptions.args.push('--disable-features=CrossSiteDocumentBlockingIfIsolating,CrossSiteDocumentBlockingAlways,IsolateOrigins,site-per-process');
|
||||
launchOptions.args.push('--load-extension=tests/extensions/Ignore-X-Frame-headers');
|
||||
}
|
||||
|
||||
if (browser.family === 'chromium' && browser.name !== 'electron') {
|
||||
launchOptions.args.push('--disable-dev-shm-usage');
|
||||
}
|
||||
|
||||
return launchOptions;
|
||||
});
|
||||
|
||||
// https://docs.cypress.io/guides/guides/screenshots-and-videos#Delete-videos-for-specs-without-failing-or-retried-tests
|
||||
on('after:spec', (spec, results) => {
|
||||
if (results && results.video) {
|
||||
// Do we have failures for any retry attempts?
|
||||
const failures = results.tests.some((test) =>
|
||||
test.attempts.some((attempt) => attempt.state === 'failed'),
|
||||
);
|
||||
if (!failures) {
|
||||
// delete the video if the spec passed and no tests retried
|
||||
fs.unlinkSync(results.video);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return config;
|
||||
};
|
||||
36
e2e-tests/cypress/tests/plugins/keycloak_request.js
Normal file
36
e2e-tests/cypress/tests/plugins/keycloak_request.js
Normal file
@@ -0,0 +1,36 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
const axios = require('axios');
|
||||
|
||||
module.exports = async ({baseUrl, headers = [], method = 'get', path = '', data = {}}) => {
|
||||
let response;
|
||||
try {
|
||||
response = await axios({
|
||||
method,
|
||||
url: `${baseUrl}/${path}`,
|
||||
headers,
|
||||
data,
|
||||
});
|
||||
|
||||
return {
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
data: response.data,
|
||||
};
|
||||
} catch (error) {
|
||||
// If we have a response for the error, pull out the relevant parts
|
||||
if (error.response) {
|
||||
response = {
|
||||
status: error.response.status,
|
||||
statusText: error.response.statusText,
|
||||
data: error.response.data,
|
||||
};
|
||||
} else {
|
||||
// If we get here something else went wrong, so throw
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
return response;
|
||||
};
|
||||
40
e2e-tests/cypress/tests/plugins/okta_request.js
Normal file
40
e2e-tests/cypress/tests/plugins/okta_request.js
Normal file
@@ -0,0 +1,40 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
const axios = require('axios');
|
||||
|
||||
module.exports = async ({baseUrl, urlSuffix, method = 'get', token, data = {}}) => {
|
||||
let response;
|
||||
|
||||
try {
|
||||
response = await axios({
|
||||
url: baseUrl + urlSuffix,
|
||||
headers: {
|
||||
'X-Requested-With': 'XMLHttpRequest',
|
||||
Authorization: token,
|
||||
},
|
||||
method,
|
||||
data,
|
||||
});
|
||||
|
||||
return {
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
data: response.data,
|
||||
};
|
||||
} catch (error) {
|
||||
// If we have a response for the error, pull out the relevant parts
|
||||
if (error.response) {
|
||||
response = {
|
||||
status: error.response.status,
|
||||
statusText: error.response.statusText,
|
||||
data: error.response.data,
|
||||
};
|
||||
} else {
|
||||
// If we get here something else went wrong, so throw
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
return response;
|
||||
};
|
||||
32
e2e-tests/cypress/tests/plugins/post_bot_message.js
Normal file
32
e2e-tests/cypress/tests/plugins/post_bot_message.js
Normal file
@@ -0,0 +1,32 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
const axios = require('axios');
|
||||
module.exports = async ({token, message, props = {}, channelId, rootId, createAt = 0, baseUrl}) => {
|
||||
let response;
|
||||
try {
|
||||
response = await axios({
|
||||
url: `${baseUrl}/api/v4/posts`,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-Requested-With': 'XMLHttpRequest',
|
||||
Authorization: `Bearer ${token}`,
|
||||
},
|
||||
method: 'post',
|
||||
data: {
|
||||
channel_id: channelId,
|
||||
message,
|
||||
props,
|
||||
type: '',
|
||||
create_at: createAt,
|
||||
root_id: rootId,
|
||||
},
|
||||
});
|
||||
} catch (err) {
|
||||
if (err.response) {
|
||||
response = err.response;
|
||||
}
|
||||
}
|
||||
|
||||
return {status: response.status, data: response.data};
|
||||
};
|
||||
18
e2e-tests/cypress/tests/plugins/post_incoming_webhook.js
Normal file
18
e2e-tests/cypress/tests/plugins/post_incoming_webhook.js
Normal file
@@ -0,0 +1,18 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
const axios = require('axios');
|
||||
|
||||
module.exports = async ({url, data}) => {
|
||||
let response;
|
||||
|
||||
try {
|
||||
response = await axios({method: 'post', url, data});
|
||||
} catch (err) {
|
||||
if (err.response) {
|
||||
response = err.response;
|
||||
}
|
||||
}
|
||||
|
||||
return {status: response.status, data: response.data};
|
||||
};
|
||||
18
e2e-tests/cypress/tests/plugins/post_list_of_messages.js
Normal file
18
e2e-tests/cypress/tests/plugins/post_list_of_messages.js
Normal file
@@ -0,0 +1,18 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
const postMessageAs = require('./post_message_as');
|
||||
|
||||
module.exports = async ({numberOfMessages, ...rest}) => {
|
||||
const results = [];
|
||||
|
||||
for (let i = 0; i < numberOfMessages; i++) {
|
||||
// Parallel posting of the messages (Promise.all) is not handled well by the server
|
||||
// resulting in random failed posts
|
||||
// so we use serial posting
|
||||
|
||||
results.push(await postMessageAs({message: `Message ${i}`, ...rest}));
|
||||
}
|
||||
|
||||
return results;
|
||||
};
|
||||
44
e2e-tests/cypress/tests/plugins/post_message_as.js
Normal file
44
e2e-tests/cypress/tests/plugins/post_message_as.js
Normal file
@@ -0,0 +1,44 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
const axios = require('axios');
|
||||
|
||||
module.exports = async ({sender, message, channelId, rootId, createAt = 0, baseUrl}) => {
|
||||
const loginResponse = await axios({
|
||||
url: `${baseUrl}/api/v4/users/login`,
|
||||
headers: {'X-Requested-With': 'XMLHttpRequest'},
|
||||
method: 'post',
|
||||
data: {login_id: sender.username, password: sender.password},
|
||||
});
|
||||
|
||||
const setCookie = loginResponse.headers['set-cookie'];
|
||||
let cookieString = '';
|
||||
setCookie.forEach((cookie) => {
|
||||
const nameAndValue = cookie.split(';')[0];
|
||||
cookieString += nameAndValue + ';';
|
||||
});
|
||||
|
||||
let response;
|
||||
try {
|
||||
response = await axios({
|
||||
url: `${baseUrl}/api/v4/posts`,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-Requested-With': 'XMLHttpRequest',
|
||||
Cookie: cookieString,
|
||||
},
|
||||
method: 'post',
|
||||
data: {
|
||||
channel_id: channelId,
|
||||
message,
|
||||
type: '',
|
||||
create_at: createAt,
|
||||
root_id: rootId,
|
||||
},
|
||||
});
|
||||
} catch (err) {
|
||||
expect(Boolean(err)).to.equal(false);
|
||||
}
|
||||
|
||||
return {status: response.status, data: response.data};
|
||||
};
|
||||
44
e2e-tests/cypress/tests/plugins/react_to_message_as.js
Normal file
44
e2e-tests/cypress/tests/plugins/react_to_message_as.js
Normal file
@@ -0,0 +1,44 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
const axios = require('axios');
|
||||
|
||||
module.exports = async ({sender, postId, reaction, baseUrl}) => {
|
||||
const loginResponse = await axios({
|
||||
url: `${baseUrl}/api/v4/users/login`,
|
||||
headers: {'X-Requested-With': 'XMLHttpRequest'},
|
||||
method: 'post',
|
||||
data: {login_id: sender.username, password: sender.password},
|
||||
});
|
||||
|
||||
const setCookie = loginResponse.headers['set-cookie'];
|
||||
let cookieString = '';
|
||||
setCookie.forEach((cookie) => {
|
||||
const nameAndValue = cookie.split(';')[0];
|
||||
cookieString += nameAndValue + ';';
|
||||
});
|
||||
|
||||
let response;
|
||||
try {
|
||||
response = await axios({
|
||||
url: `${baseUrl}/api/v4/reactions`,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-Requested-With': 'XMLHttpRequest',
|
||||
Cookie: cookieString,
|
||||
},
|
||||
method: 'post',
|
||||
data: {
|
||||
user_id: sender.id,
|
||||
post_id: postId,
|
||||
emoji_name: reaction,
|
||||
},
|
||||
});
|
||||
} catch (err) {
|
||||
if (err.response) {
|
||||
response = err.response;
|
||||
}
|
||||
}
|
||||
|
||||
return {status: response.status, data: response.data};
|
||||
};
|
||||
30
e2e-tests/cypress/tests/plugins/shell.js
Normal file
30
e2e-tests/cypress/tests/plugins/shell.js
Normal file
@@ -0,0 +1,30 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
const extractZip = require('extract-zip');
|
||||
const shell = require('shelljs');
|
||||
|
||||
const shellFind = ({path, pattern}) => {
|
||||
return shell.find(path).filter((file) => {
|
||||
return file.match(pattern);
|
||||
});
|
||||
};
|
||||
|
||||
const shellRm = ({option, file}) => {
|
||||
return shell.rm(option, file);
|
||||
};
|
||||
|
||||
const shellUnzip = async ({source, target}) => {
|
||||
try {
|
||||
await extractZip(source, {dir: target});
|
||||
return null;
|
||||
} catch (err) {
|
||||
return err;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
shellFind,
|
||||
shellRm,
|
||||
shellUnzip,
|
||||
};
|
||||
14
e2e-tests/cypress/tests/plugins/url_health_check.js
Normal file
14
e2e-tests/cypress/tests/plugins/url_health_check.js
Normal file
@@ -0,0 +1,14 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
const axios = require('axios');
|
||||
|
||||
module.exports = async ({url, method}) => {
|
||||
let response;
|
||||
try {
|
||||
response = await axios({url, method});
|
||||
return {data: response.data, status: response.status, success: true};
|
||||
} catch (err) {
|
||||
return {success: false, errorCode: err.code};
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user