makePublisher(), bridgeToken: 'devtoken', mercureUrl: 'http://127.0.0.1:8765/.well-known/mercure', mercurePublisherKey: 'devkey', mercureSubscriberKey: 'devkey', ); $tester = new CommandTester($command); $exit = $tester->execute([]); self::assertSame(0, $exit); $display = $tester->getDisplay(); self::assertStringContainsString('All checks passed', $display); self::assertStringNotContainsString('FAIL', $display); } public function testFailsAndShowsHintsWhenEnvIsMissing(): void { $command = new BridgeDoctorCommand( publisher: $this->makePublisher(), bridgeToken: '', mercureUrl: '', mercurePublisherKey: '', mercureSubscriberKey: '', ); $tester = new CommandTester($command); $exit = $tester->execute([]); self::assertSame(1, $exit); $display = $tester->getDisplay(); self::assertStringContainsString('BRIDGE_TOKEN env set', $display); self::assertStringContainsString('MERCURE_URL env set', $display); self::assertStringContainsString('Set BRIDGE_TOKEN in .env.local', $display); self::assertStringContainsString('Some checks failed', $display); } public function testConnectOptionFailsClosedAgainstAnUnreachableUrl(): void { $command = new BridgeDoctorCommand( publisher: $this->makePublisher(), bridgeToken: 'devtoken', mercureUrl: 'http://127.0.0.1:8765/.well-known/mercure', mercurePublisherKey: 'devkey', mercureSubscriberKey: 'devkey', ); $tester = new CommandTester($command); // Port 1 is reserved and refuses connections — the probe must fail. $exit = $tester->execute(['--connect' => true, '--url' => 'http://127.0.0.1:1/healthz']); self::assertSame(1, $exit); self::assertStringContainsString('Backend probe failed', $tester->getDisplay()); } private function makePublisher(): Publisher { return new Publisher(new class implements HubInterface { public function getUrl(): string { return ''; } public function getPublicUrl(): string { return ''; } public function getProvider(): \Symfony\Component\Mercure\Jwt\TokenProviderInterface { throw new \LogicException(); } public function getFactory(): ?\Symfony\Component\Mercure\Jwt\TokenFactoryInterface { return null; } public function publish(Update $update): string { return ''; } }); } }