From e9a8ba399724662f715df891f47abce46143f5d9 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Fri, 28 Mar 2025 12:53:57 +0000 Subject: [PATCH 1/2] feat!: refactor exceptions handling for `JsonbArray` in the style used for the network types --- .../InvalidJsonbArrayItemForPHPException.php | 25 ++++++++++++++++++ .../DBAL/Types/Exceptions/TypeException.php | 12 --------- .../UnexpectedTypeOfTransformedPHPValue.php | 23 ---------------- .../Doctrine/DBAL/Types/JsonbArray.php | 15 ++++------- .../Doctrine/DBAL/Types/JsonbArrayTest.php | 26 +++++++++++++++---- 5 files changed, 51 insertions(+), 50 deletions(-) create mode 100644 src/MartinGeorgiev/Doctrine/DBAL/Types/Exceptions/InvalidJsonbArrayItemForPHPException.php delete mode 100644 src/MartinGeorgiev/Doctrine/DBAL/Types/Exceptions/TypeException.php delete mode 100644 src/MartinGeorgiev/Doctrine/DBAL/Types/Exceptions/UnexpectedTypeOfTransformedPHPValue.php diff --git a/src/MartinGeorgiev/Doctrine/DBAL/Types/Exceptions/InvalidJsonbArrayItemForPHPException.php b/src/MartinGeorgiev/Doctrine/DBAL/Types/Exceptions/InvalidJsonbArrayItemForPHPException.php new file mode 100644 index 00000000..9fd2633e --- /dev/null +++ b/src/MartinGeorgiev/Doctrine/DBAL/Types/Exceptions/InvalidJsonbArrayItemForPHPException.php @@ -0,0 +1,25 @@ + - */ -abstract class TypeException extends \Exception {} diff --git a/src/MartinGeorgiev/Doctrine/DBAL/Types/Exceptions/UnexpectedTypeOfTransformedPHPValue.php b/src/MartinGeorgiev/Doctrine/DBAL/Types/Exceptions/UnexpectedTypeOfTransformedPHPValue.php deleted file mode 100644 index a99962b4..00000000 --- a/src/MartinGeorgiev/Doctrine/DBAL/Types/Exceptions/UnexpectedTypeOfTransformedPHPValue.php +++ /dev/null @@ -1,23 +0,0 @@ - - */ -class UnexpectedTypeOfTransformedPHPValue extends TypeException -{ - public function __construct(string $untransformedValue, string $typeOfTransformedPHPValue) - { - $message = \sprintf( - 'Transforming a PostgreSQL value "%s" results to an unexpected PHP value from type "%s".', - $untransformedValue, - $typeOfTransformedPHPValue - ); - parent::__construct($message); - } -} diff --git a/src/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArray.php b/src/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArray.php index 99ac932a..bde28f55 100644 --- a/src/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArray.php +++ b/src/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArray.php @@ -4,7 +4,7 @@ namespace MartinGeorgiev\Doctrine\DBAL\Types; -use MartinGeorgiev\Doctrine\DBAL\Types\Exceptions\UnexpectedTypeOfTransformedPHPValue; +use MartinGeorgiev\Doctrine\DBAL\Types\Exceptions\InvalidJsonbArrayItemForPHPException; /** * Implementation of PostgreSQL JSONB[] data type. @@ -18,9 +18,6 @@ class JsonbArray extends BaseArray { use JsonTransformer; - /** - * @var string - */ protected const TYPE_NAME = 'jsonb[]'; protected function transformArrayItemForPostgres(mixed $item): string @@ -48,17 +45,15 @@ protected function transformPostgresArrayToPHPArray(string $postgresArray): arra */ public function transformArrayItemForPHP($item): array { - $transformedValue = null; - try { $transformedValue = $this->transformFromPostgresJson($item); if (!\is_array($transformedValue)) { - throw new UnexpectedTypeOfTransformedPHPValue($item, \gettype($transformedValue)); + throw InvalidJsonbArrayItemForPHPException::forInvalidType($item); } + + return $transformedValue; } catch (\JsonException) { - throw new UnexpectedTypeOfTransformedPHPValue($item, \gettype($transformedValue)); + throw InvalidJsonbArrayItemForPHPException::forInvalidFormat($item); } - - return $transformedValue; } } diff --git a/tests/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php b/tests/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php index 8abfc85b..ad0dc92b 100644 --- a/tests/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php +++ b/tests/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php @@ -5,7 +5,7 @@ namespace Tests\MartinGeorgiev\Doctrine\DBAL\Types; use Doctrine\DBAL\Platforms\AbstractPlatform; -use MartinGeorgiev\Doctrine\DBAL\Types\Exceptions\UnexpectedTypeOfTransformedPHPValue; +use MartinGeorgiev\Doctrine\DBAL\Types\Exceptions\InvalidJsonbArrayItemForPHPException; use MartinGeorgiev\Doctrine\DBAL\Types\JsonbArray; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; @@ -92,13 +92,29 @@ public static function provideValidTransformations(): array /** * @test + * + * @dataProvider provideInvalidTransformations */ - public function throws_an_error_when_transformed_value_is_not_an_array(): void + public function throws_exception_when_invalid_data_provided_to_convert_to_php_value(string $postgresValue): void { - $this->expectException(UnexpectedTypeOfTransformedPHPValue::class); - - $postgresValue = '"a string encoded as json"'; + $this->expectException(InvalidJsonbArrayItemForPHPException::class); + $this->expectExceptionMessage('Invalid JSONB format in array'); $this->fixture->convertToPHPValue($postgresValue, $this->platform); } + + /** + * @return array + */ + public static function provideInvalidTransformations(): array + { + return [ + 'non-array json' => [ + '"a string encoded as json"', + ], + 'invalid json format' => [ + '{invalid json}', + ], + ]; + } } From b2969c227b6f216d3d9ae16d36369d1d03ade2a0 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Fri, 28 Mar 2025 12:57:05 +0000 Subject: [PATCH 2/2] phpstan ;) --- .../Doctrine/DBAL/Types/JsonbArrayTest.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/tests/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php b/tests/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php index ad0dc92b..0d2f80bb 100644 --- a/tests/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php +++ b/tests/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php @@ -104,17 +104,13 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_php_va } /** - * @return array + * @return array */ public static function provideInvalidTransformations(): array { return [ - 'non-array json' => [ - '"a string encoded as json"', - ], - 'invalid json format' => [ - '{invalid json}', - ], + 'non-array json' => ['"a string encoded as json"'], + 'invalid json format' => ['{invalid json}'], ]; } }