feat(logging): Display failed test console logs in default mode

This commit is contained in:
2025-05-15 19:40:46 +00:00
parent 553d5f0df7
commit 42cd08eb1c
7 changed files with 328 additions and 38 deletions

View File

@@ -18,6 +18,8 @@ export class TapParser {
testStatusRegex = /(ok|not\sok)\s([0-9]+)\s-\s(.*)\s#\stime=(.*)ms$/;
activeTapTestResult: TapTestResult;
collectingErrorDetails: boolean = false;
currentTestError: string[] = [];
pretaskRegex = /^::__PRETASK:(.*)$/;
@@ -91,6 +93,9 @@ export class TapParser {
this.logger.testResult(testSubject, true, testDuration);
}
} else {
// Start collecting error details for failed test
this.collectingErrorDetails = true;
this.currentTestError = [];
if (this.logger) {
this.logger.testResult(testSubject, false, testDuration);
}
@@ -101,13 +106,43 @@ export class TapParser {
if (this.activeTapTestResult) {
this.activeTapTestResult.addLogLine(logLine);
}
if (this.logger) {
// This is console output from the test file, not TAP protocol
this.logger.testConsoleOutput(logLine);
// Check if we're collecting error details
if (this.collectingErrorDetails) {
// Check if this line is an error detail (starts with Error: or has stack trace characteristics)
if (logLine.trim().startsWith('Error:') || logLine.trim().match(/^\s*at\s/)) {
this.currentTestError.push(logLine);
} else if (this.currentTestError.length > 0) {
// End of error details, show the error
const errorMessage = this.currentTestError.join('\n');
if (this.logger) {
this.logger.testErrorDetails(errorMessage);
}
this.collectingErrorDetails = false;
this.currentTestError = [];
}
}
// Don't output TAP error details as console output when we're collecting them
if (!this.collectingErrorDetails || (!logLine.trim().startsWith('Error:') && !logLine.trim().match(/^\s*at\s/))) {
if (this.logger) {
// This is console output from the test file, not TAP protocol
this.logger.testConsoleOutput(logLine);
}
}
}
if (this.activeTapTestResult && this.activeTapTestResult.testSettled) {
// Ensure any pending error is shown before settling the test
if (this.collectingErrorDetails && this.currentTestError.length > 0) {
const errorMessage = this.currentTestError.join('\n');
if (this.logger) {
this.logger.testErrorDetails(errorMessage);
}
this.collectingErrorDetails = false;
this.currentTestError = [];
}
this.testStore.push(this.activeTapTestResult);
this._getNewTapTestResult();
}