', $index, $index, $duration, $index, $index, $index, $index, $index, $duration, ); } file_put_contents($junitPath, "".implode('', $testcases).''); $parsed = TestLaneReport::parseJUnit($junitPath, 'junit'); expect($parsed['slowestEntries'])->toHaveCount(10) ->and($parsed['slowestEntries'][0]['durationSeconds'])->toBeGreaterThanOrEqual($parsed['slowestEntries'][9]['durationSeconds']) ->and($parsed['durationsByFile'])->toHaveCount(12); }); it('builds a report payload and writes the summary plus budget artifacts under a target directory', function (): void { $artifactDirectory = 'storage/logs/test-lanes-test'; $report = TestLaneReport::buildReport( laneId: 'junit', wallClockSeconds: 24.5, slowestEntries: array_map( static fn (int $index): array => [ 'subject' => sprintf('tests/Feature/Fake/Fake%dTest.php', $index), 'durationSeconds' => 1 + ($index / 10), 'laneId' => 'junit', ], range(1, 10), ), durationsByFile: [ 'tests/Feature/OpsUx/OperateHubShellTest.php' => 9.8, 'tests/Feature/Guards/ActionSurfaceContractTest.php' => 4.4, ], ); $written = TestLaneReport::writeArtifacts('junit', $report, null, $artifactDirectory); expect($report)->toHaveKeys([ 'laneId', 'finishedAt', 'wallClockSeconds', 'budgetThresholdSeconds', 'budgetBaselineSource', 'budgetEnforcement', 'budgetLifecycleState', 'budgetStatus', 'slowestEntries', 'familyBudgetEvaluations', 'artifacts', ]) ->and($report['slowestEntries'])->toHaveCount(10) ->and($written['summary'])->toStartWith($artifactDirectory.'/') ->and($written['budget'])->toStartWith($artifactDirectory.'/') ->and(file_exists(base_path($written['summary'])))->toBeTrue() ->and(file_exists(base_path($written['budget'])))->toBeTrue(); });