Skip to content

Commit 7540c48

Browse files
committed
test: add builder test
1 parent bb5ef62 commit 7540c48

File tree

2 files changed

+73
-1
lines changed

2 files changed

+73
-1
lines changed

e2e/bug-11857/src/builders.php

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
namespace Bug11857;
4+
5+
use function PHPStan\Testing\assertType;
6+
7+
trait Filterable
8+
{
9+
/**
10+
* @param array<string, mixed> $attributes
11+
* @return $this
12+
*/
13+
public function filter(array $attributes): static
14+
{
15+
// filter stuff
16+
return $this;
17+
}
18+
19+
/**
20+
* @param array<string, mixed> $attributes
21+
* @return $this
22+
*/
23+
public function filterUsingRequest(array $attributes): static
24+
{
25+
// request handling
26+
return $this->filter($attributes);
27+
}
28+
}
29+
30+
/** @template TModel of Model */
31+
class Builder
32+
{
33+
public function __construct(
34+
/** @var TModel */
35+
protected Model $model
36+
) {
37+
}
38+
39+
}
40+
41+
/**
42+
* @template TModel of Model
43+
* @extends Builder<TModel>
44+
*/
45+
class BaseBuilder extends Builder
46+
{
47+
use Filterable;
48+
}
49+
50+
/** @extends BaseBuilder<User> */
51+
class UserBuilder extends BaseBuilder {}
52+
53+
/**
54+
* @template TModel of Model
55+
* @extends Builder<TModel>
56+
*/
57+
class PackageBuilder extends Builder {}
58+
59+
// this extends a Builder coming from a package
60+
// so can't extend the BaseBuilder in our app
61+
/** @extends PackageBuilder<Comment> */
62+
final class CommentBuilder extends PackageBuilder
63+
{
64+
use Filterable;
65+
}
66+
67+
function test(UserBuilder $user, CommentBuilder $comment): void
68+
{
69+
assertType(UserBuilder::class, $user->filterUsingRequest(['foo' => 'bar']));
70+
assertType(CommentBuilder::class, $comment->filterUsingRequest(['foo' => 'bar']));
71+
}

e2e/bug-11857/src/test.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,5 +66,6 @@ function test(ChildPost $child): void
6666
{
6767
assertType('Bug11857\BelongsTo<Bug11857\User, Bug11857\ChildPost>', $child->user());
6868
// This demonstrates why `$this` is needed in non-final models
69-
assertType('Bug11857\BelongsTo<Bug11857\User, Bug11857\Post>', $child->userSelf()); // should be: Bug11857\BelongsTo<Bug11857\User, Bug11857\ChildPost>
69+
// Should be: Bug11857\BelongsTo<Bug11857\User, Bug11857\ChildPost>
70+
assertType('Bug11857\BelongsTo<Bug11857\User, Bug11857\Post>', $child->userSelf());
7071
}

0 commit comments

Comments
 (0)