html-reporter
Version:
Html-reporter and GUI for viewing and managing results of a tests run. Currently supports Testplane and Hermione.
145 lines • 6.41 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseTestsTreeBuilder = void 0;
const lodash_1 = __importDefault(require("lodash"));
const common_utils_1 = require("../common-utils");
const constants_1 = require("../constants");
const tree_1 = require("../adapters/test-result/transformers/tree");
class BaseTestsTreeBuilder {
static create(options = {}) {
return new this(options);
}
constructor(options = {}) {
this._transformer = new tree_1.TreeTestResultTransformer(options);
this._tree = {
suites: { byId: {}, allIds: [], allRootIds: [] },
browsers: { byId: {}, allIds: [] },
results: { byId: {}, allIds: [] },
images: { byId: {}, allIds: [] }
};
}
get tree() {
return this._tree;
}
sortTree() {
const sortChildSuites = (suiteId) => {
const childSuite = this._tree.suites.byId[suiteId];
if (childSuite.suiteIds) {
childSuite.suiteIds.sort().forEach(sortChildSuites);
}
if (childSuite.browserIds) {
childSuite.browserIds.sort();
}
};
this._tree.suites.allRootIds.sort().forEach(sortChildSuites);
}
addTestResult(formattedResult) {
const { testPath, browserId: browserName, attempt, imagesInfo = [] } = formattedResult;
const { browserVersion = constants_1.BrowserVersions.UNKNOWN } = formattedResult.meta;
const suiteId = this._buildId(testPath);
const browserId = this._buildId(suiteId, browserName);
const testResultId = this._buildId(browserId, attempt.toString());
const imageIds = imagesInfo
.map((image, i) => this._buildId(testResultId, image.stateName || `${image.status}_${i}`));
this._addSuites(testPath, browserId);
this._addBrowser({ id: browserId, parentId: suiteId, name: browserName, version: browserVersion }, testResultId, attempt);
this._addResult({ id: testResultId, parentId: browserId, result: formattedResult }, imageIds);
this._addImages(imageIds, { imagesInfo, parentId: testResultId });
this._setStatusForBranch(testPath);
}
_buildId(parentId = [], name = []) {
return [].concat(parentId, name).join(constants_1.DEFAULT_TITLE_DELIMITER);
}
_addSuites(testPath, browserId) {
testPath.reduce((suites, name, ind, arr) => {
const isRoot = ind === 0;
const suitePath = isRoot ? [name] : arr.slice(0, ind + 1);
const id = this._buildId(suitePath);
if (!suites.byId[id]) {
const parentId = isRoot ? null : this._buildId(suitePath.slice(0, -1));
const suite = { id, parentId, name, suitePath, root: isRoot };
this._addSuite(suite);
}
if (ind !== arr.length - 1) {
const childSuiteId = this._buildId(id, arr[ind + 1]);
this._addNodeId(id, childSuiteId, { fieldName: 'suiteIds' });
}
else {
this._addNodeId(id, browserId, { fieldName: 'browserIds' });
}
return suites;
}, this._tree.suites);
}
_addSuite(suite) {
const { suites } = this._tree;
suites.byId[suite.id] = suite;
suites.allIds.push(suite.id);
if (suite.root) {
suites.allRootIds.push(suite.id);
}
}
_addNodeId(parentSuiteId, nodeId, { fieldName }) {
const { suites } = this._tree;
if (!suites.byId[parentSuiteId][fieldName]) {
suites.byId[parentSuiteId][fieldName] = [nodeId];
return;
}
if (!this._isNodeIdExists(parentSuiteId, nodeId, { fieldName })) {
suites.byId[parentSuiteId][fieldName]?.push(nodeId);
}
}
_isNodeIdExists(parentSuiteId, nodeId, { fieldName }) {
return lodash_1.default.includes(this._tree.suites.byId[parentSuiteId][fieldName], nodeId);
}
_addBrowser({ id, parentId, name, version }, testResultId, attempt) {
const { browsers } = this._tree;
if (!browsers.byId[id]) {
browsers.byId[id] = { id, parentId, name, resultIds: [], version };
browsers.allIds.push(id);
}
this._addResultIdToBrowser(id, testResultId, attempt);
}
_addResultIdToBrowser(browserId, testResultId, attempt) {
this._tree.browsers.byId[browserId].resultIds[attempt] = testResultId;
}
_addResult({ id, parentId, result }, imageIds) {
const treeResult = this._transformer.transform(result);
if (!this._tree.results.byId[id]) {
this._tree.results.allIds.push(id);
}
this._tree.results.byId[id] = { attempt: 0, id, parentId, ...treeResult, imageIds };
}
_addImages(imageIds, { imagesInfo, parentId }) {
imageIds.forEach((id, ind) => {
this._tree.images.byId[id] = { ...imagesInfo[ind], id, parentId };
this._tree.images.allIds.push(id);
});
}
_setStatusForBranch(testPath = []) {
const suiteId = this._buildId(testPath);
if (!suiteId) {
return;
}
const suite = this._tree.suites.byId[suiteId];
const resultStatuses = lodash_1.default.compact([].concat(suite.browserIds))
.map((browserId) => {
const browser = this._tree.browsers.byId[browserId];
const lastResultId = lodash_1.default.last(browser.resultIds);
return this._tree.results.byId[lastResultId].status;
});
const childrenSuiteStatuses = lodash_1.default.compact([].concat(suite.suiteIds))
.map((childSuiteId) => this._tree.suites.byId[childSuiteId].status);
const status = (0, common_utils_1.determineFinalStatus)(lodash_1.default.compact([...resultStatuses, ...childrenSuiteStatuses]));
// if newly determined status is the same as current status, do nothing
if (suite.status === status) {
return;
}
suite.status = status || undefined;
this._setStatusForBranch(testPath.slice(0, -1));
}
}
exports.BaseTestsTreeBuilder = BaseTestsTreeBuilder;
//# sourceMappingURL=base.js.map