* SPDX-License-Identifier: GPL-3.0-or-later */ declare(strict_types=1); namespace MokoStandards\Tests\Unit; use PHPUnit\Framework\TestCase; /** * Smoke tests for bin/moko command dispatch. * * Verifies that all registered commands can be invoked with --help * without crashing (exit code 0). */ class CliDispatchTest extends TestCase { private static string $mokoPath; public static function setUpBeforeClass(): void { self::$mokoPath = dirname(__DIR__, 2) . '/bin/moko'; } public function testListCommand(): void { $output = $this->runMoko('list'); $this->assertStringContainsString('command(s) available', $output); } public function testHelpCommand(): void { $output = $this->runMoko('--help'); $this->assertStringContainsString('MokoStandards CLI', $output); } public function testUnknownCommandExitsWithCode2(): void { exec('php ' . escapeshellarg(self::$mokoPath) . ' nonexistent-command 2>&1', $out, $code); $this->assertSame(2, $code, 'Unknown command should exit with code 2'); } /** * @dataProvider registeredCommandProvider */ public function testRegisteredCommandHelp(string $command): void { // Some commands may not support --help natively (legacy scripts). // We just verify they don't fatal error (exit code != 255). exec( 'php ' . escapeshellarg(self::$mokoPath) . ' ' . escapeshellarg($command) . ' --help 2>&1', $out, $code ); $this->assertNotSame( 255, $code, "Command '{$command}' should not fatal error on --help (exit={$code})" ); } /** * Provide a sample of registered commands for smoke testing. * * Tests a representative subset to keep the suite fast while covering * all command groups. */ public static function registeredCommandProvider(): array { return [ // Validation ['health'], ['check:syntax'], ['check:changelog'], ['detect'], ['drift'], // Release ['release:notes'], ['release:validate'], ['release:joomla'], // Version ['version:read'], ['version:bump'], // Build ['build:package'], ['build:updates-xml'], // Deploy ['deploy:joomla'], // Fix ['fix:tabs'], ['fix:line-endings'], // Maintenance ['maintenance:labels'], // Repository ['repo:create'], // Licensing ['license'], // Completion ['completion'], ]; } private function runMoko(string $args): string { exec('php ' . escapeshellarg(self::$mokoPath) . ' ' . $args . ' 2>&1', $out, $code); return implode("\n", $out); } }