Skip to content

Commit

Permalink
fix: download minify.exe
Browse files Browse the repository at this point in the history
  • Loading branch information
smnandre committed Dec 22, 2024
1 parent 74ac9ee commit 8f9423b
Show file tree
Hide file tree
Showing 3 changed files with 138 additions and 20 deletions.
37 changes: 17 additions & 20 deletions src/MinifyInstaller.php
Original file line number Diff line number Diff line change
Expand Up @@ -82,32 +82,29 @@ public function download(string $version): void
$this->filesystem->appendToFile($downloadFilename, $chunk->getContent(), true);
}

if (str_ends_with($downloadFilename, '.zip')) {
$download = function () use ($downloadFilename, $tempDir) {
$archive = new \ZipArchive();
$archive->open($downloadFilename);
$archive->extractTo($tempDir, 'minify');
$archive->close();
};
} else {
$download = function () use ($downloadFilename, $tempDir) {
$archive = new \PharData($downloadFilename);
$archive->extractTo($tempDir, ['minify'], true);
};
}

try {
$download();
} catch (\Throwable $e) {
throw new InstallException(sprintf('Error extracting the binary from archive "%s".', $downloadFilename), 0, $e->getPrevious());
}

$this->filesystem->mkdir(dirname($this->getInstallBinaryPath()));

if (str_ends_with($downloadFilename, '.zip')) {
// Windows archive (minify.exe)
$archive = new \ZipArchive();
if (false === $archive->open($downloadFilename)) {

Check failure on line 90 in src/MinifyInstaller.php

View workflow job for this annotation

GitHub Actions / Static Analysis

Strict comparison using === between false and 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|true will always evaluate to false.
throw new InstallException(sprintf('Error opening archive "%s".', $downloadFilename));
}
if (false === $archive->extractTo($tempDir, 'minify.exe')) {
throw new InstallException(sprintf('Error extracting minify.exe from archive "%s".', $downloadFilename));
}
$archive->close();
$this->filesystem->copy(Path::join($tempDir, 'minify.exe'), $this->getInstallBinaryPath());
} else {
$archive = new \PharData($downloadFilename);
try {
$archive->extractTo($tempDir, ['minify'], true);
} catch (\Exception $e) {
throw new InstallException(sprintf('Error extracting the binary from archive "%s".', $downloadFilename), 0, $e);
}
$this->filesystem->copy(Path::join($tempDir, 'minify'), $this->getInstallBinaryPath());
}

$this->filesystem->remove($tempDir);
}

Expand Down
59 changes: 59 additions & 0 deletions tests/MinifyFactoryTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php

declare(strict_types=1);

/*
* This file is part of the SensioLabs MinifyBundle package.
*
* (c) Simon André - Sensiolabs
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Sensiolabs\MinifyBundle\Tests;

use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\TestCase;
use Sensiolabs\MinifyBundle\Exception\BinaryNotFoundException;
use Sensiolabs\MinifyBundle\Exception\LogicException;
use Sensiolabs\MinifyBundle\Minifier\MinifierInstallerInterface;
use Sensiolabs\MinifyBundle\Minify;
use Sensiolabs\MinifyBundle\MinifyFactory;

#[CoversClass(MinifyFactory::class)]
final class MinifyFactoryTest extends TestCase
{
public function testMminifyBinaryIsCreatedWhenBinaryPathIsAuto(): void
{
$factory = new MinifyFactory('auto');
$minify = $factory->create();
$this->assertInstanceOf(Minify::class, $minify);
}

public function testExceptionIsThrownWhenBinaryNotFound(): void
{
$this->expectException(BinaryNotFoundException::class);
$factory = new MinifyFactory(false, $this->createMock(MinifierInstallerInterface::class));
$factory->create();
}

public function testExceptionIsThrownWhenInstallerIsNullAndBinaryPathIsFalse(): void
{
$this->expectException(LogicException::class);
$factory = new MinifyFactory(false, null);
$factory->create();
}

public function testInstallerIsCalledWhenBinaryNotFound(): void
{
$installer = $this->createMock(MinifierInstallerInterface::class);
$installer->expects($this->once())->method('install');
$installer->method('isInstalled')->willReturn(false);
$installer->method('getInstallBinaryPath')->willReturn('/usr/local/bin/minify');

$this->expectException(BinaryNotFoundException::class);
$factory = new MinifyFactory(false, $installer);
$factory->create();
}
}
62 changes: 62 additions & 0 deletions tests/MinifyInstallerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

declare(strict_types=1);

/*
* This file is part of the SensioLabs MinifyBundle package.
*
* (c) Simon André - Sensiolabs
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Sensiolabs\MinifyBundle\Tests;

use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\TestCase;
use Sensiolabs\MinifyBundle\Exception\InstallException;
use Sensiolabs\MinifyBundle\MinifyInstaller;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use Symfony\Contracts\HttpClient\ResponseInterface;

#[CoversClass(MinifyInstaller::class)]
class MinifyInstallerTest extends TestCase
{
public function testMinifyBinaryIsInstalledWhenNotAlreadyInstalled(): void
{
$installer = new MinifyInstaller('/tmp/minify');
$installer->install();
$this->assertTrue($installer->isInstalled());
}

public function testExceptionIsThrownWhenBinaryCannotBeDownloaded(): void
{
$httpClient = $this->createMock(HttpClientInterface::class);
$httpClient->method('request')->willReturn($this->createMockResponse(500));
$installer = new MinifyInstaller('/tmp/minify/'.rand(5, 999), $httpClient);

$this->expectException(InstallException::class);
$installer->install();
}

public function testBinaryIsDownloadedAndInstalledCorrectly(): void
{
$httpClient = $this->createMock(HttpClientInterface::class);
$httpClient->method('request')->willReturn($this->createMockResponse(200, 'binary content'));
$installer = new MinifyInstaller('/tmp/minify', $httpClient);

$installer->install();
$this->assertFileExists('/tmp/minify/minify');
$this->assertTrue(is_executable('/tmp/minify/minify'));
}

private function createMockResponse(int $statusCode, string $content = ''): ResponseInterface
{
$response = $this->createMock(ResponseInterface::class);
$response->method('getStatusCode')->willReturn($statusCode);
$response->method('getContent')->willReturn($content);

return $response;
}
}

0 comments on commit 8f9423b

Please sign in to comment.