1 | <?php |
||
2 | |||
3 | declare(strict_types=1); |
||
4 | |||
5 | namespace GraphQLTests\Doctrine\Attribute\Reader; |
||
6 | |||
7 | use GraphQL\Doctrine\Attribute\Argument; |
||
8 | use GraphQL\Doctrine\Attribute\Exclude; |
||
9 | use GraphQL\Doctrine\Attribute\Field; |
||
10 | use GraphQL\Doctrine\Attribute\Filter; |
||
11 | use GraphQL\Doctrine\Attribute\FilterGroupCondition; |
||
12 | use GraphQL\Doctrine\Attribute\Reader\Reader; |
||
13 | use GraphQL\Doctrine\Attribute\Sorting; |
||
14 | use GraphQLTests\Doctrine\Blog\Model\AbstractModel; |
||
15 | use GraphQLTests\Doctrine\Blog\Model\Post; |
||
16 | use GraphQLTests\Doctrine\Blog\Model\User; |
||
17 | use PHPUnit\Framework\TestCase; |
||
18 | use ReflectionClass; |
||
19 | use ReflectionMethod; |
||
20 | use ReflectionProperty; |
||
21 | use ReturnTypeWillChange; |
||
22 | |||
23 | class ReaderTest extends TestCase |
||
24 | { |
||
25 | private Reader $reader; |
||
26 | |||
27 | protected function setUp(): void |
||
28 | { |
||
29 | $this->reader = new Reader(); |
||
30 | } |
||
31 | |||
32 | public function testGetRecursiveClassAttributesWithFilter(): void |
||
33 | { |
||
34 | $actual = $this->reader->getRecursiveClassAttributes(new ReflectionClass(Post::class), Filter::class); |
||
35 | |||
36 | self::assertCount(2, $actual); |
||
37 | self::assertCount(1, $actual[Post::class]); |
||
38 | self::assertContainsOnlyInstancesOf(Filter::class, $actual[Post::class]); |
||
39 | self::assertCount(1, $actual[AbstractModel::class]); |
||
40 | self::assertContainsOnlyInstancesOf(Filter::class, $actual[AbstractModel::class]); |
||
41 | } |
||
42 | |||
43 | public function testGetRecursiveClassAttributesWithSorting(): void |
||
44 | { |
||
45 | $actual = $this->reader->getRecursiveClassAttributes(new ReflectionClass(Post::class), Sorting::class); |
||
46 | |||
47 | self::assertCount(2, $actual); |
||
48 | self::assertCount(2, $actual[Post::class]); |
||
49 | self::assertContainsOnlyInstancesOf(Sorting::class, $actual[Post::class]); |
||
50 | self::assertCount(1, $actual[AbstractModel::class]); |
||
51 | self::assertContainsOnlyInstancesOf(Sorting::class, $actual[AbstractModel::class]); |
||
52 | } |
||
53 | |||
54 | public function testGetClassAttribute(): void |
||
55 | { |
||
56 | self::assertInstanceOf( |
||
57 | Filter::class, |
||
58 | $this->reader->getAttribute(new ReflectionClass(Post::class), Filter::class) |
||
59 | ); |
||
60 | } |
||
61 | |||
62 | public function testGetPropertyAttribute(): void |
||
63 | { |
||
64 | self::assertInstanceOf( |
||
65 | FilterGroupCondition::class, |
||
66 | $this->reader->getAttribute(new ReflectionProperty(Post::class, 'status'), FilterGroupCondition::class) |
||
67 | ); |
||
68 | } |
||
69 | |||
70 | public function testGetMethodAttribute(): void |
||
71 | { |
||
72 | self::assertInstanceOf( |
||
73 | Field::class, |
||
74 | $this->reader->getAttribute(new ReflectionMethod(Post::class, 'getBody'), Field::class) |
||
75 | ); |
||
76 | } |
||
77 | |||
78 | public function testGetParameterAttribute(): void |
||
79 | { |
||
80 | self::assertInstanceOf( |
||
81 | Argument::class, |
||
82 | $this->reader->getAttribute((new ReflectionMethod(User::class, 'getPosts'))->getParameters()[0], Argument::class) |
||
83 | ); |
||
84 | } |
||
85 | |||
86 | public function testWillThrowIfUniqueAttributeIsUsedMultipleTimes(): void |
||
87 | { |
||
88 | $mock = new class() { |
||
89 | #[Exclude] |
||
90 | /** @phpstan-ignore-next-line */ |
||
91 | #[Exclude] |
||
92 | /** |
||
93 | * @phpstan-ignore-next-line |
||
94 | */ |
||
95 | private $foo; |
||
0 ignored issues
–
show
introduced
by
![]() |
|||
96 | }; |
||
97 | |||
98 | $this->expectExceptionMessage('Attribute "GraphQL\Doctrine\Attribute\Exclude" must not be repeated'); |
||
99 | $this->reader->getAttribute(new ReflectionProperty($mock, 'foo'), Exclude::class); |
||
100 | } |
||
101 | |||
102 | public function testWillThrowIfReaderIsUsedWithOtherAttributes(): void |
||
103 | { |
||
104 | $mock = new class() { |
||
105 | /** |
||
106 | * @phpstan-ignore-next-line |
||
107 | */ |
||
108 | #[ReturnTypeWillChange] |
||
109 | private function foo(): void |
||
110 | { |
||
111 | } |
||
112 | }; |
||
113 | |||
114 | $this->expectExceptionMessage('GraphQL\Doctrine\Attribute\Reader\Reader cannot be used for attribute than are not part of `ecodev/graphql-doctrine`.'); |
||
115 | // @phpstan-ignore-next-line |
||
116 | $this->reader->getAttribute(new ReflectionMethod($mock, 'foo'), ReturnTypeWillChange::class); |
||
117 | } |
||
118 | } |
||
119 |