* SPDX-License-Identifier: GPL-3.0-or-later */ declare(strict_types=1); namespace MokoStandards\Tests\Unit; use PHPUnit\Framework\TestCase; /** * Tests for cli/version_read.php */ class VersionReadTest extends TestCase { private string $tmpDir; private string $script; protected function setUp(): void { $this->tmpDir = sys_get_temp_dir() . '/moko-test-' . uniqid(); mkdir($this->tmpDir, 0755, true); $this->script = dirname(__DIR__, 2) . '/cli/version_read.php'; } protected function tearDown(): void { $this->rmdir($this->tmpDir); } public function testReadsVersionFromReadme(): void { file_put_contents( "{$this->tmpDir}/README.md", "# Test\n\n" ); $this->assertSame('02.03.04', trim($this->runScript())); } public function testReadsVersionFromXmlManifest(): void { mkdir("{$this->tmpDir}/src", 0755, true); file_put_contents( "{$this->tmpDir}/src/test.xml", '' . '05.01.00' ); $this->assertSame('05.01.00', trim($this->runScript())); } public function testStripsStabilitySuffixFromXml(): void { mkdir("{$this->tmpDir}/src", 0755, true); file_put_contents( "{$this->tmpDir}/src/test.xml", '' . '01.00.00-dev' ); $this->assertSame('01.00.00', trim($this->runScript())); } public function testReturnsHigherOfReadmeAndManifest(): void { file_put_contents( "{$this->tmpDir}/README.md", "\n" ); mkdir("{$this->tmpDir}/src", 0755, true); file_put_contents( "{$this->tmpDir}/src/test.xml", '' . '01.03.00' ); $this->assertSame('01.03.00', trim($this->runScript())); } public function testExitsNonZeroWhenNoVersion(): void { file_put_contents( "{$this->tmpDir}/README.md", "# No version here\n" ); $code = 0; $this->runScript($code); $this->assertSame(1, $code); } private function runScript(int &$exitCode = 0): string { $proc = proc_open( ['php', $this->script, '--path', $this->tmpDir], [1 => ['pipe', 'w'], 2 => ['pipe', 'w']], $pipes ); $stdout = stream_get_contents($pipes[1]); fclose($pipes[1]); fclose($pipes[2]); $exitCode = proc_close($proc); return $stdout ?: ''; } private function rmdir(string $dir): void { if (!is_dir($dir)) { return; } $iter = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator( $dir, \FilesystemIterator::SKIP_DOTS ), \RecursiveIteratorIterator::CHILD_FIRST ); foreach ($iter as $file) { $file->isDir() ? rmdir($file->getPathname()) : unlink($file->getPathname()); } rmdir($dir); } }