DataClassHandlerTest   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 183
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 77
dl 0
loc 183
rs 10
c 0
b 0
f 0
wmc 11

11 Methods

Rating   Name   Duplication   Size   Complexity  
A testGetFile() 0 3 1
A testGetMissingUseStatements() 0 22 1
A testGetModelMethods() 0 3 1
A testGetModelProperties() 0 3 1
A testGenerateClassPhpDoc() 0 7 1
A provideFqnArray() 0 56 1
A testGetClassPhpDoc() 0 9 1
A testGetAst() 0 5 1
A setUp() 0 10 1
A testInitialize() 0 6 1
A testGetRenderer() 0 3 1
1
<?php
2
3
namespace CSoellinger\SilverStripe\ModelAnnotations\Test\Unit\Handler;
4
5
use CSoellinger\SilverStripe\ModelAnnotations\Handler\DataClassFileHandler;
6
use CSoellinger\SilverStripe\ModelAnnotations\Handler\DataClassHandler;
7
use CSoellinger\SilverStripe\ModelAnnotations\Task\ModelAnnotationsTask;
8
use CSoellinger\SilverStripe\ModelAnnotations\Test\Unit\Player;
9
use CSoellinger\SilverStripe\ModelAnnotations\Test\Unit\Supporter;
10
use CSoellinger\SilverStripe\ModelAnnotations\Test\Unit\Team;
11
use CSoellinger\SilverStripe\ModelAnnotations\Test\Unit\TeamSupporter;
12
use CSoellinger\SilverStripe\ModelAnnotations\View\DataClassTaskView;
13
use SilverStripe\Core\Config\Config;
14
use SilverStripe\Core\Injector\Injector;
15
use SilverStripe\Dev\SapphireTest;
16
17
/**
18
 * @internal
19
 *
20
 * @covers \CSoellinger\SilverStripe\ModelAnnotations\Handler\DataClassHandler
21
 */
