Skip to content

Commit

Permalink
MappedObject::isInitialized() removed as it can work only with public…
Browse files Browse the repository at this point in the history
… properties
mabar committed Jan 1, 2023
1 parent 1a13743 commit c775245
Showing 4 changed files with 32 additions and 24 deletions.
6 changes: 3 additions & 3 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -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
```

5 changes: 0 additions & 5 deletions src/MappedObject.php
Original file line number Diff line number Diff line change
@@ -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.
*/
11 changes: 9 additions & 2 deletions tests/Unit/Processing/DefaultObjectCreatorTest.php
Original file line number Diff line number Diff line change
@@ -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);
}

}
34 changes: 20 additions & 14 deletions tests/Unit/Processing/DefaultProcessorTest.php
Original file line number Diff line number Diff line change
@@ -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,19 +825,19 @@ 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,
'optional' => null,
'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);
}

}

0 comments on commit c775245

Please sign in to comment.