Skip to content

Commit 0f471ae

Browse files
authored
feat: suite metadata for cucumber (#243)
1 parent a5e41b7 commit 0f471ae

17 files changed

+685
-35
lines changed

package-lock.json

+9-9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "testbeats",
3-
"version": "2.1.0",
3+
"version": "2.1.1",
44
"description": "Publish test results to Microsoft Teams, Google Chat, Slack and InfluxDB",
55
"main": "src/index.js",
66
"types": "./src/index.d.ts",
@@ -55,7 +55,7 @@
5555
"pretty-ms": "^7.0.1",
5656
"rosters": "0.0.1",
5757
"sade": "^1.8.1",
58-
"test-results-parser": "0.2.3"
58+
"test-results-parser": "0.2.4"
5959
},
6060
"devDependencies": {
6161
"c8": "^7.12.0",

src/platforms/base.platform.js

+118
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
const { getPercentage, getPrettyDuration } = require('../helpers/helper')
2+
3+
class BasePlatform {
4+
5+
/**
6+
* @param {string|number} text
7+
*/
8+
bold(text) {
9+
throw new Error('Not Implemented');
10+
}
11+
12+
break() {
13+
throw new Error('Not Implemented');
14+
}
15+
16+
/**
17+
*
18+
* @param {import('..').Target} target
19+
* @param {import('test-results-parser').ITestSuite} suite
20+
*/
21+
getSuiteSummaryText(target, suite) {
22+
const suite_title = this.getSuiteTitle(suite);
23+
const suite_results_text = this.#getSuiteResultsText(suite);
24+
const duration_text = this.#getSuiteDurationText(target, suite);
25+
26+
const texts = [
27+
this.bold(suite_title),
28+
this.break(),
29+
this.break(),
30+
suite_results_text,
31+
this.break(),
32+
duration_text,
33+
];
34+
35+
const metadata_text = this.getSuiteMetaDataText(suite);
36+
37+
if (metadata_text) {
38+
texts.push(this.break());
39+
texts.push(this.break());
40+
texts.push(metadata_text);
41+
}
42+
43+
return texts.join('');
44+
}
45+
46+
/**
47+
*
48+
* @param {import('test-results-parser').ITestSuite} suite
49+
* @returns {string}
50+
*/
51+
getSuiteTitle(suite) {
52+
const emoji = suite.status === 'PASS' ? '✅' : suite.total === suite.skipped ? '⏭️' : '❌';
53+
return `${emoji} ${suite.name}`;
54+
}
55+
56+
/**
57+
*
58+
* @param {import('test-results-parser').ITestSuite} suite
59+
* @returns {string}
60+
*/
61+
#getSuiteResultsText(suite) {
62+
const suite_results = this.getSuiteResults(suite);
63+
return `${this.bold('Results')}: ${suite_results}`;
64+
}
65+
66+
/**
67+
*
68+
* @param {import('test-results-parser').ITestSuite} suite
69+
* @returns {string}
70+
*/
71+
getSuiteResults(suite) {
72+
return `${suite.passed} / ${suite.total} Passed (${getPercentage(suite.passed, suite.total)}%)`;
73+
}
74+
75+
/**
76+
*
77+
* @param {import('..').Target} target
78+
* @param {import('test-results-parser').ITestSuite} suite
79+
*/
80+
#getSuiteDurationText(target, suite) {
81+
const duration = this.getSuiteDuration(target, suite);
82+
return `${this.bold('Duration')}: ${duration}`
83+
}
84+
85+
/**
86+
*
87+
* @param {import('..').Target} target
88+
* @param {import('test-results-parser').ITestSuite} suite
89+
*/
90+
getSuiteDuration(target, suite) {
91+
return getPrettyDuration(suite.duration, target.inputs.duration);
92+
}
93+
94+
/**
95+
*
96+
* @param {import('test-results-parser').ITestSuite} suite
97+
* @returns {string}
98+
*/
99+
getSuiteMetaDataText(suite) {
100+
if (!suite || !suite.metadata) {
101+
return;
102+
}
103+
104+
const texts = [];
105+
106+
if (suite.metadata.platform && suite.metadata.platform.name && suite.metadata.platform.version) {
107+
texts.push(`${suite.metadata.platform.name} ${suite.metadata.platform.version}`)
108+
}
109+
110+
if (suite.metadata.browser && suite.metadata.browser.name && suite.metadata.browser.version) {
111+
texts.push(`${suite.metadata.browser.name} ${suite.metadata.browser.version}`)
112+
}
113+
114+
return texts.join(' • ');
115+
}
116+
}
117+
118+
module.exports = { BasePlatform }

src/platforms/chat.platform.js

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
const { BasePlatform } = require("./base.platform");
2+
3+
class ChatPlatform extends BasePlatform {
4+
5+
/**
6+
* @param {string|number} text
7+
*/
8+
bold(text) {
9+
return `<b>${text}</b>`;
10+
}
11+
12+
break() {
13+
return '<br>';
14+
}
15+
16+
}
17+
18+
module.exports = { ChatPlatform }

