From f71b0e5c7a5be36440fee5bc8442bcd63e831cf8 Mon Sep 17 00:00:00 2001 From: Ievgenii Syrotenko Date: Tue, 8 Jul 2025 18:13:56 +0200 Subject: [PATCH] fix nullable property transformation --- src/Reflection/Types/PropertyTypeFactory.php | 2 +- .../ClassTransformerFromArrayTest.php | 25 +++++++++++++++++++ .../Integration/DTO/UserNullableArrayDTO.php | 9 +++++++ tests/Units/DTO/TypesDto.php | 2 +- tests/Units/ValueCastingTest.php | 4 +++ 5 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 tests/Integration/DTO/UserNullableArrayDTO.php diff --git a/src/Reflection/Types/PropertyTypeFactory.php b/src/Reflection/Types/PropertyTypeFactory.php index 9b9931b..ecc2b4d 100644 --- a/src/Reflection/Types/PropertyTypeFactory.php +++ b/src/Reflection/Types/PropertyTypeFactory.php @@ -88,7 +88,7 @@ public static function create(RuntimeReflectionProperty $property) return new TransformableType( $type, - $isScalar, + $isNullable, ); } } diff --git a/tests/Integration/ClassTransformerFromArrayTest.php b/tests/Integration/ClassTransformerFromArrayTest.php index c0583fa..b8daddf 100644 --- a/tests/Integration/ClassTransformerFromArrayTest.php +++ b/tests/Integration/ClassTransformerFromArrayTest.php @@ -18,6 +18,7 @@ use Tests\Integration\DTO\UserEmptyTypeDTO; use ClassTransformer\Exceptions\ClassNotFoundException; +use Tests\Integration\DTO\UserNullableArrayDTO; use function count; /** @@ -221,4 +222,28 @@ public function testEmptyTypeObject(): void self::assertEquals($data['email'], $userDTO->email); self::assertEquals($data['balance'], $userDTO->balance); } + + public function testNullableTransformableProperty(): void + { + $data = [ + 'user' => null, + ]; + + $userNullableDTO = Hydrator::init()->create(UserNullableArrayDTO::class, $data); + + self::assertInstanceOf(UserNullableArrayDTO::class, $userNullableDTO); + self::assertNull($userNullableDTO->user); + } + + public function testNotNullableTransformableProperty(): void + { + $data = [ + 'user' => $this->getBaseArrayData(), + ]; + + $userNullableDTO = Hydrator::init()->create(UserNullableArrayDTO::class, $data); + + self::assertInstanceOf(UserNullableArrayDTO::class, $userNullableDTO); + self::assertInstanceOf(UserDTO::class, $userNullableDTO->user); + } } diff --git a/tests/Integration/DTO/UserNullableArrayDTO.php b/tests/Integration/DTO/UserNullableArrayDTO.php new file mode 100644 index 0000000..3b266d5 --- /dev/null +++ b/tests/Integration/DTO/UserNullableArrayDTO.php @@ -0,0 +1,9 @@ +castAttribute(null); $this->assertNull($value); + $caster = new ValueCasting(new RuntimeReflectionProperty(new \ReflectionProperty(TypesDto::class, 'nullableObject'))); + $value = $caster->castAttribute(null); + $this->assertNull($value); + } public function testCreateArrayProperty(): void