playwright-slack-report 1.1.24 → 1.1.54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,6 +11,7 @@ Publish your Playwright test results to your favorite Slack channel(s).
11
11
  ## 🚀 Features
12
12
 
13
13
  - 💌 Send results your Playwright test results to one or more Slack channels
14
+ - 🎚️ Leverage JSON results created by Playwright and seamlessly post them on Slack
14
15
  - 📊 Conditionally send results to Slack channels based on test results
15
16
  - 📄 Include additional meta information into your test summary e.g. Branch, BuildId etc
16
17
  - 🧑‍🎨 Define your own custom Slack message layout!
@@ -70,7 +71,7 @@ You will most likely need to have Slack administrator rights to perform the step
70
71
  ### Note II:
71
72
  Sending failure details in a thread is not supported when using webhooks. You will need to use Option B below.
72
73
 
73
- # Option B
74
+ # Option B - send your results via a Slack bot user
74
75
  Run your tests by providing your `SLACK_BOT_USER_OAUTH_TOKEN` as an environment variable or specifying `slackOAuthToken` option in the config:
75
76
 
76
77
  `SLACK_BOT_USER_OAUTH_TOKEN=[your Slack bot user OAUTH token] npx playwright test`
@@ -122,6 +123,53 @@ The final step will be to copy the generated Bot User OAuth Token aka `SLACK_BOT
122
123
  </details>
123
124
 
124
125
  ---
126
+ # Option C - send your JSON results via CLI
127
+
128
+ Playwright now provides a nice way to [merge multiple reports from multiple shards](https://playwright.dev/docs/test-sharding#merging-reports-from-multiple-shards). You can use this feature to generate a single JSON report and then send it to Slack, alleviating the need to have separate messages sent per shard:
129
+
130
+
131
+ `npx playwright merge-reports --reporter json ./all-blob-reports`
132
+
133
+ ^ It is important that you set the `--reporter` to `json` otherwise the report will not be generated in the correct format.
134
+
135
+ Next, you will need to configure the cli. See example below:
136
+
137
+ *cli_config.json:*
138
+
139
+ ```json
140
+ {
141
+ "sendResults": "always",
142
+ "slackLogLevel": "error",
143
+ "sendUsingBot": {
144
+ "channels": ["demo"]
145
+ },
146
+ "showInThread": true,
147
+ "meta": [
148
+ { "key": "build", "value" : "1.0.0"},
149
+ { "key": "branch", "value" : "master"},
150
+ { "key": "commit", "value" : "1234567890"},
151
+ { "key": "results", "value" : "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"}
152
+ ],
153
+ "maxNumberOfFailures": 4,
154
+ "disableUnfurl": true
155
+ }
156
+
157
+ The config file also supports the follow extra options for using a proxy and sending results via a webhook:
158
+
159
+
160
+ ```json
161
+ ...
162
+ "proxy": "http://proxy.mycompany.com:8080",
163
+ "sendUsingWebhook": {
164
+ "webhookUrl": "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX"
165
+ },
166
+ ...
167
+ ```
168
+
169
+ Once you have generated the JSON report and defined your config file, you can send it to Slack using the following command:
170
+
171
+ `SLACK_BOT_USER_OAUTH_TOKEN=[your Slack bot user OAUTH token] npx playwright-slack-report -c cli_config.json -j ./merged_tests_results.json`
172
+
125
173
 
126
174
  # ⚙️ Configuration
127
175
 
@@ -179,8 +227,6 @@ A function that returns a layout object, this configuration is optional. See se
179
227
  Same as **layout** above, but asynchronous in that it returns a promise.
180
228
  ### **maxNumberOfFailuresToShow**
181
229
  Limits the number of failures shown in the Slack message, defaults to 10.
182
- ### **separateFlaky**
183
- Don't consider flaky tests as passed, instead output them separately. Flaky tests are tests that passed but not on the first try. This defaults to `false` but it is highly recommended that you switch this on.
184
230
  ### **slackOAuthToken**
185
231
  Instead of providing an environment variable `SLACK_BOT_USER_OAUTH_TOKEN` you can specify the token in the config in the `slackOAuthToken` field.
186
232
  ### **slackLogLevel** (default LogLevel.DEBUG)
