From 4f96d2f4514d005cd75325bc1adc2c6e8018b165 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Thu, 31 Jul 2025 11:56:51 +0300 Subject: [PATCH 01/22] chore: increase test coverage --- .../MartinGeorgiev/Utils/DoctrineOrmTest.php | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 tests/Unit/MartinGeorgiev/Utils/DoctrineOrmTest.php diff --git a/tests/Unit/MartinGeorgiev/Utils/DoctrineOrmTest.php b/tests/Unit/MartinGeorgiev/Utils/DoctrineOrmTest.php new file mode 100644 index 00000000..e11cc5b2 --- /dev/null +++ b/tests/Unit/MartinGeorgiev/Utils/DoctrineOrmTest.php @@ -0,0 +1,22 @@ + Date: Thu, 31 Jul 2025 20:18:12 +0300 Subject: [PATCH 02/22] unify test method names style --- .../ORM/Query/AST/Functions/ArrayPositionTest.php | 6 ++++-- .../Doctrine/ORM/Query/AST/Functions/ArrayToJsonTest.php | 6 ++++-- .../Doctrine/ORM/Query/AST/Functions/DateAddTest.php | 9 ++++++--- .../ORM/Query/AST/Functions/DateSubtractTest.php | 9 ++++++--- .../Doctrine/ORM/Query/AST/Functions/JsonbInsertTest.php | 9 ++++++--- .../ORM/Query/AST/Functions/JsonbPathExistsTest.php | 9 ++++++--- .../ORM/Query/AST/Functions/JsonbPathMatchTest.php | 9 ++++++--- .../ORM/Query/AST/Functions/JsonbPathQueryArrayTest.php | 9 ++++++--- .../ORM/Query/AST/Functions/JsonbPathQueryFirstTest.php | 9 ++++++--- .../ORM/Query/AST/Functions/JsonbPathQueryTest.php | 9 ++++++--- .../Doctrine/ORM/Query/AST/Functions/JsonbSetTest.php | 9 ++++++--- .../Doctrine/ORM/Query/AST/Functions/RegexpCountTest.php | 6 ++++-- .../Doctrine/ORM/Query/AST/Functions/RegexpInstrTest.php | 6 ++++-- .../Doctrine/ORM/Query/AST/Functions/RegexpLikeTest.php | 6 ++++-- .../Doctrine/ORM/Query/AST/Functions/RegexpMatchTest.php | 6 ++++-- .../ORM/Query/AST/Functions/RegexpReplaceTest.php | 6 ++++-- .../ORM/Query/AST/Functions/RegexpSubstrTest.php | 6 ++++-- .../Doctrine/ORM/Query/AST/Functions/RowToJsonTest.php | 6 ++++-- 18 files changed, 90 insertions(+), 45 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPositionTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPositionTest.php index 392e6c41..1ede3db5 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPositionTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPositionTest.php @@ -43,7 +43,8 @@ protected function getDqlStatements(): array ]; } - public function test_too_few_arguments_throws_exception(): void + #[Test] + public function too_few_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('array_position() requires at least 2 arguments'); @@ -52,7 +53,8 @@ public function test_too_few_arguments_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('array_position() requires between 2 and 3 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayToJsonTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayToJsonTest.php index 6e357898..5cea1729 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayToJsonTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayToJsonTest.php @@ -40,7 +40,8 @@ protected function getDqlStatements(): array ]; } - public function test_invalid_boolean_throws_exception(): void + #[Test] + public function invalid_boolean_throws_exception(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for array_to_json. Must be "true" or "false".'); @@ -49,7 +50,8 @@ public function test_invalid_boolean_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('array_to_json() requires between 1 and 2 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateAddTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateAddTest.php index f3a199d8..fe3b915a 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateAddTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateAddTest.php @@ -44,7 +44,8 @@ protected function getDqlStatements(): array ]; } - public function test_invalid_timezone_throws_exception(): void + #[Test] + public function invalid_timezone_throws_exception(): void { $this->expectException(InvalidTimezoneException::class); $this->expectExceptionMessage('Invalid timezone "Invalid/Timezone" provided for date_add'); @@ -53,7 +54,8 @@ public function test_invalid_timezone_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_few_arguments_throws_exception(): void + #[Test] + public function too_few_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('date_add() requires at least 2 arguments'); @@ -62,7 +64,8 @@ public function test_too_few_arguments_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('date_add() requires between 2 and 3 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateSubtractTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateSubtractTest.php index 81c290d3..1b35d60c 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateSubtractTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateSubtractTest.php @@ -42,7 +42,8 @@ protected function getDqlStatements(): array ]; } - public function test_invalid_timezone_throws_exception(): void + #[Test] + public function invalid_timezone_throws_exception(): void { $this->expectException(InvalidTimezoneException::class); $this->expectExceptionMessage('Invalid timezone "Invalid/Timezone" provided for date_subtract'); @@ -51,7 +52,8 @@ public function test_invalid_timezone_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_few_arguments_throws_exception(): void + #[Test] + public function too_few_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('date_subtract() requires at least 2 arguments'); @@ -60,7 +62,8 @@ public function test_too_few_arguments_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('date_subtract() requires between 2 and 3 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbInsertTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbInsertTest.php index 8a411beb..1c5f5fa9 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbInsertTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbInsertTest.php @@ -34,7 +34,8 @@ protected function getDqlStatements(): array ]; } - public function test_invalid_boolean_throws_exception(): void + #[Test] + public function invalid_boolean_throws_exception(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for jsonb_insert. Must be "true" or "false".'); @@ -43,7 +44,8 @@ public function test_invalid_boolean_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_few_arguments_throws_exception(): void + #[Test] + public function too_few_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_insert() requires at least 3 arguments'); @@ -52,7 +54,8 @@ public function test_too_few_arguments_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_insert() requires between 3 and 4 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathExistsTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathExistsTest.php index 91cdc1b7..5661d538 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathExistsTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathExistsTest.php @@ -44,7 +44,8 @@ protected function getDqlStatements(): array ]; } - public function test_invalid_boolean_throws_exception(): void + #[Test] + public function invalid_boolean_throws_exception(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for jsonb_path_exists. Must be "true" or "false".'); @@ -53,7 +54,8 @@ public function test_invalid_boolean_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_few_arguments_throws_exception(): void + #[Test] + public function too_few_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_exists() requires at least 2 arguments'); @@ -62,7 +64,8 @@ public function test_too_few_arguments_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_exists() requires between 2 and 4 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathMatchTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathMatchTest.php index aae75158..97410c5a 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathMatchTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathMatchTest.php @@ -44,7 +44,8 @@ protected function getDqlStatements(): array ]; } - public function test_invalid_boolean_throws_exception(): void + #[Test] + public function invalid_boolean_throws_exception(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for jsonb_path_match. Must be "true" or "false".'); @@ -53,7 +54,8 @@ public function test_invalid_boolean_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_few_arguments_throws_exception(): void + #[Test] + public function too_few_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_match() requires at least 2 arguments'); @@ -62,7 +64,8 @@ public function test_too_few_arguments_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_match() requires between 2 and 4 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryArrayTest.php index 792dc692..3bdb0e7c 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryArrayTest.php @@ -44,7 +44,8 @@ protected function getDqlStatements(): array ]; } - public function test_invalid_boolean_throws_exception(): void + #[Test] + public function invalid_boolean_throws_exception(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for jsonb_path_query_array. Must be "true" or "false".'); @@ -53,7 +54,8 @@ public function test_invalid_boolean_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_few_arguments_throws_exception(): void + #[Test] + public function too_few_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_query_array() requires at least 2 arguments'); @@ -62,7 +64,8 @@ public function test_too_few_arguments_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_query_array() requires between 2 and 4 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryFirstTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryFirstTest.php index e8dde9b9..c528e3d7 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryFirstTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryFirstTest.php @@ -44,7 +44,8 @@ protected function getDqlStatements(): array ]; } - public function test_invalid_boolean_throws_exception(): void + #[Test] + public function invalid_boolean_throws_exception(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for jsonb_path_query_first. Must be "true" or "false".'); @@ -53,7 +54,8 @@ public function test_invalid_boolean_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_few_arguments_throws_exception(): void + #[Test] + public function too_few_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_query_first() requires at least 2 arguments'); @@ -62,7 +64,8 @@ public function test_too_few_arguments_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_query_first() requires between 2 and 4 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryTest.php index 2a754501..e365012f 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryTest.php @@ -44,7 +44,8 @@ protected function getDqlStatements(): array ]; } - public function test_invalid_boolean_throws_exception(): void + #[Test] + public function invalid_boolean_throws_exception(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for jsonb_path_query. Must be "true" or "false".'); @@ -53,7 +54,8 @@ public function test_invalid_boolean_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_few_arguments_throws_exception(): void + #[Test] + public function too_few_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_query() requires at least 2 arguments'); @@ -62,7 +64,8 @@ public function test_too_few_arguments_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_query() requires between 2 and 4 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetTest.php index 2e74592b..360e8f10 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetTest.php @@ -40,7 +40,8 @@ protected function getDqlStatements(): array ]; } - public function test_invalid_boolean_throws_exception(): void + #[Test] + public function invalid_boolean_throws_exception(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for jsonb_set. Must be "true" or "false".'); @@ -49,7 +50,8 @@ public function test_invalid_boolean_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_few_arguments_throws_exception(): void + #[Test] + public function too_few_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_set() requires at least 3 arguments'); @@ -58,7 +60,8 @@ public function test_too_few_arguments_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_set() requires between 3 and 4 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpCountTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpCountTest.php index aed1f93d..0ad17288 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpCountTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpCountTest.php @@ -43,7 +43,8 @@ protected function getDqlStatements(): array ]; } - public function test_too_few_arguments_throws_exception(): void + #[Test] + public function too_few_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('regexp_count() requires at least 2 arguments'); @@ -52,7 +53,8 @@ public function test_too_few_arguments_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('regexp_count() requires between 2 and 4 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpInstrTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpInstrTest.php index 0003deaf..308b25d7 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpInstrTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpInstrTest.php @@ -49,7 +49,8 @@ protected function getDqlStatements(): array ]; } - public function test_too_few_arguments_throws_exception(): void + #[Test] + public function too_few_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('regexp_instr() requires at least 2 arguments'); @@ -58,7 +59,8 @@ public function test_too_few_arguments_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('regexp_instr() requires between 2 and 7 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpLikeTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpLikeTest.php index 808549d3..82f3baf3 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpLikeTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpLikeTest.php @@ -39,7 +39,8 @@ protected function getDqlStatements(): array ]; } - public function test_too_few_arguments_throws_exception(): void + #[Test] + public function too_few_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('regexp_like() requires at least 2 arguments'); @@ -48,7 +49,8 @@ public function test_too_few_arguments_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('regexp_like() requires between 2 and 3 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpMatchTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpMatchTest.php index eb718418..72a741f6 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpMatchTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpMatchTest.php @@ -39,7 +39,8 @@ protected function getDqlStatements(): array ]; } - public function test_too_few_arguments_throws_exception(): void + #[Test] + public function too_few_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('regexp_match() requires at least 2 arguments'); @@ -48,7 +49,8 @@ public function test_too_few_arguments_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('regexp_match() requires between 2 and 3 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpReplaceTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpReplaceTest.php index 7126cdb8..2e2c1f08 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpReplaceTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpReplaceTest.php @@ -45,7 +45,8 @@ protected function getDqlStatements(): array ]; } - public function test_too_few_arguments_throws_exception(): void + #[Test] + public function too_few_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('regexp_replace() requires at least 3 arguments'); @@ -54,7 +55,8 @@ public function test_too_few_arguments_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('regexp_replace() requires between 3 and 6 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpSubstrTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpSubstrTest.php index e1eabeef..43fe7798 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpSubstrTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpSubstrTest.php @@ -45,7 +45,8 @@ protected function getDqlStatements(): array ]; } - public function test_too_few_arguments_throws_exception(): void + #[Test] + public function too_few_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('regexp_substr() requires at least 2 arguments'); @@ -54,7 +55,8 @@ public function test_too_few_arguments_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('regexp_substr() requires between 2 and 6 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RowToJsonTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RowToJsonTest.php index e811a835..e70f4419 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RowToJsonTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RowToJsonTest.php @@ -42,7 +42,8 @@ protected function getDqlStatements(): array ]; } - public function test_invalid_boolean_throws_exception(): void + #[Test] + public function invalid_boolean_throws_exception(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for row_to_json. Must be "true" or "false".'); @@ -51,7 +52,8 @@ public function test_invalid_boolean_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } - public function test_too_many_arguments_throws_exception(): void + #[Test] + public function too_many_arguments_throws_exception(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('row_to_json() requires between 1 and 2 arguments'); From 35c8a8333e8ea90eaa6f9b39817fbe7b1e912d84 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Fri, 1 Aug 2025 00:12:33 +0300 Subject: [PATCH 03/22] no message --- .../Doctrine/ORM/Query/AST/Functions/ArrayPositionTest.php | 1 + .../Doctrine/ORM/Query/AST/Functions/ArrayToJsonTest.php | 1 + .../Doctrine/ORM/Query/AST/Functions/DateAddTest.php | 1 + .../Doctrine/ORM/Query/AST/Functions/DateSubtractTest.php | 1 + .../Doctrine/ORM/Query/AST/Functions/JsonbInsertTest.php | 1 + .../Doctrine/ORM/Query/AST/Functions/JsonbPathExistsTest.php | 1 + .../Doctrine/ORM/Query/AST/Functions/JsonbPathMatchTest.php | 1 + .../Doctrine/ORM/Query/AST/Functions/JsonbPathQueryArrayTest.php | 1 + .../Doctrine/ORM/Query/AST/Functions/JsonbPathQueryFirstTest.php | 1 + .../Doctrine/ORM/Query/AST/Functions/JsonbPathQueryTest.php | 1 + .../Doctrine/ORM/Query/AST/Functions/JsonbSetTest.php | 1 + .../Doctrine/ORM/Query/AST/Functions/RegexpCountTest.php | 1 + .../Doctrine/ORM/Query/AST/Functions/RegexpInstrTest.php | 1 + .../Doctrine/ORM/Query/AST/Functions/RegexpLikeTest.php | 1 + .../Doctrine/ORM/Query/AST/Functions/RegexpMatchTest.php | 1 + .../Doctrine/ORM/Query/AST/Functions/RegexpReplaceTest.php | 1 + .../Doctrine/ORM/Query/AST/Functions/RegexpSubstrTest.php | 1 + .../Doctrine/ORM/Query/AST/Functions/RowToJsonTest.php | 1 + 18 files changed, 18 insertions(+) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPositionTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPositionTest.php index 1ede3db5..baf979c0 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPositionTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPositionTest.php @@ -8,6 +8,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayPosition; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\BaseVariadicFunction; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; +use PHPUnit\Framework\Attributes\Test; class ArrayPositionTest extends BaseVariadicFunctionTestCase { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayToJsonTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayToJsonTest.php index 5cea1729..1a9c30ef 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayToJsonTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayToJsonTest.php @@ -9,6 +9,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\BaseVariadicFunction; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidBooleanException; +use PHPUnit\Framework\Attributes\Test; class ArrayToJsonTest extends BaseVariadicFunctionTestCase { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateAddTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateAddTest.php index fe3b915a..095a2df8 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateAddTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateAddTest.php @@ -9,6 +9,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateAdd; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidTimezoneException; +use PHPUnit\Framework\Attributes\Test; class DateAddTest extends BaseVariadicFunctionTestCase { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateSubtractTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateSubtractTest.php index 1b35d60c..5d6d4c06 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateSubtractTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateSubtractTest.php @@ -9,6 +9,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateSubtract; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidTimezoneException; +use PHPUnit\Framework\Attributes\Test; class DateSubtractTest extends BaseVariadicFunctionTestCase { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbInsertTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbInsertTest.php index 1c5f5fa9..cb67a3b3 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbInsertTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbInsertTest.php @@ -8,6 +8,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidBooleanException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbInsert; +use PHPUnit\Framework\Attributes\Test; class JsonbInsertTest extends TestCase { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathExistsTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathExistsTest.php index 5661d538..6e88f696 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathExistsTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathExistsTest.php @@ -9,6 +9,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidBooleanException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathExists; +use PHPUnit\Framework\Attributes\Test; class JsonbPathExistsTest extends BaseVariadicFunctionTestCase { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathMatchTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathMatchTest.php index 97410c5a..91ba190d 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathMatchTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathMatchTest.php @@ -9,6 +9,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidBooleanException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathMatch; +use PHPUnit\Framework\Attributes\Test; class JsonbPathMatchTest extends BaseVariadicFunctionTestCase { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryArrayTest.php index 3bdb0e7c..009a5b8c 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryArrayTest.php @@ -9,6 +9,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidBooleanException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathQueryArray; +use PHPUnit\Framework\Attributes\Test; class JsonbPathQueryArrayTest extends BaseVariadicFunctionTestCase { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryFirstTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryFirstTest.php index c528e3d7..fc70b0de 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryFirstTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryFirstTest.php @@ -9,6 +9,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidBooleanException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathQueryFirst; +use PHPUnit\Framework\Attributes\Test; class JsonbPathQueryFirstTest extends BaseVariadicFunctionTestCase { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryTest.php index e365012f..6cb99489 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryTest.php @@ -9,6 +9,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidBooleanException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbPathQuery; +use PHPUnit\Framework\Attributes\Test; class JsonbPathQueryTest extends BaseVariadicFunctionTestCase { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetTest.php index 360e8f10..270c7464 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetTest.php @@ -9,6 +9,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidBooleanException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\JsonbSet; +use PHPUnit\Framework\Attributes\Test; class JsonbSetTest extends BaseVariadicFunctionTestCase { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpCountTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpCountTest.php index 0ad17288..6eed6edb 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpCountTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpCountTest.php @@ -8,6 +8,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\BaseVariadicFunction; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpCount; +use PHPUnit\Framework\Attributes\Test; class RegexpCountTest extends BaseVariadicFunctionTestCase { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpInstrTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpInstrTest.php index 308b25d7..22a2b308 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpInstrTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpInstrTest.php @@ -8,6 +8,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\BaseVariadicFunction; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpInstr; +use PHPUnit\Framework\Attributes\Test; class RegexpInstrTest extends BaseVariadicFunctionTestCase { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpLikeTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpLikeTest.php index 82f3baf3..1c64f5bf 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpLikeTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpLikeTest.php @@ -8,6 +8,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\BaseVariadicFunction; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpLike; +use PHPUnit\Framework\Attributes\Test; class RegexpLikeTest extends BaseVariadicFunctionTestCase { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpMatchTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpMatchTest.php index 72a741f6..d3b82dcb 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpMatchTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpMatchTest.php @@ -8,6 +8,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\BaseVariadicFunction; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpMatch; +use PHPUnit\Framework\Attributes\Test; class RegexpMatchTest extends BaseVariadicFunctionTestCase { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpReplaceTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpReplaceTest.php index 2e2c1f08..ac37f9a8 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpReplaceTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpReplaceTest.php @@ -8,6 +8,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\BaseVariadicFunction; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpReplace; +use PHPUnit\Framework\Attributes\Test; class RegexpReplaceTest extends BaseVariadicFunctionTestCase { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpSubstrTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpSubstrTest.php index 43fe7798..fdc9f701 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpSubstrTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpSubstrTest.php @@ -8,6 +8,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\BaseVariadicFunction; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpSubstr; +use PHPUnit\Framework\Attributes\Test; class RegexpSubstrTest extends BaseVariadicFunctionTestCase { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RowToJsonTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RowToJsonTest.php index e70f4419..e57ba503 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RowToJsonTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RowToJsonTest.php @@ -9,6 +9,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidBooleanException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RowToJson; +use PHPUnit\Framework\Attributes\Test; class RowToJsonTest extends BaseVariadicFunctionTestCase { From 0ef539ab68e594459c8ba0134ce8bee9284ccc91 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Fri, 1 Aug 2025 00:24:32 +0300 Subject: [PATCH 04/22] no message --- .../Doctrine/DBAL/Types/CidrArrayTest.php | 4 ++-- .../Doctrine/DBAL/Types/MacaddrTest.php | 24 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/CidrArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/CidrArrayTest.php index 60b98ace..833174e4 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/CidrArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/CidrArrayTest.php @@ -103,7 +103,7 @@ public static function provideInvalidPHPValuesForDatabaseTransformation(): array ]; } - #[DataProvider('provideInvalidDatabaseValuesForPHPTransformationForPHPTransformation')] + #[DataProvider('provideInvalidDatabaseValuesForPHPTransformation')] #[Test] public function throws_exception_when_invalid_data_provided_to_convert_to_php_value(string $postgresValue): void { @@ -114,7 +114,7 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_php_va /** * @return array */ - public static function provideInvalidDatabaseValuesForPHPTransformationForPHPTransformation(): array + public static function provideInvalidDatabaseValuesForPHPTransformation(): array { return [ 'invalid format' => ['{"invalid-cidr"}'], diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/MacaddrTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/MacaddrTest.php index 62370a04..f1c03865 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/MacaddrTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/MacaddrTest.php @@ -36,57 +36,57 @@ public function has_name(): void #[DataProvider('provideValidTransformations')] #[Test] - public function can_transform_from_php_value(?string $phpInput, ?string $postgresValueAfterNormalisation, ?string $phpValueAfterRetrievalFromDatabase): void + public function can_transform_from_php_value(?string $phpInput, ?string $postgresValueAfterNormalization, ?string $phpValueAfterRetrievalFromDatabase): void { - self::assertEquals($postgresValueAfterNormalisation, $this->fixture->convertToDatabaseValue($phpInput, $this->platform)); + self::assertEquals($postgresValueAfterNormalization, $this->fixture->convertToDatabaseValue($phpInput, $this->platform)); } #[DataProvider('provideValidTransformations')] #[Test] - public function can_transform_to_php_value(?string $phpInput, ?string $postgresValueAfterNormalisation, ?string $phpValueAfterRetrievalFromDatabase): void + public function can_transform_to_php_value(?string $phpInput, ?string $postgresValueAfterNormalization, ?string $phpValueAfterRetrievalFromDatabase): void { - self::assertEquals($phpValueAfterRetrievalFromDatabase, $this->fixture->convertToPHPValue($postgresValueAfterNormalisation, $this->platform)); + self::assertEquals($phpValueAfterRetrievalFromDatabase, $this->fixture->convertToPHPValue($postgresValueAfterNormalization, $this->platform)); } /** - * @return array + * @return array */ public static function provideValidTransformations(): array { return [ 'null' => [ 'phpInput' => null, - 'postgresValueAfterNormalisation' => null, + 'postgresValueAfterNormalization' => null, 'phpValueAfterRetrievalFromDatabase' => null, ], 'colon-separated lowercase' => [ 'phpInput' => '08:00:2b:01:02:03', - 'postgresValueAfterNormalisation' => '08:00:2b:01:02:03', + 'postgresValueAfterNormalization' => '08:00:2b:01:02:03', 'phpValueAfterRetrievalFromDatabase' => '08:00:2b:01:02:03', ], 'colon-separated uppercase' => [ 'phpInput' => '08:00:2B:01:02:03', - 'postgresValueAfterNormalisation' => '08:00:2b:01:02:03', + 'postgresValueAfterNormalization' => '08:00:2b:01:02:03', 'phpValueAfterRetrievalFromDatabase' => '08:00:2b:01:02:03', ], 'hyphen-separated lowercase' => [ 'phpInput' => '08-00-2b-01-02-03', - 'postgresValueAfterNormalisation' => '08:00:2b:01:02:03', + 'postgresValueAfterNormalization' => '08:00:2b:01:02:03', 'phpValueAfterRetrievalFromDatabase' => '08:00:2b:01:02:03', ], 'hyphen-separated uppercase' => [ 'phpInput' => '08-00-2B-01-02-03', - 'postgresValueAfterNormalisation' => '08:00:2b:01:02:03', + 'postgresValueAfterNormalization' => '08:00:2b:01:02:03', 'phpValueAfterRetrievalFromDatabase' => '08:00:2b:01:02:03', ], 'no separator' => [ 'phpInput' => '08002B010203', - 'postgresValueAfterNormalisation' => '08:00:2b:01:02:03', + 'postgresValueAfterNormalization' => '08:00:2b:01:02:03', 'phpValueAfterRetrievalFromDatabase' => '08:00:2b:01:02:03', ], 'mixed case no separator' => [ 'phpInput' => '08002b010203', - 'postgresValueAfterNormalisation' => '08:00:2b:01:02:03', + 'postgresValueAfterNormalization' => '08:00:2b:01:02:03', 'phpValueAfterRetrievalFromDatabase' => '08:00:2b:01:02:03', ], ]; From 9606351742a7595755f88e1368aae484a7addd3e Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Fri, 1 Aug 2025 00:35:55 +0300 Subject: [PATCH 05/22] no message --- .../Doctrine/DBAL/Types/BaseNetworkTypeArrayTest.php | 2 +- .../MartinGeorgiev/Doctrine/DBAL/Types/BaseTypeTest.php | 6 +++--- .../MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php | 2 +- .../DBAL/Types/ValueObject/BaseTimestampRangeTestCase.php | 3 +-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseNetworkTypeArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseNetworkTypeArrayTest.php index 5ee2b46c..51685aba 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseNetworkTypeArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseNetworkTypeArrayTest.php @@ -57,7 +57,7 @@ public function has_name(): void #[Test] #[DataProvider('provideValidTransformations')] - public function can_convert_to_php_value(?array $phpValue, ?string $postgresValue): void + public function can_transform_to_php_value(?array $phpValue, ?string $postgresValue): void { self::assertEquals($phpValue, $this->fixture->convertToPHPValue($postgresValue, $this->platform)); } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseTypeTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseTypeTest.php index 47e73fa8..75395985 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseTypeTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseTypeTest.php @@ -49,7 +49,7 @@ public function throws_exception_when_getting_sql_declaration_with_no_type_name( } #[Test] - public function returns_correct_type_name(): void + public function can_return_correct_type_name(): void { $type = new class extends BaseType { protected const TYPE_NAME = 'custom_type'; @@ -59,7 +59,7 @@ public function returns_correct_type_name(): void } #[Test] - public function gets_correct_sql_declaration(): void + public function can_get_correct_sql_declaration(): void { $type = new class extends BaseType { protected const TYPE_NAME = 'custom_type'; @@ -76,7 +76,7 @@ public function gets_correct_sql_declaration(): void } #[Test] - public function requires_sql_comment_hint_returns_false(): void + public function can_return_false_for_sql_comment_hint_requirement(): void { $type = new class extends BaseType { protected const TYPE_NAME = 'custom_type'; diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php index 9fa4a8ae..1951aff8 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php @@ -183,7 +183,7 @@ public function handles_edge_case_with_empty_and_malformed_arrays(): void } #[Test] - public function returns_empty_array_for_non_standard_postgres_array_format(): void + public function can_return_empty_array_for_non_standard_postgres_array_format(): void { $result1 = $this->fixture->convertToPHPValue('[test]', $this->platform); $result2 = $this->fixture->convertToPHPValue('not-an-array', $this->platform); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/BaseTimestampRangeTestCase.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/BaseTimestampRangeTestCase.php index 4a893843..9c54a134 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/BaseTimestampRangeTestCase.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/BaseTimestampRangeTestCase.php @@ -11,8 +11,7 @@ /** * Base test case for timestamp range types (TsRange, TstzRange). * Provides common timestamp-specific test patterns. - */ -/** + * * @template R of \DateTimeInterface */ abstract class BaseTimestampRangeTestCase extends BaseRangeTestCase From 0d513e3db6d01886b17a5e84eab73e54f6508ba8 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Fri, 1 Aug 2025 00:52:28 +0300 Subject: [PATCH 06/22] no message --- .../MartinGeorgiev/Doctrine/DBAL/Types/BaseArrayTest.php | 2 +- .../Doctrine/DBAL/Types/BaseNetworkTypeArrayTest.php | 2 +- .../MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php | 8 ++++---- .../Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointTest.php | 4 ++-- .../Doctrine/DBAL/Types/ValueObject/Int4RangeTest.php | 6 +++--- .../Doctrine/DBAL/Types/ValueObject/TsRangeTest.php | 2 +- .../Doctrine/DBAL/Types/ValueObject/TstzRangeTest.php | 6 +++--- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseArrayTest.php index 77611063..68e857ad 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseArrayTest.php @@ -77,7 +77,7 @@ public static function provideValidTransformations(): array } #[Test] - public function throws_invalid_argument_exception_when_php_value_is_not_array(): void + public function throws_exception_when_php_value_is_not_array(): void { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessageMatches('/Given PHP value content type is not PHP array. Instead it is "\w+"./'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseNetworkTypeArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseNetworkTypeArrayTest.php index 51685aba..f688787d 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseNetworkTypeArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseNetworkTypeArrayTest.php @@ -112,7 +112,7 @@ public static function provideInvalidValues(): array } #[Test] - public function transform_array_item_for_php_handles_valid_string(): void + public function can_transform_array_item_for_php_with_valid_string(): void { $this->assertSame('valid_address', $this->fixture->transformArrayItemForPHP('"valid_address"')); } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php index 1951aff8..b5b9c2a2 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php @@ -171,7 +171,7 @@ public function throws_exception_for_malformed_point_strings_in_database(): void } #[Test] - public function handles_edge_case_with_empty_and_malformed_arrays(): void + public function can_handle_edge_case_with_empty_and_malformed_arrays(): void { $result1 = $this->fixture->convertToPHPValue('{}', $this->platform); $result2 = $this->fixture->convertToPHPValue('{invalid}', $this->platform); @@ -193,14 +193,14 @@ public function can_return_empty_array_for_non_standard_postgres_array_format(): } #[Test] - public function transform_array_item_for_php_returns_null_for_null(): void + public function can_transform_array_item_for_php_returning_null_for_null(): void { $this->assertNull($this->fixture->transformArrayItemForPHP(null)); } #[Test] #[DataProvider('provideInvalidTypes')] - public function transform_array_item_for_php_throws_for_invalid_type(mixed $value): void + public function can_transform_array_item_for_php_throwing_for_invalid_type(mixed $value): void { $this->expectException(InvalidPointArrayItemForPHPException::class); $this->fixture->transformArrayItemForPHP($value); @@ -208,7 +208,7 @@ public function transform_array_item_for_php_throws_for_invalid_type(mixed $valu #[Test] #[DataProvider('provideInvalidTypes')] - public function transform_postgres_array_to_php_array_returns_empty_for_invalid_format(mixed $value): void + public function can_transform_postgres_array_to_php_array_returning_empty_for_invalid_format(mixed $value): void { $reflectionObject = new \ReflectionObject($this->fixture); $reflectionMethod = $reflectionObject->getMethod('transformPostgresArrayToPHPArray'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointTest.php index 82f2486a..ef894d94 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointTest.php @@ -124,7 +124,7 @@ public static function provideInvalidDatabaseValues(): array } #[Test] - public function allows_coordinate_with_exactly_6_decimal_places(): void + public function can_allow_coordinate_with_exactly_6_decimal_places(): void { $point = new PointValueObject(1.123456, 2.654321); $this->assertSame(1.123456, $point->getX()); @@ -132,7 +132,7 @@ public function allows_coordinate_with_exactly_6_decimal_places(): void } #[Test] - public function throws_for_coordinate_with_more_than_6_decimal_places(): void + public function throws_exception_for_coordinate_with_more_than_6_decimal_places(): void { $this->expectException(\InvalidArgumentException::class); new PointValueObject(1.1234567, 2.0); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/Int4RangeTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/Int4RangeTest.php index ec5c84ed..1cb43be2 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/Int4RangeTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/Int4RangeTest.php @@ -110,7 +110,7 @@ public static function provideFromStringTestCases(): \Generator } #[Test] - public function validates_int4_bounds_for_lower(): void + public function can_validate_int4_bounds_for_lower(): void { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Lower bound -2147483649 is outside INT4 range'); @@ -119,7 +119,7 @@ public function validates_int4_bounds_for_lower(): void } #[Test] - public function validates_int4_bounds_for_upper(): void + public function can_validate_int4_bounds_for_upper(): void { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Upper bound 2147483648 is outside INT4 range'); @@ -128,7 +128,7 @@ public function validates_int4_bounds_for_upper(): void } #[Test] - public function allows_max_int4_values(): void + public function can_allow_max_int4_values(): void { $int4Range = new Int4Range(-2147483648, 2147483647); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/TsRangeTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/TsRangeTest.php index a52b2361..a2f3f4d2 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/TsRangeTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/TsRangeTest.php @@ -219,7 +219,7 @@ public static function provideFromStringTestCases(): \Generator } #[Test] - public function handles_microseconds_correctly(): void + public function can_handle_microseconds_correctly(): void { $start = new \DateTimeImmutable('2023-01-01 10:00:00.123456'); $end = new \DateTimeImmutable('2023-01-01 18:00:00.654321'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/TstzRangeTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/TstzRangeTest.php index bdba6e0c..57bd0384 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/TstzRangeTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/TstzRangeTest.php @@ -159,7 +159,7 @@ public static function provideFromStringTestCases(): \Generator } #[Test] - public function handles_different_timezones(): void + public function can_handle_different_timezones(): void { $start = new \DateTimeImmutable('2023-01-01 10:00:00+02:00'); $end = new \DateTimeImmutable('2023-01-01 18:00:00-05:00'); @@ -169,7 +169,7 @@ public function handles_different_timezones(): void } #[Test] - public function handles_microseconds_with_timezone(): void + public function can_handle_microseconds_with_timezone(): void { $start = new \DateTimeImmutable('2023-01-01 10:00:00.123456+00:00'); $end = new \DateTimeImmutable('2023-01-01 18:00:00.654321+00:00'); @@ -233,7 +233,7 @@ public function throws_exception_for_invalid_timestamp_string_via_from_string(): } #[Test] - public function preserves_timezone_information(): void + public function can_preserve_timezone_information(): void { $timestampWithTz = new \DateTimeImmutable('2023-01-01 10:00:00+02:00'); $tstzRange = new TstzRange($timestampWithTz, null); From e179d2ae94195f700e16231970de6b6984bfeb58 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Fri, 1 Aug 2025 01:10:56 +0300 Subject: [PATCH 07/22] no message --- .../MartinGeorgiev/Doctrine/DBAL/Types/BigIntArrayTest.php | 7 +++++-- .../MartinGeorgiev/Doctrine/DBAL/Types/CidrArrayTest.php | 5 ++++- .../Doctrine/DBAL/Types/DoublePrecisionArrayTest.php | 5 ++++- .../MartinGeorgiev/Doctrine/DBAL/Types/InetArrayTest.php | 5 ++++- .../Doctrine/DBAL/Types/IntegerArrayTest.php | 7 +++++-- .../MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php | 5 ++++- .../Doctrine/DBAL/Types/MacaddrArrayTest.php | 7 +++++-- .../MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php | 5 ++++- .../MartinGeorgiev/Doctrine/DBAL/Types/RealArrayTest.php | 5 ++++- .../Doctrine/DBAL/Types/SmallIntArrayTest.php | 7 +++++-- 10 files changed, 44 insertions(+), 14 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BigIntArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BigIntArrayTest.php index 8daf4a9a..be2ccac8 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BigIntArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BigIntArrayTest.php @@ -33,7 +33,10 @@ public static function provideInvalidPHPValuesForDatabaseTransformation(): array } /** - * @return array + * @return list */ public static function provideValidTransformations(): array { @@ -76,7 +79,7 @@ public function throws_domain_exception_when_value_exceeds_range(string $outOfRa } /** - * @return array + * @return list */ public static function provideOutOfRangeValues(): array { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/CidrArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/CidrArrayTest.php index 833174e4..00b331b7 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/CidrArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/CidrArrayTest.php @@ -48,7 +48,10 @@ public function can_transform_to_php_value(?array $phpValue, ?string $postgresVa } /** - * @return array + * @return array */ public static function provideValidTransformations(): array { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/DoublePrecisionArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/DoublePrecisionArrayTest.php index 6962592d..e071fff3 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/DoublePrecisionArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/DoublePrecisionArrayTest.php @@ -35,7 +35,10 @@ public static function provideInvalidPHPValuesForDatabaseTransformation(): array } /** - * @return array + * @return list */ public static function provideValidTransformations(): array { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/InetArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/InetArrayTest.php index 719c31fc..c82beea2 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/InetArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/InetArrayTest.php @@ -48,7 +48,10 @@ public function can_transform_to_php_value(?array $phpValue, ?string $postgresVa } /** - * @return array + * @return array */ public static function provideValidTransformations(): array { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/IntegerArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/IntegerArrayTest.php index ea27d6f1..7133a4af 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/IntegerArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/IntegerArrayTest.php @@ -31,7 +31,10 @@ public static function provideInvalidPHPValuesForDatabaseTransformation(): array } /** - * @return array + * @return list */ public static function provideValidTransformations(): array { @@ -64,7 +67,7 @@ public static function provideValidTransformations(): array } /** - * @return array + * @return list */ public static function provideOutOfRangeValues(): array { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php index 864bdbeb..9de223d7 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php @@ -49,7 +49,10 @@ public function can_transform_to_php_value(?array $phpValue, ?string $postgresVa } /** - * @return list> + * @return list */ public static function provideValidTransformations(): array { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/MacaddrArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/MacaddrArrayTest.php index f68a1ec2..81d104d1 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/MacaddrArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/MacaddrArrayTest.php @@ -48,7 +48,10 @@ public function can_transform_to_php_value(?array $phpValue, ?string $postgresVa } /** - * @return array + * @return array */ public static function provideValidTransformations(): array { @@ -89,7 +92,7 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_databa } /** - * @return array + * @return array */ public static function provideInvalidPHPValuesForDatabaseTransformation(): array { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php index b5b9c2a2..c3b625e2 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php @@ -49,7 +49,10 @@ public function can_transform_to_php_value(?array $phpValue, ?string $postgresVa } /** - * @return array|null, postgresValue: string|null}> + * @return array|null, + * postgresValue: string|null + * }> */ public static function provideValidTransformations(): array { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/RealArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/RealArrayTest.php index 34b50ec9..63feb5ff 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/RealArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/RealArrayTest.php @@ -35,7 +35,10 @@ public static function provideInvalidPHPValuesForDatabaseTransformation(): array } /** - * @return array + * @return list */ public static function provideValidTransformations(): array { diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/SmallIntArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/SmallIntArrayTest.php index 0800f087..f39f693d 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/SmallIntArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/SmallIntArrayTest.php @@ -31,7 +31,10 @@ public static function provideInvalidPHPValuesForDatabaseTransformation(): array } /** - * @return array + * @return list */ public static function provideValidTransformations(): array { @@ -64,7 +67,7 @@ public static function provideValidTransformations(): array } /** - * @return array + * @return list */ public static function provideOutOfRangeValues(): array { From 0fab3274a08fe847733994e9e6235058c80b870e Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Fri, 1 Aug 2025 09:14:55 +0300 Subject: [PATCH 08/22] no message --- .../Doctrine/DBAL/Types/BaseRangeTestCase.php | 34 ++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseRangeTestCase.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseRangeTestCase.php index 32b0af08..f29dfed3 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseRangeTestCase.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseRangeTestCase.php @@ -108,22 +108,48 @@ public function can_handle_empty_string_from_sql(): void self::assertNull($result); } + #[DataProvider('provideInvalidDatabaseValues')] #[Test] - public function throws_exception_for_invalid_php_value_type(): void + public function throws_exception_when_converting_to_database_value_for_invalid_types(mixed $invalidValue): void { $this->expectException(InvalidRangeForDatabaseException::class); $this->expectExceptionMessage('Invalid type for range'); - $this->fixture->convertToDatabaseValue('invalid', $this->platform); // @phpstan-ignore-line argument.type + $this->fixture->convertToDatabaseValue($invalidValue, $this->platform); // @phpstan-ignore-line argument.type } + /** + * @return array + */ + public static function provideInvalidDatabaseValues(): array + { + return [ + 'string value' => ['not_a_range'], + 'integer value' => [123], + 'array value' => [[1, 2, 3]], + ]; + } + + #[DataProvider('provideInvalidPHPValues')] #[Test] - public function throws_exception_for_invalid_sql_value_type(): void + public function throws_exception_when_converting_to_php_value_for_invalid_types(mixed $invalidValue): void { $this->expectException(InvalidRangeForPHPException::class); $this->expectExceptionMessage('Invalid database value type for range conversion'); - $this->fixture->convertToPHPValue([1, 2], $this->platform); // @phpstan-ignore-line argument.type + $this->fixture->convertToPHPValue($invalidValue, $this->platform); // @phpstan-ignore-line argument.type + } + + /** + * @return array + */ + public static function provideInvalidPHPValues(): array + { + return [ + 'integer value' => [123], + 'array value' => [['invalid']], + 'boolean value' => [true], + ]; } #[Test] From ed9319c3709296465d56793d99de3c11ff3acebd Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Sat, 2 Aug 2025 01:59:46 +0300 Subject: [PATCH 09/22] no message --- .../Doctrine/DBAL/Types/CidrArrayTest.php | 16 ++-- .../Doctrine/DBAL/Types/CidrTest.php | 12 +-- .../Doctrine/DBAL/Types/InetArrayTest.php | 12 +-- .../Doctrine/DBAL/Types/InetTest.php | 18 ++-- .../Doctrine/DBAL/Types/JsonbTest.php | 94 +++++++++++++++++-- .../Doctrine/DBAL/Types/MacaddrArrayTest.php | 12 +-- .../Doctrine/DBAL/Types/MacaddrTest.php | 51 ++++++++-- .../Doctrine/DBAL/Types/PointArrayTest.php | 33 ++++--- .../Doctrine/DBAL/Types/PointTest.php | 19 ++-- 9 files changed, 200 insertions(+), 67 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/CidrArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/CidrArrayTest.php index 00b331b7..7a78c4e4 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/CidrArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/CidrArrayTest.php @@ -79,9 +79,9 @@ public static function provideValidTransformations(): array ]; } - #[DataProvider('provideInvalidPHPValuesForDatabaseTransformation')] + #[DataProvider('provideInvalidDatabaseValueInputs')] #[Test] - public function throws_exception_when_invalid_data_provided_to_convert_to_database_value(mixed $phpValue): void + public function throws_exception_for_invalid_database_value_inputs(mixed $phpValue): void { $this->expectException(InvalidCidrArrayItemForPHPException::class); $this->fixture->convertToDatabaseValue($phpValue, $this->platform); // @phpstan-ignore-line @@ -90,7 +90,7 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_databa /** * @return array */ - public static function provideInvalidPHPValuesForDatabaseTransformation(): array + public static function provideInvalidDatabaseValueInputs(): array { return [ 'invalid type' => ['not-an-array'], @@ -103,12 +103,16 @@ public static function provideInvalidPHPValuesForDatabaseTransformation(): array 'empty string' => [['']], // Empty string in array 'whitespace only' => [[' ']], // Whitespace string in array 'malformed CIDR with spaces' => [['192.168.1.0 / 24']], // Space in CIDR notation + 'valid value mixed with null array item' => [['192.168.1.0/24', null]], + 'valid value mixed with integer array item' => [['192.168.1.0/24', 123]], + 'valid value mixed with boolean array item' => [['192.168.1.0/24', true]], + 'valid value mixed with object array item' => [['192.168.1.0/24', new \stdClass()]], ]; } - #[DataProvider('provideInvalidDatabaseValuesForPHPTransformation')] + #[DataProvider('provideInvalidPHPValueInputs')] #[Test] - public function throws_exception_when_invalid_data_provided_to_convert_to_php_value(string $postgresValue): void + public function throws_exception_for_invalid_php_value_inputs(string $postgresValue): void { $this->expectException(InvalidCidrArrayItemForPHPException::class); $this->fixture->convertToPHPValue($postgresValue, $this->platform); @@ -117,7 +121,7 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_php_va /** * @return array */ - public static function provideInvalidDatabaseValuesForPHPTransformation(): array + public static function provideInvalidPHPValueInputs(): array { return [ 'invalid format' => ['{"invalid-cidr"}'], diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/CidrTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/CidrTest.php index c4073c3e..b740c2b4 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/CidrTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/CidrTest.php @@ -93,9 +93,9 @@ public static function provideValidTransformations(): array ]; } - #[DataProvider('provideInvalidPHPValuesForDatabaseTransformation')] + #[DataProvider('provideInvalidDatabaseValueInputs')] #[Test] - public function throws_exception_when_invalid_data_provided_to_convert_to_database_value(mixed $phpValue): void + public function throws_exception_for_invalid_database_value_inputs(mixed $phpValue): void { $this->expectException(InvalidCidrForPHPException::class); $this->fixture->convertToDatabaseValue($phpValue, $this->platform); @@ -104,7 +104,7 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_databa /** * @return array */ - public static function provideInvalidPHPValuesForDatabaseTransformation(): array + public static function provideInvalidDatabaseValueInputs(): array { return [ 'empty string' => [''], @@ -124,9 +124,9 @@ public static function provideInvalidPHPValuesForDatabaseTransformation(): array ]; } - #[DataProvider('provideInvalidDatabaseValuesForPHPTransformation')] + #[DataProvider('provideInvalidPHPValueInputs')] #[Test] - public function throws_exception_when_invalid_data_provided_to_convert_to_php_value(mixed $dbValue): void + public function throws_exception_for_invalid_php_value_inputs(mixed $dbValue): void { $this->expectException(InvalidCidrForDatabaseException::class); $this->fixture->convertToPHPValue($dbValue, $this->platform); @@ -135,7 +135,7 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_php_va /** * @return array */ - public static function provideInvalidDatabaseValuesForPHPTransformation(): array + public static function provideInvalidPHPValueInputs(): array { return [ 'invalid type' => [123], diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/InetArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/InetArrayTest.php index c82beea2..cd9bafdd 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/InetArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/InetArrayTest.php @@ -99,9 +99,9 @@ public static function provideValidTransformations(): array ]; } - #[DataProvider('provideInvalidPHPValuesForDatabaseTransformation')] + #[DataProvider('provideInvalidDatabaseValueInputs')] #[Test] - public function throws_exception_when_invalid_data_provided_to_convert_to_database_value(mixed $phpValue): void + public function throws_exception_for_invalid_database_value_inputs(mixed $phpValue): void { $this->expectException(InvalidInetArrayItemForPHPException::class); $this->fixture->convertToDatabaseValue($phpValue, $this->platform); // @phpstan-ignore-line @@ -110,7 +110,7 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_databa /** * @return array */ - public static function provideInvalidPHPValuesForDatabaseTransformation(): array + public static function provideInvalidDatabaseValueInputs(): array { return [ 'invalid type' => ['not-an-array'], @@ -131,9 +131,9 @@ public static function provideInvalidPHPValuesForDatabaseTransformation(): array ]; } - #[DataProvider('provideInvalidDatabaseValuesForPHPTransformation')] + #[DataProvider('provideInvalidPHPValueInputs')] #[Test] - public function throws_exception_when_invalid_data_provided_to_convert_to_php_value(string $postgresValue): void + public function throws_exception_for_invalid_php_value_inputs(string $postgresValue): void { $this->expectException(InvalidInetArrayItemForPHPException::class); @@ -143,7 +143,7 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_php_va /** * @return array */ - public static function provideInvalidDatabaseValuesForPHPTransformation(): array + public static function provideInvalidPHPValueInputs(): array { return [ 'invalid format' => ['{"invalid-ip"}'], diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/InetTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/InetTest.php index 951dfbdc..e4fa2092 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/InetTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/InetTest.php @@ -101,9 +101,9 @@ public static function provideValidTransformations(): array ]; } - #[DataProvider('provideInvalidPHPValuesForDatabaseTransformation')] + #[DataProvider('provideInvalidDatabaseValueInputs')] #[Test] - public function throws_exception_when_invalid_data_provided_to_convert_to_database_value(mixed $phpValue): void + public function throws_exception_for_invalid_database_value_inputs(mixed $phpValue): void { $this->expectException(InvalidInetForPHPException::class); $this->fixture->convertToDatabaseValue($phpValue, $this->platform); @@ -112,7 +112,7 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_databa /** * @return array */ - public static function provideInvalidPHPValuesForDatabaseTransformation(): array + public static function provideInvalidDatabaseValueInputs(): array { return [ 'non-string value' => [123], @@ -130,12 +130,15 @@ public static function provideInvalidPHPValuesForDatabaseTransformation(): array 'IPv4 with invalid octet count' => ['192.168.1'], 'IPv4 with character suffix' => ['192.168.1.1x'], 'malformed IPv4-mapped IPv6' => ['::ffff:256.256.256.256'], + 'array input' => [['not', 'ip']], + 'boolean input' => [true], + 'object input' => [new \stdClass()], ]; } - #[DataProvider('provideInvalidDatabaseValuesForPHPTransformation')] + #[DataProvider('provideInvalidPHPValueInputs')] #[Test] - public function throws_exception_when_invalid_data_provided_to_convert_to_php_value(mixed $postgresValue): void + public function throws_exception_for_invalid_php_value_inputs(mixed $postgresValue): void { $this->expectException(InvalidInetForDatabaseException::class); $this->fixture->convertToPHPValue($postgresValue, $this->platform); @@ -144,7 +147,7 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_php_va /** * @return array */ - public static function provideInvalidDatabaseValuesForPHPTransformation(): array + public static function provideInvalidPHPValueInputs(): array { return [ 'non-string value' => [123], @@ -161,6 +164,9 @@ public static function provideInvalidDatabaseValuesForPHPTransformation(): array 'IPv4 with invalid octet count' => ['192.168.1'], 'IPv4 with character suffix' => ['192.168.1.1x'], 'malformed IPv4-mapped IPv6' => ['::ffff:256.256.256.256'], + 'array input' => [['not', 'ip']], + 'boolean input' => [false], + 'object input' => [new \stdClass()], ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/JsonbTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/JsonbTest.php index bc10d5bc..d81e9c73 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/JsonbTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/JsonbTest.php @@ -5,6 +5,8 @@ namespace Tests\Unit\MartinGeorgiev\Doctrine\DBAL\Types; use Doctrine\DBAL\Platforms\AbstractPlatform; +use Doctrine\DBAL\Types\ConversionException; +use MartinGeorgiev\Doctrine\DBAL\Types\Exceptions\InvalidJsonItemForPHPException; use MartinGeorgiev\Doctrine\DBAL\Types\Jsonb; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Test; @@ -48,7 +50,7 @@ public function can_transform_to_php_value(null|array|bool|float|int|string $php } /** - * @return list @@ -56,35 +58,35 @@ public function can_transform_to_php_value(null|array|bool|float|int|string $php public static function provideValidTransformations(): array { return [ - [ + 'null value' => [ 'phpValue' => null, 'postgresValue' => null, ], - [ + 'boolean true' => [ 'phpValue' => true, 'postgresValue' => 'true', ], - [ + 'empty array' => [ 'phpValue' => [], 'postgresValue' => '[]', ], - [ + 'integer value' => [ 'phpValue' => 13, 'postgresValue' => '13', ], - [ + 'float value' => [ 'phpValue' => 13.93, 'postgresValue' => '13.93', ], - [ + 'string value' => [ 'phpValue' => 'a string value', 'postgresValue' => '"a string value"', ], - [ + 'numeric array' => [ 'phpValue' => [681, 1185, 1878, 1989], 'postgresValue' => '[681,1185,1878,1989]', ], - [ + 'complex object' => [ 'phpValue' => [ 'key1' => 'value1', 'key2' => false, @@ -96,4 +98,78 @@ public static function provideValidTransformations(): array ], ]; } + + #[Test] + public function throws_exception_for_non_encodable_value(): void + { + $resourceThatCannotBeJsonEncoded = \fopen('php://memory', 'r'); + + $this->expectException(ConversionException::class); + $this->expectExceptionMessage("can't be resolved to valid JSON"); + + try { + $this->fixture->convertToDatabaseValue($resourceThatCannotBeJsonEncoded, $this->platform); + } finally { + \fclose($resourceThatCannotBeJsonEncoded); + } + } + + #[Test] + public function throws_exception_for_circular_reference(): void + { + // Create a circular reference + $object1 = new \stdClass(); + $object2 = new \stdClass(); + $object1->reference = $object2; + $object2->reference = $object1; + + // Set up a custom error handler to expect the warning + $warningTriggered = false; + \set_error_handler(static function ($error, $errorText) use (&$warningTriggered): bool { + if ($error === E_WARNING && \str_contains($errorText, 'var_export does not handle circular references')) { + $warningTriggered = true; + + return true; // Suppress the circular reference warning + } + + return false; // Let other errors/warnings through + }); + + $this->expectException(ConversionException::class); + $this->expectExceptionMessage("can't be resolved to valid JSON"); + + try { + $this->fixture->convertToDatabaseValue($object1, $this->platform); + } finally { + \restore_error_handler(); + } + + $this->assertTrue($warningTriggered, 'Expected warning about circular references was not triggered'); + } + + #[DataProvider('provideInvalidJsonStrings')] + #[Test] + public function throws_exception_for_invalid_json_strings(string $invalidJson): void + { + $this->expectException(InvalidJsonItemForPHPException::class); + $this->expectExceptionMessage('Postgres value must be single, valid JSON object'); + + $this->fixture->convertToPHPValue($invalidJson, $this->platform); + } + + /** + * @return array + */ + public static function provideInvalidJsonStrings(): array + { + return [ + 'invalid json syntax' => ['{invalid json}'], + 'empty string' => [''], + 'malformed json' => ['{"key": value}'], + 'incomplete json' => ['{"key":'], + 'trailing comma' => ['{"key": "value",}'], + 'unquoted keys' => ['{key: "value"}'], + 'single quotes' => ["{'key': 'value'}"], + ]; + } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/MacaddrArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/MacaddrArrayTest.php index 81d104d1..e8f096a3 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/MacaddrArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/MacaddrArrayTest.php @@ -83,9 +83,9 @@ public static function provideValidTransformations(): array ]; } - #[DataProvider('provideInvalidPHPValuesForDatabaseTransformation')] + #[DataProvider('provideInvalidDatabaseValueInputs')] #[Test] - public function throws_exception_when_invalid_data_provided_to_convert_to_database_value(mixed $phpValue): void + public function throws_exception_for_invalid_database_value_inputs(mixed $phpValue): void { $this->expectException(InvalidMacaddrArrayItemForPHPException::class); $this->fixture->convertToDatabaseValue($phpValue, $this->platform); // @phpstan-ignore-line @@ -94,7 +94,7 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_databa /** * @return array */ - public static function provideInvalidPHPValuesForDatabaseTransformation(): array + public static function provideInvalidDatabaseValueInputs(): array { return [ 'invalid type' => ['not-an-array'], @@ -112,9 +112,9 @@ public static function provideInvalidPHPValuesForDatabaseTransformation(): array ]; } - #[DataProvider('provideInvalidDatabaseValuesForPHPTransformationForPHPTransformation')] + #[DataProvider('provideInvalidPHPValueInputs')] #[Test] - public function throws_exception_when_invalid_data_provided_to_convert_to_php_value(string $postgresValue): void + public function throws_exception_for_invalid_php_value_inputs(string $postgresValue): void { $this->expectException(InvalidMacaddrArrayItemForPHPException::class); @@ -124,7 +124,7 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_php_va /** * @return array */ - public static function provideInvalidDatabaseValuesForPHPTransformationForPHPTransformation(): array + public static function provideInvalidPHPValueInputs(): array { return [ 'invalid format' => ['{"invalid-mac"}'], diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/MacaddrTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/MacaddrTest.php index f1c03865..ee83b99e 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/MacaddrTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/MacaddrTest.php @@ -92,20 +92,22 @@ public static function provideValidTransformations(): array ]; } - #[DataProvider('provideInvalidPHPValuesForDatabaseTransformation')] + #[DataProvider('provideInvalidDatabaseValueInputs')] #[Test] - public function throws_exception_when_invalid_data_provided_to_convert_to_database_value(mixed $phpValue): void + public function throws_exception_for_invalid_database_value_inputs(mixed $phpValue): void { $this->expectException(InvalidMacaddrForPHPException::class); + $this->fixture->convertToDatabaseValue($phpValue, $this->platform); } /** * @return array */ - public static function provideInvalidPHPValuesForDatabaseTransformation(): array + public static function provideInvalidDatabaseValueInputs(): array { return [ + // Invalid MAC address formats 'empty string' => [''], 'invalid format' => ['00:11:22:33:44'], 'invalid characters' => ['00:11:22:gg:hh:ii'], @@ -116,25 +118,58 @@ public static function provideInvalidPHPValuesForDatabaseTransformation(): array 'wrong format' => ['not-a-mac-address'], 'mixed separators' => ['00:11-22:33-44:55'], 'non-hex digits' => ['zz:zz:zz:zz:zz:zz'], + // Invalid types + 'integer input' => [123], + 'array input' => [['not', 'string']], + 'boolean input' => [false], + 'object input' => [new \stdClass()], + 'float input' => [3.14], ]; } - #[DataProvider('provideInvalidDatabaseValuesForPHPTransformation')] + #[DataProvider('provideInvalidPHPValueInputs')] #[Test] - public function throws_exception_when_invalid_data_provided_to_convert_to_php_value(mixed $dbValue): void + public function throws_exception_for_invalid_php_value_inputs(mixed $invalidValue): void { $this->expectException(InvalidMacaddrForDatabaseException::class); - $this->fixture->convertToPHPValue($dbValue, $this->platform); + $this->expectExceptionMessage('Database value must be a string'); + + $this->fixture->convertToPHPValue($invalidValue, $this->platform); } /** * @return array */ - public static function provideInvalidDatabaseValuesForPHPTransformation(): array + public static function provideInvalidPHPValueInputs(): array + { + return [ + 'integer input' => [123], + 'array input' => [['not', 'string']], + 'boolean input' => [true], + 'object input' => [new \stdClass()], + 'float input' => [3.14], + ]; + } + + #[DataProvider('provideInvalidPHPValueFormats')] + #[Test] + public function throws_exception_for_invalid_php_value_formats(string $invalidFormat): void + { + $this->expectException(InvalidMacaddrForDatabaseException::class); + $this->expectExceptionMessage('Invalid MAC address format in database'); + + $this->fixture->convertToPHPValue($invalidFormat, $this->platform); + } + + /** + * @return array + */ + public static function provideInvalidPHPValueFormats(): array { return [ - 'invalid type' => [123], 'invalid format from database' => ['invalid-mac-format'], + 'empty string' => [''], + 'malformed mac' => ['00:11:22:33:44'], ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php index c3b625e2..a0e66fbe 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php @@ -86,9 +86,9 @@ public static function provideValidTransformations(): array ]; } - #[DataProvider('provideInvalidTransformations')] + #[DataProvider('provideInvalidDatabaseValueInputs')] #[Test] - public function throws_exception_when_invalid_data_provided_to_convert_to_database_value(mixed $phpValue): void + public function throws_exception_for_invalid_database_value_inputs(mixed $phpValue): void { $this->expectException(InvalidPointArrayItemForPHPException::class); $this->fixture->convertToDatabaseValue($phpValue, $this->platform); // @phpstan-ignore-line @@ -97,7 +97,7 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_databa /** * @return array */ - public static function provideInvalidTransformations(): array + public static function provideInvalidDatabaseValueInputs(): array { return [ 'not an array' => ['string value'], @@ -202,29 +202,34 @@ public function can_transform_array_item_for_php_returning_null_for_null(): void } #[Test] - #[DataProvider('provideInvalidTypes')] + #[DataProvider('provideInvalidPHPValueTypes')] public function can_transform_array_item_for_php_throwing_for_invalid_type(mixed $value): void { $this->expectException(InvalidPointArrayItemForPHPException::class); $this->fixture->transformArrayItemForPHP($value); } + #[DataProvider('provideInvalidPointArrayItems')] #[Test] - #[DataProvider('provideInvalidTypes')] - public function can_transform_postgres_array_to_php_array_returning_empty_for_invalid_format(mixed $value): void + public function throws_exception_for_invalid_point_array_items(array $invalidArray): void { - $reflectionObject = new \ReflectionObject($this->fixture); - $reflectionMethod = $reflectionObject->getMethod('transformPostgresArrayToPHPArray'); - $reflectionMethod->setAccessible(true); - $this->assertSame([], $reflectionMethod->invoke($this->fixture, $value)); + $this->expectException(InvalidPointArrayItemForPHPException::class); + $this->expectExceptionMessage('Array contains invalid point items'); + + $this->fixture->convertToDatabaseValue($invalidArray, $this->platform); } - public static function provideInvalidTypes(): array + /** + * @return array + */ + public static function provideInvalidPointArrayItems(): array { return [ - [123], - ['not-a-point-instance'], - ['{invalid}'], + 'integer item' => [[123]], + 'string item' => [['not-a-point']], + 'boolean item' => [[true]], + 'object item' => [[new \stdClass()]], + 'mixed invalid items' => [[123, 'not-a-point', true]], ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointTest.php index ef894d94..815b6292 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointTest.php @@ -78,9 +78,9 @@ public static function provideValidTransformations(): array ]; } - #[DataProvider('provideInvalidTransformations')] + #[DataProvider('provideInvalidDatabaseValueInputs')] #[Test] - public function throws_exception_when_invalid_data_provided_to_convert_to_database_value(mixed $phpValue): void + public function throws_exception_for_invalid_database_value_inputs(mixed $phpValue): void { $this->expectException(InvalidPointForPHPException::class); $this->fixture->convertToDatabaseValue($phpValue, $this->platform); @@ -89,18 +89,22 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_databa /** * @return array */ - public static function provideInvalidTransformations(): array + public static function provideInvalidDatabaseValueInputs(): array { return [ 'empty string' => [''], 'whitespace string' => [' '], 'invalid format' => ['invalid point'], + 'integer input' => [123], + 'array input' => [['not', 'point']], + 'boolean input' => [true], + 'object input' => [new \stdClass()], ]; } - #[DataProvider('provideInvalidDatabaseValues')] + #[DataProvider('provideInvalidPHPValueInputs')] #[Test] - public function throws_exception_when_invalid_data_provided_to_convert_to_php_value(mixed $phpValue): void + public function throws_exception_for_invalid_php_value_inputs(mixed $phpValue): void { $this->expectException(InvalidPointForDatabaseException::class); $this->fixture->convertToPHPValue($phpValue, $this->platform); @@ -109,7 +113,7 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_php_va /** * @return array */ - public static function provideInvalidDatabaseValues(): array + public static function provideInvalidPHPValueInputs(): array { return [ 'empty string' => [''], @@ -120,6 +124,9 @@ public static function provideInvalidDatabaseValues(): array 'too many coordinates' => ['(1.23,4.56,7.89)'], 'not a string' => [123], 'float precision is too granular' => ['(1.23456789,7.89)'], + 'array input' => [['not', 'point']], + 'boolean input' => [false], + 'object input' => [new \stdClass()], ]; } From 9c7de64b47c3815fd5c02c2398992620490fd0a8 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Sat, 2 Aug 2025 02:11:46 +0300 Subject: [PATCH 10/22] no message --- .../Doctrine/DBAL/Types/BaseFloatArrayTestCase.php | 4 ++-- .../Doctrine/DBAL/Types/BaseIntegerArrayTestCase.php | 4 ++-- .../Doctrine/DBAL/Types/BaseRangeTestCase.php | 4 ++-- .../Doctrine/DBAL/Types/BigIntArrayTest.php | 4 ++-- .../Doctrine/DBAL/Types/DoublePrecisionArrayTest.php | 4 ++-- .../Doctrine/DBAL/Types/IntegerArrayTest.php | 4 ++-- .../MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php | 6 +++--- .../Unit/MartinGeorgiev/Doctrine/DBAL/Types/JsonbTest.php | 5 +++++ .../MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php | 8 ++++---- .../MartinGeorgiev/Doctrine/DBAL/Types/RealArrayTest.php | 4 ++-- .../Doctrine/DBAL/Types/SmallIntArrayTest.php | 4 ++-- 11 files changed, 28 insertions(+), 23 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseFloatArrayTestCase.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseFloatArrayTestCase.php index a87e2de2..db135de9 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseFloatArrayTestCase.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseFloatArrayTestCase.php @@ -14,7 +14,7 @@ abstract class BaseFloatArrayTestCase extends TestCase { protected BaseFloatArray $fixture; - #[DataProvider('provideInvalidPHPValuesForDatabaseTransformation')] + #[DataProvider('provideInvalidDatabaseValueInputs')] #[Test] public function can_detect_invalid_for_transformation_php_value(mixed $phpValue): void { @@ -24,7 +24,7 @@ public function can_detect_invalid_for_transformation_php_value(mixed $phpValue) /** * @return list */ - public static function provideInvalidPHPValuesForDatabaseTransformation(): array + public static function provideInvalidDatabaseValueInputs(): array { return [ [true], diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseIntegerArrayTestCase.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseIntegerArrayTestCase.php index bd446324..84fcbe80 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseIntegerArrayTestCase.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseIntegerArrayTestCase.php @@ -14,7 +14,7 @@ abstract class BaseIntegerArrayTestCase extends TestCase { protected BaseIntegerArray $fixture; - #[DataProvider('provideInvalidPHPValuesForDatabaseTransformation')] + #[DataProvider('provideInvalidDatabaseValueInputs')] #[Test] public function can_detect_invalid_for_transformation_php_value(mixed $phpValue): void { @@ -24,7 +24,7 @@ public function can_detect_invalid_for_transformation_php_value(mixed $phpValue) /** * @return list */ - public static function provideInvalidPHPValuesForDatabaseTransformation(): array + public static function provideInvalidDatabaseValueInputs(): array { return [ [true], diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseRangeTestCase.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseRangeTestCase.php index f29dfed3..4ffca636 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseRangeTestCase.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BaseRangeTestCase.php @@ -110,7 +110,7 @@ public function can_handle_empty_string_from_sql(): void #[DataProvider('provideInvalidDatabaseValues')] #[Test] - public function throws_exception_when_converting_to_database_value_for_invalid_types(mixed $invalidValue): void + public function throws_exception_for_invalid_database_value_inputs(mixed $invalidValue): void { $this->expectException(InvalidRangeForDatabaseException::class); $this->expectExceptionMessage('Invalid type for range'); @@ -132,7 +132,7 @@ public static function provideInvalidDatabaseValues(): array #[DataProvider('provideInvalidPHPValues')] #[Test] - public function throws_exception_when_converting_to_php_value_for_invalid_types(mixed $invalidValue): void + public function throws_exception_for_invalid_php_value_inputs(mixed $invalidValue): void { $this->expectException(InvalidRangeForPHPException::class); $this->expectExceptionMessage('Invalid database value type for range conversion'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BigIntArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BigIntArrayTest.php index be2ccac8..924a7f2a 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BigIntArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/BigIntArrayTest.php @@ -22,9 +22,9 @@ public function has_name(): void self::assertEquals('bigint[]', $this->fixture->getName()); } - public static function provideInvalidPHPValuesForDatabaseTransformation(): array + public static function provideInvalidDatabaseValueInputs(): array { - return \array_merge(parent::provideInvalidPHPValuesForDatabaseTransformation(), [ + return \array_merge(parent::provideInvalidDatabaseValueInputs(), [ ['9223372036854775808'], // Greater than PHP_INT_MAX ['-9223372036854775809'], // Less than PHP_INT_MIN ['1.23e10'], // Scientific notation diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/DoublePrecisionArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/DoublePrecisionArrayTest.php index e071fff3..0d6ed3fd 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/DoublePrecisionArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/DoublePrecisionArrayTest.php @@ -23,9 +23,9 @@ public function has_name(): void self::assertEquals('double precision[]', $this->fixture->getName()); } - public static function provideInvalidPHPValuesForDatabaseTransformation(): array + public static function provideInvalidDatabaseValueInputs(): array { - return \array_merge(parent::provideInvalidPHPValuesForDatabaseTransformation(), [ + return \array_merge(parent::provideInvalidDatabaseValueInputs(), [ ['1.7976931348623157E+309'], // Too large ['-1.7976931348623157E+309'], // Too small ['1.123456789012345678'], // Too many decimal places (>15) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/IntegerArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/IntegerArrayTest.php index 7133a4af..f9093ef4 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/IntegerArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/IntegerArrayTest.php @@ -20,9 +20,9 @@ public function has_name(): void self::assertEquals('integer[]', $this->fixture->getName()); } - public static function provideInvalidPHPValuesForDatabaseTransformation(): array + public static function provideInvalidDatabaseValueInputs(): array { - return \array_merge(parent::provideInvalidPHPValuesForDatabaseTransformation(), [ + return \array_merge(parent::provideInvalidDatabaseValueInputs(), [ ['2147483648'], // Greater than max integer ['-2147483649'], // Less than min integer ['1.23e6'], // Scientific notation diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php index 9de223d7..11ac3c7c 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArrayTest.php @@ -87,9 +87,9 @@ public static function provideValidTransformations(): array ]; } - #[DataProvider('provideInvalidPHPValuesForDatabaseTransformation')] + #[DataProvider('provideInvalidPHPValueInputs')] #[Test] - public function throws_exception_when_invalid_data_provided_to_convert_to_php_value(string $postgresValue): void + public function throws_exception_for_invalid_php_value_inputs(string $postgresValue): void { $this->expectException(InvalidJsonArrayItemForPHPException::class); $this->expectExceptionMessage('Invalid JSON format in array'); @@ -100,7 +100,7 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_php_va /** * @return array */ - public static function provideInvalidPHPValuesForDatabaseTransformation(): array + public static function provideInvalidPHPValueInputs(): array { return [ 'non-array json' => ['"a string encoded as json"'], diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/JsonbTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/JsonbTest.php index d81e9c73..92b4312a 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/JsonbTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/JsonbTest.php @@ -103,11 +103,15 @@ public static function provideValidTransformations(): array public function throws_exception_for_non_encodable_value(): void { $resourceThatCannotBeJsonEncoded = \fopen('php://memory', 'r'); + if ($resourceThatCannotBeJsonEncoded === false) { + $this->fail('Failed to create test resource'); + } $this->expectException(ConversionException::class); $this->expectExceptionMessage("can't be resolved to valid JSON"); try { + // @phpstan-ignore-next-line argument.type - Testing invalid type handling $this->fixture->convertToDatabaseValue($resourceThatCannotBeJsonEncoded, $this->platform); } finally { \fclose($resourceThatCannotBeJsonEncoded); @@ -139,6 +143,7 @@ public function throws_exception_for_circular_reference(): void $this->expectExceptionMessage("can't be resolved to valid JSON"); try { + // @phpstan-ignore-next-line argument.type - Testing invalid type handling $this->fixture->convertToDatabaseValue($object1, $this->platform); } finally { \restore_error_handler(); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php index a0e66fbe..bab84979 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/PointArrayTest.php @@ -112,9 +112,9 @@ public static function provideInvalidDatabaseValueInputs(): array ]; } - #[DataProvider('provideInvalidDatabaseValues')] + #[DataProvider('provideInvalidPHPValueInputs')] #[Test] - public function throws_exception_when_invalid_data_provided_to_convert_to_php_value(string $postgresValue): void + public function throws_exception_for_invalid_php_value_inputs(string $postgresValue): void { $this->expectException(InvalidPointArrayItemForPHPException::class); $this->fixture->convertToPHPValue($postgresValue, $this->platform); @@ -123,7 +123,7 @@ public function throws_exception_when_invalid_data_provided_to_convert_to_php_va /** * @return array */ - public static function provideInvalidDatabaseValues(): array + public static function provideInvalidPHPValueInputs(): array { return [ 'missing parentheses' => ['{"(1.23, 4.56)","(-7.89, 0.12"}'], @@ -136,7 +136,7 @@ public static function provideInvalidDatabaseValues(): array #[DataProvider('provideInvalidPHPValueTypes')] #[Test] - public function throws_exception_when_non_string_provided_to_convert_to_php_value(mixed $value): void + public function throws_exception_for_non_string_inputs_to_database_conversion(mixed $value): void { $this->expectException(InvalidPointArrayItemForPHPException::class); $this->fixture->convertToDatabaseValue($value, $this->platform); // @phpstan-ignore-line diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/RealArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/RealArrayTest.php index 63feb5ff..98d13bf0 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/RealArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/RealArrayTest.php @@ -22,9 +22,9 @@ public function has_name(): void self::assertEquals('real[]', $this->fixture->getName()); } - public static function provideInvalidPHPValuesForDatabaseTransformation(): array + public static function provideInvalidDatabaseValueInputs(): array { - return \array_merge(parent::provideInvalidPHPValuesForDatabaseTransformation(), [ + return \array_merge(parent::provideInvalidDatabaseValueInputs(), [ ['3.402823467E+38'], // Too large ['-3.402823467E+38'], // Too small ['1.1234567'], // Too many decimal places (>6) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/SmallIntArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/SmallIntArrayTest.php index f39f693d..5e54b65c 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/SmallIntArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/DBAL/Types/SmallIntArrayTest.php @@ -20,9 +20,9 @@ public function has_name(): void self::assertEquals('smallint[]', $this->fixture->getName()); } - public static function provideInvalidPHPValuesForDatabaseTransformation(): array + public static function provideInvalidDatabaseValueInputs(): array { - return \array_merge(parent::provideInvalidPHPValuesForDatabaseTransformation(), [ + return \array_merge(parent::provideInvalidDatabaseValueInputs(), [ ['32768'], // Greater than max smallint ['-32769'], // Less than min smallint ['1.23e4'], // Scientific notation From 6e368e9efb7dffdec323af4716836f279614810b Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Sun, 3 Aug 2025 02:35:25 +0300 Subject: [PATCH 11/22] no message --- .../Doctrine/ORM/Query/AST/Functions/ArrayToJsonTest.php | 4 ++-- .../Doctrine/ORM/Query/AST/Functions/DateAddTest.php | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayToJsonTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayToJsonTest.php index 1a9c30ef..60626991 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayToJsonTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayToJsonTest.php @@ -42,7 +42,7 @@ protected function getDqlStatements(): array } #[Test] - public function invalid_boolean_throws_exception(): void + public function throws_exception_for_invalid_boolean_value(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for array_to_json. Must be "true" or "false".'); @@ -52,7 +52,7 @@ public function invalid_boolean_throws_exception(): void } #[Test] - public function too_many_arguments_throws_exception(): void + public function throws_exception_for_too_many_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('array_to_json() requires between 1 and 2 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateAddTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateAddTest.php index 095a2df8..075ea767 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateAddTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateAddTest.php @@ -46,7 +46,7 @@ protected function getDqlStatements(): array } #[Test] - public function invalid_timezone_throws_exception(): void + public function throws_exception_for_invalid_timezone(): void { $this->expectException(InvalidTimezoneException::class); $this->expectExceptionMessage('Invalid timezone "Invalid/Timezone" provided for date_add'); @@ -56,7 +56,7 @@ public function invalid_timezone_throws_exception(): void } #[Test] - public function too_few_arguments_throws_exception(): void + public function throws_exception_for_too_few_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('date_add() requires at least 2 arguments'); @@ -66,7 +66,7 @@ public function too_few_arguments_throws_exception(): void } #[Test] - public function too_many_arguments_throws_exception(): void + public function throws_exception_for_too_many_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('date_add() requires between 2 and 3 arguments'); From ba7081b8f507524d0f7a482ff3a46b7f1786168c Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Sun, 3 Aug 2025 03:04:20 +0300 Subject: [PATCH 12/22] no message --- .../Query/AST/Functions/ArrayPositionTest.php | 28 ++++++++++------- .../Query/AST/Functions/DateSubtractTest.php | 30 ++++++++++++------- .../ORM/Query/AST/Functions/GreatestTest.php | 2 +- .../AST/Functions/JsonBuildObjectTest.php | 2 +- .../AST/Functions/JsonbBuildObjectTest.php | 2 +- .../Query/AST/Functions/JsonbInsertTest.php | 6 ++-- .../AST/Functions/JsonbPathExistsTest.php | 6 ++-- .../AST/Functions/JsonbPathMatchTest.php | 6 ++-- .../AST/Functions/JsonbPathQueryArrayTest.php | 6 ++-- .../AST/Functions/JsonbPathQueryFirstTest.php | 6 ++-- .../AST/Functions/JsonbPathQueryTest.php | 6 ++-- .../ORM/Query/AST/Functions/JsonbSetTest.php | 6 ++-- .../ORM/Query/AST/Functions/LeastTest.php | 2 +- .../Query/AST/Functions/RegexpCountTest.php | 28 ++++++++++------- .../Query/AST/Functions/RegexpInstrTest.php | 28 ++++++++++------- .../Query/AST/Functions/RegexpLikeTest.php | 4 +-- .../Query/AST/Functions/RegexpMatchTest.php | 4 +-- .../Query/AST/Functions/RegexpReplaceTest.php | 28 ++++++++++------- .../Query/AST/Functions/RegexpSubstrTest.php | 28 ++++++++++------- .../ORM/Query/AST/Functions/RowToJsonTest.php | 4 +-- .../ORM/Query/AST/Functions/ToCharTest.php | 2 +- .../ORM/Query/AST/Functions/ToDateTest.php | 2 +- .../ORM/Query/AST/Functions/ToNumberTest.php | 2 +- .../Query/AST/Functions/ToTimestampTest.php | 2 +- .../ORM/Query/AST/Functions/ToTsqueryTest.php | 2 +- .../Query/AST/Functions/ToTsvectorTest.php | 2 +- .../ORM/Query/AST/Functions/UnaccentTest.php | 2 +- 27 files changed, 147 insertions(+), 99 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPositionTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPositionTest.php index baf979c0..80d2eff0 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPositionTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPositionTest.php @@ -8,6 +8,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayPosition; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\BaseVariadicFunction; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Test; class ArrayPositionTest extends BaseVariadicFunctionTestCase @@ -44,23 +45,30 @@ protected function getDqlStatements(): array ]; } + #[DataProvider('provideInvalidArgumentCountCases')] #[Test] - public function too_few_arguments_throws_exception(): void + public function throws_exception_for_invalid_argument_count(string $dql, string $expectedMessage): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); - $this->expectExceptionMessage('array_position() requires at least 2 arguments'); + $this->expectExceptionMessage($expectedMessage); - $dql = \sprintf('SELECT ARRAY_POSITION(e.textArray) FROM %s e', ContainsArrays::class); $this->buildEntityManager()->createQuery($dql)->getSQL(); } - #[Test] - public function too_many_arguments_throws_exception(): void + /** + * @return array + */ + public static function provideInvalidArgumentCountCases(): array { - $this->expectException(InvalidArgumentForVariadicFunctionException::class); - $this->expectExceptionMessage('array_position() requires between 2 and 3 arguments'); - - $dql = \sprintf("SELECT ARRAY_POSITION(e.textArray, 0, 1, 'extra_arg') FROM %s e", ContainsArrays::class); - $this->buildEntityManager()->createQuery($dql)->getSQL(); + return [ + 'too few arguments' => [ + \sprintf('SELECT ARRAY_POSITION(e.textArray) FROM %s e', ContainsArrays::class), + 'array_position() requires at least 2 arguments', + ], + 'too many arguments' => [ + \sprintf("SELECT ARRAY_POSITION(e.textArray, 0, 1, 'extra_arg') FROM %s e", ContainsArrays::class), + 'array_position() requires between 2 and 3 arguments', + ], + ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateSubtractTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateSubtractTest.php index 5d6d4c06..50397e52 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateSubtractTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateSubtractTest.php @@ -9,6 +9,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateSubtract; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidTimezoneException; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Test; class DateSubtractTest extends BaseVariadicFunctionTestCase @@ -44,7 +45,7 @@ protected function getDqlStatements(): array } #[Test] - public function invalid_timezone_throws_exception(): void + public function throws_exception_for_invalid_timezone(): void { $this->expectException(InvalidTimezoneException::class); $this->expectExceptionMessage('Invalid timezone "Invalid/Timezone" provided for date_subtract'); @@ -53,23 +54,30 @@ public function invalid_timezone_throws_exception(): void $this->buildEntityManager()->createQuery($dql)->getSQL(); } + #[DataProvider('provideInvalidArgumentCountCases')] #[Test] - public function too_few_arguments_throws_exception(): void + public function throws_exception_for_invalid_argument_count(string $dql, string $expectedMessage): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); - $this->expectExceptionMessage('date_subtract() requires at least 2 arguments'); + $this->expectExceptionMessage($expectedMessage); - $dql = \sprintf('SELECT DATE_SUBTRACT(e.datetimetz1) FROM %s e', ContainsDates::class); $this->buildEntityManager()->createQuery($dql)->getSQL(); } - #[Test] - public function too_many_arguments_throws_exception(): void + /** + * @return array + */ + public static function provideInvalidArgumentCountCases(): array { - $this->expectException(InvalidArgumentForVariadicFunctionException::class); - $this->expectExceptionMessage('date_subtract() requires between 2 and 3 arguments'); - - $dql = \sprintf("SELECT DATE_SUBTRACT(e.datetimetz1, '1 day', 'Europe/Sofia', 'extra_arg') FROM %s e", ContainsDates::class); - $this->buildEntityManager()->createQuery($dql)->getSQL(); + return [ + 'too few arguments' => [ + \sprintf('SELECT DATE_SUBTRACT(e.datetimetz1) FROM %s e', ContainsDates::class), + 'date_subtract() requires at least 2 arguments', + ], + 'too many arguments' => [ + \sprintf("SELECT DATE_SUBTRACT(e.datetimetz1, '1 day', 'Europe/Sofia', 'extra_arg') FROM %s e", ContainsDates::class), + 'date_subtract() requires between 2 and 3 arguments', + ], + ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/GreatestTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/GreatestTest.php index 315e3c81..a94628cb 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/GreatestTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/GreatestTest.php @@ -43,7 +43,7 @@ protected function getDqlStatements(): array } #[Test] - public function throws_exception_when_single_argument_given(): void + public function throws_exception_for_insufficient_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonBuildObjectTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonBuildObjectTest.php index ccfa0aba..0ad0147f 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonBuildObjectTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonBuildObjectTest.php @@ -43,7 +43,7 @@ protected function getDqlStatements(): array } #[Test] - public function throws_exception_when_odd_number_of_arguments_given(): void + public function throws_exception_for_invalid_argument_count(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbBuildObjectTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbBuildObjectTest.php index 39d805a0..5f44db60 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbBuildObjectTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbBuildObjectTest.php @@ -43,7 +43,7 @@ protected function getDqlStatements(): array } #[Test] - public function throws_exception_when_odd_number_of_arguments_given(): void + public function throws_exception_for_invalid_argument_count(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbInsertTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbInsertTest.php index cb67a3b3..eccd47fb 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbInsertTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbInsertTest.php @@ -36,7 +36,7 @@ protected function getDqlStatements(): array } #[Test] - public function invalid_boolean_throws_exception(): void + public function throws_exception_for_invalid_boolean(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for jsonb_insert. Must be "true" or "false".'); @@ -46,7 +46,7 @@ public function invalid_boolean_throws_exception(): void } #[Test] - public function too_few_arguments_throws_exception(): void + public function throws_exception_for_too_few_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_insert() requires at least 3 arguments'); @@ -56,7 +56,7 @@ public function too_few_arguments_throws_exception(): void } #[Test] - public function too_many_arguments_throws_exception(): void + public function throws_exception_for_too_many_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_insert() requires between 3 and 4 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathExistsTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathExistsTest.php index 6e88f696..4439ddaa 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathExistsTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathExistsTest.php @@ -46,7 +46,7 @@ protected function getDqlStatements(): array } #[Test] - public function invalid_boolean_throws_exception(): void + public function throws_exception_for_invalid_boolean(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for jsonb_path_exists. Must be "true" or "false".'); @@ -56,7 +56,7 @@ public function invalid_boolean_throws_exception(): void } #[Test] - public function too_few_arguments_throws_exception(): void + public function throws_exception_for_too_few_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_exists() requires at least 2 arguments'); @@ -66,7 +66,7 @@ public function too_few_arguments_throws_exception(): void } #[Test] - public function too_many_arguments_throws_exception(): void + public function throws_exception_for_too_many_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_exists() requires between 2 and 4 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathMatchTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathMatchTest.php index 91ba190d..5c3e15f9 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathMatchTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathMatchTest.php @@ -46,7 +46,7 @@ protected function getDqlStatements(): array } #[Test] - public function invalid_boolean_throws_exception(): void + public function throws_exception_for_invalid_boolean(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for jsonb_path_match. Must be "true" or "false".'); @@ -56,7 +56,7 @@ public function invalid_boolean_throws_exception(): void } #[Test] - public function too_few_arguments_throws_exception(): void + public function throws_exception_for_too_few_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_match() requires at least 2 arguments'); @@ -66,7 +66,7 @@ public function too_few_arguments_throws_exception(): void } #[Test] - public function too_many_arguments_throws_exception(): void + public function throws_exception_for_too_many_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_match() requires between 2 and 4 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryArrayTest.php index 009a5b8c..1b75ae97 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryArrayTest.php @@ -46,7 +46,7 @@ protected function getDqlStatements(): array } #[Test] - public function invalid_boolean_throws_exception(): void + public function throws_exception_for_invalid_boolean(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for jsonb_path_query_array. Must be "true" or "false".'); @@ -56,7 +56,7 @@ public function invalid_boolean_throws_exception(): void } #[Test] - public function too_few_arguments_throws_exception(): void + public function throws_exception_for_too_few_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_query_array() requires at least 2 arguments'); @@ -66,7 +66,7 @@ public function too_few_arguments_throws_exception(): void } #[Test] - public function too_many_arguments_throws_exception(): void + public function throws_exception_for_too_many_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_query_array() requires between 2 and 4 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryFirstTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryFirstTest.php index fc70b0de..e4311d7c 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryFirstTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryFirstTest.php @@ -46,7 +46,7 @@ protected function getDqlStatements(): array } #[Test] - public function invalid_boolean_throws_exception(): void + public function throws_exception_for_invalid_boolean(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for jsonb_path_query_first. Must be "true" or "false".'); @@ -56,7 +56,7 @@ public function invalid_boolean_throws_exception(): void } #[Test] - public function too_few_arguments_throws_exception(): void + public function throws_exception_for_too_few_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_query_first() requires at least 2 arguments'); @@ -66,7 +66,7 @@ public function too_few_arguments_throws_exception(): void } #[Test] - public function too_many_arguments_throws_exception(): void + public function throws_exception_for_too_many_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_query_first() requires between 2 and 4 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryTest.php index 6cb99489..dca52dc1 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbPathQueryTest.php @@ -46,7 +46,7 @@ protected function getDqlStatements(): array } #[Test] - public function invalid_boolean_throws_exception(): void + public function throws_exception_for_invalid_boolean(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for jsonb_path_query. Must be "true" or "false".'); @@ -56,7 +56,7 @@ public function invalid_boolean_throws_exception(): void } #[Test] - public function too_few_arguments_throws_exception(): void + public function throws_exception_for_too_few_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_query() requires at least 2 arguments'); @@ -66,7 +66,7 @@ public function too_few_arguments_throws_exception(): void } #[Test] - public function too_many_arguments_throws_exception(): void + public function throws_exception_for_too_many_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_path_query() requires between 2 and 4 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetTest.php index 270c7464..65ba36c2 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetTest.php @@ -42,7 +42,7 @@ protected function getDqlStatements(): array } #[Test] - public function invalid_boolean_throws_exception(): void + public function throws_exception_for_invalid_boolean(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for jsonb_set. Must be "true" or "false".'); @@ -52,7 +52,7 @@ public function invalid_boolean_throws_exception(): void } #[Test] - public function too_few_arguments_throws_exception(): void + public function throws_exception_for_too_few_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_set() requires at least 3 arguments'); @@ -62,7 +62,7 @@ public function too_few_arguments_throws_exception(): void } #[Test] - public function too_many_arguments_throws_exception(): void + public function throws_exception_for_too_many_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('jsonb_set() requires between 3 and 4 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LeastTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LeastTest.php index 89a5f0ea..9e974d09 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LeastTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LeastTest.php @@ -43,7 +43,7 @@ protected function getDqlStatements(): array } #[Test] - public function throws_exception_when_single_argument_given(): void + public function throws_exception_for_insufficient_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpCountTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpCountTest.php index 6eed6edb..0284c2d5 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpCountTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpCountTest.php @@ -8,6 +8,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\BaseVariadicFunction; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpCount; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Test; class RegexpCountTest extends BaseVariadicFunctionTestCase @@ -44,23 +45,30 @@ protected function getDqlStatements(): array ]; } + #[DataProvider('provideInvalidArgumentCountCases')] #[Test] - public function too_few_arguments_throws_exception(): void + public function throws_exception_for_invalid_argument_count(string $dql, string $expectedMessage): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); - $this->expectExceptionMessage('regexp_count() requires at least 2 arguments'); + $this->expectExceptionMessage($expectedMessage); - $dql = \sprintf('SELECT REGEXP_COUNT(e.text1) FROM %s e', ContainsTexts::class); $this->buildEntityManager()->createQuery($dql)->getSQL(); } - #[Test] - public function too_many_arguments_throws_exception(): void + /** + * @return array + */ + public static function provideInvalidArgumentCountCases(): array { - $this->expectException(InvalidArgumentForVariadicFunctionException::class); - $this->expectExceptionMessage('regexp_count() requires between 2 and 4 arguments'); - - $dql = \sprintf("SELECT REGEXP_COUNT(e.text1, '\\d+', 1, 'i', 'extra_arg') FROM %s e", ContainsTexts::class); - $this->buildEntityManager()->createQuery($dql)->getSQL(); + return [ + 'too few arguments' => [ + \sprintf('SELECT REGEXP_COUNT(e.text1) FROM %s e', ContainsTexts::class), + 'regexp_count() requires at least 2 arguments', + ], + 'too many arguments' => [ + \sprintf("SELECT REGEXP_COUNT(e.text1, '\\d+', 1, 'i', 'extra_arg') FROM %s e", ContainsTexts::class), + 'regexp_count() requires between 2 and 4 arguments', + ], + ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpInstrTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpInstrTest.php index 22a2b308..f64badc9 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpInstrTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpInstrTest.php @@ -8,6 +8,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\BaseVariadicFunction; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpInstr; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Test; class RegexpInstrTest extends BaseVariadicFunctionTestCase @@ -50,23 +51,30 @@ protected function getDqlStatements(): array ]; } + #[DataProvider('provideInvalidArgumentCountCases')] #[Test] - public function too_few_arguments_throws_exception(): void + public function throws_exception_for_invalid_argument_count(string $dql, string $expectedMessage): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); - $this->expectExceptionMessage('regexp_instr() requires at least 2 arguments'); + $this->expectExceptionMessage($expectedMessage); - $dql = \sprintf('SELECT REGEXP_INSTR(e.text1) FROM %s e', ContainsTexts::class); $this->buildEntityManager()->createQuery($dql)->getSQL(); } - #[Test] - public function too_many_arguments_throws_exception(): void + /** + * @return array + */ + public static function provideInvalidArgumentCountCases(): array { - $this->expectException(InvalidArgumentForVariadicFunctionException::class); - $this->expectExceptionMessage('regexp_instr() requires between 2 and 7 arguments'); - - $dql = \sprintf("SELECT REGEXP_INSTR(e.text1, 'c(.)(..)', 1, 1, 0, 'i', 2, 'extra_arg') FROM %s e", ContainsTexts::class); - $this->buildEntityManager()->createQuery($dql)->getSQL(); + return [ + 'too few arguments' => [ + \sprintf('SELECT REGEXP_INSTR(e.text1) FROM %s e', ContainsTexts::class), + 'regexp_instr() requires at least 2 arguments', + ], + 'too many arguments' => [ + \sprintf("SELECT REGEXP_INSTR(e.text1, 'c(.)(..)', 1, 1, 0, 'i', 2, 'extra_arg') FROM %s e", ContainsTexts::class), + 'regexp_instr() requires between 2 and 7 arguments', + ], + ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpLikeTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpLikeTest.php index 1c64f5bf..44ba132f 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpLikeTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpLikeTest.php @@ -41,7 +41,7 @@ protected function getDqlStatements(): array } #[Test] - public function too_few_arguments_throws_exception(): void + public function throws_exception_for_too_few_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('regexp_like() requires at least 2 arguments'); @@ -51,7 +51,7 @@ public function too_few_arguments_throws_exception(): void } #[Test] - public function too_many_arguments_throws_exception(): void + public function throws_exception_for_too_many_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('regexp_like() requires between 2 and 3 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpMatchTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpMatchTest.php index d3b82dcb..cb17dbc2 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpMatchTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpMatchTest.php @@ -41,7 +41,7 @@ protected function getDqlStatements(): array } #[Test] - public function too_few_arguments_throws_exception(): void + public function throws_exception_for_too_few_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('regexp_match() requires at least 2 arguments'); @@ -51,7 +51,7 @@ public function too_few_arguments_throws_exception(): void } #[Test] - public function too_many_arguments_throws_exception(): void + public function throws_exception_for_too_many_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('regexp_match() requires between 2 and 3 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpReplaceTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpReplaceTest.php index ac37f9a8..3f7de205 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpReplaceTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpReplaceTest.php @@ -8,6 +8,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\BaseVariadicFunction; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpReplace; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Test; class RegexpReplaceTest extends BaseVariadicFunctionTestCase @@ -46,23 +47,30 @@ protected function getDqlStatements(): array ]; } + #[DataProvider('provideInvalidArgumentCountCases')] #[Test] - public function too_few_arguments_throws_exception(): void + public function throws_exception_for_invalid_argument_count(string $dql, string $expectedMessage): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); - $this->expectExceptionMessage('regexp_replace() requires at least 3 arguments'); + $this->expectExceptionMessage($expectedMessage); - $dql = \sprintf("SELECT REGEXP_REPLACE(e.text1, 'pattern') FROM %s e", ContainsTexts::class); $this->buildEntityManager()->createQuery($dql)->getSQL(); } - #[Test] - public function too_many_arguments_throws_exception(): void + /** + * @return array + */ + public static function provideInvalidArgumentCountCases(): array { - $this->expectException(InvalidArgumentForVariadicFunctionException::class); - $this->expectExceptionMessage('regexp_replace() requires between 3 and 6 arguments'); - - $dql = \sprintf("SELECT REGEXP_REPLACE(e.text1, 'pattern', 'replacement', 3, 2, 'i', 'extra_arg') FROM %s e", ContainsTexts::class); - $this->buildEntityManager()->createQuery($dql)->getSQL(); + return [ + 'too few arguments' => [ + \sprintf("SELECT REGEXP_REPLACE(e.text1, 'pattern') FROM %s e", ContainsTexts::class), + 'regexp_replace() requires at least 3 arguments', + ], + 'too many arguments' => [ + \sprintf("SELECT REGEXP_REPLACE(e.text1, 'pattern', 'replacement', 3, 2, 'i', 'extra_arg') FROM %s e", ContainsTexts::class), + 'regexp_replace() requires between 3 and 6 arguments', + ], + ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpSubstrTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpSubstrTest.php index fdc9f701..2ec8f325 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpSubstrTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpSubstrTest.php @@ -8,6 +8,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\BaseVariadicFunction; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RegexpSubstr; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Test; class RegexpSubstrTest extends BaseVariadicFunctionTestCase @@ -46,23 +47,30 @@ protected function getDqlStatements(): array ]; } + #[DataProvider('provideInvalidArgumentCountCases')] #[Test] - public function too_few_arguments_throws_exception(): void + public function throws_exception_for_invalid_argument_count(string $dql, string $expectedMessage): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); - $this->expectExceptionMessage('regexp_substr() requires at least 2 arguments'); + $this->expectExceptionMessage($expectedMessage); - $dql = \sprintf('SELECT REGEXP_SUBSTR(e.text1) FROM %s e', ContainsTexts::class); $this->buildEntityManager()->createQuery($dql)->getSQL(); } - #[Test] - public function too_many_arguments_throws_exception(): void + /** + * @return array + */ + public static function provideInvalidArgumentCountCases(): array { - $this->expectException(InvalidArgumentForVariadicFunctionException::class); - $this->expectExceptionMessage('regexp_substr() requires between 2 and 6 arguments'); - - $dql = \sprintf("SELECT REGEXP_SUBSTR(e.text1, 'c(.)(..)', 1, 1, 'i', 1, 'extra_arg') FROM %s e", ContainsTexts::class); - $this->buildEntityManager()->createQuery($dql)->getSQL(); + return [ + 'too few arguments' => [ + \sprintf('SELECT REGEXP_SUBSTR(e.text1) FROM %s e', ContainsTexts::class), + 'regexp_substr() requires at least 2 arguments', + ], + 'too many arguments' => [ + \sprintf("SELECT REGEXP_SUBSTR(e.text1, 'c(.)(..)', 1, 1, 'i', 1, 'extra_arg') FROM %s e", ContainsTexts::class), + 'regexp_substr() requires between 2 and 6 arguments', + ], + ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RowToJsonTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RowToJsonTest.php index e57ba503..c7f0a007 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RowToJsonTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RowToJsonTest.php @@ -44,7 +44,7 @@ protected function getDqlStatements(): array } #[Test] - public function invalid_boolean_throws_exception(): void + public function throws_exception_for_invalid_boolean(): void { $this->expectException(InvalidBooleanException::class); $this->expectExceptionMessage('Invalid boolean value "invalid" provided for row_to_json. Must be "true" or "false".'); @@ -54,7 +54,7 @@ public function invalid_boolean_throws_exception(): void } #[Test] - public function too_many_arguments_throws_exception(): void + public function throws_exception_for_too_many_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); $this->expectExceptionMessage('row_to_json() requires between 1 and 2 arguments'); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToCharTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToCharTest.php index 4d7b8870..3aa8441b 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToCharTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToCharTest.php @@ -38,7 +38,7 @@ protected function getDqlStatements(): array } #[Test] - public function throws_exception_when_argument_is_missing(): void + public function throws_exception_for_missing_arguments(): void { $this->expectException(QueryException::class); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToDateTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToDateTest.php index ed837d2f..f8a00f22 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToDateTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToDateTest.php @@ -33,7 +33,7 @@ protected function getDqlStatements(): array } #[Test] - public function throws_exception_when_argument_is_missing(): void + public function throws_exception_for_missing_arguments(): void { $this->expectException(QueryException::class); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToNumberTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToNumberTest.php index c2e106d1..e020f639 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToNumberTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToNumberTest.php @@ -33,7 +33,7 @@ protected function getDqlStatements(): array } #[Test] - public function throws_exception_when_argument_is_missing(): void + public function throws_exception_for_missing_arguments(): void { $this->expectException(QueryException::class); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTimestampTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTimestampTest.php index 5b54d880..17be58c8 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTimestampTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTimestampTest.php @@ -33,7 +33,7 @@ protected function getDqlStatements(): array } #[Test] - public function throws_exception_when_argument_is_missing(): void + public function throws_exception_for_missing_arguments(): void { $this->expectException(QueryException::class); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTsqueryTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTsqueryTest.php index 7ea28e23..138facbe 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTsqueryTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTsqueryTest.php @@ -43,7 +43,7 @@ protected function getDqlStatements(): array } #[Test] - public function throws_exception_when_too_many_arguments_given(): void + public function throws_exception_for_too_many_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTsvectorTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTsvectorTest.php index 32177a43..ee8310e8 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTsvectorTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTsvectorTest.php @@ -43,7 +43,7 @@ protected function getDqlStatements(): array } #[Test] - public function throws_exception_when_too_many_arguments_given(): void + public function throws_exception_for_too_many_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/UnaccentTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/UnaccentTest.php index d61adb39..22a7d8cc 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/UnaccentTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/UnaccentTest.php @@ -41,7 +41,7 @@ protected function getDqlStatements(): array } #[Test] - public function throws_exception_when_too_many_arguments_given(): void + public function throws_exception_for_too_many_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); From d149bb62ca7ef5e0cdab613353e91dcfe7d6e127 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Sun, 3 Aug 2025 03:09:42 +0300 Subject: [PATCH 13/22] no message --- .../Doctrine/ORM/Query/AST/Functions/JsonBuildObjectTest.php | 2 +- .../Doctrine/ORM/Query/AST/Functions/JsonbBuildObjectTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonBuildObjectTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonBuildObjectTest.php index 0ad0147f..540b8aec 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonBuildObjectTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonBuildObjectTest.php @@ -43,7 +43,7 @@ protected function getDqlStatements(): array } #[Test] - public function throws_exception_for_invalid_argument_count(): void + public function throws_exception_for_odd_number_of_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbBuildObjectTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbBuildObjectTest.php index 5f44db60..5a2dad09 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbBuildObjectTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbBuildObjectTest.php @@ -43,7 +43,7 @@ protected function getDqlStatements(): array } #[Test] - public function throws_exception_for_invalid_argument_count(): void + public function throws_exception_for_odd_number_of_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); From fb76f392f9c1800a15c26ee000c4055c1b078312 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Sun, 3 Aug 2025 03:32:09 +0300 Subject: [PATCH 14/22] no message --- .../Doctrine/ORM/Query/AST/Functions/AllTest.php | 4 ++-- .../Doctrine/ORM/Query/AST/Functions/CeilTest.php | 4 ++-- .../Doctrine/ORM/Query/AST/Functions/FloorTest.php | 4 ++-- .../Doctrine/ORM/Query/AST/Functions/RegexpTest.php | 4 ++-- .../ORM/Query/AST/Functions/StartsWithTest.php | 4 ++-- .../ORM/Query/AST/Functions/StringToArrayTest.php | 4 ++-- .../Doctrine/ORM/Query/AST/Functions/ToCharTest.php | 12 ++++++------ .../ORM/Query/AST/Functions/UnaccentTest.php | 8 ++++---- 8 files changed, 22 insertions(+), 22 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/AllTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/AllTest.php index 359ac51a..94741af2 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/AllTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/AllTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - 'SELECT c0_.id AS id_0 FROM ContainsArrays c0_ WHERE c0_.id > ALL(c0_.textArray)', + 'all elements match condition' => 'SELECT c0_.id AS id_0 FROM ContainsArrays c0_ WHERE c0_.id > ALL(c0_.textArray)', ]; } protected function getDqlStatements(): array { return [ - \sprintf('SELECT e.id FROM %s e WHERE e.id > ALL_OF(e.textArray)', ContainsArrays::class), + 'all elements match condition' => \sprintf('SELECT e.id FROM %s e WHERE e.id > ALL_OF(e.textArray)', ContainsArrays::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CeilTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CeilTest.php index 03840638..68970767 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CeilTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/CeilTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - 'SELECT CEIL(c0_.decimal1) AS sclr_0 FROM ContainsDecimals c0_', + 'rounds decimal up to nearest integer' => 'SELECT CEIL(c0_.decimal1) AS sclr_0 FROM ContainsDecimals c0_', ]; } protected function getDqlStatements(): array { return [ - \sprintf('SELECT CEIL(e.decimal1) FROM %s e', ContainsDecimals::class), + 'rounds decimal up to nearest integer' => \sprintf('SELECT CEIL(e.decimal1) FROM %s e', ContainsDecimals::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FloorTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FloorTest.php index 985491cb..b2912ecc 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FloorTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FloorTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - 'SELECT FLOOR(c0_.decimal1) AS sclr_0 FROM ContainsDecimals c0_', + 'rounds decimal down to nearest integer' => 'SELECT FLOOR(c0_.decimal1) AS sclr_0 FROM ContainsDecimals c0_', ]; } protected function getDqlStatements(): array { return [ - \sprintf('SELECT FLOOR(e.decimal1) FROM %s e', ContainsDecimals::class), + 'rounds decimal down to nearest integer' => \sprintf('SELECT FLOOR(e.decimal1) FROM %s e', ContainsDecimals::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpTest.php index 7ecf7efe..67e8d618 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RegexpTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT (c0_.text1 ~ '.*thomas.*') AS sclr_0 FROM ContainsTexts c0_", + 'matches text against regular expression pattern' => "SELECT (c0_.text1 ~ '.*thomas.*') AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT REGEXP(e.text1, '.*thomas.*') FROM %s e", ContainsTexts::class), + 'matches text against regular expression pattern' => \sprintf("SELECT REGEXP(e.text1, '.*thomas.*') FROM %s e", ContainsTexts::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/StartsWithTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/StartsWithTest.php index 94f0dcbe..6b23850b 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/StartsWithTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/StartsWithTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT (STARTS_WITH(c0_.text1, 'TEST')) AS sclr_0 FROM ContainsTexts c0_", + 'checks if text starts with prefix' => "SELECT (STARTS_WITH(c0_.text1, 'TEST')) AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT STARTS_WITH(e.text1,'TEST') FROM %s e", ContainsTexts::class), + 'checks if text starts with prefix' => \sprintf("SELECT STARTS_WITH(e.text1,'TEST') FROM %s e", ContainsTexts::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/StringToArrayTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/StringToArrayTest.php index 8fc77088..fd20d706 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/StringToArrayTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/StringToArrayTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT string_to_array(c0_.text1, ',') AS sclr_0 FROM ContainsTexts c0_", + 'splits text into array using comma delimiter' => "SELECT string_to_array(c0_.text1, ',') AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT STRING_TO_ARRAY(e.text1, ',') FROM %s e", ContainsTexts::class), + 'splits text into array using comma delimiter' => \sprintf("SELECT STRING_TO_ARRAY(e.text1, ',') FROM %s e", ContainsTexts::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToCharTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToCharTest.php index 3aa8441b..3ee6872c 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToCharTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToCharTest.php @@ -22,18 +22,18 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT to_char(c0_.datetime1, 'HH12:MI:SS') AS sclr_0 FROM ContainsDates c0_", - "SELECT to_char(c0_.dateinterval1, 'HH24:MI:SS') AS sclr_0 FROM ContainsDates c0_", - "SELECT to_char(c0_.decimal1, '999D99S') AS sclr_0 FROM ContainsDecimals c0_", + 'formats datetime with 12-hour time' => "SELECT to_char(c0_.datetime1, 'HH12:MI:SS') AS sclr_0 FROM ContainsDates c0_", + 'formats interval with 24-hour time' => "SELECT to_char(c0_.dateinterval1, 'HH24:MI:SS') AS sclr_0 FROM ContainsDates c0_", + 'formats decimal with custom pattern' => "SELECT to_char(c0_.decimal1, '999D99S') AS sclr_0 FROM ContainsDecimals c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT TO_CHAR(e.datetime1, 'HH12:MI:SS') FROM %s e", ContainsDates::class), - \sprintf("SELECT TO_CHAR(e.dateinterval1, 'HH24:MI:SS') FROM %s e", ContainsDates::class), - \sprintf("SELECT TO_CHAR(e.decimal1, '999D99S') FROM %s e", ContainsDecimals::class), + 'formats datetime with 12-hour time' => \sprintf("SELECT TO_CHAR(e.datetime1, 'HH12:MI:SS') FROM %s e", ContainsDates::class), + 'formats interval with 24-hour time' => \sprintf("SELECT TO_CHAR(e.dateinterval1, 'HH24:MI:SS') FROM %s e", ContainsDates::class), + 'formats decimal with custom pattern' => \sprintf("SELECT TO_CHAR(e.decimal1, '999D99S') FROM %s e", ContainsDecimals::class), ]; } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/UnaccentTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/UnaccentTest.php index 22a7d8cc..40cb1e17 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/UnaccentTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/UnaccentTest.php @@ -27,16 +27,16 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - 'SELECT unaccent(c0_.text1) AS sclr_0 FROM ContainsTexts c0_', - "SELECT unaccent('unaccent', c0_.text1) AS sclr_0 FROM ContainsTexts c0_", + 'removes accents with default dictionary' => 'SELECT unaccent(c0_.text1) AS sclr_0 FROM ContainsTexts c0_', + 'removes accents with specified dictionary' => "SELECT unaccent('unaccent', c0_.text1) AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf('SELECT UNACCENT(e.text1) FROM %s e', ContainsTexts::class), - \sprintf("SELECT UNACCENT('unaccent', e.text1) FROM %s e", ContainsTexts::class), + 'removes accents with default dictionary' => \sprintf('SELECT UNACCENT(e.text1) FROM %s e', ContainsTexts::class), + 'removes accents with specified dictionary' => \sprintf("SELECT UNACCENT('unaccent', e.text1) FROM %s e", ContainsTexts::class), ]; } From ad08fc0beff3a850fea64d75fffb20e59fc82a59 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Sun, 3 Aug 2025 03:39:29 +0300 Subject: [PATCH 15/22] no message --- .../Doctrine/ORM/Query/AST/Functions/IlikeTest.php | 4 ++-- .../Doctrine/ORM/Query/AST/Functions/RandomTest.php | 8 ++++---- .../Doctrine/ORM/Query/AST/Functions/SimilarToTest.php | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/IlikeTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/IlikeTest.php index ec0ca344..103608ea 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/IlikeTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/IlikeTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT c0_.text1 ilike 'TEST' AS sclr_0 FROM ContainsTexts c0_", + 'case-insensitive pattern matching' => "SELECT c0_.text1 ilike 'TEST' AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT ILIKE(e.text1,'TEST') FROM %s e", ContainsTexts::class), + 'case-insensitive pattern matching' => \sprintf("SELECT ILIKE(e.text1,'TEST') FROM %s e", ContainsTexts::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php index 7f2f65ba..e94fff8c 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RandomTest.php @@ -19,16 +19,16 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - 'SELECT RANDOM() AS sclr_0 FROM ContainsDecimals c0_', - 'SELECT RANDOM() + c0_.decimal1 AS sclr_0 FROM ContainsDecimals c0_', + 'generates random number' => 'SELECT RANDOM() AS sclr_0 FROM ContainsDecimals c0_', + 'uses random in arithmetic expression' => 'SELECT RANDOM() + c0_.decimal1 AS sclr_0 FROM ContainsDecimals c0_', ]; } protected function getDqlStatements(): array { return [ - \sprintf('SELECT RANDOM() FROM %s e', ContainsDecimals::class), - \sprintf('SELECT RANDOM() + e.decimal1 FROM %s e', ContainsDecimals::class), + 'generates random number' => \sprintf('SELECT RANDOM() FROM %s e', ContainsDecimals::class), + 'uses random in arithmetic expression' => \sprintf('SELECT RANDOM() + e.decimal1 FROM %s e', ContainsDecimals::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SimilarToTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SimilarToTest.php index 47d19d8d..3f834ae6 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SimilarToTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SimilarToTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT c0_.text1 similar to 'TEST' AS sclr_0 FROM ContainsTexts c0_", + 'SQL regular expression pattern matching' => "SELECT c0_.text1 similar to 'TEST' AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT SIMILAR_TO(e.text1, 'TEST') FROM %s e", ContainsTexts::class), + 'SQL regular expression pattern matching' => \sprintf("SELECT SIMILAR_TO(e.text1, 'TEST') FROM %s e", ContainsTexts::class), ]; } } From 2532743cc568fdecc71a0af55e5e094ef2a4660a Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Sun, 3 Aug 2025 15:17:57 +0300 Subject: [PATCH 16/22] no message --- .../Query/AST/Functions/DateExtractTest.php | 20 +++++++++---------- .../Query/AST/Functions/DateOverlapsTest.php | 16 +++++++-------- .../AST/Functions/FlaggedRegexpMatchTest.php | 4 ++-- .../Functions/FlaggedRegexpReplaceTest.php | 4 ++-- .../ORM/Query/AST/Functions/IRegexpTest.php | 4 ++-- .../Query/AST/Functions/IsContainedByTest.php | 4 ++-- .../ORM/Query/AST/Functions/JsonValueTest.php | 12 +++++------ .../Query/AST/Functions/NotIRegexpTest.php | 4 ++-- .../ORM/Query/AST/Functions/OverlapsTest.php | 4 ++-- .../ORM/Query/AST/Functions/StrConcatTest.php | 4 ++-- .../ORM/Query/AST/Functions/ToJsonbTest.php | 20 +++++++++---------- .../ORM/Query/AST/Functions/ToNumberTest.php | 4 ++-- .../ORM/Query/AST/Functions/ToTsqueryTest.php | 12 +++++------ .../ORM/Query/AST/Functions/TsmatchTest.php | 4 ++-- 14 files changed, 58 insertions(+), 58 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateExtractTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateExtractTest.php index d5693087..08dded17 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateExtractTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateExtractTest.php @@ -19,22 +19,22 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT EXTRACT('DAY' FROM c0_.date1) AS sclr_0 FROM ContainsDates c0_", - "SELECT EXTRACT('MONTH' FROM c0_.date1) AS sclr_0 FROM ContainsDates c0_", - "SELECT EXTRACT('YEAR' FROM c0_.date1) AS sclr_0 FROM ContainsDates c0_", - "SELECT c0_.date1 AS date1_0 FROM ContainsDates c0_ WHERE EXTRACT('DAY' FROM c0_.date1) = 7", - "SELECT c0_.date1 AS date1_0 FROM ContainsDates c0_ WHERE EXTRACT('MONTH' FROM c0_.date1) = 12", + 'extracts day from date' => "SELECT EXTRACT('DAY' FROM c0_.date1) AS sclr_0 FROM ContainsDates c0_", + 'extracts month from date' => "SELECT EXTRACT('MONTH' FROM c0_.date1) AS sclr_0 FROM ContainsDates c0_", + 'extracts year from date' => "SELECT EXTRACT('YEAR' FROM c0_.date1) AS sclr_0 FROM ContainsDates c0_", + 'filters by extracted day' => "SELECT c0_.date1 AS date1_0 FROM ContainsDates c0_ WHERE EXTRACT('DAY' FROM c0_.date1) = 7", + 'filters by extracted month' => "SELECT c0_.date1 AS date1_0 FROM ContainsDates c0_ WHERE EXTRACT('MONTH' FROM c0_.date1) = 12", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT DATE_EXTRACT('DAY', e.date1) FROM %s e", ContainsDates::class), - \sprintf("SELECT DATE_EXTRACT('MONTH', e.date1) FROM %s e", ContainsDates::class), - \sprintf("SELECT DATE_EXTRACT('YEAR', e.date1) FROM %s e", ContainsDates::class), - \sprintf("SELECT e.date1 FROM %s e WHERE DATE_EXTRACT('DAY', e.date1) = 7", ContainsDates::class), - \sprintf("SELECT e.date1 FROM %s e WHERE DATE_EXTRACT('MONTH', e.date1) = 12", ContainsDates::class), + 'extracts day from date' => \sprintf("SELECT DATE_EXTRACT('DAY', e.date1) FROM %s e", ContainsDates::class), + 'extracts month from date' => \sprintf("SELECT DATE_EXTRACT('MONTH', e.date1) FROM %s e", ContainsDates::class), + 'extracts year from date' => \sprintf("SELECT DATE_EXTRACT('YEAR', e.date1) FROM %s e", ContainsDates::class), + 'filters by extracted day' => \sprintf("SELECT e.date1 FROM %s e WHERE DATE_EXTRACT('DAY', e.date1) = 7", ContainsDates::class), + 'filters by extracted month' => \sprintf("SELECT e.date1 FROM %s e WHERE DATE_EXTRACT('MONTH', e.date1) = 12", ContainsDates::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateOverlapsTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateOverlapsTest.php index 26524efc..3ec30c91 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateOverlapsTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateOverlapsTest.php @@ -19,29 +19,29 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT c0_.date1 AS date1_0 FROM ContainsDates c0_ WHERE (c0_.date1, c0_.date2) OVERLAPS ('2001-12-21', '2001-12-25') = 0", - "SELECT c0_.date1 AS date1_0 FROM ContainsDates c0_ WHERE (c0_.date1, c0_.date2) OVERLAPS ('2001-12-21', '2001-12-25') = 1", - "SELECT c0_.date1 AS date1_0 FROM ContainsDates c0_ WHERE (c0_.date1, COALESCE(c0_.date2, CURRENT_DATE)) OVERLAPS ('2001-12-21', '2001-12-25') = 1", - "SELECT c0_.date1 AS date1_0 FROM ContainsDates c0_ WHERE (c0_.date1, COALESCE(c0_.date2, CURRENT_DATE)) OVERLAPS ('2001-12-21', '2001-12-25') = 0", + 'checks non-overlapping date ranges' => "SELECT c0_.date1 AS date1_0 FROM ContainsDates c0_ WHERE (c0_.date1, c0_.date2) OVERLAPS ('2001-12-21', '2001-12-25') = 0", + 'checks overlapping date ranges' => "SELECT c0_.date1 AS date1_0 FROM ContainsDates c0_ WHERE (c0_.date1, c0_.date2) OVERLAPS ('2001-12-21', '2001-12-25') = 1", + 'checks overlapping with null handling true' => "SELECT c0_.date1 AS date1_0 FROM ContainsDates c0_ WHERE (c0_.date1, COALESCE(c0_.date2, CURRENT_DATE)) OVERLAPS ('2001-12-21', '2001-12-25') = 1", + 'checks overlapping with null handling false' => "SELECT c0_.date1 AS date1_0 FROM ContainsDates c0_ WHERE (c0_.date1, COALESCE(c0_.date2, CURRENT_DATE)) OVERLAPS ('2001-12-21', '2001-12-25') = 0", ]; } protected function getDqlStatements(): array { return [ - \sprintf( + 'checks non-overlapping date ranges' => \sprintf( "SELECT e.date1 FROM %s e WHERE DATE_OVERLAPS(e.date1, e.date2, '2001-12-21', '2001-12-25') = 0", ContainsDates::class ), - \sprintf( + 'checks overlapping date ranges' => \sprintf( "SELECT e.date1 FROM %s e WHERE DATE_OVERLAPS(e.date1, e.date2, '2001-12-21', '2001-12-25') = TRUE", ContainsDates::class ), - \sprintf( + 'checks overlapping with null handling true' => \sprintf( "SELECT e.date1 FROM %s e WHERE DATE_OVERLAPS(e.date1, COALESCE(e.date2, CURRENT_DATE()), '2001-12-21', '2001-12-25') = 1", ContainsDates::class ), - \sprintf( + 'checks overlapping with null handling false' => \sprintf( "SELECT e.date1 FROM %s e WHERE DATE_OVERLAPS(e.date1, COALESCE(e.date2, CURRENT_DATE()), '2001-12-21', '2001-12-25') = FALSE", ContainsDates::class ), diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FlaggedRegexpMatchTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FlaggedRegexpMatchTest.php index 6f567f97..bc914fde 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FlaggedRegexpMatchTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FlaggedRegexpMatchTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT regexp_match(c0_.text1, 'pattern', 'i') AS sclr_0 FROM ContainsTexts c0_", + 'matches text using regex with flags' => "SELECT regexp_match(c0_.text1, 'pattern', 'i') AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT FLAGGED_REGEXP_MATCH(e.text1, 'pattern', 'i') FROM %s e", ContainsTexts::class), + 'matches text using regex with flags' => \sprintf("SELECT FLAGGED_REGEXP_MATCH(e.text1, 'pattern', 'i') FROM %s e", ContainsTexts::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FlaggedRegexpReplaceTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FlaggedRegexpReplaceTest.php index 7fd6d28a..519fd50b 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FlaggedRegexpReplaceTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FlaggedRegexpReplaceTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT regexp_replace(c0_.text1, 'pattern', 'replacement', 'g') AS sclr_0 FROM ContainsTexts c0_", + 'replaces text using regex with flags' => "SELECT regexp_replace(c0_.text1, 'pattern', 'replacement', 'g') AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT FLAGGED_REGEXP_REPLACE(e.text1, 'pattern', 'replacement', 'g') FROM %s e", ContainsTexts::class), + 'replaces text using regex with flags' => \sprintf("SELECT FLAGGED_REGEXP_REPLACE(e.text1, 'pattern', 'replacement', 'g') FROM %s e", ContainsTexts::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/IRegexpTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/IRegexpTest.php index 64e2b1f6..2132ef7c 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/IRegexpTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/IRegexpTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT (c0_.text1 ~* '.*Thomas.*') AS sclr_0 FROM ContainsTexts c0_", + 'case-insensitive regex pattern matching' => "SELECT (c0_.text1 ~* '.*Thomas.*') AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT IREGEXP(e.text1, '.*Thomas.*') FROM %s e", ContainsTexts::class), + 'case-insensitive regex pattern matching' => \sprintf("SELECT IREGEXP(e.text1, '.*Thomas.*') FROM %s e", ContainsTexts::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/IsContainedByTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/IsContainedByTest.php index 30c7ce79..909084c8 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/IsContainedByTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/IsContainedByTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT (c0_.textArray <@ '{681,1185,1878}') AS sclr_0 FROM ContainsArrays c0_", + 'checks if left array is contained by right array' => "SELECT (c0_.textArray <@ '{681,1185,1878}') AS sclr_0 FROM ContainsArrays c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT IS_CONTAINED_BY(e.textArray, '{681,1185,1878}') FROM %s e", ContainsArrays::class), + 'checks if left array is contained by right array' => \sprintf("SELECT IS_CONTAINED_BY(e.textArray, '{681,1185,1878}') FROM %s e", ContainsArrays::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonValueTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonValueTest.php index c1654e0d..02749f81 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonValueTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonValueTest.php @@ -19,18 +19,18 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT json_value(c0_.object1, '$.name') AS sclr_0 FROM ContainsJsons c0_", - "SELECT json_value(c0_.object1, '$.address.city') AS sclr_0 FROM ContainsJsons c0_", - "SELECT json_value(c0_.object1, '$.items[0]') AS sclr_0 FROM ContainsJsons c0_", + 'extracts simple property value' => "SELECT json_value(c0_.object1, '$.name') AS sclr_0 FROM ContainsJsons c0_", + 'extracts nested property value' => "SELECT json_value(c0_.object1, '$.address.city') AS sclr_0 FROM ContainsJsons c0_", + 'extracts array element value' => "SELECT json_value(c0_.object1, '$.items[0]') AS sclr_0 FROM ContainsJsons c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT JSON_VALUE(e.object1, '$.name') FROM %s e", ContainsJsons::class), - \sprintf("SELECT JSON_VALUE(e.object1, '$.address.city') FROM %s e", ContainsJsons::class), - \sprintf("SELECT JSON_VALUE(e.object1, '$.items[0]') FROM %s e", ContainsJsons::class), + 'extracts simple property value' => \sprintf("SELECT JSON_VALUE(e.object1, '$.name') FROM %s e", ContainsJsons::class), + 'extracts nested property value' => \sprintf("SELECT JSON_VALUE(e.object1, '$.address.city') FROM %s e", ContainsJsons::class), + 'extracts array element value' => \sprintf("SELECT JSON_VALUE(e.object1, '$.items[0]') FROM %s e", ContainsJsons::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/NotIRegexpTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/NotIRegexpTest.php index 72e05ef8..352d8d6c 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/NotIRegexpTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/NotIRegexpTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT (c0_.text1 !~* '.*Thomas.*') AS sclr_0 FROM ContainsTexts c0_", + 'case-insensitive regex pattern non-matching' => "SELECT (c0_.text1 !~* '.*Thomas.*') AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT NOT_IREGEXP(e.text1, '.*Thomas.*') FROM %s e", ContainsTexts::class), + 'case-insensitive regex pattern non-matching' => \sprintf("SELECT NOT_IREGEXP(e.text1, '.*Thomas.*') FROM %s e", ContainsTexts::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php index 0aa190df..b0af3a93 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT (c0_.textArray && '{681,1185,1878}') AS sclr_0 FROM ContainsArrays c0_", + 'checks if arrays have overlapping elements' => "SELECT (c0_.textArray && '{681,1185,1878}') AS sclr_0 FROM ContainsArrays c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT OVERLAPS(e.textArray, '{681,1185,1878}') FROM %s e", ContainsArrays::class), + 'checks if arrays have overlapping elements' => \sprintf("SELECT OVERLAPS(e.textArray, '{681,1185,1878}') FROM %s e", ContainsArrays::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/StrConcatTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/StrConcatTest.php index 737c0110..a7ffdacf 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/StrConcatTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/StrConcatTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT (c0_.text1 || 'text2') AS sclr_0 FROM ContainsTexts c0_", + 'concatenates field with literal string' => "SELECT (c0_.text1 || 'text2') AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT STRCONCAT(e.text1, 'text2') FROM %s e", ContainsTexts::class), + 'concatenates field with literal string' => \sprintf("SELECT STRCONCAT(e.text1, 'text2') FROM %s e", ContainsTexts::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToJsonbTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToJsonbTest.php index dc4b2082..238fe511 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToJsonbTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToJsonbTest.php @@ -19,22 +19,22 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - 'SELECT to_jsonb(c0_.text1) AS sclr_0 FROM ContainsTexts c0_', - 'SELECT to_jsonb(UPPER(c0_.text1)) AS sclr_0 FROM ContainsTexts c0_', - 'SELECT to_jsonb(1 + 1) AS sclr_0 FROM ContainsTexts c0_', - 'SELECT to_jsonb(1) AS sclr_0 FROM ContainsTexts c0_', - 'SELECT to_jsonb(LENGTH(c0_.text1)) AS sclr_0 FROM ContainsTexts c0_', + 'converts text field to jsonb' => 'SELECT to_jsonb(c0_.text1) AS sclr_0 FROM ContainsTexts c0_', + 'converts function result to jsonb' => 'SELECT to_jsonb(UPPER(c0_.text1)) AS sclr_0 FROM ContainsTexts c0_', + 'converts arithmetic expression to jsonb' => 'SELECT to_jsonb(1 + 1) AS sclr_0 FROM ContainsTexts c0_', + 'converts literal number to jsonb' => 'SELECT to_jsonb(1) AS sclr_0 FROM ContainsTexts c0_', + 'converts length function to jsonb' => 'SELECT to_jsonb(LENGTH(c0_.text1)) AS sclr_0 FROM ContainsTexts c0_', ]; } protected function getDqlStatements(): array { return [ - \sprintf('SELECT TO_JSONB(e.text1) FROM %s e', ContainsTexts::class), - \sprintf('SELECT TO_JSONB(UPPER(e.text1)) FROM %s e', ContainsTexts::class), - \sprintf('SELECT TO_JSONB(1+1) FROM %s e', ContainsTexts::class), - \sprintf('SELECT TO_JSONB(true) FROM %s e', ContainsTexts::class), - \sprintf('SELECT TO_JSONB(LENGTH(e.text1)) FROM %s e', ContainsTexts::class), + 'converts text field to jsonb' => \sprintf('SELECT TO_JSONB(e.text1) FROM %s e', ContainsTexts::class), + 'converts function result to jsonb' => \sprintf('SELECT TO_JSONB(UPPER(e.text1)) FROM %s e', ContainsTexts::class), + 'converts arithmetic expression to jsonb' => \sprintf('SELECT TO_JSONB(1+1) FROM %s e', ContainsTexts::class), + 'converts literal number to jsonb' => \sprintf('SELECT TO_JSONB(true) FROM %s e', ContainsTexts::class), + 'converts length function to jsonb' => \sprintf('SELECT TO_JSONB(LENGTH(e.text1)) FROM %s e', ContainsTexts::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToNumberTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToNumberTest.php index e020f639..1e7ab224 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToNumberTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToNumberTest.php @@ -21,14 +21,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT to_number(c0_.text1, '99G999D9S') AS sclr_0 FROM ContainsTexts c0_", + 'converts text to number using format pattern' => "SELECT to_number(c0_.text1, '99G999D9S') AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT TO_NUMBER(e.text1, '99G999D9S') FROM %s e", ContainsTexts::class), + 'converts text to number using format pattern' => \sprintf("SELECT TO_NUMBER(e.text1, '99G999D9S') FROM %s e", ContainsTexts::class), ]; } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTsqueryTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTsqueryTest.php index 138facbe..13dab2ae 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTsqueryTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTsqueryTest.php @@ -27,18 +27,18 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - 'SELECT to_tsquery(c0_.text1) AS sclr_0 FROM ContainsTexts c0_', - 'SELECT to_tsquery(UPPER(c0_.text1)) AS sclr_0 FROM ContainsTexts c0_', - "SELECT to_tsquery('english', c0_.text1) AS sclr_0 FROM ContainsTexts c0_", + 'converts text to tsquery with default config' => 'SELECT to_tsquery(c0_.text1) AS sclr_0 FROM ContainsTexts c0_', + 'converts function result to tsquery' => 'SELECT to_tsquery(UPPER(c0_.text1)) AS sclr_0 FROM ContainsTexts c0_', + 'converts text to tsquery with specified config' => "SELECT to_tsquery('english', c0_.text1) AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf('SELECT TO_TSQUERY(e.text1) FROM %s e', ContainsTexts::class), - \sprintf('SELECT TO_TSQUERY(UPPER(e.text1)) FROM %s e', ContainsTexts::class), - \sprintf("SELECT TO_TSQUERY('english', e.text1) FROM %s e", ContainsTexts::class), + 'converts text to tsquery with default config' => \sprintf('SELECT TO_TSQUERY(e.text1) FROM %s e', ContainsTexts::class), + 'converts function result to tsquery' => \sprintf('SELECT TO_TSQUERY(UPPER(e.text1)) FROM %s e', ContainsTexts::class), + 'converts text to tsquery with specified config' => \sprintf("SELECT TO_TSQUERY('english', e.text1) FROM %s e", ContainsTexts::class), ]; } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/TsmatchTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/TsmatchTest.php index 6e25568a..b1c1bc8d 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/TsmatchTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/TsmatchTest.php @@ -23,14 +23,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT (to_tsvector(c0_.text1) @@ to_tsquery('testing')) AS sclr_0 FROM ContainsTexts c0_", + 'matches tsvector against tsquery' => "SELECT (to_tsvector(c0_.text1) @@ to_tsquery('testing')) AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT TSMATCH(TO_TSVECTOR(e.text1), TO_TSQUERY('testing')) FROM %s e", ContainsTexts::class), + 'matches tsvector against tsquery' => \sprintf("SELECT TSMATCH(TO_TSVECTOR(e.text1), TO_TSQUERY('testing')) FROM %s e", ContainsTexts::class), ]; } } From 0359e0c75157daf40f3cc327400469bd0d5510e3 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Sun, 3 Aug 2025 15:19:33 +0300 Subject: [PATCH 17/22] no message --- .../Doctrine/ORM/Query/AST/Functions/NotRegexpTest.php | 4 ++-- .../Doctrine/ORM/Query/AST/Functions/NotSimilarToTest.php | 4 ++-- .../Doctrine/ORM/Query/AST/Functions/ToDateTest.php | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/NotRegexpTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/NotRegexpTest.php index 7ed7d50d..2db5f0df 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/NotRegexpTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/NotRegexpTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT (c0_.text1 !~ '.*thomas.*') AS sclr_0 FROM ContainsTexts c0_", + 'case-sensitive regex pattern non-matching' => "SELECT (c0_.text1 !~ '.*thomas.*') AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT NOT_REGEXP(e.text1, '.*thomas.*') FROM %s e", ContainsTexts::class), + 'case-sensitive regex pattern non-matching' => \sprintf("SELECT NOT_REGEXP(e.text1, '.*thomas.*') FROM %s e", ContainsTexts::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/NotSimilarToTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/NotSimilarToTest.php index 8132113a..a78cd0db 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/NotSimilarToTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/NotSimilarToTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT c0_.text1 not similar to 'TEST' AS sclr_0 FROM ContainsTexts c0_", + 'SQL regex pattern non-matching' => "SELECT c0_.text1 not similar to 'TEST' AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT NOT_SIMILAR_TO(e.text1,'TEST') FROM %s e", ContainsTexts::class), + 'SQL regex pattern non-matching' => \sprintf("SELECT NOT_SIMILAR_TO(e.text1,'TEST') FROM %s e", ContainsTexts::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToDateTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToDateTest.php index f8a00f22..0381a4fd 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToDateTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToDateTest.php @@ -21,14 +21,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT to_date(c0_.text1, 'DD Mon YYYY') AS sclr_0 FROM ContainsTexts c0_", + 'converts text to date using format pattern' => "SELECT to_date(c0_.text1, 'DD Mon YYYY') AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT TO_DATE(e.text1, 'DD Mon YYYY') FROM %s e", ContainsTexts::class), + 'converts text to date using format pattern' => \sprintf("SELECT TO_DATE(e.text1, 'DD Mon YYYY') FROM %s e", ContainsTexts::class), ]; } From 3f8bd0823e794bcf64de004abaa30d05ead6614a Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Sun, 3 Aug 2025 15:28:50 +0300 Subject: [PATCH 18/22] no message --- .../ORM/Query/AST/Functions/DistanceTest.php | 12 ++++++------ .../Query/AST/Functions/FlaggedRegexpLikeTest.php | 4 ++-- .../ORM/Query/AST/Functions/JsonBuildObjectTest.php | 12 ++++++------ .../ORM/Query/AST/Functions/JsonGetObjectTest.php | 4 ++-- .../AST/Functions/ReturnsValueForJsonValueTest.php | 4 ++-- .../AST/Functions/TheRightExistsOnTheLeftTest.php | 4 ++-- .../ORM/Query/AST/Functions/ToTimestampTest.php | 4 ++-- 7 files changed, 22 insertions(+), 22 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DistanceTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DistanceTest.php index 1d56d2d6..d0b64cb1 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DistanceTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DistanceTest.php @@ -19,18 +19,18 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT (c0_.point1 <@> '(2.320041, 48.858889)') AS sclr_0 FROM ContainsPoints c0_", - 'SELECT (c0_.point1 <@> c0_.point2) AS sclr_0 FROM ContainsPoints c0_', - "SELECT ('(1.0, 1.0)' <@> '(2.0, 2.0)') AS sclr_0 FROM ContainsPoints c0_", + 'calculates distance between field and literal point' => "SELECT (c0_.point1 <@> '(2.320041, 48.858889)') AS sclr_0 FROM ContainsPoints c0_", + 'calculates distance between two point fields' => 'SELECT (c0_.point1 <@> c0_.point2) AS sclr_0 FROM ContainsPoints c0_', + 'calculates distance between two literal points' => "SELECT ('(1.0, 1.0)' <@> '(2.0, 2.0)') AS sclr_0 FROM ContainsPoints c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT DISTANCE(e.point1, '(2.320041, 48.858889)') FROM %s e", ContainsPoints::class), - \sprintf('SELECT DISTANCE(e.point1, e.point2) FROM %s e', ContainsPoints::class), - \sprintf("SELECT DISTANCE('(1.0, 1.0)', '(2.0, 2.0)') FROM %s e", ContainsPoints::class), + 'calculates distance between field and literal point' => \sprintf("SELECT DISTANCE(e.point1, '(2.320041, 48.858889)') FROM %s e", ContainsPoints::class), + 'calculates distance between two point fields' => \sprintf('SELECT DISTANCE(e.point1, e.point2) FROM %s e', ContainsPoints::class), + 'calculates distance between two literal points' => \sprintf("SELECT DISTANCE('(1.0, 1.0)', '(2.0, 2.0)') FROM %s e", ContainsPoints::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FlaggedRegexpLikeTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FlaggedRegexpLikeTest.php index 05a4f20a..7b28b95c 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FlaggedRegexpLikeTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/FlaggedRegexpLikeTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT regexp_like(c0_.text1, 'pattern', 'i') AS sclr_0 FROM ContainsTexts c0_", + 'checks if text matches regex pattern with flags' => "SELECT regexp_like(c0_.text1, 'pattern', 'i') AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT FLAGGED_REGEXP_LIKE(e.text1, 'pattern', 'i') FROM %s e", ContainsTexts::class), + 'checks if text matches regex pattern with flags' => \sprintf("SELECT FLAGGED_REGEXP_LIKE(e.text1, 'pattern', 'i') FROM %s e", ContainsTexts::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonBuildObjectTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonBuildObjectTest.php index 540b8aec..b30174bd 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonBuildObjectTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonBuildObjectTest.php @@ -27,18 +27,18 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT json_build_object('key1', c0_.object1) AS sclr_0 FROM ContainsJsons c0_", - "SELECT json_build_object('key1', UPPER('value1'), 'key2', 'value2') AS sclr_0 FROM ContainsJsons c0_", - "SELECT json_build_object('key1', c0_.object1, 'key2', c0_.object2) AS sclr_0 FROM ContainsJsons c0_", + 'builds JSON object with field value' => "SELECT json_build_object('key1', c0_.object1) AS sclr_0 FROM ContainsJsons c0_", + 'builds JSON object with function result and literal' => "SELECT json_build_object('key1', UPPER('value1'), 'key2', 'value2') AS sclr_0 FROM ContainsJsons c0_", + 'builds JSON object with multiple field values' => "SELECT json_build_object('key1', c0_.object1, 'key2', c0_.object2) AS sclr_0 FROM ContainsJsons c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT JSON_BUILD_OBJECT('key1', e.object1) FROM %s e", ContainsJsons::class), - \sprintf("SELECT JSON_BUILD_OBJECT('key1', UPPER('value1'), 'key2', 'value2') FROM %s e", ContainsJsons::class), - \sprintf("SELECT JSON_BUILD_OBJECT('key1', e.object1, 'key2', e.object2) FROM %s e", ContainsJsons::class), + 'builds JSON object with field value' => \sprintf("SELECT JSON_BUILD_OBJECT('key1', e.object1) FROM %s e", ContainsJsons::class), + 'builds JSON object with function result and literal' => \sprintf("SELECT JSON_BUILD_OBJECT('key1', UPPER('value1'), 'key2', 'value2') FROM %s e", ContainsJsons::class), + 'builds JSON object with multiple field values' => \sprintf("SELECT JSON_BUILD_OBJECT('key1', e.object1, 'key2', e.object2) FROM %s e", ContainsJsons::class), ]; } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonGetObjectTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonGetObjectTest.php index 18a714c4..3c669e98 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonGetObjectTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonGetObjectTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT (c0_.object1 #> '{residency}') AS sclr_0 FROM ContainsJsons c0_", + 'extracts JSON object at specified path' => "SELECT (c0_.object1 #> '{residency}') AS sclr_0 FROM ContainsJsons c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT JSON_GET_OBJECT(e.object1, '{residency}') FROM %s e", ContainsJsons::class), + 'extracts JSON object at specified path' => \sprintf("SELECT JSON_GET_OBJECT(e.object1, '{residency}') FROM %s e", ContainsJsons::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ReturnsValueForJsonValueTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ReturnsValueForJsonValueTest.php index 9545c5ff..7649d44f 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ReturnsValueForJsonValueTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ReturnsValueForJsonValueTest.php @@ -19,14 +19,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT (c0_.object1 @?? '$.test[*] ?? (@ > 2)') AS sclr_0 FROM ContainsJsons c0_", + 'checks if JSON path expression returns value' => "SELECT (c0_.object1 @?? '$.test[*] ?? (@ > 2)') AS sclr_0 FROM ContainsJsons c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT RETURNS_VALUE_FOR_JSON_VALUE(e.object1, '$.test[*] ?? (@ > 2)') FROM %s e", ContainsJsons::class), + 'checks if JSON path expression returns value' => \sprintf("SELECT RETURNS_VALUE_FOR_JSON_VALUE(e.object1, '$.test[*] ?? (@ > 2)') FROM %s e", ContainsJsons::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/TheRightExistsOnTheLeftTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/TheRightExistsOnTheLeftTest.php index 30c7e145..daf7e0a6 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/TheRightExistsOnTheLeftTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/TheRightExistsOnTheLeftTest.php @@ -21,14 +21,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT (c0_.object1 ?? ARRAY['test']) AS sclr_0 FROM ContainsJsons c0_", + 'checks if right operand keys exist in left JSON object' => "SELECT (c0_.object1 ?? ARRAY['test']) AS sclr_0 FROM ContainsJsons c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT RIGHT_EXISTS_ON_LEFT(e.object1, ARRAY('test')) FROM %s e", ContainsJsons::class), + 'checks if right operand keys exist in left JSON object' => \sprintf("SELECT RIGHT_EXISTS_ON_LEFT(e.object1, ARRAY('test')) FROM %s e", ContainsJsons::class), ]; } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTimestampTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTimestampTest.php index 17be58c8..204206d2 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTimestampTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ToTimestampTest.php @@ -21,14 +21,14 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT to_timestamp(c0_.text1, 'DD Mon YYYY') AS sclr_0 FROM ContainsTexts c0_", + 'converts text to timestamp using format pattern' => "SELECT to_timestamp(c0_.text1, 'DD Mon YYYY') AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT TO_TIMESTAMP(e.text1, 'DD Mon YYYY') FROM %s e", ContainsTexts::class), + 'converts text to timestamp using format pattern' => \sprintf("SELECT TO_TIMESTAMP(e.text1, 'DD Mon YYYY') FROM %s e", ContainsTexts::class), ]; } From 4d59f32294fd6dfb2d91317c66060cda0b4bd0d5 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Sun, 3 Aug 2025 15:35:58 +0300 Subject: [PATCH 19/22] no message --- .../AST/Functions/JsonBuildObjectTest.php | 21 +++++++++++-- .../AST/Functions/JsonbBuildObjectTest.php | 31 ++++++++++++++----- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonBuildObjectTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonBuildObjectTest.php index b30174bd..25d5d76d 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonBuildObjectTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonBuildObjectTest.php @@ -30,6 +30,9 @@ protected function getExpectedSqlStatements(): array 'builds JSON object with field value' => "SELECT json_build_object('key1', c0_.object1) AS sclr_0 FROM ContainsJsons c0_", 'builds JSON object with function result and literal' => "SELECT json_build_object('key1', UPPER('value1'), 'key2', 'value2') AS sclr_0 FROM ContainsJsons c0_", 'builds JSON object with multiple field values' => "SELECT json_build_object('key1', c0_.object1, 'key2', c0_.object2) AS sclr_0 FROM ContainsJsons c0_", + 'builds JSON object with many key-value pairs' => "SELECT json_build_object('k1', 'v1', 'k2', 'v2', 'k3', 'v3', 'k4', 'v4') AS sclr_0 FROM ContainsJsons c0_", + 'builds JSON object with numeric and boolean values' => "SELECT json_build_object('numeric_key', '123', 'boolean_key', 'true') AS sclr_0 FROM ContainsJsons c0_", + 'builds JSON object with mixed field and literal values' => "SELECT json_build_object('field_key', c0_.object1, 'literal_key', 'literal_value') AS sclr_0 FROM ContainsJsons c0_", ]; } @@ -39,6 +42,9 @@ protected function getDqlStatements(): array 'builds JSON object with field value' => \sprintf("SELECT JSON_BUILD_OBJECT('key1', e.object1) FROM %s e", ContainsJsons::class), 'builds JSON object with function result and literal' => \sprintf("SELECT JSON_BUILD_OBJECT('key1', UPPER('value1'), 'key2', 'value2') FROM %s e", ContainsJsons::class), 'builds JSON object with multiple field values' => \sprintf("SELECT JSON_BUILD_OBJECT('key1', e.object1, 'key2', e.object2) FROM %s e", ContainsJsons::class), + 'builds JSON object with many key-value pairs' => \sprintf("SELECT JSON_BUILD_OBJECT('k1', 'v1', 'k2', 'v2', 'k3', 'v3', 'k4', 'v4') FROM %s e", ContainsJsons::class), + 'builds JSON object with numeric and boolean values' => \sprintf("SELECT JSON_BUILD_OBJECT('numeric_key', '123', 'boolean_key', 'true') FROM %s e", ContainsJsons::class), + 'builds JSON object with mixed field and literal values' => \sprintf("SELECT JSON_BUILD_OBJECT('field_key', e.object1, 'literal_key', 'literal_value') FROM %s e", ContainsJsons::class), ]; } @@ -46,8 +52,19 @@ protected function getDqlStatements(): array public function throws_exception_for_odd_number_of_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); + $this->expectExceptionMessage('json_build_object() requires an even number of arguments'); - $dql = \sprintf("SELECT JSON_BUILD_OBJECT('key1', e.value1, 'key2') FROM %s e", ContainsJsons::class); - $this->assertSqlFromDql('', $dql); + $dql = \sprintf("SELECT JSON_BUILD_OBJECT('key1', e.object1, 'key2') FROM %s e", ContainsJsons::class); + $this->buildEntityManager()->createQuery($dql)->getSQL(); + } + + #[Test] + public function throws_exception_for_single_argument(): void + { + $this->expectException(InvalidArgumentForVariadicFunctionException::class); + $this->expectExceptionMessage('json_build_object() requires at least 2 arguments'); + + $dql = \sprintf("SELECT JSON_BUILD_OBJECT('key1') FROM %s e", ContainsJsons::class); + $this->buildEntityManager()->createQuery($dql)->getSQL(); } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbBuildObjectTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbBuildObjectTest.php index 5a2dad09..2bfbb369 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbBuildObjectTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbBuildObjectTest.php @@ -27,18 +27,24 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT jsonb_build_object('key1', c0_.object1) AS sclr_0 FROM ContainsJsons c0_", - "SELECT jsonb_build_object('key1', UPPER('value1'), 'key2', 'value2') AS sclr_0 FROM ContainsJsons c0_", - "SELECT jsonb_build_object('key1', c0_.object1, 'key2', c0_.object2) AS sclr_0 FROM ContainsJsons c0_", + 'builds JSONB object with field value' => "SELECT jsonb_build_object('key1', c0_.object1) AS sclr_0 FROM ContainsJsons c0_", + 'builds JSONB object with function result and literal' => "SELECT jsonb_build_object('key1', UPPER('value1'), 'key2', 'value2') AS sclr_0 FROM ContainsJsons c0_", + 'builds JSONB object with multiple field values' => "SELECT jsonb_build_object('key1', c0_.object1, 'key2', c0_.object2) AS sclr_0 FROM ContainsJsons c0_", + 'builds JSONB object with many key-value pairs' => "SELECT jsonb_build_object('k1', 'v1', 'k2', 'v2', 'k3', 'v3', 'k4', 'v4') AS sclr_0 FROM ContainsJsons c0_", + 'builds JSONB object with numeric and boolean values' => "SELECT jsonb_build_object('numeric_key', '123', 'boolean_key', 'true') AS sclr_0 FROM ContainsJsons c0_", + 'builds JSONB object with mixed field and literal values' => "SELECT jsonb_build_object('field_key', c0_.object1, 'literal_key', 'literal_value') AS sclr_0 FROM ContainsJsons c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT JSONB_BUILD_OBJECT('key1', e.object1) FROM %s e", ContainsJsons::class), - \sprintf("SELECT JSONB_BUILD_OBJECT('key1', UPPER('value1'), 'key2', 'value2') FROM %s e", ContainsJsons::class), - \sprintf("SELECT JSONB_BUILD_OBJECT('key1', e.object1, 'key2', e.object2) FROM %s e", ContainsJsons::class), + 'builds JSONB object with field value' => \sprintf("SELECT JSONB_BUILD_OBJECT('key1', e.object1) FROM %s e", ContainsJsons::class), + 'builds JSONB object with function result and literal' => \sprintf("SELECT JSONB_BUILD_OBJECT('key1', UPPER('value1'), 'key2', 'value2') FROM %s e", ContainsJsons::class), + 'builds JSONB object with multiple field values' => \sprintf("SELECT JSONB_BUILD_OBJECT('key1', e.object1, 'key2', e.object2) FROM %s e", ContainsJsons::class), + 'builds JSONB object with many key-value pairs' => \sprintf("SELECT JSONB_BUILD_OBJECT('k1', 'v1', 'k2', 'v2', 'k3', 'v3', 'k4', 'v4') FROM %s e", ContainsJsons::class), + 'builds JSONB object with numeric and boolean values' => \sprintf("SELECT JSONB_BUILD_OBJECT('numeric_key', '123', 'boolean_key', 'true') FROM %s e", ContainsJsons::class), + 'builds JSONB object with mixed field and literal values' => \sprintf("SELECT JSONB_BUILD_OBJECT('field_key', e.object1, 'literal_key', 'literal_value') FROM %s e", ContainsJsons::class), ]; } @@ -46,8 +52,19 @@ protected function getDqlStatements(): array public function throws_exception_for_odd_number_of_arguments(): void { $this->expectException(InvalidArgumentForVariadicFunctionException::class); + $this->expectExceptionMessage('jsonb_build_object() requires an even number of arguments'); $dql = \sprintf("SELECT JSONB_BUILD_OBJECT('key1', e.object1, 'key2') FROM %s e", ContainsJsons::class); - $this->assertSqlFromDql('', $dql); + $this->buildEntityManager()->createQuery($dql)->getSQL(); + } + + #[Test] + public function throws_exception_for_single_argument(): void + { + $this->expectException(InvalidArgumentForVariadicFunctionException::class); + $this->expectExceptionMessage('jsonb_build_object() requires at least 2 arguments'); + + $dql = \sprintf("SELECT JSONB_BUILD_OBJECT('key1') FROM %s e", ContainsJsons::class); + $this->buildEntityManager()->createQuery($dql)->getSQL(); } } From 56ae54d3842bc2619195b57bcec7ceebd0bcdbe3 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Mon, 4 Aug 2025 00:34:01 +0300 Subject: [PATCH 20/22] no message --- .../ORM/Query/AST/Functions/SplitPartTest.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SplitPartTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SplitPartTest.php index 53797b29..67e36c3e 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SplitPartTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/SplitPartTest.php @@ -19,16 +19,24 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - "SELECT split_part(c0_.text1, ',', 1) AS sclr_0 FROM ContainsTexts c0_", - "SELECT split_part(c0_.text2, '-', -2) AS sclr_0 FROM ContainsTexts c0_", + 'splits text and returns first part' => "SELECT split_part(c0_.text1, ',', 1) AS sclr_0 FROM ContainsTexts c0_", + 'splits text and returns part from end' => "SELECT split_part(c0_.text2, '-', -2) AS sclr_0 FROM ContainsTexts c0_", + 'splits with zero field number' => "SELECT split_part(c0_.text1, ',', 0) AS sclr_0 FROM ContainsTexts c0_", + 'splits with large field number' => "SELECT split_part(c0_.text1, ',', 999) AS sclr_0 FROM ContainsTexts c0_", + 'splits with single character delimiter' => "SELECT split_part(c0_.text1, '|', 2) AS sclr_0 FROM ContainsTexts c0_", + 'splits with multi-character delimiter' => "SELECT split_part(c0_.text1, ':::', 1) AS sclr_0 FROM ContainsTexts c0_", ]; } protected function getDqlStatements(): array { return [ - \sprintf("SELECT SPLIT_PART(e.text1, ',', 1) FROM %s e", ContainsTexts::class), - \sprintf("SELECT SPLIT_PART(e.text2, '-', -2) FROM %s e", ContainsTexts::class), + 'splits text and returns first part' => \sprintf("SELECT SPLIT_PART(e.text1, ',', 1) FROM %s e", ContainsTexts::class), + 'splits text and returns part from end' => \sprintf("SELECT SPLIT_PART(e.text2, '-', -2) FROM %s e", ContainsTexts::class), + 'splits with zero field number' => \sprintf("SELECT SPLIT_PART(e.text1, ',', 0) FROM %s e", ContainsTexts::class), + 'splits with large field number' => \sprintf("SELECT SPLIT_PART(e.text1, ',', 999) FROM %s e", ContainsTexts::class), + 'splits with single character delimiter' => \sprintf("SELECT SPLIT_PART(e.text1, '|', 2) FROM %s e", ContainsTexts::class), + 'splits with multi-character delimiter' => \sprintf("SELECT SPLIT_PART(e.text1, ':::', 1) FROM %s e", ContainsTexts::class), ]; } } From 076c1e1c2d0eb2cb2863617d1145a6a219640fe5 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Mon, 4 Aug 2025 00:51:02 +0300 Subject: [PATCH 21/22] no message --- .../AST/Functions/BaseVariadicFunction.php | 8 +++++ .../Query/AST/Functions/WidthBucketTest.php | 30 ++++++++++++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/BaseVariadicFunction.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/BaseVariadicFunction.php index 79c31dfb..b3bf10ad 100644 --- a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/BaseVariadicFunction.php +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/BaseVariadicFunction.php @@ -81,6 +81,10 @@ private function feedParserWithNodesForNodeMappingPattern(Parser $parser, string // When nodeIndex=2, we're about to add the 3rd argument (total: 3) $foundMoreNodesThanMappingExpected = ($nodeIndex + 1) > $this->getMaxArgumentCount(); if ($foundMoreNodesThanMappingExpected) { + if ($this->getMinArgumentCount() === $this->getMaxArgumentCount()) { + throw InvalidArgumentForVariadicFunctionException::exactCount($this->getFunctionName(), $this->getMinArgumentCount()); + } + throw InvalidArgumentForVariadicFunctionException::between($this->getFunctionName(), $this->getMinArgumentCount(), $this->getMaxArgumentCount()); } @@ -114,6 +118,10 @@ protected function validateArguments(Node ...$arguments): void $maxArgumentCount = $this->getMaxArgumentCount(); $argumentCount = \count($arguments); + if ($minArgumentCount === $maxArgumentCount && $argumentCount !== $minArgumentCount) { + throw InvalidArgumentForVariadicFunctionException::exactCount($this->getFunctionName(), $this->getMinArgumentCount()); + } + if ($argumentCount < $minArgumentCount) { throw InvalidArgumentForVariadicFunctionException::atLeast($this->getFunctionName(), $this->getMinArgumentCount()); } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php index 66b4c973..29b8b8d7 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/WidthBucketTest.php @@ -5,7 +5,9 @@ namespace Tests\Unit\MartinGeorgiev\Doctrine\ORM\Query\AST\Functions; use Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsDecimals; +use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\WidthBucket; +use PHPUnit\Framework\Attributes\Test; class WidthBucketTest extends TestCase { @@ -19,16 +21,36 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - 'SELECT WIDTH_BUCKET(c0_.decimal1, 0.0, 20.0, 4) AS sclr_0 FROM ContainsDecimals c0_', - 'SELECT WIDTH_BUCKET(15, 0.0, 20.0, 4) AS sclr_0 FROM ContainsDecimals c0_', + 'assigns field value to histogram bucket' => 'SELECT WIDTH_BUCKET(c0_.decimal1, 0.0, 20.0, 4) AS sclr_0 FROM ContainsDecimals c0_', + 'assigns literal value to histogram bucket' => 'SELECT WIDTH_BUCKET(15, 0.0, 20.0, 4) AS sclr_0 FROM ContainsDecimals c0_', ]; } protected function getDqlStatements(): array { return [ - \sprintf('SELECT WIDTH_BUCKET(e.decimal1, 0.0, 20.0, 4) FROM %s e', ContainsDecimals::class), - \sprintf('SELECT WIDTH_BUCKET(15, 0.0, 20.0, 4) FROM %s e', ContainsDecimals::class), + 'assigns field value to histogram bucket' => \sprintf('SELECT WIDTH_BUCKET(e.decimal1, 0.0, 20.0, 4) FROM %s e', ContainsDecimals::class), + 'assigns literal value to histogram bucket' => \sprintf('SELECT WIDTH_BUCKET(15, 0.0, 20.0, 4) FROM %s e', ContainsDecimals::class), ]; } + + #[Test] + public function throws_exception_for_too_few_arguments(): void + { + $this->expectException(InvalidArgumentForVariadicFunctionException::class); + $this->expectExceptionMessage('WIDTH_BUCKET() requires exactly 4 arguments'); + + $dql = \sprintf('SELECT WIDTH_BUCKET(e.decimal1, 0.0, 20.0) FROM %s e', ContainsDecimals::class); + $this->buildEntityManager()->createQuery($dql)->getSQL(); + } + + #[Test] + public function throws_exception_for_too_many_arguments(): void + { + $this->expectException(InvalidArgumentForVariadicFunctionException::class); + $this->expectExceptionMessage('WIDTH_BUCKET() requires exactly 4 arguments'); + + $dql = \sprintf('SELECT WIDTH_BUCKET(e.decimal1, 0.0, 20.0, 4, 5) FROM %s e', ContainsDecimals::class); + $this->buildEntityManager()->createQuery($dql)->getSQL(); + } } From 21dc61a5f113f4c5f9b0230d2b6c7e7aa012e5ba Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Mon, 4 Aug 2025 01:08:19 +0300 Subject: [PATCH 22/22] no message --- .../Query/AST/Functions/ArrayPositionTest.php | 6 +++ .../ORM/Query/AST/Functions/DateAddTest.php | 49 ++++++++++++------- .../Query/AST/Functions/DateSubtractTest.php | 46 +++++++++++------ 3 files changed, 67 insertions(+), 34 deletions(-) diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPositionTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPositionTest.php index 80d2eff0..9bd3236d 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPositionTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPositionTest.php @@ -32,6 +32,9 @@ protected function getExpectedSqlStatements(): array 'finds numeric element' => 'SELECT array_position(c0_.integerArray, 42) AS sclr_0 FROM ContainsArrays c0_', 'finds element using parameter' => 'SELECT array_position(c0_.textArray, ?) AS sclr_0 FROM ContainsArrays c0_', 'with start position' => "SELECT array_position(c0_.textArray, 'new-value', 2) AS sclr_0 FROM ContainsArrays c0_", + 'with zero start position' => "SELECT array_position(c0_.textArray, 'value', 0) AS sclr_0 FROM ContainsArrays c0_", + 'with negative start position' => "SELECT array_position(c0_.textArray, 'value', -1) AS sclr_0 FROM ContainsArrays c0_", + 'with arithmetic expression as start position' => "SELECT array_position(c0_.textArray, 'value', 1 + 1) AS sclr_0 FROM ContainsArrays c0_", ]; } @@ -42,6 +45,9 @@ protected function getDqlStatements(): array 'finds numeric element' => \sprintf('SELECT ARRAY_POSITION(e.integerArray, 42) FROM %s e', ContainsArrays::class), 'finds element using parameter' => \sprintf('SELECT ARRAY_POSITION(e.textArray, :dql_parameter) FROM %s e', ContainsArrays::class), 'with start position' => \sprintf("SELECT ARRAY_POSITION(e.textArray, 'new-value', 2) FROM %s e", ContainsArrays::class), + 'with zero start position' => \sprintf("SELECT ARRAY_POSITION(e.textArray, 'value', 0) FROM %s e", ContainsArrays::class), + 'with negative start position' => \sprintf("SELECT ARRAY_POSITION(e.textArray, 'value', -1) FROM %s e", ContainsArrays::class), + 'with arithmetic expression as start position' => \sprintf("SELECT ARRAY_POSITION(e.textArray, 'value', 1+1) FROM %s e", ContainsArrays::class), ]; } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateAddTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateAddTest.php index 075ea767..f106e58c 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateAddTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateAddTest.php @@ -9,6 +9,7 @@ use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\DateAdd; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException; use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidTimezoneException; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Test; class DateAddTest extends BaseVariadicFunctionTestCase @@ -28,33 +29,21 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - 'adds 1 day with timezone' => "SELECT date_add(c0_.datetimetz1, '1 day', 'Europe/Sofia') AS sclr_0 FROM ContainsDates c0_", - 'adds 2 hours with timezone' => "SELECT date_add(c0_.datetimetz1, '2 hours', 'UTC') AS sclr_0 FROM ContainsDates c0_", - 'adds 3 days without timezone' => "SELECT date_add(c0_.datetimetz1, '3 days') AS sclr_0 FROM ContainsDates c0_", - 'adds with WHERE clause' => "SELECT c0_.datetimetz1 AS datetimetz1_0 FROM ContainsDates c0_ WHERE date_add(c0_.datetimetz1, '1 day') = '2023-01-02 00:00:00'", + 'with timezone (3 arguments)' => "SELECT date_add(c0_.datetimetz1, '1 day', 'Europe/Sofia') AS sclr_0 FROM ContainsDates c0_", + 'without timezone (2 arguments)' => "SELECT date_add(c0_.datetimetz1, '3 days') AS sclr_0 FROM ContainsDates c0_", + 'used in WHERE clause' => "SELECT c0_.datetimetz1 AS datetimetz1_0 FROM ContainsDates c0_ WHERE date_add(c0_.datetimetz1, '1 day') = '2023-01-02 00:00:00'", ]; } protected function getDqlStatements(): array { return [ - 'adds 1 day with timezone' => \sprintf("SELECT DATE_ADD(e.datetimetz1, '1 day', 'Europe/Sofia') FROM %s e", ContainsDates::class), - 'adds 2 hours with timezone' => \sprintf("SELECT DATE_ADD(e.datetimetz1, '2 hours', 'UTC') FROM %s e", ContainsDates::class), - 'adds 3 days without timezone' => \sprintf("SELECT DATE_ADD(e.datetimetz1, '3 days') FROM %s e", ContainsDates::class), - 'adds with WHERE clause' => \sprintf("SELECT e.datetimetz1 FROM %s e WHERE DATE_ADD(e.datetimetz1, '1 day') = '2023-01-02 00:00:00'", ContainsDates::class), + 'with timezone (3 arguments)' => \sprintf("SELECT DATE_ADD(e.datetimetz1, '1 day', 'Europe/Sofia') FROM %s e", ContainsDates::class), + 'without timezone (2 arguments)' => \sprintf("SELECT DATE_ADD(e.datetimetz1, '3 days') FROM %s e", ContainsDates::class), + 'used in WHERE clause' => \sprintf("SELECT e.datetimetz1 FROM %s e WHERE DATE_ADD(e.datetimetz1, '1 day') = '2023-01-02 00:00:00'", ContainsDates::class), ]; } - #[Test] - public function throws_exception_for_invalid_timezone(): void - { - $this->expectException(InvalidTimezoneException::class); - $this->expectExceptionMessage('Invalid timezone "Invalid/Timezone" provided for date_add'); - - $dql = \sprintf("SELECT DATE_ADD(e.datetimetz1, '1 day', 'Invalid/Timezone') FROM %s e", ContainsDates::class); - $this->buildEntityManager()->createQuery($dql)->getSQL(); - } - #[Test] public function throws_exception_for_too_few_arguments(): void { @@ -74,4 +63,28 @@ public function throws_exception_for_too_many_arguments(): void $dql = \sprintf("SELECT DATE_ADD(e.datetimetz1, '1 day', 'Europe/Sofia', 'extra_arg') FROM %s e", ContainsDates::class); $this->buildEntityManager()->createQuery($dql)->getSQL(); } + + #[DataProvider('provideInvalidTimezoneValues')] + #[Test] + public function throws_exception_for_invalid_timezone(string $invalidTimezone): void + { + $this->expectException(InvalidTimezoneException::class); + $this->expectExceptionMessage(\sprintf('Invalid timezone "%s" provided for date_add. Must be a valid PHP timezone identifier.', $invalidTimezone)); + + $dql = \sprintf("SELECT DATE_ADD(e.datetimetz1, '1 day', '%s') FROM %s e", $invalidTimezone, ContainsDates::class); + $this->buildEntityManager()->createQuery($dql)->getSQL(); + } + + /** + * @return array + */ + public static function provideInvalidTimezoneValues(): array + { + return [ + 'empty string' => [''], + 'whitespace only' => [' '], + 'numeric value' => ['123'], + 'invalid timezone' => ['Invalid/Timezone'], + ]; + } } diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateSubtractTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateSubtractTest.php index 50397e52..9a122b2d 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateSubtractTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/DateSubtractTest.php @@ -29,31 +29,21 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - 'subtracts 1 day with timezone' => "SELECT date_subtract(c0_.datetimetz1, '1 day', 'Europe/Sofia') AS sclr_0 FROM ContainsDates c0_", - 'subtracts 2 hours with timezone' => "SELECT date_subtract(c0_.datetimetz1, '2 hours', 'UTC') AS sclr_0 FROM ContainsDates c0_", - 'subtracts 3 days without timezone' => "SELECT date_subtract(c0_.datetimetz1, '3 days') AS sclr_0 FROM ContainsDates c0_", + 'with timezone (3 arguments)' => "SELECT date_subtract(c0_.datetimetz1, '1 day', 'Europe/Sofia') AS sclr_0 FROM ContainsDates c0_", + 'without timezone (2 arguments)' => "SELECT date_subtract(c0_.datetimetz1, '3 days') AS sclr_0 FROM ContainsDates c0_", + 'used in WHERE clause' => "SELECT c0_.datetimetz1 AS datetimetz1_0 FROM ContainsDates c0_ WHERE date_subtract(c0_.datetimetz1, '1 day') = '2023-01-02 00:00:00'", ]; } protected function getDqlStatements(): array { return [ - 'subtracts 1 day with timezone' => \sprintf("SELECT DATE_SUBTRACT(e.datetimetz1, '1 day', 'Europe/Sofia') FROM %s e", ContainsDates::class), - 'subtracts 2 hours with timezone' => \sprintf("SELECT DATE_SUBTRACT(e.datetimetz1, '2 hours', 'UTC') FROM %s e", ContainsDates::class), - 'subtracts 3 days without timezone' => \sprintf("SELECT DATE_SUBTRACT(e.datetimetz1, '3 days') FROM %s e", ContainsDates::class), + 'with timezone (3 arguments)' => \sprintf("SELECT DATE_SUBTRACT(e.datetimetz1, '1 day', 'Europe/Sofia') FROM %s e", ContainsDates::class), + 'without timezone (2 arguments)' => \sprintf("SELECT DATE_SUBTRACT(e.datetimetz1, '3 days') FROM %s e", ContainsDates::class), + 'used in WHERE clause' => \sprintf("SELECT e.datetimetz1 FROM %s e WHERE DATE_SUBTRACT(e.datetimetz1, '1 day') = '2023-01-02 00:00:00'", ContainsDates::class), ]; } - #[Test] - public function throws_exception_for_invalid_timezone(): void - { - $this->expectException(InvalidTimezoneException::class); - $this->expectExceptionMessage('Invalid timezone "Invalid/Timezone" provided for date_subtract'); - - $dql = \sprintf("SELECT DATE_SUBTRACT(e.datetimetz1, '1 day', 'Invalid/Timezone') FROM %s e", ContainsDates::class); - $this->buildEntityManager()->createQuery($dql)->getSQL(); - } - #[DataProvider('provideInvalidArgumentCountCases')] #[Test] public function throws_exception_for_invalid_argument_count(string $dql, string $expectedMessage): void @@ -80,4 +70,28 @@ public static function provideInvalidArgumentCountCases(): array ], ]; } + + #[DataProvider('provideInvalidTimezoneValues')] + #[Test] + public function throws_exception_for_invalid_timezone(string $invalidTimezone): void + { + $this->expectException(InvalidTimezoneException::class); + $this->expectExceptionMessage(\sprintf('Invalid timezone "%s" provided for date_subtract. Must be a valid PHP timezone identifier.', $invalidTimezone)); + + $dql = \sprintf("SELECT DATE_SUBTRACT(e.datetimetz1, '1 day', '%s') FROM %s e", $invalidTimezone, ContainsDates::class); + $this->buildEntityManager()->createQuery($dql)->getSQL(); + } + + /** + * @return array + */ + public static function provideInvalidTimezoneValues(): array + { + return [ + 'empty string' => [''], + 'whitespace only' => [' '], + 'numeric value' => ['123'], + 'invalid timezone' => ['Invalid/Timezone'], + ]; + } }