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
182 lines
6.9 KiB
TypeScript
182 lines
6.9 KiB
TypeScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
import type {ChainableT} from '../types';
|
|
|
|
const dbClient = Cypress.expose('dbClient');
|
|
const dbConnection = Cypress.expose('dbConnection');
|
|
const dbConfig = {
|
|
client: dbClient,
|
|
connection: dbConnection,
|
|
};
|
|
|
|
const message = `Compare "cypress.json" against "config.json" of mattermost-server. It should match database driver and connection string.
|
|
|
|
The value at "cypress.json" is based on default mattermost-server's local database:
|
|
{"dbClient": "${dbClient}", "dbConnection": "${dbConnection}"}
|
|
|
|
If your server is using database other than the default, you may export those as env variables, like:
|
|
"__CYPRESS_dbClient=[dbClient] CYPRESS_dbConnection=[dbConnection] npm run cypress:open__"
|
|
`;
|
|
|
|
function apiRequireServerDBToMatch(): ChainableT {
|
|
return cy.apiGetConfig().then(({config}) => {
|
|
// On Cloud, SqlSettings is not being returned.
|
|
// With that, checking of server DB will be ignored and will assume it does match with
|
|
// the one being expected by Cypress.
|
|
if (config.SqlSettings && config.SqlSettings.DriverName !== dbClient) {
|
|
expect(config.SqlSettings.DriverName, message).to.equal(dbClient);
|
|
}
|
|
});
|
|
}
|
|
Cypress.Commands.add('apiRequireServerDBToMatch', apiRequireServerDBToMatch);
|
|
|
|
interface GetActiveUserSessionsParam {
|
|
username: string;
|
|
userId?: string;
|
|
limit?: number;
|
|
}
|
|
interface GetActiveUserSessionsResult {
|
|
user: Cypress.UserProfile;
|
|
// DB session records have dynamic fields
|
|
sessions: Array<Record<string, any>>;
|
|
}
|
|
function dbGetActiveUserSessions(params: GetActiveUserSessionsParam): ChainableT<GetActiveUserSessionsResult> {
|
|
// cy.task() returns untyped data
|
|
return cy.task('dbGetActiveUserSessions', {dbConfig, params}).then(({user, sessions, errorMessage}: any) => {
|
|
expect(errorMessage).to.be.undefined;
|
|
|
|
return cy.wrap({user, sessions});
|
|
});
|
|
}
|
|
Cypress.Commands.add('dbGetActiveUserSessions', dbGetActiveUserSessions);
|
|
|
|
interface GetUserParam {
|
|
username: string;
|
|
}
|
|
interface GetUserResult {
|
|
user: Cypress.UserProfile & {mfasecret: string};
|
|
}
|
|
function dbGetUser(params: GetUserParam): ChainableT<GetUserResult> {
|
|
// cy.task() returns untyped data
|
|
return cy.task('dbGetUser', {dbConfig, params}).then(({user, errorMessage, error}: any) => {
|
|
verifyError(error, errorMessage);
|
|
|
|
return cy.wrap({user});
|
|
});
|
|
}
|
|
Cypress.Commands.add('dbGetUser', dbGetUser);
|
|
|
|
interface GetUserSessionParam {
|
|
sessionId: string;
|
|
}
|
|
interface GetUserSessionResult {
|
|
// DB session records have dynamic fields
|
|
session: Record<string, any>;
|
|
}
|
|
function dbGetUserSession(params: GetUserSessionParam): ChainableT<GetUserSessionResult> {
|
|
// cy.task() returns untyped data
|
|
return cy.task('dbGetUserSession', {dbConfig, params}).then(({session, errorMessage}: any) => {
|
|
expect(errorMessage).to.be.undefined;
|
|
|
|
return cy.wrap({session});
|
|
});
|
|
}
|
|
Cypress.Commands.add('dbGetUserSession', dbGetUserSession);
|
|
|
|
interface UpdateUserSessionParam {
|
|
sessionId: string;
|
|
userId: string;
|
|
// DB session fields are dynamic
|
|
fieldsToUpdate: Record<string, any>;
|
|
}
|
|
interface UpdateUserSessionResult {
|
|
// DB session records have dynamic fields
|
|
session: Record<string, any>;
|
|
}
|
|
function dbUpdateUserSession(params: UpdateUserSessionParam): ChainableT<UpdateUserSessionResult> {
|
|
// cy.task() returns untyped data
|
|
return cy.task('dbUpdateUserSession', {dbConfig, params}).then(({session, errorMessage}: any) => {
|
|
expect(errorMessage).to.be.undefined;
|
|
|
|
return cy.wrap({session});
|
|
});
|
|
}
|
|
Cypress.Commands.add('dbUpdateUserSession', dbUpdateUserSession);
|
|
|
|
function dbRefreshPostStats(): ChainableT<{success?: boolean; skipped?: boolean; message?: string}> {
|
|
// cy.task() returns untyped data
|
|
return cy.task('dbRefreshPostStats', {dbConfig}).then(({success, skipped, message, errorMessage, error}: any) => {
|
|
verifyError(error, errorMessage);
|
|
return cy.wrap({success, skipped, message} as {success?: boolean; skipped?: boolean; message?: string});
|
|
}) as ChainableT<{success?: boolean; skipped?: boolean; message?: string}>;
|
|
}
|
|
Cypress.Commands.add('dbRefreshPostStats', dbRefreshPostStats);
|
|
|
|
function verifyError(error: unknown, errorMessage: string) {
|
|
if (errorMessage) {
|
|
expect(errorMessage, `${errorMessage}\n\n${message}\n\n${JSON.stringify(error)}`).to.be.undefined;
|
|
}
|
|
}
|
|
|
|
declare global {
|
|
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
namespace Cypress {
|
|
interface Chainable {
|
|
|
|
/**
|
|
* Gets server config, and assert if it matches with the database connection being used by Cypress
|
|
*
|
|
* @example
|
|
* cy.apiRequireServerDBToMatch();
|
|
*/
|
|
apiRequireServerDBToMatch: typeof apiRequireServerDBToMatch;
|
|
|
|
/**
|
|
* Gets active sessions of a user on a given username or user ID directly from the database
|
|
* @param {String} username
|
|
* @param {String} userId
|
|
* @param {String} limit - maximum number of active sessions to return, e.g. 50 (default)
|
|
* @returns {Object} user - user object
|
|
* @returns {[Object]} sessions - an array of active sessions
|
|
*/
|
|
dbGetActiveUserSessions: typeof dbGetActiveUserSessions;
|
|
|
|
/**
|
|
* Gets user on a given username directly from the database
|
|
* @param {Object} options
|
|
* @param {String} options.username
|
|
* @returns {UserProfile} user - user object
|
|
*/
|
|
dbGetUser: typeof dbGetUser;
|
|
|
|
/**
|
|
* Gets session of a user on a given session ID directly from the database
|
|
* @param {Object} options
|
|
* @param {String} options.sessionId
|
|
* @returns {Session} session
|
|
*/
|
|
dbGetUserSession: typeof dbGetUserSession;
|
|
|
|
/**
|
|
* Updates session of a user on a given user ID and session ID with fields to update directly from the database
|
|
* @param {Object} options
|
|
* @param {String} options.sessionId
|
|
* @param {String} options.userId
|
|
* @param {Object} options.fieldsToUpdate - will update all except session ID and user ID
|
|
* @returns {Session} session
|
|
*/
|
|
dbUpdateUserSession: typeof dbUpdateUserSession;
|
|
|
|
/**
|
|
* Refreshes PostgreSQL materialized views for post statistics
|
|
* @returns {Object} result
|
|
* @returns {boolean} result.success - true if refresh was successful
|
|
* @returns {boolean} result.skipped - true if operation was skipped (non-PostgreSQL)
|
|
* @returns {string} result.message - message when operation is skipped
|
|
*/
|
|
dbRefreshPostStats: typeof dbRefreshPostStats;
|
|
}
|
|
}
|
|
}
|