diff --git a/src/SimpleDTO.php b/src/SimpleDTO.php index 00a7d8e..ea4a950 100644 --- a/src/SimpleDTO.php +++ b/src/SimpleDTO.php @@ -9,6 +9,7 @@ use Carbon\CarbonImmutable; use Illuminate\Contracts\Database\Eloquent\CastsAttributes; use Illuminate\Database\Eloquent\Model; +use Illuminate\Http\UploadedFile; use Illuminate\Support\Collection; use Illuminate\Validation\ValidationException; use ReflectionClass; @@ -430,7 +431,7 @@ private function isArrayable(mixed $value): bool $value instanceof Collection || $value instanceof ValidatedDTO || $value instanceof Model || - is_object($value); + (is_object($value) && ! ($value instanceof UploadedFile)); } private function formatArrayableValue(mixed $value): array|int|string diff --git a/tests/Datasets/ValidatedFileDTO.php b/tests/Datasets/ValidatedFileDTO.php new file mode 100644 index 0000000..01c14eb --- /dev/null +++ b/tests/Datasets/ValidatedFileDTO.php @@ -0,0 +1,30 @@ + 'required|file|mimes:jpg,jpeg,png', + ]; + } +} diff --git a/tests/Unit/ValidatedDTOTest.php b/tests/Unit/ValidatedDTOTest.php index 230985a..ad48661 100644 --- a/tests/Unit/ValidatedDTOTest.php +++ b/tests/Unit/ValidatedDTOTest.php @@ -8,6 +8,7 @@ use Illuminate\Console\Command; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Request; +use Illuminate\Http\UploadedFile; use Illuminate\Validation\ValidationException; use WendellAdriel\ValidatedDTO\Exceptions\InvalidJsonException; use WendellAdriel\ValidatedDTO\Tests\Datasets\DummyBackedEnum; @@ -25,6 +26,7 @@ use WendellAdriel\ValidatedDTO\Tests\Datasets\UserNestedDTO; use WendellAdriel\ValidatedDTO\Tests\Datasets\ValidatedDTOInstance; use WendellAdriel\ValidatedDTO\Tests\Datasets\ValidatedEnumDTO; +use WendellAdriel\ValidatedDTO\Tests\Datasets\ValidatedFileDTO; use WendellAdriel\ValidatedDTO\ValidatedDTO; beforeEach(function () { @@ -449,3 +451,17 @@ public function __invoke() ->and($user->email) ->toBe('john.doe@example.com'); }); + +it('validates that ValidatedDTO can be instantiated with file validation rules', function () { + $uploadedFile = UploadedFile::fake()->image('avatar.jpg'); + $validatedDTO = ValidatedFileDTO::fromArray(['file' => $uploadedFile]); + + expect($validatedDTO->validator->passes()) + ->toBeTrue(); +}); + +it('validates that ValidateDTO cannot be instantiated with wrong mime type') +->expect(function () { + $uploadedFile = UploadedFile::fake()->create('document.pdf'); + ValidatedFileDTO::fromArray(['file' => $uploadedFile]); +})->throws(ValidationException::class);