src/platforms/index.js

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
const { TARGET } = require("../helpers/constants");
2+
const { SlackPlatform } = require('./slack.platform');
3+
const { TeamsPlatform } = require('./teams.platform');
4+
const { ChatPlatform } = require('./chat.platform');
5+
6+
/**
7+
*
8+
* @param {string} name
9+
*/
10+
function getPlatform(name) {
11+
switch (name) {
12+
case TARGET.SLACK:
13+
return new SlackPlatform();
14+
case TARGET.TEAMS:
15+
return new TeamsPlatform();
16+
case TARGET.CHAT:
17+
return new ChatPlatform();
18+
default:
19+
throw new Error('Invalid Platform');
20+
}
21+
}
22+
23+
module.exports = {
24+
getPlatform
25+
}

src/platforms/slack.platform.js

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
const { BasePlatform } = require("./base.platform");
2+
3+
class SlackPlatform extends BasePlatform {
4+
5+
/**
6+
* @param {string|number} text
7+
*/
8+
bold(text) {
9+
return `*${text}*`;
10+
}
11+
12+
break() {
13+
return '\n';
14+
}
15+
}
16+
17+
module.exports = { SlackPlatform }

src/platforms/teams.platform.js

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
const { BasePlatform } = require("./base.platform");
2+
3+
class TeamsPlatform extends BasePlatform {
4+
/**
5+
* @param {string|number} text
6+
*/
7+
bold(text) {
8+
return `**${text}**`;
9+
}
10+
11+
break() {
12+
return '\n\n';
13+
}
14+
}
15+
16+
module.exports = { TeamsPlatform }

src/targets/chat.js

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
const request = require('phin-retry');
22
const { getTitleText, getResultText, truncate, getPrettyDuration } = require('../helpers/helper');
33
const extension_manager = require('../extensions');
4-
const { HOOK, STATUS } = require('../helpers/constants');
4+
const { HOOK, STATUS, TARGET } = require('../helpers/constants');
55
const PerformanceTestResult = require('performance-results-parser/src/models/PerformanceTestResult');
66
const { getValidMetrics, getMetricValuesText } = require('../helpers/performance');
77
const logger = require('../utils/logger');
8+
const { getPlatform } = require('../platforms');
89

910
async function run({ result, target }) {
1011
setTargetInputs(target);
@@ -100,11 +101,9 @@ function setSuiteBlock({ result, target, payload }) {
100101
}
101102

102103
function getSuiteSummary({ target, suite }) {
103-
const emoji = suite.status === 'PASS' ? '✅' : '❌';
104-
const suite_title = `${emoji} ${suite.name}`;
105-
const result_text = getResultText({ result: suite });
106-
const duration_text = getPrettyDuration(suite.duration, target.inputs.duration);
107-
return `<b>${suite_title}</b><br><br><b>Results</b>: ${result_text}<br><b>Duration</b>: ${duration_text}`;
104+
const platform = getPlatform(TARGET.CHAT);
105+
const text = platform.getSuiteSummaryText(target, suite);
106+
return text;
108107
}
109108

110109
function getFailureDetails(suite) {

src/targets/slack.js

+4-9
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
const request = require('phin-retry');
22
const { getPercentage, truncate, getPrettyDuration } = require('../helpers/helper');
33
const extension_manager = require('../extensions');
4-
const { HOOK, STATUS } = require('../helpers/constants');
4+
const { HOOK, STATUS, TARGET } = require('../helpers/constants');
55
const logger = require('../utils/logger');
66

77
const PerformanceTestResult = require('performance-results-parser/src/models/PerformanceTestResult');
88
const { getValidMetrics, getMetricValuesText } = require('../helpers/performance');
99
const TestResult = require('test-results-parser/src/models/TestResult');
10+
const { getPlatform } = require('../platforms');
1011

1112

1213

@@ -109,9 +110,8 @@ function setSuiteBlock({ result, target, payload }) {
109110
}
110111

111112
function getSuiteSummary({ target, suite }) {
112-
let text = `*${getSuiteTitle(suite)}*\n`;
113-
text += `\n*Results*: ${getResultText(suite)}`;
114-
text += `\n*Duration*: ${getPrettyDuration(suite.duration, target.inputs.duration)}`;
113+
const platform = getPlatform(TARGET.SLACK);
114+
const text = platform.getSuiteSummaryText(target, suite);
115115
return {
116116
"type": "section",
117117
"text": {
@@ -121,11 +121,6 @@ function getSuiteSummary({ target, suite }) {
121121
};
122122
}
123123

124-
function getSuiteTitle(suite) {
125-
const emoji = suite.status === 'PASS' ? '✅' : suite.total === suite.skipped ? '⏭️' : '❌';
126-
return `${emoji} ${suite.name}`;
127-
}
128-
129124
function getFailureDetails(suite) {
130125
let text = '';
131126
const cases = suite.cases;

0 commit comments

Comments
 (0)