feat: improves error handling

This commit is contained in:
Nuno Maduro
2023-02-20 17:28:33 +00:00
parent ba1f2df40b
commit 09644640bf
3 changed files with 22 additions and 12 deletions

View File

@ -43,7 +43,7 @@ final class KernelDump
@ob_clean(); // @phpstan-ignore-line @ob_clean(); // @phpstan-ignore-line
if ($this->buffer !== '') { if ($this->buffer !== '') {
$this->flush('INFO'); $this->flush();
} }
} }
@ -52,36 +52,42 @@ final class KernelDump
*/ */
public function shutdown(): void public function shutdown(): void
{ {
@ob_clean(); // @phpstan-ignore-line $this->disable();
if ($this->buffer !== '') {
$this->flush('ERROR');
}
} }
/** /**
* Flushes the buffer. * Flushes the buffer.
*/ */
private function flush(string $type): void private function flush(): void
{ {
View::renderUsing($this->output); View::renderUsing($this->output);
if ($this->isOpeningHeadline($this->buffer)) { if ($this->isOpeningHeadline($this->buffer)) {
$this->buffer = implode(PHP_EOL, array_slice(explode(PHP_EOL, $this->buffer), 2)); $this->buffer = implode(PHP_EOL, array_slice(explode(PHP_EOL, $this->buffer), 2));
} }
$type = 'INFO';
if ($this->isInternalError($this->buffer)) { if ($this->isInternalError($this->buffer)) {
$type = 'ERROR';
$this->buffer = str_replace('An error occurred inside PHPUnit.', '', $this->buffer); $this->buffer = str_replace('An error occurred inside PHPUnit.', '', $this->buffer);
} }
$this->buffer = trim($this->buffer); $this->buffer = trim($this->buffer);
$this->buffer = rtrim($this->buffer, '.').'.'; $this->buffer = rtrim($this->buffer, '.').'.';
$lines = explode(PHP_EOL, $this->buffer);
$lines = array_reverse($lines);
$firstLine = array_pop($lines);
$lines = array_reverse($lines);
View::render('components.badge', [ View::render('components.badge', [
'type' => $type, 'type' => $type,
'content' => $this->buffer, 'content' => $firstLine,
]); ]);
$this->output->writeln($lines);
$this->buffer = ''; $this->buffer = '';
} }

View File

@ -6,6 +6,7 @@ namespace Pest;
use NunoMaduro\Collision\Writer; use NunoMaduro\Collision\Writer;
use Pest\Support\Container; use Pest\Support\Container;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\OutputInterface;
use Throwable; use Throwable;
use Whoops\Exception\Inspector; use Whoops\Exception\Inspector;
@ -39,7 +40,11 @@ final class Panic
private function handle(): void private function handle(): void
{ {
/** @var OutputInterface $output */ /** @var OutputInterface $output */
$output = Container::getInstance()->get(OutputInterface::class); try {
$output = Container::getInstance()->get(OutputInterface::class);
} catch (Throwable) {
$output = new ConsoleOutput();
}
if ($this->throwable instanceof Contracts\Panicable) { if ($this->throwable instanceof Contracts\Panicable) {
$this->throwable->render($output); $this->throwable->render($output);
@ -51,7 +56,6 @@ final class Panic
$inspector = new Inspector($this->throwable); $inspector = new Inspector($this->throwable);
$output->writeln('');
$writer->write($inspector); $writer->write($inspector);
$output->writeln(''); $output->writeln('');

View File

@ -91,7 +91,7 @@ final class TestSuite
} }
if (! self::$instance instanceof self) { if (! self::$instance instanceof self) {
throw new InvalidPestCommand(); Panic::with(new InvalidPestCommand());
} }
return self::$instance; return self::$instance;