From 190ade63bf2e08d4ec2eaebe2127c357c412b24c Mon Sep 17 00:00:00 2001 From: Caleb White Date: Mon, 10 Aug 2026 22:19:07 -0500 Subject: [PATCH] fix(tia): suppress PHPUnit XML coverage during recording When phpunit.xml has and sections, PHPUnit auto-initializes its code coverage driver which takes over xdebug's coverage APIs. TIA's recorder then gets empty data from xdebug_get_code_coverage(), resulting in zero recorded edges and no graph being saved. Inject --no-coverage into the arguments when TIA enters its own recording mode (not piggybacking on an explicit coverage report). This tells PHPUnit to ignore XML-configured coverage reports, leaving xdebug free for TIA's per-test recording. Having and in phpunit.xml is standard for any project that generates coverage reports. Without this fix, users must manually pass --no-coverage alongside --tia, which is an unnecessary footgun. --- src/Plugins/Tia.php | 4 +++ tests/Features/Tia/CoveragePiggyback.php | 39 ++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/Plugins/Tia.php b/src/Plugins/Tia.php index dda0f52de..3e03f156b 100644 --- a/src/Plugins/Tia.php +++ b/src/Plugins/Tia.php @@ -1238,6 +1238,10 @@ private function enterRecordMode(array $arguments): array return $arguments; } + if (! $this->piggybackCoverage && ! in_array('--no-coverage', $arguments, true)) { + $arguments[] = '--no-coverage'; + } + if (Parallel::isEnabled()) { $this->purgeWorkerPartials(); diff --git a/tests/Features/Tia/CoveragePiggyback.php b/tests/Features/Tia/CoveragePiggyback.php index 9b7319eab..a28b2280a 100644 --- a/tests/Features/Tia/CoveragePiggyback.php +++ b/tests/Features/Tia/CoveragePiggyback.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use Pest\Support\Coverage; use Tests\Fixtures\Tia\Project; afterEach(function (): void { @@ -39,6 +40,44 @@ ->and($graph['files'])->toContain('app/Calculator.php'); })->skipOnWindows(); +test('xml-configured coverage does not prevent tia recording', function (): void { + $project = Project::make('master'); + + $project->write('phpunit.xml', <<<'XML_WRAP' + + + + + ./tests + + + + + + + + + + ./app + + + + XML_WRAP); + + $result = $project->pest('--tia'); + + expect($result->exitCode)->toBe(0, $result->describe()) + ->and($project->graphExists())->toBeTrue() + ->and(array_keys($project->graph()['edges']))->toEqualCanonicalizing(array_keys(Project::EDGES)); +})->skipOnWindows()->skip(! Coverage::isAvailable(), 'Coverage is not available'); + test('a coverage report leaves the edges of an existing graph alone', function (): void { $project = Project::make('master'); $project->seed('master');