Skip to content

Commit b3412ed

Browse files
janedbalondrejmirtes
authored andcommitted
Test for first class callable issue
1 parent 0b99ffb commit b3412ed

File tree

3 files changed

+92
-35
lines changed

3 files changed

+92
-35
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;
4+
5+
use PHPStan\Testing\TypeInferenceTestCase;
6+
7+
class ReturnQueryBuilderExpressionTypeResolverExtensionTest extends TypeInferenceTestCase
8+
{
9+
10+
/** @return iterable<mixed> */
11+
public function dataFileAsserts(): iterable
12+
{
13+
yield from $this->gatherAssertTypes(__DIR__ . '/../data/QueryResult/queryBuilderExpressionTypeResolver.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: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace QueryResult\CreateQuery;
4+
5+
use Doctrine\Common\Collections\Criteria;
6+
use Doctrine\ORM\AbstractQuery;
7+
use Doctrine\ORM\EntityManagerInterface;
8+
use Doctrine\ORM\Query\Expr\Andx;
9+
use Doctrine\ORM\Query\Expr\From;
10+
use Doctrine\ORM\QueryBuilder;
11+
use QueryResult\Entities\Many;
12+
use function PHPStan\Testing\assertType;
13+
14+
class QueryBuilderGetQuery
15+
{
16+
17+
public function testQueryTypeIsInferredOnAcrossMethods(EntityManagerInterface $em): void
18+
{
19+
$query = $this->getQueryBuilder($em)->getQuery();
20+
$branchingQuery = $this->getBranchingQueryBuilder($em)->getQuery();
21+
22+
assertType('Doctrine\ORM\Query<null, QueryResult\Entities\Many>', $query);
23+
assertType('Doctrine\ORM\Query<null, QueryResult\Entities\Many>', $branchingQuery);
24+
}
25+
26+
public function testQueryTypeIsInferredOnAcrossMethodsEvenWhenVariableAssignmentIsUsed(EntityManagerInterface $em): void
27+
{
28+
$queryBuilder = $this->getQueryBuilder($em);
29+
30+
assertType('Doctrine\ORM\Query<null, QueryResult\Entities\Many>', $queryBuilder->getQuery());
31+
}
32+
33+
public function testFirstClassCallableDoesNotFail(EntityManagerInterface $em): void
34+
{
35+
$this->getQueryBuilder(...);
36+
}
37+
38+
private function getQueryBuilder(EntityManagerInterface $em): QueryBuilder
39+
{
40+
return $em->createQueryBuilder()
41+
->select('m')
42+
->from(Many::class, 'm');
43+
}
44+
45+
private function getBranchingQueryBuilder(EntityManagerInterface $em): QueryBuilder
46+
{
47+
$queryBuilder = $em->createQueryBuilder()
48+
->select('m')
49+
->from(Many::class, 'm');
50+
51+
if (random_int(0, 1) === 1) {
52+
$queryBuilder->andWhere('m.intColumn = 1');
53+
}
54+
55+
return $queryBuilder;
56+
}
57+
}

tests/Type/Doctrine/data/QueryResult/queryBuilderGetQuery.php

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -233,39 +233,4 @@ public function testDynamicMethodCall(
233233
assertType('mixed', $result);
234234
}
235235

236-
public function testQueryTypeIsInferredOnAcrossMethods(EntityManagerInterface $em): void
237-
{
238-
$query = $this->getQueryBuilder($em)->getQuery();
239-
$branchingQuery = $this->getBranchingQueryBuilder($em)->getQuery();
240-
241-
assertType('Doctrine\ORM\Query<null, QueryResult\Entities\Many>', $query);
242-
assertType('Doctrine\ORM\Query<null, QueryResult\Entities\Many>', $branchingQuery);
243-
}
244-
245-
public function testQueryTypeIsInferredOnAcrossMethodsEvenWhenVariableAssignmentIsUsed(EntityManagerInterface $em): void
246-
{
247-
$queryBuilder = $this->getQueryBuilder($em);
248-
249-
assertType('Doctrine\ORM\Query<null, QueryResult\Entities\Many>', $queryBuilder->getQuery());
250-
}
251-
252-
private function getQueryBuilder(EntityManagerInterface $em): QueryBuilder
253-
{
254-
return $em->createQueryBuilder()
255-
->select('m')
256-
->from(Many::class, 'm');
257-
}
258-
259-
private function getBranchingQueryBuilder(EntityManagerInterface $em): QueryBuilder
260-
{
261-
$queryBuilder = $em->createQueryBuilder()
262-
->select('m')
263-
->from(Many::class, 'm');
264-
265-
if (random_int(0, 1) === 1) {
266-
$queryBuilder->andWhere('m.intColumn = 1');
267-
}
268-
269-
return $queryBuilder;
270-
}
271236
}

0 commit comments

Comments
 (0)