diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonTestCase.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonTestCase.php index f1965cd7..cad26d6d 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonTestCase.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonTestCase.php @@ -39,12 +39,18 @@ protected function insertTestDataForJsonFixture(): void { $json1 = '{"name": "John", "age": 30, "tags": ["developer", "manager"], "address": {"city": "New York"}}'; $json2 = '{"name": "Jane", "age": 25, "tags": ["designer"], "address": {"city": "Boston"}}'; + $json3 = '{"name": "Micky", "age": 30, "tags": [], "address": {"city": "New York"}}'; + $json4 = '{}'; + $json5 = '{"name": "John", "age": null, "tags": ["developer"], "address": {"city": "New York", "zip": null}}'; $sql = \sprintf(' INSERT INTO %s.containsjsons (object1, object2) VALUES (\'%s\', \'%s\'), + (\'%s\', \'%s\'), + (\'%s\', \'%s\'), + (\'%s\', \'%s\'), (\'%s\', \'%s\') - ', self::DATABASE_SCHEMA, $json1, $json1, $json2, $json2); + ', self::DATABASE_SCHEMA, $json1, $json1, $json2, $json2, $json3, $json3, $json4, $json4, $json5, $json5); $this->connection->executeStatement($sql); } } diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbAggTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbAggTest.php index b452e73d..8e51cbe9 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbAggTest.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbAggTest.php @@ -31,35 +31,11 @@ public function test_jsonb_agg_with_single_row(): void $this->assertEqualsCanonicalizing($expected, $actual); } - public function test_jsonb_agg_with_all_rows(): void + public function test_jsonb_agg_with_multiple_rows(): void { $dql = 'SELECT JSONB_AGG(t.object1) as result - FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t'; - $result = $this->executeDqlQuery($dql); - $this->assertIsString($result[0]['result']); - $actual = \json_decode($result[0]['result'], true); - $this->assertIsArray($actual); - $expected = [ - [ - 'name' => 'John', - 'age' => 30, - 'tags' => ['developer', 'manager'], - 'address' => ['city' => 'New York'], - ], - [ - 'name' => 'Jane', - 'age' => 25, - 'tags' => ['designer'], - 'address' => ['city' => 'Boston'], - ], - ]; - $this->assertEqualsCanonicalizing($expected, $actual); - } - - public function test_jsonb_agg_with_object2_column(): void - { - $dql = 'SELECT JSONB_AGG(t.object2) as result - FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t'; + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id IN (1, 2)'; $result = $this->executeDqlQuery($dql); $this->assertIsString($result[0]['result']); $actual = \json_decode($result[0]['result'], true); diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbInsertTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbInsertTest.php new file mode 100644 index 00000000..537ff017 --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbInsertTest.php @@ -0,0 +1,78 @@ + JsonbInsert::class, + ]; + } + + public function test_jsonb_insert_new_value(): void + { + $dql = 'SELECT JSONB_INSERT(t.object1, :path, :value) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'path' => '{email}', + 'value' => '"john@example.com"', + ]); + $this->assertIsString($result[0]['result']); + $decoded = \json_decode($result[0]['result'], true); + $this->assertIsArray($decoded); + $this->assertArrayHasKey('email', $decoded); + $this->assertSame('john@example.com', $decoded['email']); + } + + public function test_jsonb_insert_nested_path(): void + { + $dql = 'SELECT JSONB_INSERT(t.object1, :path, :value) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'path' => '{address,zip}', + 'value' => '"10001"', + ]); + $this->assertIsString($result[0]['result']); + $decoded = \json_decode($result[0]['result'], true); + $this->assertIsArray($decoded); + $this->assertArrayHasKey('address', $decoded); + $this->assertIsArray($decoded['address']); + $this->assertArrayHasKey('zip', $decoded['address']); + $this->assertSame('10001', $decoded['address']['zip']); + } + + public function test_throws_exception_when_inserting_at_existing_object_key(): void + { + $this->expectException(Exception::class); + $dql = 'SELECT JSONB_INSERT(t.object1, :path, :value) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $this->executeDqlQuery($dql, [ + 'path' => '{name}', + 'value' => '"John Doe"', + ]); + } + + public function test_throws_exception_when_inserting_at_existing_nested_path(): void + { + $this->expectException(Exception::class); + + $dql = 'SELECT JSONB_INSERT(t.object1, :path, :value) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 5'; + + $this->executeDqlQuery($dql, [ + 'path' => '{address,zip}', + 'value' => '"10001"', + ]); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbObjectAggTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbObjectAggTest.php new file mode 100644 index 00000000..2c3bc35e --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbObjectAggTest.php @@ -0,0 +1,29 @@ + JsonbObjectAgg::class, + ]; + } + + public function test_jsonb_object_agg(): void + { + $dql = "SELECT JSONB_OBJECT_AGG('key', 'value') as result + FROM Fixtures\\MartinGeorgiev\\Doctrine\\Entity\\ContainsJsons t + WHERE t.id = 1"; + $result = $this->executeDqlQuery($dql); + $this->assertIsString($result[0]['result']); + $decoded = \json_decode($result[0]['result'], true); + $this->assertIsArray($decoded); + $this->assertSame(['key' => 'value'], $decoded); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbObjectKeysTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbObjectKeysTest.php new file mode 100644 index 00000000..b37f4b28 --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbObjectKeysTest.php @@ -0,0 +1,26 @@ + JsonbObjectKeys::class, + ]; + } + + public function test_jsonb_object_keys(): void + { + $dql = 'SELECT JSONB_OBJECT_KEYS(t.object1) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertIsString($result[0]['result']); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryArrayTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryArrayTest.php new file mode 100644 index 00000000..311ecb34 --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryArrayTest.php @@ -0,0 +1,79 @@ + JsonbPathQueryArray::class, + ]; + } + + public function test_jsonb_path_query_array_simple(): void + { + $dql = 'SELECT JSONB_PATH_QUERY_ARRAY(:json, :path) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'json' => '{"a": 1, "b": 2}', + 'path' => '$.b', + ]); + $this->assertIsString($result[0]['result']); + $decoded = \json_decode($result[0]['result'], true); + $this->assertIsArray($decoded); + $this->assertCount(1, $decoded); + $this->assertSame(2, $decoded[0]); + } + + public function test_jsonb_path_query_array_multiple_values(): void + { + $dql = 'SELECT JSONB_PATH_QUERY_ARRAY(:json, :path) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'json' => '{"items": [1, 2, 3]}', + 'path' => '$.items[*]', + ]); + $this->assertIsString($result[0]['result']); + $decoded = \json_decode($result[0]['result'], true); + $this->assertIsArray($decoded); + $this->assertCount(3, $decoded); + $this->assertSame([1, 2, 3], $decoded); + } + + public function test_jsonb_path_query_array_with_filter(): void + { + $dql = 'SELECT JSONB_PATH_QUERY_ARRAY(:json, :path) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'json' => '{"items": [{"id": 1}, {"id": 2}, {"id": 3}]}', + 'path' => '$.items[*] ? (@.id > 1)', + ]); + $this->assertIsString($result[0]['result']); + $decoded = \json_decode($result[0]['result'], true); + $this->assertIsArray($decoded); + $this->assertCount(2, $decoded); + $this->assertSame(['id' => 2], $decoded[0]); + $this->assertSame(['id' => 3], $decoded[1]); + } + + public function test_jsonb_path_query_array_with_column_reference(): void + { + $dql = 'SELECT JSONB_PATH_QUERY_ARRAY(t.object1, :path) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, ['path' => '$.tags[*]']); + $this->assertIsString($result[0]['result']); + $decoded = \json_decode($result[0]['result'], true); + $this->assertIsArray($decoded); + $this->assertCount(2, $decoded); + $this->assertSame(['developer', 'manager'], $decoded); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryFirstTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryFirstTest.php new file mode 100644 index 00000000..fd69f09b --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryFirstTest.php @@ -0,0 +1,78 @@ + JsonbPathQueryFirst::class, + ]; + } + + public function test_jsonb_path_query_first_simple(): void + { + $dql = 'SELECT JSONB_PATH_QUERY_FIRST(:json, :path) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'json' => '{"a": 1, "b": 2}', + 'path' => '$.b', + ]); + $this->assertIsString($result[0]['result']); + $this->assertSame('2', $result[0]['result']); + } + + public function test_jsonb_path_query_first_array(): void + { + $dql = 'SELECT JSONB_PATH_QUERY_FIRST(:json, :path) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'json' => '{"items": [1, 2, 3]}', + 'path' => '$.items[*]', + ]); + $this->assertIsString($result[0]['result']); + $this->assertSame('1', $result[0]['result']); + } + + public function test_jsonb_path_query_first_with_filter(): void + { + $dql = 'SELECT JSONB_PATH_QUERY_FIRST(:json, :path) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'json' => '{"items": [{"id": 1}, {"id": 2}, {"id": 3}]}', + 'path' => '$.items[*] ? (@.id > 1)', + ]); + $this->assertIsString($result[0]['result']); + $this->assertSame('{"id": 2}', $result[0]['result']); + } + + public function test_jsonb_path_query_first_with_no_match(): void + { + $dql = 'SELECT JSONB_PATH_QUERY_FIRST(:json, :path) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'json' => '{"items": [{"id": 1}]}', + 'path' => '$.items[*] ? (@.id > 1)', + ]); + $this->assertNull($result[0]['result']); + } + + public function test_jsonb_path_query_first_with_column_reference(): void + { + $dql = 'SELECT JSONB_PATH_QUERY_FIRST(t.object1, :path) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, ['path' => '$.tags[*]']); + $this->assertIsString($result[0]['result']); + $this->assertSame('"developer"', $result[0]['result']); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryTest.php new file mode 100644 index 00000000..1f02dd1d --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryTest.php @@ -0,0 +1,74 @@ + JsonbPathQuery::class, + ]; + } + + public function test_jsonb_path_query_simple(): void + { + $dql = 'SELECT JSONB_PATH_QUERY(:json, :path) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'json' => '{"a": 1, "b": 2}', + 'path' => '$.b', + ]); + $this->assertIsArray($result); + $this->assertCount(1, $result); + $this->assertSame('2', $result[0]['result']); + } + + public function test_jsonb_path_query_array(): void + { + $dql = 'SELECT JSONB_PATH_QUERY(:json, :path) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'json' => '{"items": [1, 2, 3]}', + 'path' => '$.items[*]', + ]); + $this->assertIsArray($result); + $this->assertCount(3, $result); + $this->assertSame('1', $result[0]['result']); + $this->assertSame('2', $result[1]['result']); + $this->assertSame('3', $result[2]['result']); + } + + public function test_jsonb_path_query_with_filter(): void + { + $dql = 'SELECT JSONB_PATH_QUERY(:json, :path) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'json' => '{"items": [{"id": 1}, {"id": 2}, {"id": 3}]}', + 'path' => '$.items[*] ? (@.id > 1)', + ]); + $this->assertIsArray($result); + $this->assertCount(2, $result); + $this->assertSame('{"id": 2}', $result[0]['result']); + $this->assertSame('{"id": 3}', $result[1]['result']); + } + + public function test_jsonb_path_query_with_column_reference(): void + { + $dql = 'SELECT JSONB_PATH_QUERY(t.object1, :path) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, ['path' => '$.tags[*]']); + $this->assertIsArray($result); + $this->assertCount(2, $result); + $this->assertSame('"developer"', $result[0]['result']); + $this->assertSame('"manager"', $result[1]['result']); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPrettyTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPrettyTest.php new file mode 100644 index 00000000..d6c1e611 --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPrettyTest.php @@ -0,0 +1,26 @@ + JsonbPretty::class, + ]; + } + + public function test_jsonb_pretty(): void + { + $dql = 'SELECT JSONB_PRETTY(t.object1) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertIsString($result[0]['result']); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetLaxTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetLaxTest.php new file mode 100644 index 00000000..59229340 --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetLaxTest.php @@ -0,0 +1,82 @@ + JsonbSetLax::class, + ]; + } + + public function test_jsonb_set_lax_update_existing_value(): void + { + $dql = 'SELECT JSONB_SET_LAX(t.object1, :path, :value) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'path' => '{name}', + 'value' => '"John Doe"', + ]); + $this->assertIsString($result[0]['result']); + $decoded = \json_decode($result[0]['result'], true); + $this->assertIsArray($decoded); + $this->assertArrayHasKey('name', $decoded); + $this->assertSame('John Doe', $decoded['name']); + } + + public function test_jsonb_set_lax_add_new_value(): void + { + $dql = 'SELECT JSONB_SET_LAX(t.object1, :path, :value) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'path' => '{email}', + 'value' => '"john@example.com"', + ]); + $this->assertIsString($result[0]['result']); + $decoded = \json_decode($result[0]['result'], true); + $this->assertIsArray($decoded); + $this->assertArrayHasKey('email', $decoded); + $this->assertSame('john@example.com', $decoded['email']); + } + + public function test_jsonb_set_lax_nested_path(): void + { + $dql = 'SELECT JSONB_SET_LAX(t.object1, :path, :value) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'path' => '{address,zip}', + 'value' => '"10001"', + ]); + $this->assertIsString($result[0]['result']); + $decoded = \json_decode($result[0]['result'], true); + $this->assertIsArray($decoded); + $this->assertArrayHasKey('address', $decoded); + $this->assertIsArray($decoded['address']); + $this->assertArrayHasKey('zip', $decoded['address']); + $this->assertSame('10001', $decoded['address']['zip']); + } + + public function test_jsonb_set_lax_with_invalid_path(): void + { + $dql = 'SELECT JSONB_SET_LAX(t.object1, :path, :value) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'path' => '{invalid,path}', + 'value' => '"value"', + ]); + $this->assertIsString($result[0]['result']); + $decoded = \json_decode($result[0]['result'], true); + $this->assertIsArray($decoded); + self::assertArrayNotHasKey('invalid', $decoded); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetTest.php new file mode 100644 index 00000000..c1268666 --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetTest.php @@ -0,0 +1,82 @@ + JsonbSet::class, + ]; + } + + public function test_jsonb_set_update_existing_value(): void + { + $dql = 'SELECT JSONB_SET(t.object1, :path, :value) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'path' => '{name}', + 'value' => '"John Doe"', + ]); + $this->assertIsString($result[0]['result']); + $decoded = \json_decode($result[0]['result'], true); + $this->assertIsArray($decoded); + $this->assertArrayHasKey('name', $decoded); + $this->assertSame('John Doe', $decoded['name']); + } + + public function test_jsonb_set_add_new_value(): void + { + $dql = 'SELECT JSONB_SET(t.object1, :path, :value) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'path' => '{email}', + 'value' => '"john@example.com"', + ]); + $this->assertIsString($result[0]['result']); + $decoded = \json_decode($result[0]['result'], true); + $this->assertIsArray($decoded); + $this->assertArrayHasKey('email', $decoded); + $this->assertSame('john@example.com', $decoded['email']); + } + + public function test_jsonb_set_nested_path(): void + { + $dql = 'SELECT JSONB_SET(t.object1, :path, :value) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql, [ + 'path' => '{address,zip}', + 'value' => '"10001"', + ]); + $this->assertIsString($result[0]['result']); + $decoded = \json_decode($result[0]['result'], true); + $this->assertIsArray($decoded); + $this->assertArrayHasKey('address', $decoded); + $this->assertIsArray($decoded['address']); + $this->assertArrayHasKey('zip', $decoded['address']); + $this->assertSame('10001', $decoded['address']['zip']); + } + + public function test_jsonb_set_with_create_missing_false(): void + { + $dql = "SELECT JSONB_SET(t.object1, :path, :value, 'false') as result + FROM Fixtures\\MartinGeorgiev\\Doctrine\\Entity\\ContainsJsons t + WHERE t.id = 1"; + $result = $this->executeDqlQuery($dql, [ + 'path' => '{nonexistent}', + 'value' => '"value"', + ]); + $this->assertIsString($result[0]['result']); + $decoded = \json_decode($result[0]['result'], true); + $this->assertIsArray($decoded); + self::assertArrayNotHasKey('nonexistent', $decoded); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbStripNullsTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbStripNullsTest.php new file mode 100644 index 00000000..68be7955 --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbStripNullsTest.php @@ -0,0 +1,37 @@ + JsonbStripNulls::class, + ]; + } + + public function test_jsonb_strip_nulls(): void + { + $dql = 'SELECT JSONB_STRIP_NULLS(t.object1) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertIsString($result[0]['result']); + } + + public function test_jsonb_strip_nulls_with_null_values(): void + { + $dql = 'SELECT JSONB_STRIP_NULLS(t.object1) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsJsons t + WHERE t.id = 5'; + $result = $this->executeDqlQuery($dql); + $this->assertIsString($result[0]['result']); + $this->assertStringNotContainsString('"age": null', $result[0]['result']); + $this->assertStringNotContainsString('"zip": null', $result[0]['result']); + } +}