package/dist/cli.js ADDED
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ /* eslint-disable no-console */
8
+ const commander_1 = require("commander");
9
+ const web_api_1 = require("@slack/web-api");
10
+ const https_proxy_agent_1 = require("https-proxy-agent");
11
+ const webhook_1 = require("@slack/webhook");
12
+ const ResultsParser_1 = __importDefault(require("./src/ResultsParser"));
13
+ const SlackClient_1 = __importDefault(require("./src/SlackClient"));
14
+ const cli_pre_checks_1 = __importDefault(require("./src/cli/cli_pre_checks"));
15
+ const SlackWebhookClient_1 = __importDefault(require("./src/SlackWebhookClient"));
16
+ const program = new commander_1.Command();
17
+ program
18
+ .name('playwright-slack-report - cli')
19
+ .version('1.0.0')
20
+ .description('📦 Send Playwright json results to directly Slack ')
21
+ .option('-c, --config <path>', 'Configuration file for the CLI app e.g ./config.json')
22
+ .option('-j, --json-results <path>', 'Generated Playwright json results file e.g. ./results.json')
23
+ .action(async (options) => {
24
+ const preCheckResult = await (0, cli_pre_checks_1.default)(options.jsonResults, options.config);
25
+ const config = preCheckResult.config;
26
+ if (preCheckResult.status === 'error') {
27
+ console.error(`❌ ${preCheckResult.message}`);
28
+ process.exit(1);
29
+ }
30
+ const agent = config.proxy ? new https_proxy_agent_1.HttpsProxyAgent(config.proxy) : undefined;
31
+ const resultsParser = new ResultsParser_1.default();
32
+ const resultSummary = await resultsParser.parseFromJsonFile(preCheckResult.jsonPath);
33
+ if (config.sendUsingBot) {
34
+ const slackClient = new SlackClient_1.default(new web_api_1.WebClient(process.env.SLACK_BOT_USER_OAUTH_TOKEN, {
35
+ logLevel: config.slackLogLevel,
36
+ agent,
37
+ }));
38
+ const success = await sendResultsUsingBot({
39
+ resultSummary,
40
+ slackClient,
41
+ config,
42
+ });
43
+ if (!success) {
44
+ console.error('❌ Failed to send results to Slack');
45
+ process.exit(1);
46
+ }
47
+ else {
48
+ console.log('✅ Results sent to Slack');
49
+ process.exit(0);
50
+ }
51
+ }
52
+ if (config.sendUsingWebhook) {
53
+ const webhook = new webhook_1.IncomingWebhook(config.sendUsingWebhook.webhookUrl, {
54
+ agent,
55
+ });
56
+ const slackWebhookClient = new SlackWebhookClient_1.default(webhook);
57
+ const webhookResult = await slackWebhookClient.sendMessage({
58
+ customLayout: undefined,
59
+ customLayoutAsync: undefined,
60
+ maxNumberOfFailures: config.maxNumberOfFailures,
61
+ disableUnfurl: config.disableUnfurl,
62
+ summaryResults: resultSummary,
63
+ });
64
+ // eslint-disable-next-line no-console
65
+ console.log(JSON.stringify(webhookResult, null, 2));
66
+ console.log('✅ Results sent to Slack');
67
+ process.exit(0);
68
+ }
69
+ });
70
+ program.parse();
71
+ async function sendResultsUsingBot({ resultSummary, slackClient, config, }) {
72
+ if (config.slackLogLevel === web_api_1.LogLevel.DEBUG) {
73
+ console.log({ config });
74
+ }
75
+ if (resultSummary.failures.length === 0
76
+ && config.sendResults === 'on-failure') {
77
+ console.log('⏩ Slack CLI reporter - no failures found');
78
+ return true;
79
+ }
80
+ let summaryResults = resultSummary;
81
+ summaryResults = { ...resultSummary, meta: config.meta };
82
+ if (config.sendUsingBot) {
83
+ const result = await slackClient.sendMessage({
84
+ options: {
85
+ channelIds: config.sendUsingBot.channels,
86
+ customLayout: undefined,
87
+ customLayoutAsync: undefined,
88
+ maxNumberOfFailures: config.maxNumberOfFailures,
89
+ disableUnfurl: config.disableUnfurl,
90
+ summaryResults,
91
+ showInThread: config.showInThread,
92
+ },
93
+ });
94
+ if (config.showInThread && resultSummary.failures.length > 0) {
95
+ for (let i = 0; i < result.length; i += 1) {
96
+ // eslint-disable-next-line no-await-in-loop
97
+ await slackClient.attachDetailsToThread({
98
+ channelIds: [result[i].channel],
99
+ ts: result[i].ts,
100
+ summaryResults: resultSummary,
101
+ maxNumberOfFailures: config.maxNumberOfFailures,
102
+ });
103
+ }
104
+ }
105
+ if (result.filter((r) => !r.outcome.includes('✅ Message sent to')).length
106
+ !== 0) {
107
+ return false;
108
+ }
109
+ return true;
110
+ }
111
+ throw new Error('sendUsingBot config is not set');
112
+ }
113
+ //# sourceMappingURL=cli.js.map
@@ -2,4 +2,5 @@ import { KnownBlock, Block } from '@slack/types';
2
2
  import { SummaryResults } from '.';
