Skip to content

Commit dcd4f5a

Browse files
authored
Additional tests
1 parent 35b098c commit dcd4f5a

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Type\Doctrine\QueryBuilder\Expr;
4+
5+
use PHPStan\Testing\TypeInferenceTestCase;
6+
7+
class ExpressionBuilderDynamicReturnTypeExtensionTest extends TypeInferenceTestCase
8+
{
9+
10+
/** @return iterable<mixed> */
11+
public function dataFileAsserts(): iterable
12+
{
13+
yield from $this->gatherAssertTypes(__DIR__ . '/../../data/QueryResult/expressionBuilderGetQuery.php');
14+
}
15+
16+
/**
17+
* @dataProvider dataFileAsserts
18+
* @param mixed ...$args
19+
*/
20+
public function testFileAsserts(
21+
string $assertType,
22+
string $file,
23+
...$args
24+
): void
25+
{
26+
$this->assertFileAsserts($assertType, $file, ...$args);
27+
}
28+
29+
/** @return string[] */
30+
public static function getAdditionalConfigFiles(): array
31+
{
32+
return [__DIR__ . '/../../data/QueryResult/config.neon'];
33+
}
34+
35+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace QueryResult\CreateQuery;
4+
5+
use Doctrine\ORM\AbstractQuery;
6+
use Doctrine\ORM\EntityManagerInterface;
7+
use Doctrine\ORM\QueryBuilder;
8+
use QueryResult\Entities\Many;
9+
use function PHPStan\Testing\assertType;
10+
11+
class ExpressionBuilderGetQuery
12+
{
13+
public function isNullLiteralString(EntityManagerInterface $em): void
14+
{
15+
$result = $em->createQueryBuilder()->expr()->isNull('field');
16+
assertType("'field IS NULL'", $result); // A ConstantStringType isLiteralString
17+
}
18+
19+
public function isNullNonLiteralString(EntityManagerInterface $em): void
20+
{
21+
$field = strtolower('field'); // Non literal-string, e.g. $_POST['field'];
22+
$result = $em->createQueryBuilder()->expr()->isNull($field);
23+
assertType('string', $result);
24+
}
25+
26+
public function isNotNullLiteralString(EntityManagerInterface $em): void
27+
{
28+
$result = $em->createQueryBuilder()->expr()->isNotNull('field');
29+
assertType("'field IS NOT NULL'", $result); // A ConstantStringType isLiteralString
30+
}
31+
32+
public function isNotNullNonLiteralString(EntityManagerInterface $em): void
33+
{
34+
$field = strtolower('field'); // Non literal-string, e.g. $_POST['field'];
35+
$result = $em->createQueryBuilder()->expr()->isNotNull($field);
36+
assertType('string', $result);
37+
}
38+
39+
public function countDistinctLiteralString(EntityManagerInterface $em): void
40+
{
41+
$result = $em->createQueryBuilder()->expr()->countDistinct('A', 'B', 'C');
42+
assertType("'COUNT(DISTINCT A, B, C)'", $result); // A ConstantStringType isLiteralString
43+
}
44+
45+
public function countDistinctNonLiteralString(EntityManagerInterface $em): void
46+
{
47+
$field = strtolower('B'); // Non literal-string, e.g. $_POST['field'];
48+
$result = $em->createQueryBuilder()->expr()->countDistinct('A', $field, 'C');
49+
assertType('string', $result);
50+
}
51+
52+
public function betweenLiteralString(EntityManagerInterface $em): void
53+
{
54+
$result = $em->createQueryBuilder()->expr()->between('field', "'value_1'", "'value_2'");
55+
assertType("'field BETWEEN \'value_1\' AND \'value_2\''", $result); // A ConstantStringType isLiteralString
56+
}
57+
58+
public function betweenNonLiteralString(EntityManagerInterface $em): void
59+
{
60+
$value_1 = strtolower('B'); // Non literal-string, e.g. $_POST['field'];
61+
$result = $em->createQueryBuilder()->expr()->between('field', "'" . $value_1 . "'", "'value_2'");
62+
assertType('string', $result);
63+
}
64+
65+
// Might be a problem, as these do not return a 'literal-string'.
66+
// As in, functions to support MOD() and ABS() return stringable value objects (Expr\Func).
67+
public function isNullNonLiteralStringExprFunc(EntityManagerInterface $em): void
68+
{
69+
$result = $em->createQueryBuilder()->expr()->isNull($qb->expr()->mod('field', '0'));
70+
assertType('string', $result);
71+
}
72+
73+
public function betweenNonLiteralStringExprFunc(EntityManagerInterface $em): void
74+
{
75+
$result = $em->createQueryBuilder()->expr()->between($qb->expr()->abs('field'), '10', '30');
76+
assertType('string', $result);
77+
}
78+
79+
}

0 commit comments

Comments
 (0)