* Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Test\Util; use Composer\Util\Zip; use Composer\Test\TestCase; /** * @author Andreas Schempp */ class ZipTest extends TestCase { public function testThrowsExceptionIfZipExtensionIsNotLoaded(): void { if (extension_loaded('zip')) { $this->markTestSkipped('The PHP zip extension is loaded.'); } self::expectException('RuntimeException'); self::expectExceptionMessage('The Zip Util requires PHP\'s zip extension'); Zip::getComposerJson(''); } public function testReturnsNullifTheZipIsNotFound(): void { if (!extension_loaded('zip')) { $this->markTestSkipped('The PHP zip extension is not loaded.'); } $result = Zip::getComposerJson(__DIR__.'/Fixtures/Zip/invalid.zip'); $this->assertNull($result); } public function testReturnsNullIfTheZipIsEmpty(): void { if (!extension_loaded('zip')) { $this->markTestSkipped('The PHP zip extension is not loaded.'); } $result = Zip::getComposerJson(__DIR__.'/Fixtures/Zip/empty.zip'); $this->assertNull($result); } public function testThrowsExceptionIfTheZipHasNoComposerJson(): void { if (!extension_loaded('zip')) { $this->markTestSkipped('The PHP zip extension is not loaded.'); } self::expectException('RuntimeException'); self::expectExceptionMessage('No composer.json found either at the top level or within the topmost directory'); Zip::getComposerJson(__DIR__.'/Fixtures/Zip/nojson.zip'); } public function testThrowsExceptionIfTheComposerJsonIsInASubSubfolder(): void { if (!extension_loaded('zip')) { $this->markTestSkipped('The PHP zip extension is not loaded.'); } self::expectException('RuntimeException'); self::expectExceptionMessage('No composer.json found either at the top level or within the topmost directory'); Zip::getComposerJson(__DIR__.'/Fixtures/Zip/subfolders.zip'); } public function testReturnsComposerJsonInZipRoot(): void { if (!extension_loaded('zip')) { $this->markTestSkipped('The PHP zip extension is not loaded.'); } $result = Zip::getComposerJson(__DIR__.'/Fixtures/Zip/root.zip'); $this->assertEquals("{\n \"name\": \"foo/bar\"\n}\n", $result); } public function testReturnsComposerJsonInFirstFolder(): void { if (!extension_loaded('zip')) { $this->markTestSkipped('The PHP zip extension is not loaded.'); } $result = Zip::getComposerJson(__DIR__.'/Fixtures/Zip/folder.zip'); $this->assertEquals("{\n \"name\": \"foo/bar\"\n}\n", $result); } public function testMultipleTopLevelDirsIsInvalid(): void { if (!extension_loaded('zip')) { $this->markTestSkipped('The PHP zip extension is not loaded.'); } self::expectException('RuntimeException'); self::expectExceptionMessage('Archive has more than one top level directories, and no composer.json was found on the top level, so it\'s an invalid archive. Top level paths found were: folder1/,folder2/'); Zip::getComposerJson(__DIR__.'/Fixtures/Zip/multiple.zip'); } public function testReturnsComposerJsonFromFirstSubfolder(): void { if (!extension_loaded('zip')) { $this->markTestSkipped('The PHP zip extension is not loaded.'); } $result = Zip::getComposerJson(__DIR__.'/Fixtures/Zip/single-sub.zip'); $this->assertEquals("{\n \"name\": \"foo/bar\"\n}\n", $result); } }