From 36dd362d456c084cd7c88921715f1fb2c2236473 Mon Sep 17 00:00:00 2001 From: Guillaume Chau Date: Sun, 19 Dec 2021 15:10:22 +0100 Subject: [PATCH] feat: redirect console --- packages/peeky-runner/src/message.ts | 1 + packages/peeky-runner/src/runner.ts | 8 ++++++ packages/peeky-runner/src/runtime/console.ts | 26 +++++++++++++++++++ .../src/runtime/global-context.ts | 12 +++++++++ .../peeky-runner/src/runtime/run-tests.ts | 8 ++++++ packages/peeky-runner/src/runtime/setup.ts | 3 +++ 6 files changed, 58 insertions(+) create mode 100644 packages/peeky-runner/src/runtime/console.ts create mode 100644 packages/peeky-runner/src/runtime/global-context.ts diff --git a/packages/peeky-runner/src/message.ts b/packages/peeky-runner/src/message.ts index acea325..fa35261 100644 --- a/packages/peeky-runner/src/message.ts +++ b/packages/peeky-runner/src/message.ts @@ -9,6 +9,7 @@ export interface WorkerRemoteMethods { onTestError: (suiteId: string, testId: string, duration: number, error: TestErrorData) => void onTestSuccess: (suiteId: string, testId: string, duration: number) => void transform: (id: string) => Promise + onLog: (suiteId: string, testId: string, type: 'stdout' | 'stderr', text: string) => void } export interface TestErrorData { diff --git a/packages/peeky-runner/src/runner.ts b/packages/peeky-runner/src/runner.ts index e339790..b57de33 100644 --- a/packages/peeky-runner/src/runner.ts +++ b/packages/peeky-runner/src/runner.ts @@ -76,6 +76,14 @@ export async function setupRunner (options: RunnerOptions) { const test = suite.tests.find(t => t.id === testId) consola.log(chalk.green(`${chalk.bgGreenBright.black.bold(' PASS ')} ${suite.title} › ${chalk.bold(test.title)} ${chalk.grey(`(${formatDurationToString(duration)})`)}`)) }, + + onLog: (suiteId, testId, type, text) => { + const suite = suiteMap[suiteId] + const test = suite?.tests.find(t => t.id === testId) + consola.log(chalk.dim(`\n[${type}] ${test ? `${suite.title} › ${chalk.bold(test.title)}` : 'unknown test'}\n`)) + process[type].write(text) + process[type].write('\n') + }, }, handleMessage) const result = await pool.run({ diff --git a/packages/peeky-runner/src/runtime/console.ts b/packages/peeky-runner/src/runtime/console.ts new file mode 100644 index 0000000..5c5dab2 --- /dev/null +++ b/packages/peeky-runner/src/runtime/console.ts @@ -0,0 +1,26 @@ +import { Console } from 'console' +import { Writable } from 'stream' +import { currentSuite, currentTest } from './global-context.js' +import { toMainThread } from './message.js' + +export function setupConsole () { + function createWritable (type: 'stdout' | 'stderr') { + return new Writable({ + write: (chunk, enconding, callback) => { + toMainThread().onLog(currentSuite?.id, currentTest?.id, type, String(chunk)) + callback() + }, + }) + } + const stdout = createWritable('stdout') + const stderr = createWritable('stderr') + + const console = new Console({ + stdout, + stderr, + colorMode: true, + groupIndentation: 2, + }) + + globalThis.console = console +} diff --git a/packages/peeky-runner/src/runtime/global-context.ts b/packages/peeky-runner/src/runtime/global-context.ts new file mode 100644 index 0000000..42a1bae --- /dev/null +++ b/packages/peeky-runner/src/runtime/global-context.ts @@ -0,0 +1,12 @@ +import { Test, TestSuite } from '../types.js' + +export let currentSuite: TestSuite +export let currentTest: Test + +export function setCurrentSuite (suite: TestSuite) { + currentSuite = suite +} + +export function setCurrentTest (test: Test) { + currentTest = test +} diff --git a/packages/peeky-runner/src/runtime/run-tests.ts b/packages/peeky-runner/src/runtime/run-tests.ts index b93c0c6..aadffbf 100644 --- a/packages/peeky-runner/src/runtime/run-tests.ts +++ b/packages/peeky-runner/src/runtime/run-tests.ts @@ -1,12 +1,15 @@ import { basename } from 'path' import { performance } from 'perf_hooks' import type { Context, Test } from '../types' +import { setCurrentSuite, setCurrentTest } from './global-context.js' import { toMainThread } from './message.js' export async function runTests (ctx: Context) { const { default: sinon } = await import('sinon') for (const suite of ctx.suites) { + setCurrentSuite(suite) + let testsToRun: Test[] const onlyTests = suite.tests.filter(t => t.flag === 'only') if (onlyTests.length) { @@ -35,6 +38,7 @@ export async function runTests (ctx: Context) { } for (const test of testsToRun) { + setCurrentTest(test) sinon.restore() for (const handler of suite.beforeEachHandlers) { @@ -65,6 +69,8 @@ export async function runTests (ctx: Context) { for (const handler of suite.afterEachHandlers) { await handler() } + + setCurrentTest(null) } for (const handler of suite.afterAllHandlers) { @@ -83,5 +89,7 @@ export async function runTests (ctx: Context) { testErrors: suite.testErrors, otherErrors: suite.otherErrors, }, performance.now() - suiteTime) + + setCurrentSuite(null) } } diff --git a/packages/peeky-runner/src/runtime/setup.ts b/packages/peeky-runner/src/runtime/setup.ts index d5665f1..44738da 100644 --- a/packages/peeky-runner/src/runtime/setup.ts +++ b/packages/peeky-runner/src/runtime/setup.ts @@ -1,4 +1,5 @@ import { PeekyConfig, setupConfigLoader } from '@peeky/config' +import { setupConsole } from './console.js' let initialized = false export let baseConfig: PeekyConfig @@ -12,5 +13,7 @@ export async function setupWorker () { await configLoader.destroy() baseConfig = config + setupConsole() + initialized = true }