diff --git a/spec/Articus/DataTransfer/Validator/SerializableValue.spec.php b/spec/Articus/DataTransfer/Validator/SerializableValue.spec.php index 53df674..ee9dca6 100644 --- a/spec/Articus/DataTransfer/Validator/SerializableValue.spec.php +++ b/spec/Articus/DataTransfer/Validator/SerializableValue.spec.php @@ -33,6 +33,20 @@ expect($validator->validate([]))->toBe($error); expect($validator->validate(new stdClass()))->toBe($error); }); + it('denies invalid string', function () + { + $data = 'some data'; + $dataError = ['aaa' => 111]; + $error = [DT\Validator\SerializableValue::INVALID_INNER => $dataError]; + $exception = new DT\Exception\InvalidData($dataError); + $valueValidator = mock(DT\Validator\ValidatorInterface::class); + $unserializer = mock(Example\InvokableInterface::class); + + $unserializer->shouldReceive('__invoke')->with($data)->andThrow($exception)->once(); + + $validator = new DT\Validator\SerializableValue($valueValidator, $unserializer); + expect($validator->validate($data))->toBe($error); + }); it('denies string with invalid serialized value', function () { $data = 'some data'; diff --git a/src/Articus/DataTransfer/Validator/SerializableValue.php b/src/Articus/DataTransfer/Validator/SerializableValue.php index e5e9171..65b7cba 100644 --- a/src/Articus/DataTransfer/Validator/SerializableValue.php +++ b/src/Articus/DataTransfer/Validator/SerializableValue.php @@ -3,6 +3,7 @@ namespace Articus\DataTransfer\Validator; +use Articus\DataTransfer\Exception; use function is_string; /** @@ -44,11 +45,18 @@ public function validate($data): array { if (is_string($data)) { - $value = ($this->unserializer)($data); - $valueViolations = $this->valueValidator->validate($value); - if (!empty($valueViolations)) + try { - $result[self::INVALID_INNER] = $valueViolations; + $value = ($this->unserializer)($data); + $valueViolations = $this->valueValidator->validate($value); + if (!empty($valueViolations)) + { + $result[self::INVALID_INNER] = $valueViolations; + } + } + catch (Exception\InvalidData $e) + { + $result[self::INVALID_INNER] = $e->getViolations(); } } else