Reject invalid uploads and expand flow tests.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
namespace Xxx\Tests\Unit;
|
||||
|
||||
use PHPUnit\Framework\Attributes\DataProvider;
|
||||
use Xxx\Tests\Support\FakeRecaptcha;
|
||||
use Xxx\Tests\Support\TestCase;
|
||||
|
||||
@@ -120,6 +121,79 @@ class ValidateDataTest extends TestCase {
|
||||
$this->assertSame(array('upload' => "<b>notes</b>.txt wasn't an image file. Please go back."), $this->validate(array()));
|
||||
}
|
||||
|
||||
public static function invalidUploadFields(): array {
|
||||
return array(
|
||||
'array filename' => array('name', array('a.png')),
|
||||
'array temporary file' => array('tmp_name', array('/tmp/not-an-upload')),
|
||||
'array error code' => array('error', array(UPLOAD_ERR_OK)),
|
||||
'numeric filename' => array('name', 123),
|
||||
'boolean temporary file' => array('tmp_name', FALSE),
|
||||
'string error code' => array('error', '0'),
|
||||
);
|
||||
}
|
||||
|
||||
#[DataProvider('invalidUploadFields')]
|
||||
public function testAnInvalidUploadFieldIsRejected(string $field, mixed $value): void {
|
||||
$this->imageOf(strlen(self::png()));
|
||||
$_FILES['upload'][$field] = $value;
|
||||
$this->assertArrayHasKey('upload', $this->validate(array()));
|
||||
$this->assertArrayNotHasKey('pending_upload', $_SESSION);
|
||||
}
|
||||
|
||||
public function testANestedUploadIsRejected(): void {
|
||||
$_FILES['upload'] = array('name' => array('a.png'), 'tmp_name' => array('/tmp/not-an-upload'),
|
||||
'error' => array(UPLOAD_ERR_OK), 'size' => array(1), 'type' => array('image/png'));
|
||||
$this->assertArrayHasKey('upload', $this->validate(array()));
|
||||
$this->assertArrayNotHasKey('pending_upload', $_SESSION);
|
||||
}
|
||||
|
||||
public static function absentUploads(): array {
|
||||
return array(
|
||||
'no upload entry' => array(array()),
|
||||
'empty entry' => array(array('upload' => array())),
|
||||
'no file chosen' => array(array('upload' => array('error' => UPLOAD_ERR_NO_FILE))),
|
||||
);
|
||||
}
|
||||
|
||||
#[DataProvider('absentUploads')]
|
||||
public function testAnAbsentUploadDoesNotBlockATextStory(array $files): void {
|
||||
$_FILES = $files;
|
||||
$this->assertSame(array(), $this->validate(array()));
|
||||
}
|
||||
|
||||
public function testASuccessfulUploadNeedsATemporaryFilename(): void {
|
||||
$_FILES['upload'] = array('name' => 'a.png', 'error' => UPLOAD_ERR_OK);
|
||||
$this->assertArrayHasKey('upload', $this->validate(array()));
|
||||
}
|
||||
|
||||
public function testAMissingTemporaryFileIsRejected(): void {
|
||||
$_FILES['upload'] = array('name' => 'a.png', 'tmp_name' => $this->tmp . '/missing', 'error' => UPLOAD_ERR_OK);
|
||||
$this->assertArrayHasKey('upload', $this->validate(array()));
|
||||
$this->assertArrayNotHasKey('pending_upload', $_SESSION);
|
||||
}
|
||||
|
||||
public function testAScalarUploadEntryIsRejected(): void {
|
||||
$_FILES['upload'] = 'not a file entry';
|
||||
$this->assertArrayHasKey('upload', $this->validate(array()));
|
||||
}
|
||||
|
||||
public function testAnEmptyTemporaryFilenameIsRejected(): void {
|
||||
$_FILES['upload'] = array('name' => 'a.png', 'tmp_name' => '', 'error' => UPLOAD_ERR_OK);
|
||||
$this->assertArrayHasKey('upload', $this->validate(array()));
|
||||
}
|
||||
|
||||
public function testADirectoryIsNotAnUpload(): void {
|
||||
$_FILES['upload'] = array('name' => 'a.png', 'tmp_name' => $this->tmp, 'error' => UPLOAD_ERR_OK);
|
||||
$this->assertArrayHasKey('upload', $this->validate(array()));
|
||||
}
|
||||
|
||||
public function testAnEmptyImageFileIsRejectedWithoutWarnings(): void {
|
||||
$file = $this->tmp . '/empty';
|
||||
file_put_contents($file, '');
|
||||
$_FILES['upload'] = array('name' => 'a.png', 'tmp_name' => $file, 'error' => UPLOAD_ERR_OK);
|
||||
$this->assertArrayHasKey('upload', $this->validate(array()));
|
||||
}
|
||||
|
||||
public function testAnImageUploadPasses(): void {
|
||||
$file = $this->tmp . '/upload';
|
||||
file_put_contents($file, self::png());
|
||||
|
||||
Reference in New Issue
Block a user