From c775245e9bcb0ec4a3a93e38ae00e9da9b8b398c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Barto=C5=A1?= Date: Sun, 1 Jan 2023 00:34:51 +0100 Subject: [PATCH] MappedObject::isInitialized() removed as it can work only with public properties --- docs/README.md | 6 ++-- src/MappedObject.php | 5 --- .../Processing/DefaultObjectCreatorTest.php | 11 ++++-- .../Unit/Processing/DefaultProcessorTest.php | 34 +++++++++++-------- 4 files changed, 32 insertions(+), 24 deletions(-) diff --git a/docs/README.md b/docs/README.md index 5e9d25e1..d2d4ae95 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1349,7 +1349,7 @@ $input->optional; // true ### No fields are required We can make all fields optional. This is useful for partial updates, like PATCH requests in REST APIs. Only changed -fields are sent, and we have to check which ones are available with `$mappedObject->isInitialized('property');`. +fields are sent, and we have to check which ones are available with reflection. Unlike with default mode, mapped object are not auto-initialized as described under [mapped object rule](#mappedobject-rule). At least empty array (`[]`) should be sent to initialize them. @@ -1367,9 +1367,9 @@ $options->setRequiredFields(RequiredFields::none()); $input = $processor->process($data, ModesExampleInput::class, $options); // $input == ModesExampleInput(required: __UNSET__, optional: __UNSET__) -$input->isInitialized('required'); // false +(new ReflectionProperty($input, 'required'))->isInitialized($input); // false $input->required; // Error, property is not set -$input->isInitialized('optional'); // false +(new ReflectionProperty($input, 'optional'))->isInitialized($input); // false $input->optional; // Error, property is not set ``` diff --git a/src/MappedObject.php b/src/MappedObject.php index 46870c93..b6ac62f2 100644 --- a/src/MappedObject.php +++ b/src/MappedObject.php @@ -12,11 +12,6 @@ abstract class MappedObject { - public function isInitialized(string $property): bool - { - return (new ReflectionProperty($this, $property))->isInitialized($this); - } - /** * Checks if the public non-static property exists. */ diff --git a/tests/Unit/Processing/DefaultObjectCreatorTest.php b/tests/Unit/Processing/DefaultObjectCreatorTest.php index 2bb6ed39..6d3cc935 100644 --- a/tests/Unit/Processing/DefaultObjectCreatorTest.php +++ b/tests/Unit/Processing/DefaultObjectCreatorTest.php @@ -4,8 +4,10 @@ use ArgumentCountError; use Orisai\Exceptions\Logic\InvalidState; +use Orisai\ObjectMapper\MappedObject; use Orisai\ObjectMapper\Processing\DefaultObjectCreator; use PHPUnit\Framework\TestCase; +use ReflectionProperty; use Tests\Orisai\ObjectMapper\Doubles\ConstructorUsingVO; use Tests\Orisai\ObjectMapper\Doubles\DependentVO; use Tests\Orisai\ObjectMapper\Doubles\EmptyVO; @@ -54,7 +56,7 @@ public function testRuntimeFailure(): void public function testDontUseConstructor(): void { $vo = new ConstructorUsingVO('string'); - self::assertTrue($vo->isInitialized('string')); + self::assertTrue($this->isInitialized($vo, 'string')); self::assertSame('string', $vo->string); $creator = new DefaultObjectCreator(); @@ -63,7 +65,12 @@ public function testDontUseConstructor(): void $creator->checkClassIsInstantiable(EmptyVO::class, true); $vo = $creator->createInstance(ConstructorUsingVO::class, false); - self::assertFalse($vo->isInitialized('string')); + self::assertFalse($this->isInitialized($vo, 'string')); + } + + private function isInitialized(MappedObject $object, string $property): bool + { + return (new ReflectionProperty($object, $property))->isInitialized($object); } } diff --git a/tests/Unit/Processing/DefaultProcessorTest.php b/tests/Unit/Processing/DefaultProcessorTest.php index 48365819..77a31a6c 100644 --- a/tests/Unit/Processing/DefaultProcessorTest.php +++ b/tests/Unit/Processing/DefaultProcessorTest.php @@ -13,6 +13,7 @@ use Orisai\ObjectMapper\Printers\TypeToStringConverter; use Orisai\ObjectMapper\Processing\Options; use Orisai\ObjectMapper\Processing\RequiredFields; +use ReflectionProperty; use stdClass; use Tests\Orisai\ObjectMapper\Doubles\AfterClassCallbackCurrentTypeInvalidDataVO; use Tests\Orisai\ObjectMapper\Doubles\AfterClassCallbackNewTypeInvalidDataVO; @@ -759,9 +760,9 @@ public function testRequiredNonDefaultFields(): void 'required' => null, ], PropertiesInitVO::class, $options); - self::assertTrue($vo->isInitialized('required')); - self::assertTrue($vo->isInitialized('optional')); - self::assertTrue($vo->isInitialized('structure')); + self::assertTrue($this->isInitialized($vo, 'required')); + self::assertTrue($this->isInitialized($vo, 'optional')); + self::assertTrue($this->isInitialized($vo, 'structure')); self::assertNull($vo->required); self::assertNull($vo->optional); @@ -779,9 +780,9 @@ public function testRequireAllFields(): void 'structure' => [], ], PropertiesInitVO::class, $options); - self::assertTrue($vo->isInitialized('required')); - self::assertTrue($vo->isInitialized('optional')); - self::assertTrue($vo->isInitialized('structure')); + self::assertTrue($this->isInitialized($vo, 'required')); + self::assertTrue($this->isInitialized($vo, 'optional')); + self::assertTrue($this->isInitialized($vo, 'structure')); self::assertNull($vo->required); self::assertNull($vo->optional); @@ -824,9 +825,9 @@ public function testRequireNoneFields(): void $vo = $this->processor->process([], PropertiesInitVO::class, $options); - self::assertFalse($vo->isInitialized('required')); - self::assertFalse($vo->isInitialized('optional')); - self::assertFalse($vo->isInitialized('structure')); + self::assertFalse($this->isInitialized($vo, 'required')); + self::assertFalse($this->isInitialized($vo, 'optional')); + self::assertFalse($this->isInitialized($vo, 'structure')); $vo = $this->processor->process([ 'required' => null, @@ -834,9 +835,9 @@ public function testRequireNoneFields(): void 'structure' => [], ], PropertiesInitVO::class, $options); - self::assertTrue($vo->isInitialized('required')); - self::assertTrue($vo->isInitialized('optional')); - self::assertTrue($vo->isInitialized('structure')); + self::assertTrue($this->isInitialized($vo, 'required')); + self::assertTrue($this->isInitialized($vo, 'optional')); + self::assertTrue($this->isInitialized($vo, 'structure')); self::assertNull($vo->required); self::assertNull($vo->optional); @@ -869,8 +870,8 @@ public function testSkipped(): void self::assertSame('required', $vo->required); self::assertSame('optional', $vo->optional); - self::assertFalse($vo->isInitialized('requiredSkipped')); - self::assertFalse($vo->isInitialized('optionalSkipped')); + self::assertFalse($this->isInitialized($vo, 'requiredSkipped')); + self::assertFalse($this->isInitialized($vo, 'optionalSkipped')); $this->processor->processSkippedProperties([ 'requiredSkipped', @@ -999,4 +1000,9 @@ public function testAttributes(): void self::assertSame('foo', $vo->string); } + private function isInitialized(MappedObject $object, string $property): bool + { + return (new ReflectionProperty($object, $property))->isInitialized($object); + } + }