UNPKG

@sprucelabs/spruce-cli

Version:

Command line interface for building Spruce skills.

148 lines 5.34 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const test_utils_1 = require("@sprucelabs/test-utils"); const chalk_1 = __importDefault(require("chalk")); const duration_utility_1 = __importDefault(require("../../utilities/duration.utility")); class TestLogItemGenerator { startTimes = {}; testRunnerStatus; generateLogItemForFile(file, status) { this.testRunnerStatus = status; let logContent = ''; const duration = this.calculateDurationInMsForFile(file); logContent += `${this.generateStatusBlock(file.status)} ${file.path}${duration ? ` ${this.generateDuration(file.status, duration)}` : ''}\n`; if (file.tests) { file.tests.forEach((test) => { const bullet = this.bulletBasedOnStatus(test.status); logContent += ` ${bullet} ^-${test.name}^ ${this.generateDuration(test.status, test.duration)}\n`; }); } if (file.status === 'running') { const pendingKey = `${file.path}-pending-${file.tests?.length ?? 0}`; logContent += ` ^-${'Running next test... ⚡️⚡️⚡️'}^ ${this.generateDuration('running', this.calculateDurationInMs(pendingKey))}\n`; } return logContent; } generateDuration(status, duration) { if (duration === 0) { return ''; } const durationColor = this.colorBasedOnStatus(status); return `^${durationColor}(${duration_utility_1.default.msToFriendly(duration)})^`; } bulletBasedOnStatus(status) { let bullet = 'y'; switch (status) { case 'running': bullet = '^g(running)^'; break; case 'passed': bullet = '^g√^'; break; case 'failed': bullet = '^rx^'; break; case 'pending': case 'skipped': bullet = '^y(skipped)^'; break; case 'todo': bullet = '^y(todo)^'; break; default: bullet = '??'; break; } return bullet; } calculateDurationInMsForFile(file) { if (file.status !== 'running' && file.tests) { return file.tests.reduce((time, test) => { time += test.duration; return time; }, 0); } const key = file.path; return this.calculateDurationInMs(key); } calculateDurationInMs(key) { if (!this.startTimes[key]) { this.startTimes[key] = new Date().getTime(); } const delta = new Date().getTime() - this.startTimes[key]; return delta; } generateErrorLogItemForFile(file) { let errorContent = ''; file.tests?.forEach((test) => { test.errorMessages?.forEach((message) => { const cleaned = message ?? test_utils_1.StackCleaner.clean(message); errorContent += ` ${chalk_1.default.red(file.path)}\n`; errorContent += ` - ${chalk_1.default.red(test.name)}\n\n`; errorContent += cleaned.replace(/\n+ {4}at/i, '\n\n\n at') + '\n\n\n'; }); }); if (!errorContent && file.errorMessage) { errorContent += `${chalk_1.default.red(file.path)}\n`; errorContent += file.errorMessage + '\n\n\n'; } return errorContent; } resetStartTimes() { this.startTimes = {}; } generateStatusBlock(status) { const bgColor = this.colorBasedOnStatus(status); let statusLabel = status; let color = 'k'; let padding = 10; switch (status) { case 'passed': padding = 11; color = 'w'; break; case 'failed': padding = 11; color = 'w'; break; } if (status === 'running' && this.testRunnerStatus === 'stopped') { statusLabel = 'stopped'; color = 'w'; } return `^b^#^${bgColor}^${color}^+${this.centerStringWithSpaces(statusLabel, padding)}^`; } colorBasedOnStatus(status) { let color = 'y'; switch (status) { case 'passed': color = 'g'; break; case 'failed': color = 'r'; break; } if (status === 'running' && this.testRunnerStatus === 'stopped') { color = 'b'; } return color; } centerStringWithSpaces(text, numberOfSpaces) { text = text.trim(); let l = text.length; let w2 = Math.floor(numberOfSpaces / 2); let l2 = Math.floor(l / 2); let s = new Array(w2 - l2 + 1).join(' '); text = s + text + s; if (text.length < numberOfSpaces) { text += new Array(numberOfSpaces - text.length + 1).join(' '); } return text; } } exports.default = TestLogItemGenerator; //# sourceMappingURL=TestLogItemGenerator.js.map