3
3
  declare const generateBlocks: (summaryResults: SummaryResults, maxNumberOfFailures: number) => Promise<Array<KnownBlock | Block>>;
4
4
  declare const generateFailures: (summaryResults: SummaryResults, maxNumberOfFailures: number) => Promise<Array<KnownBlock | Block>>;
5
- export { generateBlocks, generateFailures };
5
+ declare const generateFallbackText: (summaryResults: SummaryResults) => string;
6
+ export { generateBlocks, generateFailures, generateFallbackText };
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateFailures = exports.generateBlocks = void 0;
3
+ exports.generateFallbackText = exports.generateFailures = exports.generateBlocks = void 0;
4
4
  const generateBlocks = async (summaryResults, maxNumberOfFailures) => {
5
5
  const meta = [];
6
6
  const header = {
@@ -72,3 +72,6 @@ const generateFailures = async (summaryResults, maxNumberOfFailures) => {
72
72
  ];
73
73
  };
74
74
  exports.generateFailures = generateFailures;
75
+ const generateFallbackText = (summaryResults) => `✅ ${summaryResults.passed} ❌ ${summaryResults.failed} ${summaryResults.flaky !== undefined ? ` 🟡 ${summaryResults.flaky} ` : ' '}⏩ ${summaryResults.skipped}`;
76
+ exports.generateFallbackText = generateFallbackText;
77
+ //# sourceMappingURL=LayoutGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LayoutGenerator.js","sourceRoot":"","sources":["../../src/LayoutGenerator.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  /// <reference types="node" />
2
- import { failure, flaky, pass, SummaryResults } from '.';
3
- export declare type testResult = {
2
+ import { TestCase } from '@playwright/test/reporter';
3
+ import { failure, Spec, SummaryResults } from '.';
4
+ export type testResult = {
4
5
  suiteName: string;
5
6
  name: string;
6
7
  browser?: string;
@@ -18,7 +19,7 @@ export declare type testResult = {
18
19
  path: string;
19
20
  }[];
20
21
  };
21
- export declare type testSuite = {
22
+ export type testSuite = {
22
23
  testSuite: {
23
24
  title: string;
24
25
  tests: testResult[];
@@ -27,18 +28,24 @@ export declare type testSuite = {
27
28
  };
28
29
  export default class ResultsParser {
29
30
  private result;
30
- private separateFlakyTests;
31
- constructor(options?: {
32
- separateFlakyTests: boolean;
33
- });
34
- getParsedResults(): Promise<SummaryResults>;
31
+ constructor();
32
+ parseFromJsonFile(filePath: string): Promise<SummaryResults>;
33
+ parseTestSuite(suites: any, retries: number, suiteIndex?: number): Promise<void>;
34
+ parseTests(suiteName: any, specs: any, retries: number): Promise<testResult[]>;
35
+ getFailure(snippet: string, stack: string): string;
36
+ getParsedResults(allTests: Array<TestCase>): Promise<SummaryResults>;
35
37
  getFailures(): Promise<Array<failure>>;
36
- getFlakes(): Promise<Array<flaky>>;
37
- getPasses(): Promise<Array<pass>>;
38
38
  static getTestName(failedTest: any): any;
39
39
  updateResults(data: {
40
40
  testSuite: any;
41
41
  }): void;
42
+ addTestResultFromJson({ suiteName, spec, testCase, projectBrowserMapping, retries, }: {
43
+ suiteName: any;
44
+ spec: Spec;
45
+ testCase: any;
46
+ projectBrowserMapping: any;
47
+ retries: number;
48
+ }): void;
42
49
  addTestResult(suiteName: any, testCase: any, projectBrowserMapping: any): void;
43
50
  safelyDetermineFailure(result: {
44
51
  errors: any[];
@@ -55,7 +62,4 @@ export default class ResultsParser {
55
62
  projectName: string;
56
63
  browser: string;
57
64
  };
58
- /** removes tests from the passed array that only passed on a retry (flaky).
59
- * Does not modify param passed, returns a new passed array. */
60
- doSeparateFlakyTests(passes: Array<pass>, flakes: Array<flaky>): pass[];
61
65
  }
@@ -5,37 +5,133 @@
5
5
  /* eslint-disable no-control-regex */
6
6
  /* eslint-disable class-methods-use-this */
7
7
  /* eslint-disable no-param-reassign */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || function (mod) {
25
+ if (mod && mod.__esModule) return mod;
26
+ var result = {};
27
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
+ __setModuleDefault(result, mod);
29
+ return result;
30
+ };
8
31
  Object.defineProperty(exports, "__esModule", { value: true });
32
+ const fs = __importStar(require("fs"));
9
33
  class ResultsParser {
10
34
  result;
11
- separateFlakyTests;
12
- constructor(options = { separateFlakyTests: false }) {
35
+ constructor() {
13
36
  this.result = [];
14
- this.separateFlakyTests = options.separateFlakyTests;
15
37
  }
16
- async getParsedResults() {
38
+ async parseFromJsonFile(filePath) {
39
+ const data = fs.readFileSync(filePath, 'utf-8');
40
+ const parsedData = JSON.parse(data);
41
+ const { retries } = parsedData.config.projects[0];
42
+ await this.parseTestSuite(parsedData.suites, retries);
17
43
  const failures = await this.getFailures();
18
- const flakes = await this.getFlakes();
19
- let passes = await this.getPasses();
20
- if (this.separateFlakyTests) {
21
- passes = this.doSeparateFlakyTests(passes, flakes);
22
- }
23
44
  const summary = {
24
- passed: passes.length,
25
- failed: failures.length,
26
- flaky: this.separateFlakyTests ? flakes.length : undefined,
27
- skipped: 0,
45
+ passed: parsedData.stats.expected,
46
+ failed: parsedData.stats.unexpected,
47
+ flaky: parsedData.stats.flaky,
48
+ skipped: parsedData.stats.skipped,
28
49
  failures,
29
50
  tests: [],
30
51
  };
31
52
  for (const suite of this.result) {
32
53
  summary.tests = summary.tests.concat(suite.testSuite.tests);
33
- for (const test of suite.testSuite.tests) {
34
- if (test.status === 'skipped') {
35
- summary.skipped += 1;
54
+ }
55
+ // console.log('🚀~ summary:', JSON.stringify(summary, null, 2));
56
+ return summary;
57
+ }
58
+ async parseTestSuite(suites, retries, suiteIndex = 0) {
59
+ let testResults = [];
60
+ if (suites[0].suites?.length > 0) {
61
+ testResults = await this.parseTests(suites[0].title, suites[0].specs, retries);
62
+ this.updateResults({
63
+ testSuite: {
64
+ title: suites[0].title,
65
+ tests: testResults,
66
+ },
67
+ });
68
+ await this.parseTestSuite(suites[suiteIndex].suites, retries, (suiteIndex += 1));
69
+ }
70
+ else {
71
+ testResults = await this.parseTests(suites[0].title, suites[0].specs, retries);
72
+ this.updateResults({
73
+ testSuite: {
74
+ title: suites[0].title,
75
+ tests: testResults,
76
+ },
77
+ });
78
+ // eslint-disable-next-line no-useless-return
79
+ return;
80
+ }
81
+ }
82
+ async parseTests(suiteName, specs, retries) {
83
+ const testResults = [];
84
+ for (const spec of specs) {
85
+ for (const test of spec.tests) {
86
+ for (const result of test.results) {
87
+ testResults.push({
88
+ suiteName,
89
+ name: spec.title,
90
+ status: result.status === 'unexpected' ? 'failed' : result.status,
91
+ browser: test.projectName,
92
+ projectName: test.projectName,
93
+ retry: result.retry,
94
+ retries,
95
+ startedAt: result.startTime,
96
+ endedAt: new Date(new Date(result.startTime).getTime() + result.duration).toISOString(),
97
+ reason: result.error
98
+ ? this.getFailure(result.error.snippet, result.error.stack)
99
+ : '',
100
+ attachments: result.attachments,
101
+ });
36
102
  }
37
103
  }
38
104
  }
105
+ return testResults;
106
+ }
107
+ getFailure(snippet, stack) {
108
+ const fullError = `${snippet}\r\n${stack || ''}`;
109
+ return this.cleanseReason(fullError);
110
+ }
111
+ async getParsedResults(allTests) {
112
+ const failures = await this.getFailures();
113
+ // use Playwright recommended way of extracting test stats:
114
+ // https://github.com/microsoft/playwright/issues/27498#issuecomment-1766766335
115
+ const stats = {
116
+ expected: 0,
117
+ skipped: 0,
118
+ unexpected: 0,
119
+ flaky: 0,
120
+ };
121
+ // eslint-disable-next-line no-plusplus
122
+ for (const test of allTests)
123
+ ++stats[test.outcome()];
124
+ const summary = {
125
+ passed: stats.expected,
126
+ failed: stats.unexpected,
127
+ flaky: stats.flaky,
128
+ skipped: stats.skipped,
129
+ failures,
130
+ tests: [],
131
+ };
132
+ for (const suite of this.result) {
133
+ summary.tests = summary.tests.concat(suite.testSuite.tests);
134
+ }
39
135
  return summary;
40
136
  }
41
137
  async getFailures() {
@@ -55,33 +151,6 @@ class ResultsParser {
55
151
  }
56
152
  return failures;
57
153
  }
58
- async getFlakes() {
59
- const flaky = [];
60
- for (const suite of this.result) {
61
- for (const test of suite.testSuite.tests) {
62
- if (test.status === 'passed' && test.retry > 0) {
63
- flaky.push({
64
- test: ResultsParser.getTestName(test),
65
- retry: test.retry,
66
- });
67
- }
68
- }
69
- }
70
- return flaky;
71
- }
72
- async getPasses() {
73
- const passes = [];
74
- for (const suite of this.result) {
75
- for (const test of suite.testSuite.tests) {
76
- if (test.status === 'passed') {
77
- passes.push({
78
- test: ResultsParser.getTestName(test),
79
- });
80
- }
81
- }
82
- }
83
- return passes;
84
- }
85
154
  static getTestName(failedTest) {
86
155
  const testName = failedTest.name;
87
156
  if (failedTest.browser && failedTest.projectName) {
@@ -97,6 +166,31 @@ class ResultsParser {
97
166
  this.result.push(data);
98
167
  }
99
168
  }
169
+ addTestResultFromJson({ suiteName, spec, testCase, projectBrowserMapping, retries, }) {
170
+ const testResults = [];
171
+ const projectSettings = this.determineBrowser(projectBrowserMapping[0].projectName, projectBrowserMapping);
172
+ for (const result of testCase.results) {
173
+ testResults.push({
174
+ suiteName,
175
+ name: spec.title,
176
+ status: result.status,
177
+ browser: projectSettings.browser,
178
+ projectName: projectSettings.projectName,
179
+ retry: result.retry,
180
+ retries,
181
+ startedAt: new Date(result.startTime).toISOString(),
182
+ endedAt: new Date(new Date(result.startTime).getTime() + result.duration).toISOString(),
183
+ reason: this.safelyDetermineFailure(result),
184
+ attachments: result.attachments,
185
+ });
186
+ }
187
+ this.updateResults({
188
+ testSuite: {
189
+ title: suiteName,
190
+ tests: testResults,
191
+ },
192
+ });
193
+ }
100
194
  addTestResult(suiteName, testCase, projectBrowserMapping) {
101
195
  const testResults = [];
102
196
  const projectSettings = this.determineBrowser(testCase._projectId, projectBrowserMapping);
@@ -154,17 +248,6 @@ class ResultsParser {
154
248
  browser: '',
155
249
  };
156
250
  }
157
- /** removes tests from the passed array that only passed on a retry (flaky).
158
- * Does not modify param passed, returns a new passed array. */
159
- doSeparateFlakyTests(passes, flakes) {
160
- const _passes = new Map();
161
- for (const pass of passes) {
162
- _passes.set(pass.test, pass);
163
- }
164
- for (const flake of flakes) {
165
- _passes.delete(flake.test);
166
- }
167
- return [..._passes.values()];
168
- }
169
251
  }
170
252
  exports.default = ResultsParser;
253
+ //# sourceMappingURL=ResultsParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResultsParser.js","sourceRoot":"","sources":["../../src/ResultsParser.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { WebClient, KnownBlock, Block, ChatPostMessageResponse, LogLevel } from '@slack/web-api';
2
2
  import { SummaryResults } from '.';
3
- export declare type additionalInfo = Array<{
3
+ export type additionalInfo = Array<{
4
4
  key: string;
5
5
  value: string;
6
6
  }>;
@@ -33,5 +33,5 @@ export default class SlackClient {
33
33
  disableUnfurl?: boolean;
34
34
  fakeRequest?: Function;
35
35
  }): Promise<any[]>;
36
- static doPostRequest(slackWebClient: WebClient, channel: string, blocks: Array<KnownBlock | Block>, unfurl: boolean, threadTimestamp?: string): Promise<ChatPostMessageResponse>;
36
+ static doPostRequest(slackWebClient: WebClient, channel: string, fallbackText: string, blocks: Array<KnownBlock | Block>, unfurl: boolean, threadTimestamp?: string): Promise<ChatPostMessageResponse>;
37
37
  }
@@ -25,6 +25,7 @@ class SlackClient {
25
25
  if (!options.channelIds) {
26
26
  throw new Error(`Channel ids [${options.channelIds}] is not valid`);
27
27
  }
28
+ const fallbackText = (0, LayoutGenerator_1.generateFallbackText)(options.summaryResults);
28
29
  const result = [];
29
30
  const unfurl = !options.disableUnfurl;
30
31
  for (const channel of options.channelIds) {
@@ -36,7 +37,7 @@ class SlackClient {
36
37
  }
37
38
  else {
38
39
  // send request for reals
39
- chatResponse = await SlackClient.doPostRequest(this.slackWebClient, channel, blocks, unfurl);
40
+ chatResponse = await SlackClient.doPostRequest(this.slackWebClient, channel, fallbackText, blocks, unfurl);
40
41
  }
41
42
  if (chatResponse.ok) {
42
43
  result.push({
@@ -66,6 +67,7 @@ class SlackClient {
66
67
  async attachDetailsToThread({ channelIds, ts, summaryResults, maxNumberOfFailures, disableUnfurl, fakeRequest, }) {
67
68
  const result = [];
68
69
  const blocks = await (0, LayoutGenerator_1.generateFailures)(summaryResults, maxNumberOfFailures);
70
+ const fallbackText = (0, LayoutGenerator_1.generateFallbackText)(summaryResults);
69
71
  for (const channel of channelIds) {
70
72
  // under test
71
73
  let chatResponse;
@@ -73,7 +75,7 @@ class SlackClient {
73
75
  chatResponse = await fakeRequest();
74
76
  }
75
77
  else {
76
- chatResponse = await SlackClient.doPostRequest(this.slackWebClient, channel, blocks, disableUnfurl, ts);
78
+ chatResponse = await SlackClient.doPostRequest(this.slackWebClient, channel, fallbackText, blocks, disableUnfurl, ts);
77
79
  }
78
80
  if (chatResponse.ok) {
79
81
  // eslint-disable-next-line no-console
@@ -87,10 +89,10 @@ class SlackClient {
87
89
  }
88
90
  return result;
89
91
  }
90
- static async doPostRequest(slackWebClient, channel, blocks, unfurl, threadTimestamp) {
92
+ static async doPostRequest(slackWebClient, channel, fallbackText, blocks, unfurl, threadTimestamp) {
91
93
  const chatResponse = await slackWebClient.chat.postMessage({
92
94
  channel,
93
- text: ' ',
95
+ text: fallbackText,
94
96
  unfurl_link: unfurl,
95
97
  blocks,
96
98
  thread_ts: threadTimestamp,
@@ -99,3 +101,4 @@ class SlackClient {
99
101
  }
100
102
  }
101
103
  exports.default = SlackClient;
104
+ //# sourceMappingURL=SlackClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlackClient.js","sourceRoot":"","sources":["../../src/SlackClient.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,6 @@ declare class SlackReporter implements Reporter {
15
15
  private proxy;
16
16
  private browsers;
17
17
  private suite;
18
- private separateFlaky;
19
18
  logs: string[];
20
19
  onBegin(fullConfig: FullConfig, suite: Suite): void;
21
20
  onTestEnd(test: TestCase, result: TestResult): void;