From 7869cba1d23b79f51783390a92f593fcb17b50ac Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Thu, 22 May 2025 17:15:05 +0100 Subject: [PATCH 1/2] chore: test functions against a real PostgreSQL server --- .../ORM/Query/AST/Functions/ArrayAggTest.php | 42 +++++++++++++++++ .../Query/AST/Functions/JsonObjectAggTest.php | 36 +++++++++++++++ .../ORM/Query/AST/Functions/StringAggTest.php | 45 +++++++++++++++++++ .../ORM/Query/AST/Functions/TextTestCase.php | 5 ++- 4 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayAggTest.php create mode 100644 tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonObjectAggTest.php create mode 100644 tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/StringAggTest.php diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayAggTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayAggTest.php new file mode 100644 index 00000000..82fed6b4 --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayAggTest.php @@ -0,0 +1,42 @@ + ArrayAgg::class]; + } + + public function test_array_agg_with_text_array(): void + { + $dql = 'SELECT ARRAY_AGG(t.textArray) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertSame('{{apple,banana,orange}}', $result[0]['result']); + } + + public function test_array_agg_with_integer_array(): void + { + $dql = 'SELECT ARRAY_AGG(t.integerArray) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertSame('{{1,2,3}}', $result[0]['result']); + } + + public function test_array_agg_with_boolean_array(): void + { + $dql = 'SELECT ARRAY_AGG(t.boolArray) as result + FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t + WHERE t.id = 1'; + $result = $this->executeDqlQuery($dql); + $this->assertSame('{{t,f,t}}', $result[0]['result']); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonObjectAggTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonObjectAggTest.php new file mode 100644 index 00000000..69b498e9 --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonObjectAggTest.php @@ -0,0 +1,36 @@ + JsonObjectAgg::class, + ]; + } + + public function test_json_object_agg_simple(): void + { + $dql = "SELECT JSON_OBJECT_AGG('key', t.object1) as result + FROM Fixtures\\MartinGeorgiev\\Doctrine\\Entity\\ContainsJsons t + WHERE t.id = 3"; + $result = $this->executeDqlQuery($dql); + $this->assertIsString($result[0]['result']); + $decoded = \json_decode($result[0]['result'], true); + $this->assertIsArray($decoded); + $this->assertSame([ + 'key' => [ + 'age' => 30, + 'name' => 'Micky', + 'tags' => [], + 'address' => ['city' => 'New York'], + ], + ], $decoded); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/StringAggTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/StringAggTest.php new file mode 100644 index 00000000..273d046c --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/StringAggTest.php @@ -0,0 +1,45 @@ + StringAgg::class]; + } + + public function test_string_agg_with_for_all_rows(): void + { + $dql = "SELECT STRING_AGG(t.text1, ',') as result + FROM Fixtures\\MartinGeorgiev\\Doctrine\\Entity\\ContainsTexts t"; + $result = $this->executeDqlQuery($dql); + $this->assertSame('this is a test string,lorem ipsum dolor,foo,special,chars;test', $result[0]['result']); + } + + public function test_string_agg_with_for_all_rows_and_semicolon_delimiter(): void + { + $dql = "SELECT STRING_AGG(t.text2, ';') as result + FROM Fixtures\\MartinGeorgiev\\Doctrine\\Entity\\ContainsTexts t"; + $result = $this->executeDqlQuery($dql); + $this->assertSame('another test string;sit amet;bar;multi;delimiter,case', $result[0]['result']); + } + + public function test_string_agg_with_for_all_rows_and_space_delimiter(): void + { + $dql = "SELECT STRING_AGG(t.text1, ' ') as result FROM Fixtures\\MartinGeorgiev\\Doctrine\\Entity\\ContainsTexts t"; + $result = $this->executeDqlQuery($dql); + $this->assertSame('this is a test string lorem ipsum dolor foo special,chars;test', $result[0]['result']); + } + + public function test_string_agg_with_where_clause(): void + { + $dql = "SELECT STRING_AGG(t.text1, ',') as result FROM Fixtures\\MartinGeorgiev\\Doctrine\\Entity\\ContainsTexts t WHERE t.id in (1, 4)"; + $result = $this->executeDqlQuery($dql); + $this->assertSame('this is a test string,special,chars;test', $result[0]['result']); + } +} diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/TextTestCase.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/TextTestCase.php index ddde9653..189520e3 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/TextTestCase.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/TextTestCase.php @@ -38,7 +38,10 @@ protected function insertTestDataForTextFixture(): void { $sql = \sprintf(' INSERT INTO %s.containstexts (text1, text2) VALUES - (\'this is a test string\', \'another test string\') + (\'this is a test string\', \'another test string\'), + (\'lorem ipsum dolor\', \'sit amet\'), + (\'foo\', \'bar\'), + (\'special,chars;test\', \'multi;delimiter,case\') ', self::DATABASE_SCHEMA); $this->connection->executeStatement($sql); } From 38f5b79af4f97c7d39d69f321b842d2deafd4afa Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Thu, 22 May 2025 17:16:29 +0100 Subject: [PATCH 2/2] no message --- .scrutinizer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.scrutinizer.yml b/.scrutinizer.yml index 5160a9e2..fc411df6 100644 --- a/.scrutinizer.yml +++ b/.scrutinizer.yml @@ -8,7 +8,7 @@ build: tests: override: - php-scrutinizer-run - - command: composer run-tests-with-clover + - command: composer run-unit-tests-with-clover coverage: file: var/logs/test-coverage/clover.xml format: clover