8000 add missing $extensions and $extensionsMessage to the Image constraint · symfony/symfony@c29f026 · GitHub
[go: up one dir, main page]

Skip to content

Commit c29f026

Browse files
committed
add missing $extensions and $extensionsMessage to the Image constraint
1 parent 4c45d9c commit c29f026

File tree

2 files changed

+84
-3
lines changed

2 files changed

+84
-3
lines changed

src/Symfony/Component/Validator/Constraints/Image.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class Image extends File
6464
*/
6565
protected static $errorNames = self::ERROR_NAMES;
6666

67-
public $mimeTypes = 'image/*';
67+
public $mimeTypes;
6868
public $minWidth;
6969
public $maxWidth;
7070
public $maxHeight;
@@ -140,7 +140,9 @@ public function __construct(
140140
?string $allowPortraitMessage = null,
141141
?string $corruptedMessage = null,
142142
?array $groups = null,
143-
mixed $payload = null
143+
mixed $payload = null,
144+
array|string|null $extensions = null,
145+
?string $extensionsMessage = null,
144146
) {
145147
parent::__construct(
146148
$options,
@@ -163,7 +165,9 @@ public function __construct(
163165
$uploadExtensionErrorMessage,
164166
$uploadErrorMessage,
165167
$groups,
166-
$payload
168+
$payload,
169+
$extensions,
170+
$extensionsMessage,
167171
);
168172

169173
$this->minWidth = $minWidth ?? $this->minWidth;
@@ -192,6 +196,10 @@ public function __construct(
192196
$this->allowPortraitMessage = $allowPortraitMessage ?? $this->allowPortraitMessage;
193197
$this->corruptedMessage = $corruptedMessage ?? $this->corruptedMessage;
194198

199+
if (null === $this->mimeTypes && [] === $this->extensions) {
200+
$this->mimeTypes = 'image/*';
201+
}
202+
195203
if (!\in_array('image/*', (array) $this->mimeTypes, true) && !\array_key_exists('mimeTypesMessage', $options ?? []) && null === $mimeTypesMessage) {
196204
$this->mimeTypesMessage = 'The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.';
197205
}

src/Symfony/Component/Validator/Tests/Constraints/ImageValidatorTest.php

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
namespace Symfony\Component\Validator\Tests\Constraints;
1313

14+
use Symfony\Component\HttpFoundation\File\File;
15+
use Symfony\Component\Mime\MimeTypes;
1416
use Symfony\Component\Validator\Constraints\Image;
1517
use Symfony\Component\Validator\Constraints\ImageValidator;
1618
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
@@ -579,4 +581,75 @@ public static function provideInvalidMimeTypeWithNarrowedSet()
579581
]),
580582
];
581583
}
584+
585+
/**
586+
* @dataProvider providerValidExtension
587+
*/
588+
public function testExtensionValid(string $name)
589+
{
590+
if (!class_exists(MimeTypes::class)) {
591+
$this->markTestSkipped('Guessing the mime type is not possible');
592+
}
593+
594+
$constraint = new Image(mimeTypes: [], extensions: ['gif'], extensionsMessage: 'myMessage');
595+
596+
$this->validator->validate(new File(__DIR__.'/Fixtures/'.$name), $constraint);
597+
598+
$this->assertNoViolation();
599+
}
600+
601+
public static function providerValidExtension(): iterable
602+
{
603+
yield ['test.gif'];
604+
yield ['test.png.gif'];
605+
}
606+
607+
/**
608+
* @dataProvider provideInvalidExtension
609+
*/
61 6D4E 0+
public function testExtensionInvalid(string $name, string $extension)
611+
{
612+
$path = __DIR__.'/Fixtures/'.$name;
613+
$constraint = new Image(extensions: ['png', 'svg'], extensionsMessage: 'myMessage');
614+
615+
$this->validator->validate(new File($path), $constraint);
616+
617+
$this->buildViolation('myMessage')
618+
->setParameters([
619+
'{{ file }}' => '"'.$path.'"',
620+
'{{ extension }}' => '"'.$extension.'"',
621+
'{{ extensions }}' => '"png", "svg"',
622+
'{{ name }}' => '"'.$name.'"',
623+
])
624+
->setCode(Image::INVALID_EXTENSION_ERROR)
625+
->assertRaised();
626+
}
627+
628+
public static function provideInvalidExtension(): iterable
629+
{
630+
yield ['test.gif', 'gif'];
631+
yield ['test.png.gif', 'gif'];
632+
}
633+
634+
public function testExtensionAutodetectMimeTypesInvalid()
635+
{
636+
if (!class_exists(MimeTypes::class)) {
637+
$this->markTestSkipped('Guessing the mime type is not possible');
638+
}
639+
640+
$path = __DIR__.'/Fixtures/invalid-content.gif';
641+
$constraint = new Image(mimeTypesMessage: 'myMessage', extensions: ['gif']);
642+
643+
$this->validator->validate(new File($path), $constraint);
644+
645+
$this->buildViolation('myMessage')
646+
->setParameters([
647+
'{{ file }}' => '"'.$path.'"',
648+
'{{ name }}' => '"invalid-content.gif"',
649+
'{{ type }}' => '"text/plain"',
650+
'{{ types }}' => '"image/gif"',
651+
])
652+
->setCode(Image::INVALID_MIME_TYPE_ERROR)
653+
->assertRaised();
654+
}
582655
}

0 commit comments

Comments
 (0)
0