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:
200
e2e-tests/cypress/utils/test_cases.js
Normal file
200
e2e-tests/cypress/utils/test_cases.js
Normal file
@@ -0,0 +1,200 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
/* eslint-disable no-console */
|
||||
|
||||
// See reference: https://support.smartbear.com/tm4j-cloud/api-docs/
|
||||
|
||||
const axios = require('axios');
|
||||
const chalk = require('chalk').default;
|
||||
|
||||
const {getAllTests} = require('./report');
|
||||
|
||||
const status = {
|
||||
passed: 'Pass',
|
||||
failed: 'Fail',
|
||||
pending: 'Pending',
|
||||
skipped: 'Skip',
|
||||
};
|
||||
|
||||
const environment = {
|
||||
chrome: 'Chrome',
|
||||
firefox: 'Firefox',
|
||||
};
|
||||
|
||||
function getStepStateResult(steps = []) {
|
||||
return steps.reduce((acc, item) => {
|
||||
if (acc[item.state]) {
|
||||
acc[item.state] += 1;
|
||||
} else {
|
||||
acc[item.state] = 1;
|
||||
}
|
||||
|
||||
return acc;
|
||||
}, {});
|
||||
}
|
||||
|
||||
function getStepStateSummary(steps = []) {
|
||||
const result = getStepStateResult(steps);
|
||||
|
||||
return Object.entries(result).map(([key, value]) => `${value} ${key}`).join(',');
|
||||
}
|
||||
|
||||
function getTM4JTestCases(report) {
|
||||
return getAllTests(report.results).
|
||||
filter((item) => (/^(MM-T)\w+/g).test(item.title)).
|
||||
map((item) => {
|
||||
return {
|
||||
title: item.title,
|
||||
duration: item.duration,
|
||||
incrementalDuration: item.incrementalDuration,
|
||||
state: item.state,
|
||||
pass: item.pass,
|
||||
fail: item.fail,
|
||||
pending: item.pending,
|
||||
};
|
||||
}).
|
||||
reduce((acc, item) => {
|
||||
// Extract the key to exactly match with "MM-T[0-9]+"
|
||||
const key = item.title.match(/(MM-T\d+)/)[0];
|
||||
|
||||
if (acc[key]) {
|
||||
acc[key].push(item);
|
||||
} else {
|
||||
acc[key] = [item];
|
||||
}
|
||||
|
||||
return acc;
|
||||
}, {});
|
||||
}
|
||||
|
||||
function saveToEndpoint(url, data) {
|
||||
return axios({
|
||||
method: 'POST',
|
||||
url,
|
||||
headers: {
|
||||
'Content-Type': 'application/json; charset=utf-8',
|
||||
Authorization: process.env.TM4J_API_KEY,
|
||||
},
|
||||
data,
|
||||
}).catch((error) => {
|
||||
console.log('Something went wrong:', error.response.data.message);
|
||||
return error.response.data;
|
||||
});
|
||||
}
|
||||
|
||||
async function createTestCycle(startDate, endDate) {
|
||||
const {
|
||||
BRANCH,
|
||||
BUILD_ID,
|
||||
JIRA_PROJECT_KEY,
|
||||
TM4J_CYCLE_NAME,
|
||||
TM4J_FOLDER_ID,
|
||||
} = process.env;
|
||||
|
||||
const testCycle = {
|
||||
projectKey: JIRA_PROJECT_KEY,
|
||||
name: TM4J_CYCLE_NAME ? `${TM4J_CYCLE_NAME} (${BUILD_ID}-${BRANCH})` : `${BUILD_ID}-${BRANCH}`,
|
||||
description: `Cypress automated test with ${BRANCH}`,
|
||||
plannedStartDate: startDate,
|
||||
plannedEndDate: endDate,
|
||||
statusName: 'Done',
|
||||
folderId: TM4J_FOLDER_ID,
|
||||
};
|
||||
|
||||
const response = await saveToEndpoint('https://api.zephyrscale.smartbear.com/v2/testcycles', testCycle);
|
||||
return response.data;
|
||||
}
|
||||
|
||||
async function createTestExecutions(report, testCycle) {
|
||||
const {
|
||||
BROWSER,
|
||||
JIRA_PROJECT_KEY,
|
||||
TM4J_ENVIRONMENT_NAME,
|
||||
} = process.env;
|
||||
|
||||
const testCases = getTM4JTestCases(report);
|
||||
const startDate = new Date(report.stats.start);
|
||||
const startTime = startDate.getTime();
|
||||
|
||||
const promises = [];
|
||||
Object.entries(testCases).forEach(([key, steps], index) => {
|
||||
const testScriptResults = steps.
|
||||
sort((a, b) => a.title.localeCompare(b.title)).
|
||||
map((item) => {
|
||||
return {
|
||||
statusName: status[item.state],
|
||||
actualEndDate: new Date(startTime + item.incrementalDuration).toISOString(),
|
||||
actualResult: 'Cypress automated test completed',
|
||||
};
|
||||
});
|
||||
|
||||
const stateResult = getStepStateResult(steps);
|
||||
|
||||
const testExecution = {
|
||||
projectKey: JIRA_PROJECT_KEY,
|
||||
testCaseKey: key,
|
||||
testCycleKey: testCycle.key,
|
||||
statusName: stateResult.passed && stateResult.passed === steps.length ? 'Pass' : 'Fail',
|
||||
testScriptResults,
|
||||
environmentName: TM4J_ENVIRONMENT_NAME || environment[BROWSER] || 'Chrome',
|
||||
actualEndDate: testScriptResults[testScriptResults.length - 1].actualEndDate,
|
||||
executionTime: steps.reduce((acc, prev) => {
|
||||
return acc + prev.duration;
|
||||
}, 0),
|
||||
comment: `Cypress automated test - ${getStepStateSummary(steps)}`,
|
||||
};
|
||||
|
||||
// Temporarily log to verify cases that were being saved.
|
||||
console.log(index, key);
|
||||
|
||||
promises.push(saveTestExecution(testExecution, index));
|
||||
});
|
||||
|
||||
await Promise.all(promises);
|
||||
console.log('Successfully saved test cases into the Test Management System');
|
||||
}
|
||||
|
||||
const saveTestCases = async (allReport) => {
|
||||
const {start, end} = allReport.stats;
|
||||
|
||||
const testCycle = await createTestCycle(start, end);
|
||||
|
||||
await createTestExecutions(allReport, testCycle);
|
||||
};
|
||||
|
||||
const RETRY = [];
|
||||
|
||||
async function saveTestExecution(testExecution, index) {
|
||||
await axios({
|
||||
method: 'POST',
|
||||
url: 'https://api.zephyrscale.smartbear.com/v2/testexecutions',
|
||||
headers: {
|
||||
'Content-Type': 'application/json; charset=utf-8',
|
||||
Authorization: process.env.TM4J_API_KEY,
|
||||
},
|
||||
data: testExecution,
|
||||
}).then(() => {
|
||||
console.log(chalk.green('Success:', index, testExecution.testCaseKey));
|
||||
}).catch((error) => {
|
||||
// Retry on 500 error code / internal server error
|
||||
if (!error.response || error.response.data.errorCode === 500) {
|
||||
if (RETRY[testExecution.testCaseKey]) {
|
||||
RETRY[testExecution.testCaseKey] += 1;
|
||||
} else {
|
||||
RETRY[testExecution.testCaseKey] = 1;
|
||||
}
|
||||
|
||||
saveTestExecution(testExecution, index);
|
||||
console.log(chalk.magenta('Retry:', index, testExecution.testCaseKey, `(${RETRY[testExecution.testCaseKey]}x)`));
|
||||
} else {
|
||||
console.log(chalk.red('Error:', index, testExecution.testCaseKey, error.response.data.message));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
createTestCycle,
|
||||
saveTestCases,
|
||||
createTestExecutions,
|
||||
};
|
||||
Reference in New Issue
Block a user