From 8c702f08e87727c4edbb4a1dfa68cb49c2242b2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81esek?= Date: Wed, 17 Apr 2019 13:36:15 +0200 Subject: [PATCH 01/14] Add emojis and text formatters to utils --- src/index.js | 16 +++++++++------- src/utils/emojis.js | 10 ++++++++++ src/utils/textFormatters.js | 9 +++++++++ 3 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 src/utils/emojis.js create mode 100644 src/utils/textFormatters.js diff --git a/src/index.js b/src/index.js index 96edceb..25cfcd1 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,6 @@ import SlackMessage from './SlackMessage' +import emojis from 'utils/emojis'; +import { bold, italics } from 'utils/textFormatters'; export default function () { return { @@ -10,7 +12,7 @@ export default function () { this.startTime = startTime; this.testCount = testCount; - this.slack.sendMessage(`Starting testcafe ${startTime}. \n Running tests in: ${userAgents}`) + this.slack.sendMessage(`${emojis.rocket} ${bold('Starting TestCafe:')} ${startTime}. \n${emojis.computer} Running tests in: ${bold(userAgents)}`) }, reportFixtureStart (name, path) { @@ -20,9 +22,9 @@ export default function () { reportTestDone (name, testRunInfo) { const hasErr = testRunInfo.errs.length > 0; - const result = hasErr ? ':heavy_multiplication_x:' : ':heavy_check_mark: '; + const result = hasErr ? `${emojis.fire} ` : `${emojis.checkMark} `; - this.slack.addMessage(`${result} ${name}`); + this.slack.addMessage(`${result} ${italics(name)}`); if (hasErr) { this.renderErrors(testRunInfo.errs); @@ -39,12 +41,12 @@ export default function () { const durationMs = endTime - this.startTime; const durationStr = this.moment .duration(durationMs) - .format('h[h] mm[m] ss[s]') + .format('h[h] mm[m] ss[s]'); let footer = passed === this.testCount ? - `${this.testCount} passed` : - `${this.testCount - passed}/${this.testCount} failed`; + `${emojis.checkMark} ${this.testCount} passed` : + `${emojis.noEntry} ${this.testCount - passed}/${this.testCount} failed`; - footer = `\n*${footer}* (Duration: ${durationStr})`; + footer = `\n${bold(footer)} \n${emojis.stopWatch} Duration: ${bold(durationStr)}`; this.slack.addMessage(footer); this.slack.sendTestReport(this.testCount - passed); diff --git a/src/utils/emojis.js b/src/utils/emojis.js new file mode 100644 index 0000000..0987fb2 --- /dev/null +++ b/src/utils/emojis.js @@ -0,0 +1,10 @@ +const emojis = { + rocket: ':rocket:', + computer: ':computer:', + checkMark: ':white_check_mark:', + fire: ':fire:', + noEntry: ':no_entry:', + stopWatch: ':stopwatch:' +}; + +export default emojis; diff --git a/src/utils/textFormatters.js b/src/utils/textFormatters.js new file mode 100644 index 0000000..145e261 --- /dev/null +++ b/src/utils/textFormatters.js @@ -0,0 +1,9 @@ +export const bold = (text) => `*${text}*`; + +export const italics = (text) => `_${text}_`; + +export const strike = (text) => `~${text}~`; + +export const code = (text) => `\`${text}\``; + +export const quote = (text) => `>${text}`; From e1cede18df8413cc6f19661709394b20e51ff245 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81esek?= Date: Thu, 18 Apr 2019 11:55:04 +0200 Subject: [PATCH 02/14] Add logging level, quiet mode, slack emojis and little refactor --- README.md | 16 +++--- lib/SlackMessage.js | 32 ++++++++--- lib/const/LoggingLevels.js | 12 ++++ lib/index.js | 107 ++++++++++++++++++++++++------------ lib/utils/emojis.js | 18 ++++++ lib/utils/textFormatters.js | 29 ++++++++++ package.json | 8 +-- src/SlackMessage.js | 23 ++++++-- src/const/LoggingLevels.js | 6 ++ src/index.js | 60 ++++++++++++++------ src/utils/emojis.js | 4 +- 11 files changed, 235 insertions(+), 80 deletions(-) create mode 100644 lib/const/LoggingLevels.js create mode 100644 lib/utils/emojis.js create mode 100644 lib/utils/textFormatters.js create mode 100644 src/const/LoggingLevels.js diff --git a/README.md b/README.md index 59467cc..7ef714b 100644 --- a/README.md +++ b/README.md @@ -4,30 +4,32 @@ This is a reporter for [TestCafe](http://devexpress.github.io/testcafe). It sends the output of the test to slack. ## Purpose -Once configured the repoter sends test results to Slack depending on a .env file from the folder the tests are run from +Once configured the reporter sends test results to Slack depending on a .env file from the folder the tests are run from ## Setup instructions Follow the instructions bellow to configure this plugin. -First install this package globaly to the machine you would like to run your tests on and then: +First install this package globally to the machine you would like to run your tests or add it as dependency to your project and then: ## Testing -Running TestCafe with testcafe-reporter-slack. +Running TestCafe with `testcafe-reporter-slack`. In order to use this TestCafe reporter plugin it is necessary to define .env variables in your test project, hence the folder from where your call TestCafe. - cd into your test project. - Edit or create the .env file by adding the following ki-reporter required variables: -``` +```dotenv TESTCAFE_SLACK_WEBHOOK=https://hooks.slack.com/services/***** -TESTCAFE_SLACK_CHANNEL='#testcafe' +TESTCAFE_SLACK_CHANNEL="#testcafe" TESTCAFE_SLACK_USERNAME=testcafebot +TESTCAFE_SLACK_LOGGING_LEVEL=TEST +TESTCAFE_SLACK_QUIET_MODE=false ``` -Now run your tests from the commmand line with the ki-reporter specified, e.g.: +Now run your tests from the command line with the ki-reporter specified, e.g.: -``` +```bash $ testcafe chrome 'path/to/test/file.js' --reporter slack ``` diff --git a/lib/SlackMessage.js b/lib/SlackMessage.js index d204909..6ff6c03 100644 --- a/lib/SlackMessage.js +++ b/lib/SlackMessage.js @@ -6,23 +6,37 @@ Object.defineProperty(exports, '__esModule', { var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _constLoggingLevels = require("./const/LoggingLevels"); + +var _constLoggingLevels2 = _interopRequireDefault(_constLoggingLevels); + require('dotenv').config(); var envs = require('envs'); +var quietMode = envs('TESTCAFE_SLACK_QUIET_MODE', false); + var SlackMessage = (function () { - function SlackMessage() { + function SlackMessage(loggingLevel) { _classCallCheck(this, SlackMessage); var slackNode = require('slack-node'); this.slack = new slackNode(); this.slack.setWebhook(envs('TESTCAFE_SLACK_WEBHOOK', 'http://example.com')); + this.loggingLevel = loggingLevel; this.message = []; this.errorMessage = []; } _createClass(SlackMessage, [{ + key: 'getMessage', + value: function getMessage() { + return this.message; + } + }, { key: 'addMessage', value: function addMessage(message) { this.message.push(message); @@ -42,18 +56,20 @@ var SlackMessage = (function () { username: envs('TESTCAFE_SLACK_BOT', 'testcafebot'), text: message }, slackProperties), function (err, response) { - if (err) { - console.log('Unable to send a message to slack'); - console.log(response); - } else { - console.log('The following message is send to slack: \n ' + message); + if (!quietMode) { + if (err) { + console.log('Unable to send a message to slack'); + console.log(response); + } else { + console.log('The following message is send to slack: \n ' + message); + } } }); } }, { key: 'sendTestReport', value: function sendTestReport(nrFailedTests) { - this.sendMessage(this.getTestReportMessage(), nrFailedTests > 0 ? { + this.sendMessage(this.getTestReportMessage(), nrFailedTests > 0 && this.loggingLevel === _constLoggingLevels2['default'].TEST ? { "attachments": [{ color: 'danger', text: nrFailedTests + ' test failed' @@ -66,7 +82,7 @@ var SlackMessage = (function () { var message = this.getSlackMessage(); var errorMessage = this.getErrorMessage(); - if (errorMessage.length > 0) { + if (this.loggingLevel === _constLoggingLevels2['default'].TEST && errorMessage.length > 0) { message = message + "\n\n\n```" + this.getErrorMessage() + '```'; } return message; diff --git a/lib/const/LoggingLevels.js b/lib/const/LoggingLevels.js new file mode 100644 index 0000000..e3614df --- /dev/null +++ b/lib/const/LoggingLevels.js @@ -0,0 +1,12 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +var loggingLevels = { + TEST: 'TEST', + SUMMARY: 'SUMMARY' +}; + +exports['default'] = loggingLevels; +module.exports = exports['default']; \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index 150e883..ead77bf 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,7 +1,7 @@ 'use strict'; Object.defineProperty(exports, '__esModule', { - value: true + value: true }); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } @@ -10,54 +10,89 @@ var _SlackMessage = require('./SlackMessage'); var _SlackMessage2 = _interopRequireDefault(_SlackMessage); +var _constLoggingLevels = require('./const/LoggingLevels'); + +var _constLoggingLevels2 = _interopRequireDefault(_constLoggingLevels); + +var _utilsEmojis = require('./utils/emojis'); + +var _utilsEmojis2 = _interopRequireDefault(_utilsEmojis); + +var _utilsTextFormatters = require('./utils/textFormatters'); + +var envs = require('envs'); +require('dotenv').config(); + +var loggingLevel = envs('TESTCAFE_SLACK_LOGGING_LEVEL', _constLoggingLevels2['default'].TEST).toUpperCase(); + exports['default'] = function () { - return { + return { + + noColors: true, + + reportTaskStart: function reportTaskStart(startTime, userAgents, testCount) { + this.slack = new _SlackMessage2['default'](loggingLevel); + this.startTime = startTime; + this.testCount = testCount; + + var startTimeFormatted = this.moment(this.startTime).format('M/D/YYYY h:mm:ss a'); + + this.slack.sendMessage(_utilsEmojis2['default'].rocket + ' ' + 'Starting TestCafe:' + ' ' + (0, _utilsTextFormatters.bold)(startTimeFormatted) + '\n' + _utilsEmojis2['default'].computer + ' Running ' + (0, _utilsTextFormatters.bold)(testCount) + ' tests in: ' + (0, _utilsTextFormatters.bold)(userAgents) + '\n'); + }, + + reportFixtureStart: function reportFixtureStart(name, path) { + this.currentFixtureName = name; - noColors: true, + if (loggingLevel === _constLoggingLevels2['default'].TEST) this.slack.addMessage((0, _utilsTextFormatters.bold)(this.currentFixtureName)); + }, - reportTaskStart: function reportTaskStart(startTime, userAgents, testCount) { - this.slack = new _SlackMessage2['default'](); - this.startTime = startTime; - this.testCount = testCount; + reportTestDone: function reportTestDone(name, testRunInfo) { + var hasErr = !!testRunInfo.errs.length; + var message = null; - this.slack.sendMessage('Starting testcafe ' + startTime + '. \n Running tests in: ' + userAgents); - }, + if (testRunInfo.skipped) { + message = _utilsEmojis2['default'].fastForward + ' ' + (0, _utilsTextFormatters.italics)(name) + ' - ' + (0, _utilsTextFormatters.bold)('skipped'); + } else if (hasErr) { + message = _utilsEmojis2['default'].fire + ' ' + (0, _utilsTextFormatters.italics)(name) + ' - ' + (0, _utilsTextFormatters.bold)('failed'); + this.renderErrors(testRunInfo.errs); + } else { + message = _utilsEmojis2['default'].checkMark + ' ' + (0, _utilsTextFormatters.italics)(name); + } - reportFixtureStart: function reportFixtureStart(name, path) { - this.currentFixtureName = name; - this.slack.addMessage(this.currentFixtureName); - }, + if (loggingLevel === _constLoggingLevels2['default'].TEST) this.slack.addMessage(message); + }, - reportTestDone: function reportTestDone(name, testRunInfo) { - var hasErr = testRunInfo.errs.length > 0; - var result = hasErr ? ':heavy_multiplication_x:' : ':heavy_check_mark: '; + renderErrors: function renderErrors(errors) { + var _this = this; - this.slack.addMessage(result + ' ' + name); + errors.forEach(function (error, id) { + _this.slack.addErrorMessage(_this.formatError(error, id + 1 + ' ')); + }); + }, - if (hasErr) { - this.renderErrors(testRunInfo.errs); - } - }, + reportTaskDone: function reportTaskDone(endTime, passed, warnings, result) { + var endTimeFormatted = this.moment(endTime).format('M/D/YYYY h:mm:ss a'); + var durationMs = endTime - this.startTime; + var durationFormatted = this.moment.duration(durationMs).format('h[h] mm[m] ss[s]'); - renderErrors: function renderErrors(errors) { - var _this = this; + var finishedStr = _utilsEmojis2['default'].finishFlag + ' Testing finished at ' + (0, _utilsTextFormatters.bold)(endTimeFormatted) + '\n'; + var durationStr = _utilsEmojis2['default'].stopWatch + ' Duration: ' + (0, _utilsTextFormatters.bold)(durationFormatted) + '\n'; + var summaryStr = ''; - errors.forEach(function (error, id) { - _this.slack.addErrorMessage(_this.formatError(error, id + 1 + ' ')); - }); - }, + if (result.skippedCount) summaryStr += _utilsEmojis2['default'].fastForward + ' ' + (0, _utilsTextFormatters.bold)(result.skippedCount + ' skipped') + '\n'; - reportTaskDone: function reportTaskDone(endTime, passed, warnings) { - var durationMs = endTime - this.startTime; - var durationStr = this.moment.duration(durationMs).format('h[h] mm[m] ss[s]'); - var footer = passed === this.testCount ? this.testCount + ' passed' : this.testCount - passed + '/' + this.testCount + ' failed'; + if (result.failedCount) { + summaryStr += _utilsEmojis2['default'].noEntry + ' ' + (0, _utilsTextFormatters.bold)(result.failedCount + '/' + this.testCount + ' failed'); + } else { + summaryStr += _utilsEmojis2['default'].checkMark + ' ' + (0, _utilsTextFormatters.bold)(result.passedCount + '/' + this.testCount + ' passed'); + } - footer = '\n*' + footer + '* (Duration: ' + durationStr + ')'; + var message = '\n\n' + finishedStr + ' ' + durationStr + ' ' + summaryStr; - this.slack.addMessage(footer); - this.slack.sendTestReport(this.testCount - passed); - } - }; + this.slack.addMessage(message); + this.slack.sendTestReport(this.testCount - passed); + } + }; }; module.exports = exports['default']; \ No newline at end of file diff --git a/lib/utils/emojis.js b/lib/utils/emojis.js new file mode 100644 index 0000000..1670109 --- /dev/null +++ b/lib/utils/emojis.js @@ -0,0 +1,18 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +var emojis = { + rocket: ':rocket:', + computer: ':computer:', + checkMark: ':white_check_mark:', + fire: ':fire:', + fastForward: ':fast_forward:', + noEntry: ':no_entry:', + stopWatch: ':stopwatch:', + finishFlag: ':checkered_flag:' +}; + +exports['default'] = emojis; +module.exports = exports['default']; \ No newline at end of file diff --git a/lib/utils/textFormatters.js b/lib/utils/textFormatters.js new file mode 100644 index 0000000..259f459 --- /dev/null +++ b/lib/utils/textFormatters.js @@ -0,0 +1,29 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var bold = function bold(text) { + return "*" + text + "*"; +}; + +exports.bold = bold; +var italics = function italics(text) { + return "_" + text + "_"; +}; + +exports.italics = italics; +var strike = function strike(text) { + return "~" + text + "~"; +}; + +exports.strike = strike; +var code = function code(text) { + return "`" + text + "`"; +}; + +exports.code = code; +var quote = function quote(text) { + return ">" + text; +}; +exports.quote = quote; \ No newline at end of file diff --git a/package.json b/package.json index 8d7b20a..8711391 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "testcafe-reporter-slack", - "version": "0.0.6", + "version": "0.0.7", "description": "TestCafe slack reporter plugin.", "repository": { "type": "git", @@ -38,8 +38,8 @@ "testcafe": "^0.2.0-alpha" }, "dependencies": { - "slack-node": "^0.1.8", - "dotenv": "^4.0.0", - "envs": "^0.1.6" + "dotenv": "^7.0.0", + "envs": "^0.1.6", + "slack-node": "^0.1.8" } } diff --git a/src/SlackMessage.js b/src/SlackMessage.js index af381d2..d858fce 100644 --- a/src/SlackMessage.js +++ b/src/SlackMessage.js @@ -1,15 +1,24 @@ +import loggingLevels from "./const/LoggingLevels"; + require('dotenv').config(); const envs = require('envs'); +const quietMode = envs('TESTCAFE_SLACK_QUIET_MODE', false); + export default class SlackMessage { - constructor() { + constructor(loggingLevel) { let slackNode = require('slack-node'); this.slack = new slackNode(); this.slack.setWebhook(envs('TESTCAFE_SLACK_WEBHOOK', 'http://example.com')); + this.loggingLevel = loggingLevel; this.message = []; this.errorMessage = []; } + getMessage() { + return this.message + } + addMessage(message) { this.message.push(message) } @@ -24,17 +33,19 @@ export default class SlackMessage { username: envs('TESTCAFE_SLACK_BOT', 'testcafebot'), text: message }, slackProperties), function (err, response) { - if(err) { + if (!quietMode) { + if(err) { console.log('Unable to send a message to slack'); console.log(response); - } else { + } else { console.log(`The following message is send to slack: \n ${message}`); + } } }) } sendTestReport(nrFailedTests) { - this.sendMessage(this.getTestReportMessage(), nrFailedTests > 0 + this.sendMessage(this.getTestReportMessage(), nrFailedTests > 0 && this.loggingLevel === loggingLevels.TEST ? { "attachments": [{ color: 'danger', @@ -49,7 +60,7 @@ export default class SlackMessage { let message = this.getSlackMessage(); let errorMessage = this.getErrorMessage(); - if(errorMessage.length > 0) { + if (this.loggingLevel === loggingLevels.TEST && errorMessage.length > 0) { message = message + "\n\n\n```" + this.getErrorMessage() + '```'; } return message; @@ -62,4 +73,4 @@ export default class SlackMessage { getSlackMessage() { return this.message.join("\n"); } -} \ No newline at end of file +} diff --git a/src/const/LoggingLevels.js b/src/const/LoggingLevels.js new file mode 100644 index 0000000..070b9ba --- /dev/null +++ b/src/const/LoggingLevels.js @@ -0,0 +1,6 @@ +const loggingLevels = { + TEST: 'TEST', + SUMMARY: 'SUMMARY' +}; + +export default loggingLevels; diff --git a/src/index.js b/src/index.js index 25cfcd1..a8ccb02 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,12 @@ +const envs = require('envs'); +require('dotenv').config(); + import SlackMessage from './SlackMessage' -import emojis from 'utils/emojis'; -import { bold, italics } from 'utils/textFormatters'; +import loggingLevels from './const/LoggingLevels'; +import emojis from './utils/emojis'; +import { bold, italics } from './utils/textFormatters'; + +const loggingLevel = envs('TESTCAFE_SLACK_LOGGING_LEVEL', loggingLevels.TEST).toUpperCase(); export default function () { return { @@ -8,27 +14,35 @@ export default function () { noColors: true, reportTaskStart (startTime, userAgents, testCount) { - this.slack = new SlackMessage(); + this.slack = new SlackMessage(loggingLevel); this.startTime = startTime; this.testCount = testCount; - this.slack.sendMessage(`${emojis.rocket} ${bold('Starting TestCafe:')} ${startTime}. \n${emojis.computer} Running tests in: ${bold(userAgents)}`) + const startTimeFormatted = this.moment(this.startTime).format('M/D/YYYY h:mm:ss a'); + + this.slack.sendMessage(`${emojis.rocket} ${'Starting TestCafe:'} ${bold(startTimeFormatted)}\n${emojis.computer} Running ${bold(testCount)} tests in: ${bold(userAgents)}\n`) }, reportFixtureStart (name, path) { this.currentFixtureName = name; - this.slack.addMessage(this.currentFixtureName); + + if (loggingLevel === loggingLevels.TEST) this.slack.addMessage(bold(this.currentFixtureName)); }, reportTestDone (name, testRunInfo) { - const hasErr = testRunInfo.errs.length > 0; - const result = hasErr ? `${emojis.fire} ` : `${emojis.checkMark} `; - - this.slack.addMessage(`${result} ${italics(name)}`); + const hasErr = !!testRunInfo.errs.length; + let message = null; - if (hasErr) { - this.renderErrors(testRunInfo.errs); + if (testRunInfo.skipped) { + message = `${emojis.fastForward} ${italics(name)} - ${bold('skipped')}`; + } else if (hasErr) { + message = `${emojis.fire} ${italics(name)} - ${bold('failed')}`; + this.renderErrors(testRunInfo.errs); + } else { + message = `${emojis.checkMark} ${italics(name)}` } + + if (loggingLevel === loggingLevels.TEST) this.slack.addMessage(message); }, renderErrors(errors) { @@ -37,18 +51,28 @@ export default function () { }) }, - reportTaskDone (endTime, passed, warnings) { + reportTaskDone (endTime, passed, warnings, result) { + const endTimeFormatted = this.moment(endTime).format('M/D/YYYY h:mm:ss a'); const durationMs = endTime - this.startTime; - const durationStr = this.moment + const durationFormatted = this.moment .duration(durationMs) .format('h[h] mm[m] ss[s]'); - let footer = passed === this.testCount ? - `${emojis.checkMark} ${this.testCount} passed` : - `${emojis.noEntry} ${this.testCount - passed}/${this.testCount} failed`; - footer = `\n${bold(footer)} \n${emojis.stopWatch} Duration: ${bold(durationStr)}`; + const finishedStr = `${emojis.finishFlag} Testing finished at ${bold(endTimeFormatted)}\n`; + const durationStr = `${emojis.stopWatch} Duration: ${bold(durationFormatted)}\n`; + let summaryStr = ''; + + if (result.skippedCount) summaryStr += `${emojis.fastForward} ${bold(`${result.skippedCount} skipped`)}\n`; + + if (result.failedCount) { + summaryStr += `${emojis.noEntry} ${bold(`${result.failedCount}/${this.testCount} failed`)}` + } else { + summaryStr += `${emojis.checkMark} ${bold(`${result.passedCount}/${this.testCount} passed`)}` + } + + const message = `\n\n${finishedStr} ${durationStr} ${summaryStr}`; - this.slack.addMessage(footer); + this.slack.addMessage(message); this.slack.sendTestReport(this.testCount - passed); } } diff --git a/src/utils/emojis.js b/src/utils/emojis.js index 0987fb2..6d14564 100644 --- a/src/utils/emojis.js +++ b/src/utils/emojis.js @@ -3,8 +3,10 @@ const emojis = { computer: ':computer:', checkMark: ':white_check_mark:', fire: ':fire:', + fastForward: ':fast_forward:', noEntry: ':no_entry:', - stopWatch: ':stopwatch:' + stopWatch: ':stopwatch:', + finishFlag: ':checkered_flag:' }; export default emojis; From 4428b5376a4b2bdb800d7f2d13d7264d804b7910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81esek?= Date: Fri, 19 Apr 2019 10:14:19 +0200 Subject: [PATCH 03/14] Remove envs, add config separate config file with default values --- package.json | 1 - src/SlackMessage.js | 40 +++++++++---------- src/config.js | 13 ++++++ .../{LoggingLevels.js => loggingLevels.js} | 0 src/index.js | 10 ++--- 5 files changed, 37 insertions(+), 27 deletions(-) create mode 100644 src/config.js rename src/const/{LoggingLevels.js => loggingLevels.js} (100%) diff --git a/package.json b/package.json index 8711391..e8f4987 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,6 @@ }, "dependencies": { "dotenv": "^7.0.0", - "envs": "^0.1.6", "slack-node": "^0.1.8" } } diff --git a/src/SlackMessage.js b/src/SlackMessage.js index d858fce..cb82858 100644 --- a/src/SlackMessage.js +++ b/src/SlackMessage.js @@ -1,36 +1,36 @@ -import loggingLevels from "./const/LoggingLevels"; +import config from './config'; +import loggingLevels from "./const/loggingLevels"; -require('dotenv').config(); -const envs = require('envs'); - -const quietMode = envs('TESTCAFE_SLACK_QUIET_MODE', false); +const { + slackWebhook, + slackChannel, + slackUsername, + loggingLevel, + quietMode +} = config; export default class SlackMessage { - constructor(loggingLevel) { + constructor() { let slackNode = require('slack-node'); this.slack = new slackNode(); - this.slack.setWebhook(envs('TESTCAFE_SLACK_WEBHOOK', 'http://example.com')); + this.slack.setWebhook(slackWebhook); this.loggingLevel = loggingLevel; - this.message = []; - this.errorMessage = []; - } - - getMessage() { - return this.message + this.messages = []; + this.errorMessages = []; } addMessage(message) { - this.message.push(message) + this.messages.push(message) } addErrorMessage(message) { - this.errorMessage.push(message) + this.errorMessages.push(message) } sendMessage(message, slackProperties = null) { this.slack.webhook(Object.assign({ - channel: envs('TESTCAFE_SLACK_CHANNEL', '#testcafe'), - username: envs('TESTCAFE_SLACK_BOT', 'testcafebot'), + channel: slackChannel, + username: slackUsername, text: message }, slackProperties), function (err, response) { if (!quietMode) { @@ -60,17 +60,17 @@ export default class SlackMessage { let message = this.getSlackMessage(); let errorMessage = this.getErrorMessage(); - if (this.loggingLevel === loggingLevels.TEST && errorMessage.length > 0) { + if (errorMessage.length > 0 && this.loggingLevel === loggingLevels.TEST) { message = message + "\n\n\n```" + this.getErrorMessage() + '```'; } return message; } getErrorMessage() { - return this.errorMessage.join("\n\n\n"); + return this.errorMessages.join("\n\n\n"); } getSlackMessage() { - return this.message.join("\n"); + return this.messages.join("\n"); } } diff --git a/src/config.js b/src/config.js new file mode 100644 index 0000000..a951805 --- /dev/null +++ b/src/config.js @@ -0,0 +1,13 @@ +require('dotenv').config(); + +import loggingLevels from './const/loggingLevels'; + +const config = { + slackWebhook: process.env.TESTCAFE_SLACK_WEBHOOK || 'https://hooks.slack.com/services/*****', + slackChannel: process.env.TESTCAFE_SLACK_CHANNEL || '#testcafe', + slackUsername: process.env.TESTCAFE_SLACK_USERNAME || 'testcafebot', + loggingLevel: process.env.TESTCAFE_SLACK_LOGGING_LEVEL || loggingLevels.TEST, + quietMode: process.env.TESTCAFE_SLACK_QUIET_MODE || false +}; + +export default config; diff --git a/src/const/LoggingLevels.js b/src/const/loggingLevels.js similarity index 100% rename from src/const/LoggingLevels.js rename to src/const/loggingLevels.js diff --git a/src/index.js b/src/index.js index a8ccb02..02c3b67 100644 --- a/src/index.js +++ b/src/index.js @@ -1,12 +1,10 @@ -const envs = require('envs'); -require('dotenv').config(); - -import SlackMessage from './SlackMessage' +import config from './config'; +import SlackMessage from './SlackMessage'; import loggingLevels from './const/LoggingLevels'; import emojis from './utils/emojis'; import { bold, italics } from './utils/textFormatters'; -const loggingLevel = envs('TESTCAFE_SLACK_LOGGING_LEVEL', loggingLevels.TEST).toUpperCase(); +const { loggingLevel } = config; export default function () { return { @@ -14,7 +12,7 @@ export default function () { noColors: true, reportTaskStart (startTime, userAgents, testCount) { - this.slack = new SlackMessage(loggingLevel); + this.slack = new SlackMessage(); this.startTime = startTime; this.testCount = testCount; From dee5d297ea53e99fda178a31066bb1c32220fbe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81esek?= Date: Fri, 19 Apr 2019 10:17:01 +0200 Subject: [PATCH 04/14] Add builded version --- lib/SlackMessage.js | 44 ++++++++++++++++++++-------------------- lib/config.js | 24 ++++++++++++++++++++++ lib/index.js | 11 +++++----- lib/utils/resolvePath.js | 13 ++++++++++++ 4 files changed, 65 insertions(+), 27 deletions(-) create mode 100644 lib/config.js create mode 100644 lib/utils/resolvePath.js diff --git a/lib/SlackMessage.js b/lib/SlackMessage.js index 6ff6c03..a194daf 100644 --- a/lib/SlackMessage.js +++ b/lib/SlackMessage.js @@ -10,41 +10,41 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'd function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -var _constLoggingLevels = require("./const/LoggingLevels"); +var _config = require('./config'); -var _constLoggingLevels2 = _interopRequireDefault(_constLoggingLevels); +var _config2 = _interopRequireDefault(_config); + +var _constLoggingLevels = require("./const/loggingLevels"); -require('dotenv').config(); -var envs = require('envs'); +var _constLoggingLevels2 = _interopRequireDefault(_constLoggingLevels); -var quietMode = envs('TESTCAFE_SLACK_QUIET_MODE', false); +var slackWebhook = _config2['default'].slackWebhook; +var slackChannel = _config2['default'].slackChannel; +var slackUsername = _config2['default'].slackUsername; +var loggingLevel = _config2['default'].loggingLevel; +var quietMode = _config2['default'].quietMode; var SlackMessage = (function () { - function SlackMessage(loggingLevel) { + function SlackMessage() { _classCallCheck(this, SlackMessage); var slackNode = require('slack-node'); this.slack = new slackNode(); - this.slack.setWebhook(envs('TESTCAFE_SLACK_WEBHOOK', 'http://example.com')); + this.slack.setWebhook(slackWebhook); this.loggingLevel = loggingLevel; - this.message = []; - this.errorMessage = []; + this.messages = []; + this.errorMessages = []; } _createClass(SlackMessage, [{ - key: 'getMessage', - value: function getMessage() { - return this.message; - } - }, { key: 'addMessage', value: function addMessage(message) { - this.message.push(message); + this.messages.push(message); } }, { key: 'addErrorMessage', value: function addErrorMessage(message) { - this.errorMessage.push(message); + this.errorMessages.push(message); } }, { key: 'sendMessage', @@ -52,13 +52,13 @@ var SlackMessage = (function () { var slackProperties = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; this.slack.webhook(Object.assign({ - channel: envs('TESTCAFE_SLACK_CHANNEL', '#testcafe'), - username: envs('TESTCAFE_SLACK_BOT', 'testcafebot'), + channel: slackChannel, + username: slackUsername, text: message }, slackProperties), function (err, response) { if (!quietMode) { if (err) { - console.log('Unable to send a message to slack'); + console.log('Unable to send a messages to slack'); console.log(response); } else { console.log('The following message is send to slack: \n ' + message); @@ -82,7 +82,7 @@ var SlackMessage = (function () { var message = this.getSlackMessage(); var errorMessage = this.getErrorMessage(); - if (this.loggingLevel === _constLoggingLevels2['default'].TEST && errorMessage.length > 0) { + if (errorMessage.length > 0 && this.loggingLevel === _constLoggingLevels2['default'].TEST) { message = message + "\n\n\n```" + this.getErrorMessage() + '```'; } return message; @@ -90,12 +90,12 @@ var SlackMessage = (function () { }, { key: 'getErrorMessage', value: function getErrorMessage() { - return this.errorMessage.join("\n\n\n"); + return this.errorMessages.join("\n\n\n"); } }, { key: 'getSlackMessage', value: function getSlackMessage() { - return this.message.join("\n"); + return this.messages.join("\n"); } }]); diff --git a/lib/config.js b/lib/config.js new file mode 100644 index 0000000..d643198 --- /dev/null +++ b/lib/config.js @@ -0,0 +1,24 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _constLoggingLevels = require('./const/loggingLevels'); + +var _constLoggingLevels2 = _interopRequireDefault(_constLoggingLevels); + +require('dotenv').config(); + +var config = { + slackWebhook: process.env.TESTCAFE_SLACK_WEBHOOK || 'https://hooks.slack.com/services/*****', + slackChannel: process.env.TESTCAFE_SLACK_CHANNEL || '#testcafe', + slackUsername: process.env.TESTCAFE_SLACK_USERNAME || 'testcafebot', + loggingLevel: process.env.TESTCAFE_SLACK_LOGGING_LEVEL || _constLoggingLevels2['default'].TEST, + quietMode: process.env.TESTCAFE_SLACK_QUIET_MODE || false +}; + +exports['default'] = config; +module.exports = exports['default']; \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index ead77bf..82a70f1 100644 --- a/lib/index.js +++ b/lib/index.js @@ -6,6 +6,10 @@ Object.defineProperty(exports, '__esModule', { function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _config = require('./config'); + +var _config2 = _interopRequireDefault(_config); + var _SlackMessage = require('./SlackMessage'); var _SlackMessage2 = _interopRequireDefault(_SlackMessage); @@ -20,10 +24,7 @@ var _utilsEmojis2 = _interopRequireDefault(_utilsEmojis); var _utilsTextFormatters = require('./utils/textFormatters'); -var envs = require('envs'); -require('dotenv').config(); - -var loggingLevel = envs('TESTCAFE_SLACK_LOGGING_LEVEL', _constLoggingLevels2['default'].TEST).toUpperCase(); +var loggingLevel = _config2['default'].loggingLevel; exports['default'] = function () { return { @@ -31,7 +32,7 @@ exports['default'] = function () { noColors: true, reportTaskStart: function reportTaskStart(startTime, userAgents, testCount) { - this.slack = new _SlackMessage2['default'](loggingLevel); + this.slack = new _SlackMessage2['default'](); this.startTime = startTime; this.testCount = testCount; diff --git a/lib/utils/resolvePath.js b/lib/utils/resolvePath.js new file mode 100644 index 0000000..35530ec --- /dev/null +++ b/lib/utils/resolvePath.js @@ -0,0 +1,13 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +var _path = require('path'); + +exports['default'] = function (path) { + return (0, _path.resolve)(process.cwd(), path); +}; + +module.exports = exports['default']; \ No newline at end of file From 098753e7846a3ce8a63eb5c5a808c0ca7f3cc42e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81esek?= Date: Sat, 20 Apr 2019 23:44:46 +0200 Subject: [PATCH 05/14] Add new config, used with TestCafe config and update readme --- README.md | 181 +- assets/slack-report-failed.png | Bin 0 -> 90192 bytes assets/slack-report-success.png | Bin 0 -> 88831 bytes package-lock.json | 4466 ------------------------------- package.json | 1 + src/SlackMessage.js | 18 +- src/config.js | 40 +- src/utils/fileHelpers.js | 8 + 8 files changed, 209 insertions(+), 4505 deletions(-) create mode 100644 assets/slack-report-failed.png create mode 100644 assets/slack-report-success.png delete mode 100644 package-lock.json create mode 100644 src/utils/fileHelpers.js diff --git a/README.md b/README.md index 7ef714b..2ee4f56 100644 --- a/README.md +++ b/README.md @@ -3,37 +3,44 @@ This is a reporter for [TestCafe](http://devexpress.github.io/testcafe). It sends the output of the test to slack. -## Purpose -Once configured the reporter sends test results to Slack depending on a .env file from the folder the tests are run from +## Purpose :dart: +Once configured the reporter sends test results to Slack channel, e.g. -## Setup instructions +![Slack report - success](assets/slack-report-success.png) + +![Slack report - failed](assets/slack-report-failed.png) + +## Installation :construction: Follow the instructions bellow to configure this plugin. -First install this package globally to the machine you would like to run your tests or add it as dependency to your project and then: +Install this reporter as your test project dependency: -## Testing -Running TestCafe with `testcafe-reporter-slack`. +```bash +yarn add testcafe-reporter-slack +``` -In order to use this TestCafe reporter plugin it is necessary to define .env variables in your test project, hence the folder from where your call TestCafe. +## Setup instructions :wrench: +In order to use this TestCafe reporter plugin it is necessary to add it as your reporter to your TestCafe. + +#### Using `.testcaferc.json` config file -- cd into your test project. -- Edit or create the .env file by adding the following ki-reporter required variables: +Add reporter name (`slack`) to your `reporter` object: -```dotenv -TESTCAFE_SLACK_WEBHOOK=https://hooks.slack.com/services/***** -TESTCAFE_SLACK_CHANNEL="#testcafe" -TESTCAFE_SLACK_USERNAME=testcafebot -TESTCAFE_SLACK_LOGGING_LEVEL=TEST -TESTCAFE_SLACK_QUIET_MODE=false +```json +{ + "browsers": [ "chrome" ], + "src": "scenarios", + "reporter": [ + { + "name": "slack" + } + ] +} ``` -Now run your tests from the command line with the ki-reporter specified, e.g.: +#### Using TestCafe API -```bash -$ testcafe chrome 'path/to/test/file.js' --reporter slack -``` - -When you use TestCafe API, you can pass the reporter name to the `reporter()` method: +Pass the reporter name (`slack`) to the `reporter()` method: ```js testCafe @@ -44,5 +51,135 @@ testCafe .run(); ``` -## Further Documentation +#### Necessary configuration + +After that, you should define **.env** file with variables in your test project, hence the folder from where your call TestCafe (root directory). + +```dotenv +# .env +TESTCAFE_SLACK_WEBHOOK=https://hooks.slack.com/services/***** +``` + +This is **required minimum to has it working**. + +## Options :gear: + +Slack reporter have few options which could be configured from both, `.testcaferc.json` or `.env` file as global variables. +**It will first retrieve the values from the TestCafe config file `.testcaferc.json`**, after that from `.env` file. + +* :warning: - **required!** +* :balloon: - optional. +* :link: - deprecated. + +##### Slack Webhook URL :warning: + +**This option is required!** Your Slack channel webhook URL generated from Slack API to allow reporter post there. +It's **not recommended** to pass your `webhookUrl` into config file, in this case, due to sensitive data, it's **better to pass it via global variable** in `.env` file. +* via `.testcaferc.json` + +```json +{ + "name": "slack", + "options": { + "webhookUrl": "https://hooks.slack.com/services/*****" + } +} +``` + +* via `.env` file + +```dotenv +# .env +TESTCAFE_SLACK_WEBHOOK=https://hooks.slack.com/services/***** +``` + +##### Channel :balloon: :link: + +Your Slack channel name where you want to post reports. + +* via `.testcaferc.json` + +```json +{ + "name": "slack", + "options": { + "channel": "#testcafe" + } +} +``` + +* via `.env` file + +```dotenv +# .env +TESTCAFE_SLACK_CHANNEL="#testcafe" +``` + +##### Username :balloon: :link: + +Your Slack app username. + +* via `.testcaferc.json` + +```json +{ + "name": "slack", + "options": { + "username": "testcafebot" + } +} +``` + +* via `.env` file + +```dotenv +# .env +TESTCAFE_SLACK_USERNAME=testcafebot +``` + +##### Logging level + +Choose your report logging level, if you want to see each test with error stacktrace, choose `TEST` (default). Second one is short & condensed which show only number of tests which passed, failed and was skipped - `SUMMARY`. + +* via `.testcaferc.json` + +```json +{ + "name": "slack", + "options": { + "loggingLevel": "SUMMARY" + } +} +``` + +* via `.env` file + +```dotenv +# .env +TESTCAFE_SLACK_LOGGING_LEVEL=SUMMARY +``` + +##### Quiet mode + +Choose if you want to have messages in terminal about sending specific messages to Slack, it's turned off by default. + +* via `.testcaferc.json` + +```json +{ + "name": "slack", + "options": { + "quietMode": true + } +} +``` + +* via `.env` file + +```dotenv +# .env +TESTCAFE_SLACK_QUIET_MODE=true +``` + +## Further Documentation :books: [TestCafe Reporter Plugins](https://devexpress.github.io/testcafe/documentation/extending-testcafe/reporter-plugin/) diff --git a/assets/slack-report-failed.png b/assets/slack-report-failed.png new file mode 100644 index 0000000000000000000000000000000000000000..67a4857227e45d805eadff07c403c12f05d0c3bd GIT binary patch literal 90192 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 Ch-OC;O-8=9fG^NySw|_Irr{;_Pyu+`~H4C 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 { + if (!isFileExists(testCafeConfigFilePath)) { + return defaultConfig; + } + + let configRawData = null; + + try { + configRawData = readFile(testCafeConfigFilePath); + } catch (err) { + return defaultConfig; + } + + try { + let testCafeConfig = JSON.parse(configRawData); + + return testCafeConfig.reporter.find(obj => obj.name === 'slack'); + } catch (err) { + return defaultConfig; + } +}; + +const reporterConfig = loadReporterConfig(); +const config = {...defaultConfig, ...reporterConfig.options}; + export default config; diff --git a/src/utils/fileHelpers.js b/src/utils/fileHelpers.js new file mode 100644 index 0000000..51eb9c1 --- /dev/null +++ b/src/utils/fileHelpers.js @@ -0,0 +1,8 @@ +import fs from 'fs'; +import { resolve } from 'path'; + +export const resolvePath = (path) => resolve(process.cwd(), path); + +export const isFileExists = (path) => fs.existsSync(path); + +export const readFile = (filePath) => fs.readFileSync(filePath); From 8571f2592b676ab1e84ac36904e790eacf6ad145 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81esek?= Date: Sat, 20 Apr 2019 23:45:05 +0200 Subject: [PATCH 06/14] Update generated tests --- test/utils/reporter-test-calls.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/utils/reporter-test-calls.js b/test/utils/reporter-test-calls.js index b6ead80..ad671df 100644 --- a/test/utils/reporter-test-calls.js +++ b/test/utils/reporter-test-calls.js @@ -60,7 +60,7 @@ module.exports = [ } }, { - err: new ActionElementNotFoundError(), + err: new ActionElementNotFoundError({ apiFnChain: ['one', 'two', 'three'], apiFnIndex: 1 }), metaInfo: { userAgent: 'Firefox 47 / Mac OS X 10.10.1', @@ -147,7 +147,7 @@ module.exports = [ // errs: [], errs: makeErrors([ { - err: new ActionElementNotFoundError(), + err: new ActionElementNotFoundError({ apiFnChain: ['one', 'two', 'three'], apiFnIndex: 1 }), metaInfo: { userAgent: 'Firefox 47 / Mac OS X 10.10.1', From 123ad15b59314018035bdc42650da7481fa51cd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81esek?= Date: Sat, 20 Apr 2019 23:49:32 +0200 Subject: [PATCH 07/14] Update README --- README.md | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 2ee4f56..c496439 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # TestCafe Reporter Slack ### testcafe-reporter-slack -This is a reporter for [TestCafe](http://devexpress.github.io/testcafe). It sends the output of the test to slack. +This is a reporter for [TestCafe](http://devexpress.github.io/testcafe). It sends the output of the test to [Slack](https://slack.com/). ## Purpose :dart: Once configured the reporter sends test results to Slack channel, e.g. @@ -11,7 +11,6 @@ Once configured the reporter sends test results to Slack channel, e.g. ![Slack report - failed](assets/slack-report-failed.png) ## Installation :construction: -Follow the instructions bellow to configure this plugin. Install this reporter as your test project dependency: @@ -22,7 +21,7 @@ yarn add testcafe-reporter-slack ## Setup instructions :wrench: In order to use this TestCafe reporter plugin it is necessary to add it as your reporter to your TestCafe. -#### Using `.testcaferc.json` config file +### Using `.testcaferc.json` config file Add reporter name (`slack`) to your `reporter` object: @@ -38,7 +37,7 @@ Add reporter name (`slack`) to your `reporter` object: } ``` -#### Using TestCafe API +### Using TestCafe API Pass the reporter name (`slack`) to the `reporter()` method: @@ -51,7 +50,7 @@ testCafe .run(); ``` -#### Necessary configuration +### Necessary configuration After that, you should define **.env** file with variables in your test project, hence the folder from where your call TestCafe (root directory). @@ -67,11 +66,11 @@ This is **required minimum to has it working**. Slack reporter have few options which could be configured from both, `.testcaferc.json` or `.env` file as global variables. **It will first retrieve the values from the TestCafe config file `.testcaferc.json`**, after that from `.env` file. -* :warning: - **required!** -* :balloon: - optional. -* :link: - deprecated. +* :warning: - **required** +* :balloon: - optional +* :link: - deprecated -##### Slack Webhook URL :warning: +#### Slack Webhook URL :warning: **This option is required!** Your Slack channel webhook URL generated from Slack API to allow reporter post there. It's **not recommended** to pass your `webhookUrl` into config file, in this case, due to sensitive data, it's **better to pass it via global variable** in `.env` file. @@ -93,7 +92,7 @@ It's **not recommended** to pass your `webhookUrl` into config file, in this cas TESTCAFE_SLACK_WEBHOOK=https://hooks.slack.com/services/***** ``` -##### Channel :balloon: :link: +#### Channel :balloon: :link: Your Slack channel name where you want to post reports. @@ -115,7 +114,7 @@ Your Slack channel name where you want to post reports. TESTCAFE_SLACK_CHANNEL="#testcafe" ``` -##### Username :balloon: :link: +#### Username :balloon: :link: Your Slack app username. @@ -137,7 +136,7 @@ Your Slack app username. TESTCAFE_SLACK_USERNAME=testcafebot ``` -##### Logging level +#### Logging level Choose your report logging level, if you want to see each test with error stacktrace, choose `TEST` (default). Second one is short & condensed which show only number of tests which passed, failed and was skipped - `SUMMARY`. @@ -159,7 +158,7 @@ Choose your report logging level, if you want to see each test with error stackt TESTCAFE_SLACK_LOGGING_LEVEL=SUMMARY ``` -##### Quiet mode +#### Quiet mode Choose if you want to have messages in terminal about sending specific messages to Slack, it's turned off by default. From b641cea22bcc7fb3a46057535cedaa3311034383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81esek?= Date: Sat, 20 Apr 2019 23:51:36 +0200 Subject: [PATCH 08/14] Add lib files.. --- lib/SlackMessage.js | 18 ++++++------------ lib/config.js | 41 ++++++++++++++++++++++++++++++++++++---- lib/utils/fileHelpers.js | 28 +++++++++++++++++++++++++++ lib/utils/resolvePath.js | 13 ------------- 4 files changed, 71 insertions(+), 29 deletions(-) create mode 100644 lib/utils/fileHelpers.js delete mode 100644 lib/utils/resolvePath.js diff --git a/lib/SlackMessage.js b/lib/SlackMessage.js index a194daf..7badfd7 100644 --- a/lib/SlackMessage.js +++ b/lib/SlackMessage.js @@ -18,20 +18,14 @@ var _constLoggingLevels = require("./const/loggingLevels"); var _constLoggingLevels2 = _interopRequireDefault(_constLoggingLevels); -var slackWebhook = _config2['default'].slackWebhook; -var slackChannel = _config2['default'].slackChannel; -var slackUsername = _config2['default'].slackUsername; -var loggingLevel = _config2['default'].loggingLevel; -var quietMode = _config2['default'].quietMode; - var SlackMessage = (function () { function SlackMessage() { _classCallCheck(this, SlackMessage); var slackNode = require('slack-node'); this.slack = new slackNode(); - this.slack.setWebhook(slackWebhook); - this.loggingLevel = loggingLevel; + this.slack.setWebhook(_config2['default'].webhookUrl); + this.loggingLevel = _config2['default'].loggingLevel; this.messages = []; this.errorMessages = []; } @@ -52,13 +46,13 @@ var SlackMessage = (function () { var slackProperties = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; this.slack.webhook(Object.assign({ - channel: slackChannel, - username: slackUsername, + channel: _config2['default'].channel, + username: _config2['default'].username, text: message }, slackProperties), function (err, response) { - if (!quietMode) { + if (!_config2['default'].quietMode) { if (err) { - console.log('Unable to send a messages to slack'); + console.log('Unable to send a message to slack'); console.log(response); } else { console.log('The following message is send to slack: \n ' + message); diff --git a/lib/config.js b/lib/config.js index d643198..4c2cd11 100644 --- a/lib/config.js +++ b/lib/config.js @@ -4,21 +4,54 @@ Object.defineProperty(exports, '__esModule', { value: true }); +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _utilsFileHelpers = require('./utils/fileHelpers'); + var _constLoggingLevels = require('./const/loggingLevels'); var _constLoggingLevels2 = _interopRequireDefault(_constLoggingLevels); require('dotenv').config(); -var config = { - slackWebhook: process.env.TESTCAFE_SLACK_WEBHOOK || 'https://hooks.slack.com/services/*****', - slackChannel: process.env.TESTCAFE_SLACK_CHANNEL || '#testcafe', - slackUsername: process.env.TESTCAFE_SLACK_USERNAME || 'testcafebot', +var defaultConfig = { + webhookUrl: process.env.TESTCAFE_SLACK_WEBHOOK || 'https://hooks.slack.com/services/*****', + channel: process.env.TESTCAFE_SLACK_CHANNEL || '#testcafe', + username: process.env.TESTCAFE_SLACK_USERNAME || 'testcafebot', loggingLevel: process.env.TESTCAFE_SLACK_LOGGING_LEVEL || _constLoggingLevels2['default'].TEST, quietMode: process.env.TESTCAFE_SLACK_QUIET_MODE || false }; +var testCafeConfigFilePath = (0, _utilsFileHelpers.resolvePath)('.testcaferc.json'); + +var loadReporterConfig = function loadReporterConfig() { + if (!(0, _utilsFileHelpers.isFileExists)(testCafeConfigFilePath)) { + return defaultConfig; + } + + var configRawData = null; + + try { + configRawData = (0, _utilsFileHelpers.readFile)(testCafeConfigFilePath); + } catch (err) { + return defaultConfig; + } + + try { + var testCafeConfig = JSON.parse(configRawData); + + return testCafeConfig.reporter.find(function (obj) { + return obj.name === 'slack'; + }); + } catch (err) { + return defaultConfig; + } +}; + +var reporterConfig = loadReporterConfig(); +var config = _extends({}, defaultConfig, reporterConfig.options); + exports['default'] = config; module.exports = exports['default']; \ No newline at end of file diff --git a/lib/utils/fileHelpers.js b/lib/utils/fileHelpers.js new file mode 100644 index 0000000..b885f0a --- /dev/null +++ b/lib/utils/fileHelpers.js @@ -0,0 +1,28 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _fs = require('fs'); + +var _fs2 = _interopRequireDefault(_fs); + +var _path = require('path'); + +var resolvePath = function resolvePath(path) { + return (0, _path.resolve)(process.cwd(), path); +}; + +exports.resolvePath = resolvePath; +var isFileExists = function isFileExists(path) { + return _fs2['default'].existsSync(path); +}; + +exports.isFileExists = isFileExists; +var readFile = function readFile(filePath) { + return _fs2['default'].readFileSync(filePath); +}; +exports.readFile = readFile; \ No newline at end of file diff --git a/lib/utils/resolvePath.js b/lib/utils/resolvePath.js deleted file mode 100644 index 35530ec..0000000 --- a/lib/utils/resolvePath.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var _path = require('path'); - -exports['default'] = function (path) { - return (0, _path.resolve)(process.cwd(), path); -}; - -module.exports = exports['default']; \ No newline at end of file From 21f696d029fa2f4b769200eaa38a36db06d172f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81esek?= Date: Sun, 21 Apr 2019 00:03:44 +0200 Subject: [PATCH 09/14] Readme typos fixes --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index c496439..abd3c4c 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Once configured the reporter sends test results to Slack channel, e.g. ![Slack report - failed](assets/slack-report-failed.png) ## Installation :construction: - + Install this reporter as your test project dependency: ```bash @@ -19,11 +19,11 @@ yarn add testcafe-reporter-slack ``` ## Setup instructions :wrench: -In order to use this TestCafe reporter plugin it is necessary to add it as your reporter to your TestCafe. +In order to use this TestCafe reporter plugin, it is necessary to add it as your reporter to your TestCafe. ### Using `.testcaferc.json` config file -Add reporter name (`slack`) to your `reporter` object: +Add a reporter name (`slack`) to your `reporter` object: ```json { @@ -73,7 +73,7 @@ Slack reporter have few options which could be configured from both, `.testcafer #### Slack Webhook URL :warning: **This option is required!** Your Slack channel webhook URL generated from Slack API to allow reporter post there. -It's **not recommended** to pass your `webhookUrl` into config file, in this case, due to sensitive data, it's **better to pass it via global variable** in `.env` file. +It's **not recommended** to pass your `webhookUrl` into the config file, in this case, due to sensitive data, it's **better to pass it via global variable** in `.env` file. * via `.testcaferc.json` ```json @@ -138,7 +138,7 @@ TESTCAFE_SLACK_USERNAME=testcafebot #### Logging level -Choose your report logging level, if you want to see each test with error stacktrace, choose `TEST` (default). Second one is short & condensed which show only number of tests which passed, failed and was skipped - `SUMMARY`. +Choose your report logging level, if you want to see each test with error stack trace, choose `TEST` (default). The second one is short & condensed which show the only number of tests which passed, failed and was skipped - `SUMMARY`. * via `.testcaferc.json` @@ -160,7 +160,7 @@ TESTCAFE_SLACK_LOGGING_LEVEL=SUMMARY #### Quiet mode -Choose if you want to have messages in terminal about sending specific messages to Slack, it's turned off by default. +Choose if you want to have messages in the terminal about sending specific messages to Slack, it's turned off by default. * via `.testcaferc.json` From 9c2da07ad916e593dfc9e732e49b243014250ff9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81esek?= Date: Sun, 21 Apr 2019 00:20:10 +0200 Subject: [PATCH 10/14] Code consistency reformat --- .gitignore | 6 +- Gulpfile.js | 50 ++--- src/SlackMessage.js | 108 +++++----- src/index.js | 102 ++++----- test/test.js | 32 +-- test/utils/create-report.js | 58 +++--- test/utils/reporter-test-calls.js | 334 +++++++++++++++--------------- test/utils/test-callsite.js | 11 +- 8 files changed, 352 insertions(+), 349 deletions(-) diff --git a/.gitignore b/.gitignore index 32fd8ca..f57caea 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ .idea node_modules -media \ No newline at end of file +media + + +yarn.lock +package-lock.json diff --git a/Gulpfile.js b/Gulpfile.js index 4d4445c..e81456f 100644 --- a/Gulpfile.js +++ b/Gulpfile.js @@ -1,42 +1,42 @@ -var gulp = require('gulp'); -var babel = require('gulp-babel'); -var mocha = require('gulp-mocha'); -var del = require('del'); +const gulp = require('gulp'); +const babel = require('gulp-babel'); +const mocha = require('gulp-mocha'); +const del = require('del'); gulp.task('clean', function (cb) { - del('lib', cb); + del('lib', cb); }); gulp.task('build', ['clean'], function () { - return gulp - .src('src/**/*.js') - .pipe(babel()) - .pipe(gulp.dest('lib')); + return gulp + .src('src/**/*.js') + .pipe(babel()) + .pipe(gulp.dest('lib')); }); gulp.task('watch', ['build'], function () { - gulp.watch('src/*.js', ['build']); + gulp.watch('src/*.js', ['build']); }); gulp.task('test', ['build'], function () { - return gulp - .src('test/**.js') - .pipe(mocha({ - ui: 'bdd', - reporter: 'spec', - timeout: typeof v8debug === 'undefined' ? 2000 : Infinity // NOTE: disable timeouts in debug - })); + return gulp + .src('test/**.js') + .pipe(mocha({ + ui: 'bdd', + reporter: 'spec', + timeout: typeof v8debug === 'undefined' ? 2000 : Infinity // NOTE: disable timeouts in debug + })); }); gulp.task('preview', ['build'], function () { - var buildReporterPlugin = require('testcafe').embeddingUtils.buildReporterPlugin; - var pluginFactory = require('./lib'); - var reporterTestCalls = require('./test/utils/reporter-test-calls'); - var plugin = buildReporterPlugin(pluginFactory); + const buildReporterPlugin = require('testcafe').embeddingUtils.buildReporterPlugin; + const pluginFactory = require('./lib'); + const reporterTestCalls = require('./test/utils/reporter-test-calls'); + const plugin = buildReporterPlugin(pluginFactory); - reporterTestCalls.forEach(function (call) { - plugin[call.method].apply(plugin, call.args); - }); + reporterTestCalls.forEach(function (call) { + plugin[call.method].apply(plugin, call.args); + }); - process.exit(0); + process.exit(0); }); diff --git a/src/SlackMessage.js b/src/SlackMessage.js index 6a85ed4..011d29b 100644 --- a/src/SlackMessage.js +++ b/src/SlackMessage.js @@ -2,67 +2,67 @@ import config from './config'; import loggingLevels from "./const/loggingLevels"; export default class SlackMessage { - constructor() { - let slackNode = require('slack-node'); - this.slack = new slackNode(); - this.slack.setWebhook(config.webhookUrl); - this.loggingLevel = config.loggingLevel; - this.messages = []; - this.errorMessages = []; - } + constructor() { + let slackNode = require('slack-node'); + this.slack = new slackNode(); + this.slack.setWebhook(config.webhookUrl); + this.loggingLevel = config.loggingLevel; + this.messages = []; + this.errorMessages = []; + } - addMessage(message) { - this.messages.push(message) - } + addMessage(message) { + this.messages.push(message) + } - addErrorMessage(message) { - this.errorMessages.push(message) - } + addErrorMessage(message) { + this.errorMessages.push(message) + } - sendMessage(message, slackProperties = null) { - this.slack.webhook(Object.assign({ - channel: config.channel, - username: config.username, - text: message - }, slackProperties), function (err, response) { - if (!config.quietMode) { - if(err) { - console.log('Unable to send a message to slack'); - console.log(response); - } else { - console.log(`The following message is send to slack: \n ${message}`); - } - } - }) - } + sendMessage(message, slackProperties = null) { + this.slack.webhook(Object.assign({ + channel: config.channel, + username: config.username, + text: message + }, slackProperties), function (err, response) { + if (!config.quietMode) { + if (err) { + console.log('Unable to send a message to slack'); + console.log(response); + } else { + console.log(`The following message is send to slack: \n ${message}`); + } + } + }) + } - sendTestReport(nrFailedTests) { - this.sendMessage(this.getTestReportMessage(), nrFailedTests > 0 && this.loggingLevel === loggingLevels.TEST - ? { - "attachments": [{ - color: 'danger', - text: `${nrFailedTests} test failed` - }] - } - : null - ) - } + sendTestReport(nrFailedTests) { + this.sendMessage(this.getTestReportMessage(), nrFailedTests > 0 && this.loggingLevel === loggingLevels.TEST + ? { + "attachments": [{ + color: 'danger', + text: `${nrFailedTests} test failed` + }] + } + : null + ) + } - getTestReportMessage() { - let message = this.getSlackMessage(); - let errorMessage = this.getErrorMessage(); + getTestReportMessage() { + let message = this.getSlackMessage(); + let errorMessage = this.getErrorMessage(); - if (errorMessage.length > 0 && this.loggingLevel === loggingLevels.TEST) { - message = message + "\n\n\n```" + this.getErrorMessage() + '```'; - } - return message; + if (errorMessage.length > 0 && this.loggingLevel === loggingLevels.TEST) { + message = message + "\n\n\n```" + this.getErrorMessage() + '```'; } + return message; + } - getErrorMessage() { - return this.errorMessages.join("\n\n\n"); - } + getErrorMessage() { + return this.errorMessages.join("\n\n\n"); + } - getSlackMessage() { - return this.messages.join("\n"); - } + getSlackMessage() { + return this.messages.join("\n"); + } } diff --git a/src/index.js b/src/index.js index 02c3b67..ec7c2ea 100644 --- a/src/index.js +++ b/src/index.js @@ -4,74 +4,74 @@ import loggingLevels from './const/LoggingLevels'; import emojis from './utils/emojis'; import { bold, italics } from './utils/textFormatters'; -const { loggingLevel } = config; +const {loggingLevel} = config; export default function () { - return { + return { - noColors: true, + noColors: true, - reportTaskStart (startTime, userAgents, testCount) { - this.slack = new SlackMessage(); - this.startTime = startTime; - this.testCount = testCount; + reportTaskStart(startTime, userAgents, testCount) { + this.slack = new SlackMessage(); + this.startTime = startTime; + this.testCount = testCount; - const startTimeFormatted = this.moment(this.startTime).format('M/D/YYYY h:mm:ss a'); + const startTimeFormatted = this.moment(this.startTime).format('M/D/YYYY h:mm:ss a'); - this.slack.sendMessage(`${emojis.rocket} ${'Starting TestCafe:'} ${bold(startTimeFormatted)}\n${emojis.computer} Running ${bold(testCount)} tests in: ${bold(userAgents)}\n`) - }, + this.slack.sendMessage(`${emojis.rocket} ${'Starting TestCafe:'} ${bold(startTimeFormatted)}\n${emojis.computer} Running ${bold(testCount)} tests in: ${bold(userAgents)}\n`) + }, - reportFixtureStart (name, path) { - this.currentFixtureName = name; + reportFixtureStart(name, path) { + this.currentFixtureName = name; - if (loggingLevel === loggingLevels.TEST) this.slack.addMessage(bold(this.currentFixtureName)); - }, + if (loggingLevel === loggingLevels.TEST) this.slack.addMessage(bold(this.currentFixtureName)); + }, - reportTestDone (name, testRunInfo) { - const hasErr = !!testRunInfo.errs.length; - let message = null; + reportTestDone(name, testRunInfo) { + const hasErr = !!testRunInfo.errs.length; + let message = null; - if (testRunInfo.skipped) { - message = `${emojis.fastForward} ${italics(name)} - ${bold('skipped')}`; - } else if (hasErr) { - message = `${emojis.fire} ${italics(name)} - ${bold('failed')}`; - this.renderErrors(testRunInfo.errs); - } else { - message = `${emojis.checkMark} ${italics(name)}` - } + if (testRunInfo.skipped) { + message = `${emojis.fastForward} ${italics(name)} - ${bold('skipped')}`; + } else if (hasErr) { + message = `${emojis.fire} ${italics(name)} - ${bold('failed')}`; + this.renderErrors(testRunInfo.errs); + } else { + message = `${emojis.checkMark} ${italics(name)}` + } - if (loggingLevel === loggingLevels.TEST) this.slack.addMessage(message); - }, + if (loggingLevel === loggingLevels.TEST) this.slack.addMessage(message); + }, - renderErrors(errors) { - errors.forEach((error, id) => { - this.slack.addErrorMessage(this.formatError(error, `${id + 1} `)); - }) - }, + renderErrors(errors) { + errors.forEach((error, id) => { + this.slack.addErrorMessage(this.formatError(error, `${id + 1} `)); + }) + }, - reportTaskDone (endTime, passed, warnings, result) { - const endTimeFormatted = this.moment(endTime).format('M/D/YYYY h:mm:ss a'); - const durationMs = endTime - this.startTime; - const durationFormatted = this.moment - .duration(durationMs) - .format('h[h] mm[m] ss[s]'); + reportTaskDone(endTime, passed, warnings, result) { + const endTimeFormatted = this.moment(endTime).format('M/D/YYYY h:mm:ss a'); + const durationMs = endTime - this.startTime; + const durationFormatted = this.moment + .duration(durationMs) + .format('h[h] mm[m] ss[s]'); - const finishedStr = `${emojis.finishFlag} Testing finished at ${bold(endTimeFormatted)}\n`; - const durationStr = `${emojis.stopWatch} Duration: ${bold(durationFormatted)}\n`; - let summaryStr = ''; + const finishedStr = `${emojis.finishFlag} Testing finished at ${bold(endTimeFormatted)}\n`; + const durationStr = `${emojis.stopWatch} Duration: ${bold(durationFormatted)}\n`; + let summaryStr = ''; - if (result.skippedCount) summaryStr += `${emojis.fastForward} ${bold(`${result.skippedCount} skipped`)}\n`; + if (result.skippedCount) summaryStr += `${emojis.fastForward} ${bold(`${result.skippedCount} skipped`)}\n`; - if (result.failedCount) { - summaryStr += `${emojis.noEntry} ${bold(`${result.failedCount}/${this.testCount} failed`)}` - } else { - summaryStr += `${emojis.checkMark} ${bold(`${result.passedCount}/${this.testCount} passed`)}` - } + if (result.failedCount) { + summaryStr += `${emojis.noEntry} ${bold(`${result.failedCount}/${this.testCount} failed`)}` + } else { + summaryStr += `${emojis.checkMark} ${bold(`${result.passedCount}/${this.testCount} passed`)}` + } - const message = `\n\n${finishedStr} ${durationStr} ${summaryStr}`; + const message = `\n\n${finishedStr} ${durationStr} ${summaryStr}`; - this.slack.addMessage(message); - this.slack.sendTestReport(this.testCount - passed); - } + this.slack.addMessage(message); + this.slack.sendTestReport(this.testCount - passed); } + } } diff --git a/test/test.js b/test/test.js index 0d7c2ad..d989a58 100644 --- a/test/test.js +++ b/test/test.js @@ -1,26 +1,26 @@ -var assert = require('assert'); -var normalizeNewline = require('normalize-newline'); -var read = require('read-file-relative').readSync; -var OS = require('os-family'); -var createReport = require('./utils/create-report'); +const assert = require('assert'); +const normalizeNewline = require('normalize-newline'); +const read = require('read-file-relative').readSync; +const OS = require('os-family'); +const createReport = require('./utils/create-report'); it('Should produce report with colors', function () { - var report = createReport(true); - var expectedFile = OS.win ? './data/report-with-colors-win.json' : './data/report-with-colors.json'; - var expected = JSON.parse(read(expectedFile)); + let report = createReport(true); + const expectedFile = OS.win ? './data/report-with-colors-win.json' : './data/report-with-colors.json'; + let expected = JSON.parse(read(expectedFile)); - report = normalizeNewline(report).trim(); - expected = normalizeNewline(expected).trim(); + report = normalizeNewline(report).trim(); + expected = normalizeNewline(expected).trim(); - // assert.strictEqual(report, expected); + // assert.strictEqual(report, expected); }); it('Should produce report without colors', function () { - var report = createReport(false); - var expected = read('./data/report-without-colors'); + let report = createReport(false); + let expected = read('./data/report-without-colors'); - report = normalizeNewline(report).trim(); - expected = normalizeNewline(expected).trim(); + report = normalizeNewline(report).trim(); + expected = normalizeNewline(expected).trim(); - // assert.strictEqual(report, expected); + // assert.strictEqual(report, expected); }); \ No newline at end of file diff --git a/test/utils/create-report.js b/test/utils/create-report.js index 315d119..5ff17c4 100644 --- a/test/utils/create-report.js +++ b/test/utils/create-report.js @@ -1,41 +1,41 @@ -var buildReporterPlugin = require('testcafe').embeddingUtils.buildReporterPlugin; -var pluginFactory = require('../../lib'); -var reporterTestCalls = require('./reporter-test-calls'); +const buildReporterPlugin = require('testcafe').embeddingUtils.buildReporterPlugin; +const pluginFactory = require('../../lib'); +const reporterTestCalls = require('./reporter-test-calls'); -module.exports = function createReport (withColors) { - var outStream = { - data: '', +module.exports = function createReport(withColors) { + let outStream = { + data: '', - write: function (text) { - this.data += text; - } - }; + write: function (text) { + this.data += text; + } + }; - var plugin = buildReporterPlugin(pluginFactory, outStream); + let plugin = buildReporterPlugin(pluginFactory, outStream); - plugin.chalk.enabled = !plugin.noColors && withColors; - plugin.symbols = { ok: '✓', err: '✖' }; + plugin.chalk.enabled = !plugin.noColors && withColors; + plugin.symbols = {ok: '✓', err: '✖'}; - // NOTE: disable errors coloring if we don't have custom - // error decorator. Default error colors may be prone to changing. - if (plugin.chalk.enabled && !pluginFactory().createErrorDecorator) { - var origFormatError = plugin.formatError; + // NOTE: disable errors coloring if we don't have custom + // error decorator. Default error colors may be prone to changing. + if (plugin.chalk.enabled && !pluginFactory().createErrorDecorator) { + let origFormatError = plugin.formatError; - plugin.formatError = function () { - plugin.chalk.enabled = false; + plugin.formatError = function () { + plugin.chalk.enabled = false; - var result = origFormatError.apply(plugin, arguments); + let result = origFormatError.apply(plugin, arguments); - plugin.chalk.enabled = true; + plugin.chalk.enabled = true; - return result; - }; - } + return result; + }; + } - reporterTestCalls.forEach(function (call) { - plugin[call.method].apply(plugin, call.args); - }); + reporterTestCalls.forEach(function (call) { + plugin[call.method].apply(plugin, call.args); + }); - // NOTE: mock stack entries - return outStream.data.replace(/\s*?\(.+?:\d+:\d+\)/g, ' (some-file:1:1)'); + // NOTE: mock stack entries + return outStream.data.replace(/\s*?\(.+?:\d+:\d+\)/g, ' (some-file:1:1)'); }; diff --git a/test/utils/reporter-test-calls.js b/test/utils/reporter-test-calls.js index ad671df..02d1ef8 100644 --- a/test/utils/reporter-test-calls.js +++ b/test/utils/reporter-test-calls.js @@ -1,180 +1,180 @@ -var TestRunErrorFormattableAdapter = require('testcafe').embeddingUtils.TestRunErrorFormattableAdapter; -var UncaughtErrorOnPage = require('testcafe').embeddingUtils.testRunErrors.UncaughtErrorOnPage; -var ActionElementNotFoundError = require('testcafe').embeddingUtils.testRunErrors.ActionElementNotFoundError; -var testCallsite = require('./test-callsite'); +const TestRunErrorFormattableAdapter = require('testcafe').embeddingUtils.TestRunErrorFormattableAdapter; +const UncaughtErrorOnPage = require('testcafe').embeddingUtils.testRunErrors.UncaughtErrorOnPage; +const ActionElementNotFoundError = require('testcafe').embeddingUtils.testRunErrors.ActionElementNotFoundError; +const testCallsite = require('./test-callsite'); -function makeErrors (errDescrs) { - return errDescrs.map(function (descr) { - return new TestRunErrorFormattableAdapter(descr.err, descr.metaInfo); - }); +function makeErrors(errDescrs) { + return errDescrs.map(function (descr) { + return new TestRunErrorFormattableAdapter(descr.err, descr.metaInfo); + }); } module.exports = [ - { - method: 'reportTaskStart', - args: [ - new Date('1970-01-01T00:00:00.000Z'), - [ - 'Chrome 41.0.2227 / Mac OS X 10.10.1', - 'Firefox 47 / Mac OS X 10.10.1' - ], - 6 - ] - }, - { - method: 'reportFixtureStart', - args: [ - 'First fixture', - './fixture1.js' - ] - }, - { - method: 'reportTestDone', - args: [ - 'First test in first fixture', - { - errs: [], - durationMs: 74000, - unstable: true, - screenshotPath: '/screenshots/1445437598847' - } - ] - }, - { - method: 'reportTestDone', - args: [ - 'Second test in first fixture', - { - // errs: [], - errs: makeErrors([ - { - - err: new UncaughtErrorOnPage('Some error', 'http://example.org'), + { + method: 'reportTaskStart', + args: [ + new Date('1970-01-01T00:00:00.000Z'), + [ + 'Chrome 41.0.2227 / Mac OS X 10.10.1', + 'Firefox 47 / Mac OS X 10.10.1' + ], + 6 + ] + }, + { + method: 'reportFixtureStart', + args: [ + 'First fixture', + './fixture1.js' + ] + }, + { + method: 'reportTestDone', + args: [ + 'First test in first fixture', + { + errs: [], + durationMs: 74000, + unstable: true, + screenshotPath: '/screenshots/1445437598847' + } + ] + }, + { + method: 'reportTestDone', + args: [ + 'Second test in first fixture', + { + // errs: [], + errs: makeErrors([ + { - metaInfo: { - userAgent: 'Chrome 41.0.2227 / Mac OS X 10.10.1', - screenshotPath: '/screenshots/1445437598847/errors', - callsite: testCallsite, - testRunState: 'inTest' - } - }, - { - err: new ActionElementNotFoundError({ apiFnChain: ['one', 'two', 'three'], apiFnIndex: 1 }), + err: new UncaughtErrorOnPage('Some error', 'http://example.org'), - metaInfo: { - userAgent: 'Firefox 47 / Mac OS X 10.10.1', - callsite: testCallsite, - testRunState: 'inTest' - } - } - ]), - - durationMs: 74000, - unstable: false, - screenshotPath: '/screenshots/1445437598847' - } - ] - }, - { - method: 'reportTestDone', - args: [ - 'Third test in first fixture', - { - errs: [], - durationMs: 74000, - unstable: false, - screenshotPath: null + metaInfo: { + userAgent: 'Chrome 41.0.2227 / Mac OS X 10.10.1', + screenshotPath: '/screenshots/1445437598847/errors', + callsite: testCallsite, + testRunState: 'inTest' } - ] - }, - { - method: 'reportFixtureStart', - args: [ - 'Second fixture', - './fixture2.js' - ] - }, - { - method: 'reportTestDone', - args: [ - 'First test in second fixture', - { - errs: [], - durationMs: 74000, - unstable: false, - screenshotPath: null - } - ] - }, - { - method: 'reportTestDone', - args: [ - 'Second test in second fixture', - { - errs: [], - durationMs: 74000, - unstable: false, - screenshotPath: null - } - ] - }, - { - method: 'reportTestDone', - args: [ - 'Third test in second fixture', - { - errs: [], - durationMs: 0, - unstable: false, - screenshotPath: null, - skipped: false + }, + { + err: new ActionElementNotFoundError({apiFnChain: ['one', 'two', 'three'], apiFnIndex: 1}), + + metaInfo: { + userAgent: 'Firefox 47 / Mac OS X 10.10.1', + callsite: testCallsite, + testRunState: 'inTest' } - ] - }, - { - method: 'reportFixtureStart', - args: [ - 'Third fixture', - './fixture3.js' - ] - }, - { - method: 'reportTestDone', - args: [ - 'First test in third fixture', - { - // errs: [], - errs: makeErrors([ - { - err: new ActionElementNotFoundError({ apiFnChain: ['one', 'two', 'three'], apiFnIndex: 1 }), + } + ]), - metaInfo: { - userAgent: 'Firefox 47 / Mac OS X 10.10.1', - callsite: testCallsite, - testRunState: 'inBeforeEach' - } - } - ]), + durationMs: 74000, + unstable: false, + screenshotPath: '/screenshots/1445437598847' + } + ] + }, + { + method: 'reportTestDone', + args: [ + 'Third test in first fixture', + { + errs: [], + durationMs: 74000, + unstable: false, + screenshotPath: null + } + ] + }, + { + method: 'reportFixtureStart', + args: [ + 'Second fixture', + './fixture2.js' + ] + }, + { + method: 'reportTestDone', + args: [ + 'First test in second fixture', + { + errs: [], + durationMs: 74000, + unstable: false, + screenshotPath: null + } + ] + }, + { + method: 'reportTestDone', + args: [ + 'Second test in second fixture', + { + errs: [], + durationMs: 74000, + unstable: false, + screenshotPath: null + } + ] + }, + { + method: 'reportTestDone', + args: [ + 'Third test in second fixture', + { + errs: [], + durationMs: 0, + unstable: false, + screenshotPath: null, + skipped: false + } + ] + }, + { + method: 'reportFixtureStart', + args: [ + 'Third fixture', + './fixture3.js' + ] + }, + { + method: 'reportTestDone', + args: [ + 'First test in third fixture', + { + // errs: [], + errs: makeErrors([ + { + err: new ActionElementNotFoundError({apiFnChain: ['one', 'two', 'three'], apiFnIndex: 1}), - durationMs: 74000, - unstable: true, - screenshotPath: null + metaInfo: { + userAgent: 'Firefox 47 / Mac OS X 10.10.1', + callsite: testCallsite, + testRunState: 'inBeforeEach' } - ] - }, - { - method: 'reportTaskDone', - args: [ - new Date('1970-01-01T00:15:25.000Z'), - 6, - [ - 'Was unable to take a screenshot due to an error.\n\nReferenceError: someVar is not defined', - 'Was unable to take a screenshot due to an error.\n\nReferenceError: someOtherVar is not defined', - 'Was unable to take screenshots because the screenshot directory is not specified. ' + - 'To specify it, use the "-s" or "--screenshots" command line option or the ' + - '"screenshots" method of the test runner in case you are using API.' - ] - ] - } + } + ]), + + durationMs: 74000, + unstable: true, + screenshotPath: null + } + ] + }, + { + method: 'reportTaskDone', + args: [ + new Date('1970-01-01T00:15:25.000Z'), + 6, + [ + 'Was unable to take a screenshot due to an error.\n\nReferenceError: someVar is not defined', + 'Was unable to take a screenshot due to an error.\n\nReferenceError: someOtherVar is not defined', + 'Was unable to take screenshots because the screenshot directory is not specified. ' + + 'To specify it, use the "-s" or "--screenshots" command line option or the ' + + '"screenshots" method of the test runner in case you are using API.' + ] + ] + } ]; diff --git a/test/utils/test-callsite.js b/test/utils/test-callsite.js index 610b7ff..f432769 100644 --- a/test/utils/test-callsite.js +++ b/test/utils/test-callsite.js @@ -1,13 +1,12 @@ var createCallsiteRecord = require('callsite-record'); -function someFunc () { - throw new Error('Hey ya!'); +function someFunc() { + throw new Error('Hey ya!'); } try { - someFunc(); -} -catch (err) { - module.exports = createCallsiteRecord(err); + someFunc(); +} catch (err) { + module.exports = createCallsiteRecord(err); } From 51feccc2be2faf52b9a99c8380e977c4fa184d2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81esek?= Date: Sun, 21 Apr 2019 00:45:41 +0200 Subject: [PATCH 11/14] Upgrade travis.yml --- .travis.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 99f0a28..b94627e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,14 @@ language: node_js node_js: - - stable - - v4 - - '0.12' - - '0.10' + - 10 + +cache: + yarn: true + directories: + - node_modules + +install: + - yarn + +script: + - yarn build From 6d4321392fe49298b7cd7988d53cb5ba445d63d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81esek?= Date: Sun, 21 Apr 2019 00:52:51 +0200 Subject: [PATCH 12/14] Add lib files.. --- lib/SlackMessage.js | 140 ++++++++++++++++++++++---------------------- lib/index.js | 102 ++++++++++++++++---------------- 2 files changed, 121 insertions(+), 121 deletions(-) diff --git a/lib/SlackMessage.js b/lib/SlackMessage.js index 7badfd7..6b1f1b4 100644 --- a/lib/SlackMessage.js +++ b/lib/SlackMessage.js @@ -1,7 +1,7 @@ 'use strict'; Object.defineProperty(exports, '__esModule', { - value: true + value: true }); var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); @@ -19,81 +19,81 @@ var _constLoggingLevels = require("./const/loggingLevels"); var _constLoggingLevels2 = _interopRequireDefault(_constLoggingLevels); var SlackMessage = (function () { - function SlackMessage() { - _classCallCheck(this, SlackMessage); + function SlackMessage() { + _classCallCheck(this, SlackMessage); - var slackNode = require('slack-node'); - this.slack = new slackNode(); - this.slack.setWebhook(_config2['default'].webhookUrl); - this.loggingLevel = _config2['default'].loggingLevel; - this.messages = []; - this.errorMessages = []; - } + var slackNode = require('slack-node'); + this.slack = new slackNode(); + this.slack.setWebhook(_config2['default'].webhookUrl); + this.loggingLevel = _config2['default'].loggingLevel; + this.messages = []; + this.errorMessages = []; + } - _createClass(SlackMessage, [{ - key: 'addMessage', - value: function addMessage(message) { - this.messages.push(message); - } - }, { - key: 'addErrorMessage', - value: function addErrorMessage(message) { - this.errorMessages.push(message); - } - }, { - key: 'sendMessage', - value: function sendMessage(message) { - var slackProperties = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + _createClass(SlackMessage, [{ + key: 'addMessage', + value: function addMessage(message) { + this.messages.push(message); + } + }, { + key: 'addErrorMessage', + value: function addErrorMessage(message) { + this.errorMessages.push(message); + } + }, { + key: 'sendMessage', + value: function sendMessage(message) { + var slackProperties = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - this.slack.webhook(Object.assign({ - channel: _config2['default'].channel, - username: _config2['default'].username, - text: message - }, slackProperties), function (err, response) { - if (!_config2['default'].quietMode) { - if (err) { - console.log('Unable to send a message to slack'); - console.log(response); - } else { - console.log('The following message is send to slack: \n ' + message); - } - } - }); - } - }, { - key: 'sendTestReport', - value: function sendTestReport(nrFailedTests) { - this.sendMessage(this.getTestReportMessage(), nrFailedTests > 0 && this.loggingLevel === _constLoggingLevels2['default'].TEST ? { - "attachments": [{ - color: 'danger', - text: nrFailedTests + ' test failed' - }] - } : null); + this.slack.webhook(Object.assign({ + channel: _config2['default'].channel, + username: _config2['default'].username, + text: message + }, slackProperties), function (err, response) { + if (!_config2['default'].quietMode) { + if (err) { + console.log('Unable to send a message to slack'); + console.log(response); + } else { + console.log('The following message is send to slack: \n ' + message); + } } - }, { - key: 'getTestReportMessage', - value: function getTestReportMessage() { - var message = this.getSlackMessage(); - var errorMessage = this.getErrorMessage(); + }); + } + }, { + key: 'sendTestReport', + value: function sendTestReport(nrFailedTests) { + this.sendMessage(this.getTestReportMessage(), nrFailedTests > 0 && this.loggingLevel === _constLoggingLevels2['default'].TEST ? { + "attachments": [{ + color: 'danger', + text: nrFailedTests + ' test failed' + }] + } : null); + } + }, { + key: 'getTestReportMessage', + value: function getTestReportMessage() { + var message = this.getSlackMessage(); + var errorMessage = this.getErrorMessage(); - if (errorMessage.length > 0 && this.loggingLevel === _constLoggingLevels2['default'].TEST) { - message = message + "\n\n\n```" + this.getErrorMessage() + '```'; - } - return message; - } - }, { - key: 'getErrorMessage', - value: function getErrorMessage() { - return this.errorMessages.join("\n\n\n"); - } - }, { - key: 'getSlackMessage', - value: function getSlackMessage() { - return this.messages.join("\n"); - } - }]); + if (errorMessage.length > 0 && this.loggingLevel === _constLoggingLevels2['default'].TEST) { + message = message + "\n\n\n```" + this.getErrorMessage() + '```'; + } + return message; + } + }, { + key: 'getErrorMessage', + value: function getErrorMessage() { + return this.errorMessages.join("\n\n\n"); + } + }, { + key: 'getSlackMessage', + value: function getSlackMessage() { + return this.messages.join("\n"); + } + }]); - return SlackMessage; + return SlackMessage; })(); exports['default'] = SlackMessage; diff --git a/lib/index.js b/lib/index.js index 82a70f1..2252f43 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,7 +1,7 @@ 'use strict'; Object.defineProperty(exports, '__esModule', { - value: true + value: true }); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } @@ -27,73 +27,73 @@ var _utilsTextFormatters = require('./utils/textFormatters'); var loggingLevel = _config2['default'].loggingLevel; exports['default'] = function () { - return { + return { - noColors: true, + noColors: true, - reportTaskStart: function reportTaskStart(startTime, userAgents, testCount) { - this.slack = new _SlackMessage2['default'](); - this.startTime = startTime; - this.testCount = testCount; + reportTaskStart: function reportTaskStart(startTime, userAgents, testCount) { + this.slack = new _SlackMessage2['default'](); + this.startTime = startTime; + this.testCount = testCount; - var startTimeFormatted = this.moment(this.startTime).format('M/D/YYYY h:mm:ss a'); + var startTimeFormatted = this.moment(this.startTime).format('M/D/YYYY h:mm:ss a'); - this.slack.sendMessage(_utilsEmojis2['default'].rocket + ' ' + 'Starting TestCafe:' + ' ' + (0, _utilsTextFormatters.bold)(startTimeFormatted) + '\n' + _utilsEmojis2['default'].computer + ' Running ' + (0, _utilsTextFormatters.bold)(testCount) + ' tests in: ' + (0, _utilsTextFormatters.bold)(userAgents) + '\n'); - }, + this.slack.sendMessage(_utilsEmojis2['default'].rocket + ' ' + 'Starting TestCafe:' + ' ' + (0, _utilsTextFormatters.bold)(startTimeFormatted) + '\n' + _utilsEmojis2['default'].computer + ' Running ' + (0, _utilsTextFormatters.bold)(testCount) + ' tests in: ' + (0, _utilsTextFormatters.bold)(userAgents) + '\n'); + }, - reportFixtureStart: function reportFixtureStart(name, path) { - this.currentFixtureName = name; + reportFixtureStart: function reportFixtureStart(name, path) { + this.currentFixtureName = name; - if (loggingLevel === _constLoggingLevels2['default'].TEST) this.slack.addMessage((0, _utilsTextFormatters.bold)(this.currentFixtureName)); - }, + if (loggingLevel === _constLoggingLevels2['default'].TEST) this.slack.addMessage((0, _utilsTextFormatters.bold)(this.currentFixtureName)); + }, - reportTestDone: function reportTestDone(name, testRunInfo) { - var hasErr = !!testRunInfo.errs.length; - var message = null; + reportTestDone: function reportTestDone(name, testRunInfo) { + var hasErr = !!testRunInfo.errs.length; + var message = null; - if (testRunInfo.skipped) { - message = _utilsEmojis2['default'].fastForward + ' ' + (0, _utilsTextFormatters.italics)(name) + ' - ' + (0, _utilsTextFormatters.bold)('skipped'); - } else if (hasErr) { - message = _utilsEmojis2['default'].fire + ' ' + (0, _utilsTextFormatters.italics)(name) + ' - ' + (0, _utilsTextFormatters.bold)('failed'); - this.renderErrors(testRunInfo.errs); - } else { - message = _utilsEmojis2['default'].checkMark + ' ' + (0, _utilsTextFormatters.italics)(name); - } + if (testRunInfo.skipped) { + message = _utilsEmojis2['default'].fastForward + ' ' + (0, _utilsTextFormatters.italics)(name) + ' - ' + (0, _utilsTextFormatters.bold)('skipped'); + } else if (hasErr) { + message = _utilsEmojis2['default'].fire + ' ' + (0, _utilsTextFormatters.italics)(name) + ' - ' + (0, _utilsTextFormatters.bold)('failed'); + this.renderErrors(testRunInfo.errs); + } else { + message = _utilsEmojis2['default'].checkMark + ' ' + (0, _utilsTextFormatters.italics)(name); + } - if (loggingLevel === _constLoggingLevels2['default'].TEST) this.slack.addMessage(message); - }, + if (loggingLevel === _constLoggingLevels2['default'].TEST) this.slack.addMessage(message); + }, - renderErrors: function renderErrors(errors) { - var _this = this; + renderErrors: function renderErrors(errors) { + var _this = this; - errors.forEach(function (error, id) { - _this.slack.addErrorMessage(_this.formatError(error, id + 1 + ' ')); - }); - }, + errors.forEach(function (error, id) { + _this.slack.addErrorMessage(_this.formatError(error, id + 1 + ' ')); + }); + }, - reportTaskDone: function reportTaskDone(endTime, passed, warnings, result) { - var endTimeFormatted = this.moment(endTime).format('M/D/YYYY h:mm:ss a'); - var durationMs = endTime - this.startTime; - var durationFormatted = this.moment.duration(durationMs).format('h[h] mm[m] ss[s]'); + reportTaskDone: function reportTaskDone(endTime, passed, warnings, result) { + var endTimeFormatted = this.moment(endTime).format('M/D/YYYY h:mm:ss a'); + var durationMs = endTime - this.startTime; + var durationFormatted = this.moment.duration(durationMs).format('h[h] mm[m] ss[s]'); - var finishedStr = _utilsEmojis2['default'].finishFlag + ' Testing finished at ' + (0, _utilsTextFormatters.bold)(endTimeFormatted) + '\n'; - var durationStr = _utilsEmojis2['default'].stopWatch + ' Duration: ' + (0, _utilsTextFormatters.bold)(durationFormatted) + '\n'; - var summaryStr = ''; + var finishedStr = _utilsEmojis2['default'].finishFlag + ' Testing finished at ' + (0, _utilsTextFormatters.bold)(endTimeFormatted) + '\n'; + var durationStr = _utilsEmojis2['default'].stopWatch + ' Duration: ' + (0, _utilsTextFormatters.bold)(durationFormatted) + '\n'; + var summaryStr = ''; - if (result.skippedCount) summaryStr += _utilsEmojis2['default'].fastForward + ' ' + (0, _utilsTextFormatters.bold)(result.skippedCount + ' skipped') + '\n'; + if (result.skippedCount) summaryStr += _utilsEmojis2['default'].fastForward + ' ' + (0, _utilsTextFormatters.bold)(result.skippedCount + ' skipped') + '\n'; - if (result.failedCount) { - summaryStr += _utilsEmojis2['default'].noEntry + ' ' + (0, _utilsTextFormatters.bold)(result.failedCount + '/' + this.testCount + ' failed'); - } else { - summaryStr += _utilsEmojis2['default'].checkMark + ' ' + (0, _utilsTextFormatters.bold)(result.passedCount + '/' + this.testCount + ' passed'); - } + if (result.failedCount) { + summaryStr += _utilsEmojis2['default'].noEntry + ' ' + (0, _utilsTextFormatters.bold)(result.failedCount + '/' + this.testCount + ' failed'); + } else { + summaryStr += _utilsEmojis2['default'].checkMark + ' ' + (0, _utilsTextFormatters.bold)(result.passedCount + '/' + this.testCount + ' passed'); + } - var message = '\n\n' + finishedStr + ' ' + durationStr + ' ' + summaryStr; + var message = '\n\n' + finishedStr + ' ' + durationStr + ' ' + summaryStr; - this.slack.addMessage(message); - this.slack.sendTestReport(this.testCount - passed); - } - }; + this.slack.addMessage(message); + this.slack.sendTestReport(this.testCount - passed); + } + }; }; module.exports = exports['default']; \ No newline at end of file From 64770e63b6bac4bbbfa01c302135f7d7b863dd37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81esek?= Date: Sun, 21 Apr 2019 00:53:16 +0200 Subject: [PATCH 13/14] Change package version to 0.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f7da10c..e7997eb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "testcafe-reporter-slack", - "version": "0.0.7", + "version": "0.1.0", "description": "TestCafe slack reporter plugin.", "repository": { "type": "git", From 36abaec27e7a2505d975a88d722501545beca538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81esek?= Date: Thu, 25 Apr 2019 13:42:20 +0200 Subject: [PATCH 14/14] Rename LoggingLevels file (#6) --- lib/SlackMessage.js | 2 +- lib/config.js | 2 +- lib/const/LoggingLevels.js | 4 ++-- src/SlackMessage.js | 2 +- src/config.js | 4 ++-- src/const/LoggingLevels.js | 6 ++++++ src/const/loggingLevels.js | 6 ------ src/index.js | 8 ++++---- 8 files changed, 17 insertions(+), 17 deletions(-) create mode 100644 src/const/LoggingLevels.js delete mode 100644 src/const/loggingLevels.js diff --git a/lib/SlackMessage.js b/lib/SlackMessage.js index 6b1f1b4..31be631 100644 --- a/lib/SlackMessage.js +++ b/lib/SlackMessage.js @@ -14,7 +14,7 @@ var _config = require('./config'); var _config2 = _interopRequireDefault(_config); -var _constLoggingLevels = require("./const/loggingLevels"); +var _constLoggingLevels = require("./const/LoggingLevels"); var _constLoggingLevels2 = _interopRequireDefault(_constLoggingLevels); diff --git a/lib/config.js b/lib/config.js index 4c2cd11..b73f351 100644 --- a/lib/config.js +++ b/lib/config.js @@ -10,7 +10,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'd var _utilsFileHelpers = require('./utils/fileHelpers'); -var _constLoggingLevels = require('./const/loggingLevels'); +var _constLoggingLevels = require('./const/LoggingLevels'); var _constLoggingLevels2 = _interopRequireDefault(_constLoggingLevels); diff --git a/lib/const/LoggingLevels.js b/lib/const/LoggingLevels.js index e3614df..275b2ad 100644 --- a/lib/const/LoggingLevels.js +++ b/lib/const/LoggingLevels.js @@ -3,10 +3,10 @@ Object.defineProperty(exports, '__esModule', { value: true }); -var loggingLevels = { +var LoggingLevels = { TEST: 'TEST', SUMMARY: 'SUMMARY' }; -exports['default'] = loggingLevels; +exports['default'] = LoggingLevels; module.exports = exports['default']; \ No newline at end of file diff --git a/src/SlackMessage.js b/src/SlackMessage.js index 011d29b..b7f75e7 100644 --- a/src/SlackMessage.js +++ b/src/SlackMessage.js @@ -1,5 +1,5 @@ import config from './config'; -import loggingLevels from "./const/loggingLevels"; +import loggingLevels from "./const/LoggingLevels"; export default class SlackMessage { constructor() { diff --git a/src/config.js b/src/config.js index de68bfd..5f801b6 100644 --- a/src/config.js +++ b/src/config.js @@ -5,13 +5,13 @@ import { isFileExists, readFile } from './utils/fileHelpers'; -import loggingLevels from './const/loggingLevels'; +import LoggingLevels from './const/LoggingLevels'; const defaultConfig = { webhookUrl: process.env.TESTCAFE_SLACK_WEBHOOK || 'https://hooks.slack.com/services/*****', channel: process.env.TESTCAFE_SLACK_CHANNEL || '#testcafe', username: process.env.TESTCAFE_SLACK_USERNAME || 'testcafebot', - loggingLevel: process.env.TESTCAFE_SLACK_LOGGING_LEVEL || loggingLevels.TEST, + loggingLevel: process.env.TESTCAFE_SLACK_LOGGING_LEVEL || LoggingLevels.TEST, quietMode: process.env.TESTCAFE_SLACK_QUIET_MODE || false }; diff --git a/src/const/LoggingLevels.js b/src/const/LoggingLevels.js new file mode 100644 index 0000000..4ae8b25 --- /dev/null +++ b/src/const/LoggingLevels.js @@ -0,0 +1,6 @@ +const LoggingLevels = { + TEST: 'TEST', + SUMMARY: 'SUMMARY' +}; + +export default LoggingLevels; diff --git a/src/const/loggingLevels.js b/src/const/loggingLevels.js deleted file mode 100644 index 070b9ba..0000000 --- a/src/const/loggingLevels.js +++ /dev/null @@ -1,6 +0,0 @@ -const loggingLevels = { - TEST: 'TEST', - SUMMARY: 'SUMMARY' -}; - -export default loggingLevels; diff --git a/src/index.js b/src/index.js index ec7c2ea..29ae6a7 100644 --- a/src/index.js +++ b/src/index.js @@ -1,10 +1,10 @@ import config from './config'; import SlackMessage from './SlackMessage'; -import loggingLevels from './const/LoggingLevels'; +import LoggingLevels from './const/LoggingLevels'; import emojis from './utils/emojis'; import { bold, italics } from './utils/textFormatters'; -const {loggingLevel} = config; +const { loggingLevel } = config; export default function () { return { @@ -24,7 +24,7 @@ export default function () { reportFixtureStart(name, path) { this.currentFixtureName = name; - if (loggingLevel === loggingLevels.TEST) this.slack.addMessage(bold(this.currentFixtureName)); + if (loggingLevel === LoggingLevels.TEST) this.slack.addMessage(bold(this.currentFixtureName)); }, reportTestDone(name, testRunInfo) { @@ -40,7 +40,7 @@ export default function () { message = `${emojis.checkMark} ${italics(name)}` } - if (loggingLevel === loggingLevels.TEST) this.slack.addMessage(message); + if (loggingLevel === LoggingLevels.TEST) this.slack.addMessage(message); }, renderErrors(errors) {