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

@@ -40,6 +40,8 @@ export class TsTestLogger {
private fileResults: TestFileResult[] = [];
private currentFileResult: TestFileResult | null = null;
private currentTestLogFile: string | null = null;
private currentTestLogs: string[] = []; // Buffer for current test logs
private currentTestFailed: boolean = false;
constructor(options: LogOptions = {}) {
this.options = options;
@@ -145,6 +147,10 @@ export class TsTestLogger {
tests: []
};
// Reset test-specific state
this.currentTestLogs = [];
this.currentTestFailed = false;
// Only set up test log file if --logfile option is specified
if (this.options.logFile) {
const baseFilename = path.basename(filename, '.ts');
@@ -179,6 +185,7 @@ export class TsTestLogger {
this.currentFileResult.passed++;
} else {
this.currentFileResult.failed++;
this.currentTestFailed = true;
}
this.currentFileResult.duration += duration;
}
@@ -188,6 +195,14 @@ export class TsTestLogger {
return;
}
// If test failed and we have buffered logs, show them now
if (!passed && this.currentTestLogs.length > 0 && !this.options.verbose) {
this.log(this.format(' 📋 Console output from failed test:', 'yellow'));
this.currentTestLogs.forEach(logMessage => {
this.log(this.format(` ${logMessage}`, 'dim'));
});
}
const icon = passed ? '✅' : '❌';
const color = passed ? 'green' : 'red';
@@ -199,6 +214,9 @@ export class TsTestLogger {
this.log(this.format(` ${error}`, 'red'));
}
}
// Clear logs after each test
this.currentTestLogs = [];
}
testFileEnd(passed: number, failed: number, duration: number) {
@@ -242,9 +260,12 @@ export class TsTestLogger {
testConsoleOutput(message: string) {
if (this.options.json) return;
// Show console output from test files only in verbose mode
// In verbose mode, show console output immediately
if (this.options.verbose) {
this.log(this.format(` ${message}`, 'dim'));
} else {
// In non-verbose mode, buffer the logs
this.currentTestLogs.push(message);
}
// Always log to test file if --logfile is specified
@@ -267,6 +288,26 @@ export class TsTestLogger {
}
}
// Test error details display
testErrorDetails(errorMessage: string) {
if (this.options.json) {
this.logJson({ event: 'testError', error: errorMessage });
return;
}
if (!this.options.quiet) {
this.log(this.format(' Error details:', 'red'));
errorMessage.split('\n').forEach(line => {
this.log(this.format(` ${line}`, 'red'));
});
}
// Always log to test file if --logfile is specified
if (this.currentTestLogFile) {
this.logToTestFile(` Error: ${errorMessage}`);
}
}
// Final summary
summary() {
const totalDuration = Date.now() - this.startTime;