Skip to content

Commit 0058d1c

Browse files
feat!: refactor exceptions handling for JsonbArray in the style used for the network types (#311)
1 parent ba3f9f2 commit 0058d1c

File tree

5 files changed

+47
-50
lines changed

5 files changed

+47
-50
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MartinGeorgiev\Doctrine\DBAL\Types\Exceptions;
6+
7+
use Doctrine\DBAL\Types\ConversionException;
8+
9+
class InvalidJsonbArrayItemForPHPException extends ConversionException
10+
{
11+
private static function create(string $message, mixed $value): self
12+
{
13+
return new self(\sprintf($message, \var_export($value, true)));
14+
}
15+
16+
public static function forInvalidType(mixed $value): self
17+
{
18+
return self::create('Array values must be valid JSON objects, %s given', $value);
19+
}
20+
21+
public static function forInvalidFormat(mixed $value): self
22+
{
23+
return self::create('Invalid JSONB format in array: %s', $value);
24+
}
25+
}

src/MartinGeorgiev/Doctrine/DBAL/Types/Exceptions/TypeException.php

Lines changed: 0 additions & 12 deletions
This file was deleted.

src/MartinGeorgiev/Doctrine/DBAL/Types/Exceptions/UnexpectedTypeOfTransformedPHPValue.php

Lines changed: 0 additions & 23 deletions
This file was deleted.

src/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArray.php

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace MartinGeorgiev\Doctrine\DBAL\Types;
66

7-
use MartinGeorgiev\Doctrine\DBAL\Types\Exceptions\UnexpectedTypeOfTransformedPHPValue;
7+
use MartinGeorgiev\Doctrine\DBAL\Types\Exceptions\InvalidJsonbArrayItemForPHPException;
88

99
/**
1010
* Implementation of PostgreSQL JSONB[] data type.
@@ -18,9 +18,6 @@ class JsonbArray extends BaseArray
1818
{
1919
use JsonTransformer;
2020

21-
/**
22-
* @var string
23-
*/
2421
protected const TYPE_NAME = 'jsonb[]';
2522

2623
protected function transformArrayItemForPostgres(mixed $item): string
@@ -48,17 +45,15 @@ protected function transformPostgresArrayToPHPArray(string $postgresArray): arra
4845
*/
4946
public function transformArrayItemForPHP($item): array
5047
{
51-
$transformedValue = null;
52-
5348
try {
5449
$transformedValue = $this->transformFromPostgresJson($item);
5550
if (!\is_array($transformedValue)) {
56-
throw new UnexpectedTypeOfTransformedPHPValue($item, \gettype($transformedValue));
51+
throw InvalidJsonbArrayItemForPHPException::forInvalidType($item);
5752
}
53+
54+
return $transformedValue;
5855
} catch (\JsonException) {
59-
throw new UnexpectedTypeOfTransformedPHPValue($item, \gettype($transformedValue));
56+
throw InvalidJsonbArrayItemForPHPException::forInvalidFormat($item);
6057
}
61-
62-
return $transformedValue;
6358
}
6459
}

tests/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace Tests\MartinGeorgiev\Doctrine\DBAL\Types;
66

77
use Doctrine\DBAL\Platforms\AbstractPlatform;
8-
use MartinGeorgiev\Doctrine\DBAL\Types\Exceptions\UnexpectedTypeOfTransformedPHPValue;
8+
use MartinGeorgiev\Doctrine\DBAL\Types\Exceptions\InvalidJsonbArrayItemForPHPException;
99
use MartinGeorgiev\Doctrine\DBAL\Types\JsonbArray;
1010
use PHPUnit\Framework\MockObject\MockObject;
1111
use PHPUnit\Framework\TestCase;
@@ -92,13 +92,25 @@ public static function provideValidTransformations(): array
9292

9393
/**
9494
* @test
95+
*
96+
* @dataProvider provideInvalidTransformations
9597
*/
96-
public function throws_an_error_when_transformed_value_is_not_an_array(): void
98+
public function throws_exception_when_invalid_data_provided_to_convert_to_php_value(string $postgresValue): void
9799
{
98-
$this->expectException(UnexpectedTypeOfTransformedPHPValue::class);
99-
100-
$postgresValue = '"a string encoded as json"';
100+
$this->expectException(InvalidJsonbArrayItemForPHPException::class);
101+
$this->expectExceptionMessage('Invalid JSONB format in array');
101102

102103
$this->fixture->convertToPHPValue($postgresValue, $this->platform);
103104
}
105+
106+
/**
107+
* @return array<string, array{string}>
108+
*/
109+
public static function provideInvalidTransformations(): array
110+
{
111+
return [
112+
'non-array json' => ['"a string encoded as json"'],
113+
'invalid json format' => ['{invalid json}'],
114+
];
115+
}
104116
}

0 commit comments

Comments
 (0)