anonymous//tests/Attribute/Reader/ReaderTest.php$0
last analyzed

Complexity

Total Complexity 0

Size/Duplication

Total Lines 8
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 0
dl 0
loc 8
c 0
b 0
f 0
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
The private property $foo is not used, and could be removed.
Loading history...
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