phpmyadmin/tests/unit/ZipExtensionTest.php
Maurício Meneghini Fauth 606f66b5df
Rename tests/classes to tests/unit
This directory is for unit tests only, so let's rename it to unit to be
more clear.

Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
2024-02-23 13:29:07 -03:00

199 lines
5.3 KiB
PHP

<?php
declare(strict_types=1);
namespace PhpMyAdmin\Tests;
use PhpMyAdmin\ZipExtension;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\RequiresPhpExtension;
use ZipArchive;
use function file_put_contents;
use function tempnam;
use function unlink;
#[CoversClass(ZipExtension::class)]
#[RequiresPhpExtension('zip')]
class ZipExtensionTest extends AbstractTestCase
{
private ZipExtension $zipExtension;
protected function setUp(): void
{
parent::setUp();
$this->zipExtension = new ZipExtension(new ZipArchive());
}
/**
* Test for getContents
*
* @param string $file path to zip file
* @param string|null $specificEntry regular expression to match a file
* @param array<string, string> $output expected output
* @psalm-param array{error: string, data: string} $output
*/
#[DataProvider('provideTestGetContents')]
public function testGetContents(string $file, string|null $specificEntry, array $output): void
{
self::assertSame(
$this->zipExtension->getContents($file, $specificEntry),
$output,
);
}
/**
* @return array<string, array<int, array<string, string>|string|null>>
* @psalm-return array<string, array{string, string|null, array{error: string, data: string}}>
*/
public static function provideTestGetContents(): array
{
return [
'null as specific entry' => [
'./tests/test_data/test.zip',
null,
['error' => '', 'data' => 'TEST FILE' . "\n"],
],
'an existent specific entry' => [
'./tests/test_data/test.zip',
'/test.file/',
['error' => '', 'data' => 'TEST FILE' . "\n"],
],
'a nonexistent specific entry' => [
'./tests/test_data/test.zip',
'/foobar/',
['error' => 'Error in ZIP archive: Could not find "/foobar/"', 'data' => ''],
],
];
}
/**
* Test for findFile
*
* @param string $file path to zip file
* @param string $fileRegexp regular expression for the file name to match
* @param string|bool $output expected output
* @psalm-param string|false $output
*/
#[DataProvider('provideTestFindFile')]
public function testFindFile(string $file, string $fileRegexp, string|bool $output): void
{
self::assertSame(
$this->zipExtension->findFile($file, $fileRegexp),
$output,
);
}
/**
* Provider for testFindFileFromZipArchive
*
* @return array<int, array<int, string|bool>>
* @psalm-return array<int, array{string, string, string|false}>
*/
public static function provideTestFindFile(): array
{
return [
['./tests/test_data/test.zip', '/test/', 'test.file'],
['./tests/test_data/test.zip', '/invalid/', false],
];
}
/**
* Test for getNumberOfFiles
*/
public function testGetNumberOfFiles(): void
{
self::assertSame(
$this->zipExtension->getNumberOfFiles('./tests/test_data/test.zip'),
1,
);
}
/**
* Test for extract
*/
public function testExtract(): void
{
self::assertFalse(
$this->zipExtension->extract(
'./tests/test_data/test.zip',
'wrongName',
),
);
self::assertSame(
"TEST FILE\n",
$this->zipExtension->extract(
'./tests/test_data/test.zip',
'test.file',
),
);
}
/**
* Test for createFile
*/
public function testCreateSingleFile(): void
{
$file = $this->zipExtension->createFile('Test content', 'test.txt');
self::assertIsString($file);
self::assertNotEmpty($file);
$tmp = tempnam('./', 'zip-test');
self::assertNotFalse($tmp);
self::assertNotFalse(file_put_contents($tmp, $file));
$zip = new ZipArchive();
self::assertTrue(
$zip->open($tmp),
);
self::assertSame(0, $zip->locateName('test.txt'));
$zip->close();
unlink($tmp);
}
/**
* Test for createFile
*/
public function testCreateFailure(): void
{
self::assertFalse(
$this->zipExtension->createFile(
'Content',
['name1.txt', 'name2.txt'],
),
);
}
/**
* Test for createFile
*/
public function testCreateMultiFile(): void
{
$file = $this->zipExtension->createFile(
['Content', 'Content2'],
['name1.txt', 'name2.txt'],
);
self::assertIsString($file);
self::assertNotEmpty($file);
$tmp = tempnam('./', 'zip-test');
self::assertNotFalse($tmp);
self::assertNotFalse(file_put_contents($tmp, $file));
$zip = new ZipArchive();
self::assertTrue(
$zip->open($tmp),
);
self::assertSame(0, $zip->locateName('name1.txt'));
self::assertSame(1, $zip->locateName('name2.txt'));
$zip->close();
unlink($tmp);
}
}