22
class DataClassHandlerTest extends SapphireTest
23
{
24
    protected static DataClassHandler $handler;
25
26
    protected function setUp(): void
27
    {
28
        parent::setUp();
29
30
        /** @var DataClassHandler $handlerInstance */
31
        $handlerInstance = Injector::inst()
32
            ->createWithArgs(DataClassHandler::class, [Team::class])
33
        ;
34
35
        self::$handler = $handlerInstance;
36
    }
37
38
    /**
39
     * @covers \CSoellinger\SilverStripe\ModelAnnotations\Handler\DataClassHandler::__construct
40
     * @dataProvider provideFqnArray
41
     */
42
    public function testInitialize(string $fqn, string $classDoc, string $classFilePath): void
43
    {
44
        $handlerInstance = new DataClassHandler($fqn);
45
46
        self::assertEquals($classFilePath, $handlerInstance->getFile()->getPath());
47
        self::assertNotEmpty($classDoc);
48
    }
49
50
    /**
51
     * @covers \CSoellinger\SilverStripe\ModelAnnotations\Handler\DataClassHandler::getMissingUseStatements
52
     */
53
    public function testGetMissingUseStatements(): void
54
    {
55
        $missingUseStatements = self::$handler->getMissingUseStatements();
56
57
        self::assertCount(0, $missingUseStatements);
58
59
        Config::forClass(ModelAnnotationsTask::class)->set('addUseStatements', true);
60
61
        /** @var DataClassHandler $handlerInstance */
62
        $handlerInstance = Injector::inst()
63
            ->createWithArgs(DataClassHandler::class, ['CSoellinger\SilverStripe\ModelAnnotations\Test\Unit\Team'])
64
        ;
65
66
        self::$handler = $handlerInstance;
67
68
        $missingUseStatements = self::$handler->getMissingUseStatements();
69
70
        self::assertCount(2, $missingUseStatements);
71
        self::assertEquals('use SilverStripe\\ORM\\HasManyList;', $missingUseStatements[0]);
72
        self::assertEquals('use SilverStripe\\ORM\\ManyManyList;', $missingUseStatements[1]);
73
74
        Config::forClass(ModelAnnotationsTask::class)->set('addUseStatements', false);
75
    }
76
77
    /**
78
     * @covers \CSoellinger\SilverStripe\ModelAnnotations\Handler\DataClassHandler::getFile
79
     */
80
    public function testGetFile(): void
81
    {
82
        self::assertInstanceOf(DataClassFileHandler::class, self::$handler->getFile());
83
    }
84
85
    /**
86
     * @covers \CSoellinger\SilverStripe\ModelAnnotations\Handler\DataClassHandler::getAst
87
     */
88
    public function testGetAst(): void
89
    {
90
        $ast = \ast\parse_file(self::$handler->getFile()->getPath(), 80);
91
92
        self::assertEquals($ast->children[4], self::$handler->getAst());
93
    }
94
95
    /**
96
     * @covers \CSoellinger\SilverStripe\ModelAnnotations\Handler\DataClassHandler::getModelProperties
97
     */
98
    public function testGetModelProperties(): void
99
    {
100
        self::assertCount(2, self::$handler->getModelProperties());
101
    }
102
103
    /**
104
     * @covers \CSoellinger\SilverStripe\ModelAnnotations\Handler\DataClassHandler::getModelMethods
105
     */
106
    public function testGetModelMethods(): void
107
    {
108
        self::assertCount(3, self::$handler->getModelMethods());
109
    }
110
111
    /**
112
     * @covers \CSoellinger\SilverStripe\ModelAnnotations\Handler\DataClassHandler::getRenderer
113
     */
114
    public function testGetRenderer(): void
115
    {
116
        self::assertInstanceOf(DataClassTaskView::class, self::$handler->getRenderer());
117
    }
118
119
    /**
120
     * @covers \CSoellinger\SilverStripe\ModelAnnotations\Handler\DataClassHandler::getClassPhpDoc
121
     */
122
    public function testGetClassPhpDoc(): void
123
    {
124
        self::assertEquals('', self::$handler->getClassPhpDoc());
125
126
        $reflection = new \ReflectionProperty(get_class(self::$handler), 'ast');
127
        $reflection->setAccessible(true);
128
        $reflection->setValue(self::$handler, null);
129
130
        self::assertEquals('', self::$handler->getClassPhpDoc());
131
    }
132
133
    /**
134
     * @covers \CSoellinger\SilverStripe\ModelAnnotations\Handler\DataClassHandler::generateClassPhpDoc
135
     * @dataProvider provideFqnArray
136
     */
137
    public function testGenerateClassPhpDoc(string $fqn, string $classDoc): void
138
    {
139
        /** @var DataClassHandler $handlerInstance */
140
        $handlerInstance = Injector::inst()->createWithArgs(DataClassHandler::class, [$fqn]);
141
        self::$handler = $handlerInstance;
142
143
        self::assertEquals($classDoc, self::$handler->generateClassPhpDoc());
144
    }
145
146
    /**
147
     * @return array<int,string[]>
148
     */
149
    public function provideFqnArray()
150
    {
151
        return [
152
            [
153
                Player::class,
154
                implode(PHP_EOL, [
155
                    '/**',
156
                    ' * @internal Testing model',
157
                    ' *',
158
                    ' * @property string $Name ...',
159
                    ' *',
160
                    ' * @property Team $Team   Has one Team {@see Team}',
161
                    ' * @property int  $TeamID Team ID',
162
                    ' */',
163
                ]),
164
                (string) realpath(implode(DIRECTORY_SEPARATOR, [__DIR__, '..', 'Player.php'])),
165
            ],
166
            [
167
                Supporter::class,
168
                implode(PHP_EOL, [
169
                    '/**',
170
                    ' * @internal Testing model',
171
                    ' *',
172
                    ' * @method ManyManyList Supports() ...',
173
                    ' *',
174
                    ' */',
175
                ]),
176
                (string) realpath(implode(DIRECTORY_SEPARATOR, [__DIR__, '..', 'Supporter.php'])),
177
            ],
178
            [
179
                Team::class,
180
                implode(PHP_EOL, [
181
                    '/**',
182
                    ' * @property string $Name   Name ...',
183
                    ' * @property string $Origin Origin ...',
184
                    ' *',
185
                    ' * @method \SilverStripe\ORM\HasManyList  Players()    Has many Players {@see Player}',
186
                    ' * @method \SilverStripe\ORM\ManyManyList Supporters() Many many Supporters {@see TeamSupporter}',
187
                    ' * @method \SilverStripe\ORM\ManyManyList Images()     Many many Images {@see Image}',
188
                    ' */',
189
                ]),
190
                (string) realpath(implode(DIRECTORY_SEPARATOR, [__DIR__, '..', 'Team.php'])),
191
            ],
192
            [
193
                TeamSupporter::class,
194
                implode(PHP_EOL, [
195
                    '/**',
196
                    ' * @property int       $Ranking     Ranking ...',
197
                    ' * @property int       $TeamID      Team ID',
198
                    ' * @property Supporter $Supporter   Has one Supporter',
199
                    ' *',
200
                    ' * @property Team $Team        Has one Team {@see Team}',
201
                    ' * @property int  $SupporterID Supporter ID',
202
                    ' */',
203
                ]),
204
                (string) realpath(implode(DIRECTORY_SEPARATOR, [__DIR__, '..', 'TeamSupporter.php'])),
205
            ],
206
        ];
207
    }
208
}
209