Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\simpletest\Unit;
|
Chris@0
|
4
|
Chris@0
|
5 use Composer\Autoload\ClassLoader;
|
Chris@0
|
6 use Drupal\Core\Extension\Extension;
|
Chris@0
|
7 use Drupal\Core\Extension\ModuleHandlerInterface;
|
Chris@0
|
8 use Drupal\simpletest\Exception\MissingGroupException;
|
Chris@0
|
9 use Drupal\simpletest\TestDiscovery;
|
Chris@0
|
10 use Drupal\Tests\UnitTestCase;
|
Chris@0
|
11 use org\bovigo\vfs\vfsStream;
|
Chris@0
|
12
|
Chris@0
|
13 /**
|
Chris@0
|
14 * @coversDefaultClass \Drupal\simpletest\TestDiscovery
|
Chris@0
|
15 * @group simpletest
|
Chris@0
|
16 */
|
Chris@0
|
17 class TestDiscoveryTest extends UnitTestCase {
|
Chris@0
|
18
|
Chris@0
|
19 /**
|
Chris@0
|
20 * @covers ::getTestInfo
|
Chris@0
|
21 * @dataProvider infoParserProvider
|
Chris@0
|
22 */
|
Chris@0
|
23 public function testTestInfoParser($expected, $classname, $doc_comment = NULL) {
|
Chris@0
|
24 $info = TestDiscovery::getTestInfo($classname, $doc_comment);
|
Chris@0
|
25 $this->assertEquals($expected, $info);
|
Chris@0
|
26 }
|
Chris@0
|
27
|
Chris@0
|
28 public function infoParserProvider() {
|
Chris@0
|
29 // A module provided unit test.
|
Chris@0
|
30 $tests[] = [
|
Chris@0
|
31 // Expected result.
|
Chris@0
|
32 [
|
Chris@0
|
33 'name' => 'Drupal\Tests\simpletest\Unit\TestDiscoveryTest',
|
Chris@0
|
34 'group' => 'simpletest',
|
Chris@0
|
35 'description' => 'Tests \Drupal\simpletest\TestDiscovery.',
|
Chris@0
|
36 'type' => 'PHPUnit-Unit',
|
Chris@0
|
37 ],
|
Chris@0
|
38 // Classname.
|
Chris@0
|
39 'Drupal\Tests\simpletest\Unit\TestDiscoveryTest',
|
Chris@0
|
40 ];
|
Chris@0
|
41
|
Chris@0
|
42 // A core unit test.
|
Chris@0
|
43 $tests[] = [
|
Chris@0
|
44 // Expected result.
|
Chris@0
|
45 [
|
Chris@0
|
46 'name' => 'Drupal\Tests\Core\DrupalTest',
|
Chris@0
|
47 'group' => 'DrupalTest',
|
Chris@0
|
48 'description' => 'Tests \Drupal.',
|
Chris@0
|
49 'type' => 'PHPUnit-Unit',
|
Chris@0
|
50 ],
|
Chris@0
|
51 // Classname.
|
Chris@0
|
52 'Drupal\Tests\Core\DrupalTest',
|
Chris@0
|
53 ];
|
Chris@0
|
54
|
Chris@0
|
55 // Functional PHPUnit test.
|
Chris@0
|
56 $tests[] = [
|
Chris@0
|
57 // Expected result.
|
Chris@0
|
58 [
|
Chris@0
|
59 'name' => 'Drupal\FunctionalTests\BrowserTestBaseTest',
|
Chris@0
|
60 'group' => 'browsertestbase',
|
Chris@0
|
61 'description' => 'Tests BrowserTestBase functionality.',
|
Chris@0
|
62 'type' => 'PHPUnit-Functional',
|
Chris@0
|
63 ],
|
Chris@0
|
64 // Classname.
|
Chris@0
|
65 'Drupal\FunctionalTests\BrowserTestBaseTest',
|
Chris@0
|
66 ];
|
Chris@0
|
67
|
Chris@0
|
68 // kernel PHPUnit test.
|
Chris@0
|
69 $tests['phpunit-kernel'] = [
|
Chris@0
|
70 // Expected result.
|
Chris@0
|
71 [
|
Chris@0
|
72 'name' => '\Drupal\Tests\file\Kernel\FileItemValidationTest',
|
Chris@0
|
73 'group' => 'file',
|
Chris@0
|
74 'description' => 'Tests that files referenced in file and image fields are always validated.',
|
Chris@0
|
75 'type' => 'PHPUnit-Kernel',
|
Chris@0
|
76 ],
|
Chris@0
|
77 // Classname.
|
Chris@0
|
78 '\Drupal\Tests\file\Kernel\FileItemValidationTest',
|
Chris@0
|
79 ];
|
Chris@0
|
80
|
Chris@0
|
81 // Simpletest classes can not be autoloaded in a PHPUnit test, therefore
|
Chris@0
|
82 // provide a docblock.
|
Chris@0
|
83 $tests[] = [
|
Chris@0
|
84 // Expected result.
|
Chris@0
|
85 [
|
Chris@0
|
86 'name' => 'Drupal\simpletest\Tests\ExampleSimpleTest',
|
Chris@0
|
87 'group' => 'simpletest',
|
Chris@0
|
88 'description' => 'Tests the Simpletest UI internal browser.',
|
Chris@0
|
89 'type' => 'Simpletest',
|
Chris@0
|
90 ],
|
Chris@0
|
91 // Classname.
|
Chris@0
|
92 'Drupal\simpletest\Tests\ExampleSimpleTest',
|
Chris@0
|
93 // Doc block.
|
Chris@0
|
94 "/**
|
Chris@0
|
95 * Tests the Simpletest UI internal browser.
|
Chris@0
|
96 *
|
Chris@0
|
97 * @group simpletest
|
Chris@0
|
98 */
|
Chris@0
|
99 ",
|
Chris@0
|
100 ];
|
Chris@0
|
101
|
Chris@0
|
102 // Test with a different amount of leading spaces.
|
Chris@0
|
103 $tests[] = [
|
Chris@0
|
104 // Expected result.
|
Chris@0
|
105 [
|
Chris@0
|
106 'name' => 'Drupal\simpletest\Tests\ExampleSimpleTest',
|
Chris@0
|
107 'group' => 'simpletest',
|
Chris@0
|
108 'description' => 'Tests the Simpletest UI internal browser.',
|
Chris@0
|
109 'type' => 'Simpletest',
|
Chris@0
|
110 ],
|
Chris@0
|
111 // Classname.
|
Chris@0
|
112 'Drupal\simpletest\Tests\ExampleSimpleTest',
|
Chris@0
|
113 // Doc block.
|
Chris@0
|
114 "/**
|
Chris@0
|
115 * Tests the Simpletest UI internal browser.
|
Chris@0
|
116 *
|
Chris@0
|
117 * @group simpletest
|
Chris@0
|
118 */
|
Chris@0
|
119 */
|
Chris@0
|
120 ",
|
Chris@0
|
121 ];
|
Chris@0
|
122
|
Chris@0
|
123 // Make sure that a "* @" inside a string does not get parsed as an
|
Chris@0
|
124 // annotation.
|
Chris@0
|
125 $tests[] = [
|
Chris@0
|
126 // Expected result.
|
Chris@0
|
127 [
|
Chris@0
|
128 'name' => 'Drupal\simpletest\Tests\ExampleSimpleTest',
|
Chris@0
|
129 'group' => 'simpletest',
|
Chris@0
|
130 'description' => 'Tests the Simpletest UI internal browser. * @',
|
Chris@0
|
131 'type' => 'Simpletest',
|
Chris@0
|
132 ],
|
Chris@0
|
133 // Classname.
|
Chris@0
|
134 'Drupal\simpletest\Tests\ExampleSimpleTest',
|
Chris@0
|
135 // Doc block.
|
Chris@0
|
136 "/**
|
Chris@0
|
137 * Tests the Simpletest UI internal browser. * @
|
Chris@0
|
138 *
|
Chris@0
|
139 * @group simpletest
|
Chris@0
|
140 */
|
Chris@0
|
141 ",
|
Chris@0
|
142 ];
|
Chris@0
|
143
|
Chris@0
|
144 // Multiple @group annotations.
|
Chris@0
|
145 $tests[] = [
|
Chris@0
|
146 // Expected result.
|
Chris@0
|
147 [
|
Chris@0
|
148 'name' => 'Drupal\simpletest\Tests\ExampleSimpleTest',
|
Chris@0
|
149 'group' => 'Test',
|
Chris@0
|
150 'description' => 'Tests the Simpletest UI internal browser.',
|
Chris@0
|
151 'type' => 'Simpletest',
|
Chris@0
|
152 ],
|
Chris@0
|
153 // Classname.
|
Chris@0
|
154 'Drupal\simpletest\Tests\ExampleSimpleTest',
|
Chris@0
|
155 // Doc block.
|
Chris@0
|
156 "/**
|
Chris@0
|
157 * Tests the Simpletest UI internal browser.
|
Chris@0
|
158 *
|
Chris@0
|
159 * @group Test
|
Chris@0
|
160 * @group simpletest
|
Chris@0
|
161 */
|
Chris@0
|
162 ",
|
Chris@0
|
163 ];
|
Chris@0
|
164
|
Chris@0
|
165 // @dependencies annotation.
|
Chris@0
|
166 $tests[] = [
|
Chris@0
|
167 // Expected result.
|
Chris@0
|
168 [
|
Chris@0
|
169 'name' => 'Drupal\simpletest\Tests\ExampleSimpleTest',
|
Chris@0
|
170 'description' => 'Tests the Simpletest UI internal browser.',
|
Chris@0
|
171 'type' => 'Simpletest',
|
Chris@0
|
172 'requires' => ['module' => ['test']],
|
Chris@0
|
173 'group' => 'simpletest',
|
Chris@0
|
174 ],
|
Chris@0
|
175 // Classname.
|
Chris@0
|
176 'Drupal\simpletest\Tests\ExampleSimpleTest',
|
Chris@0
|
177 // Doc block.
|
Chris@0
|
178 "/**
|
Chris@0
|
179 * Tests the Simpletest UI internal browser.
|
Chris@0
|
180 *
|
Chris@0
|
181 * @dependencies test
|
Chris@0
|
182 * @group simpletest
|
Chris@0
|
183 */
|
Chris@0
|
184 ",
|
Chris@0
|
185 ];
|
Chris@0
|
186
|
Chris@0
|
187 // Multiple @dependencies annotation.
|
Chris@0
|
188 $tests[] = [
|
Chris@0
|
189 // Expected result.
|
Chris@0
|
190 [
|
Chris@0
|
191 'name' => 'Drupal\simpletest\Tests\ExampleSimpleTest',
|
Chris@0
|
192 'description' => 'Tests the Simpletest UI internal browser.',
|
Chris@0
|
193 'type' => 'Simpletest',
|
Chris@0
|
194 'requires' => ['module' => ['test', 'test1', 'test2']],
|
Chris@0
|
195 'group' => 'simpletest',
|
Chris@0
|
196 ],
|
Chris@0
|
197 // Classname.
|
Chris@0
|
198 'Drupal\simpletest\Tests\ExampleSimpleTest',
|
Chris@0
|
199 // Doc block.
|
Chris@0
|
200 "/**
|
Chris@0
|
201 * Tests the Simpletest UI internal browser.
|
Chris@0
|
202 *
|
Chris@0
|
203 * @dependencies test, test1, test2
|
Chris@0
|
204 * @group simpletest
|
Chris@0
|
205 */
|
Chris@0
|
206 ",
|
Chris@0
|
207 ];
|
Chris@0
|
208
|
Chris@0
|
209 // Multi-line summary line.
|
Chris@0
|
210 $tests[] = [
|
Chris@0
|
211 // Expected result.
|
Chris@0
|
212 [
|
Chris@0
|
213 'name' => 'Drupal\simpletest\Tests\ExampleSimpleTest',
|
Chris@0
|
214 'description' => 'Tests the Simpletest UI internal browser. And the summary line continues an there is no gap to the annotation.',
|
Chris@0
|
215 'type' => 'Simpletest',
|
Chris@0
|
216 'group' => 'simpletest',
|
Chris@0
|
217 ],
|
Chris@0
|
218 // Classname.
|
Chris@0
|
219 'Drupal\simpletest\Tests\ExampleSimpleTest',
|
Chris@0
|
220 // Doc block.
|
Chris@0
|
221 "/**
|
Chris@0
|
222 * Tests the Simpletest UI internal browser. And the summary line continues an
|
Chris@0
|
223 * there is no gap to the annotation.
|
Chris@0
|
224 *
|
Chris@0
|
225 * @group simpletest
|
Chris@0
|
226 */
|
Chris@0
|
227 ",
|
Chris@0
|
228 ];
|
Chris@0
|
229 return $tests;
|
Chris@0
|
230 }
|
Chris@0
|
231
|
Chris@0
|
232 /**
|
Chris@0
|
233 * @covers ::getTestInfo
|
Chris@0
|
234 */
|
Chris@0
|
235 public function testTestInfoParserMissingGroup() {
|
Chris@0
|
236 $classname = 'Drupal\KernelTests\field\BulkDeleteTest';
|
Chris@0
|
237 $doc_comment = <<<EOT
|
Chris@0
|
238 /**
|
Chris@0
|
239 * Bulk delete storages and fields, and clean up afterwards.
|
Chris@0
|
240 */
|
Chris@0
|
241 EOT;
|
Chris@0
|
242 $this->setExpectedException(MissingGroupException::class, 'Missing @group annotation in Drupal\KernelTests\field\BulkDeleteTest');
|
Chris@0
|
243 TestDiscovery::getTestInfo($classname, $doc_comment);
|
Chris@0
|
244 }
|
Chris@0
|
245
|
Chris@0
|
246 /**
|
Chris@0
|
247 * @covers ::getTestInfo
|
Chris@0
|
248 */
|
Chris@0
|
249 public function testTestInfoParserMissingSummary() {
|
Chris@0
|
250 $classname = 'Drupal\KernelTests\field\BulkDeleteTest';
|
Chris@0
|
251 $doc_comment = <<<EOT
|
Chris@0
|
252 /**
|
Chris@0
|
253 * @group field
|
Chris@0
|
254 */
|
Chris@0
|
255 EOT;
|
Chris@0
|
256 $info = TestDiscovery::getTestInfo($classname, $doc_comment);
|
Chris@0
|
257 $this->assertEmpty($info['description']);
|
Chris@0
|
258 }
|
Chris@0
|
259
|
Chris@0
|
260 protected function setupVfsWithTestClasses() {
|
Chris@0
|
261 vfsStream::setup('drupal');
|
Chris@0
|
262
|
Chris@0
|
263 $test_file = <<<EOF
|
Chris@0
|
264 <?php
|
Chris@0
|
265
|
Chris@0
|
266 /**
|
Chris@0
|
267 * Test description
|
Chris@0
|
268 * @group example
|
Chris@0
|
269 */
|
Chris@0
|
270 class FunctionalExampleTest {}
|
Chris@0
|
271 EOF;
|
Chris@0
|
272
|
Chris@0
|
273 vfsStream::create([
|
Chris@0
|
274 'modules' => [
|
Chris@0
|
275 'test_module' => [
|
Chris@0
|
276 'tests' => [
|
Chris@0
|
277 'src' => [
|
Chris@0
|
278 'Functional' => [
|
Chris@0
|
279 'FunctionalExampleTest.php' => $test_file,
|
Chris@0
|
280 'FunctionalExampleTest2.php' => str_replace(['FunctionalExampleTest', '@group example'], ['FunctionalExampleTest2', '@group example2'], $test_file),
|
Chris@0
|
281 ],
|
Chris@0
|
282 'Kernel' => [
|
Chris@0
|
283 'KernelExampleTest3.php' => str_replace(['FunctionalExampleTest', '@group example'], ['KernelExampleTest3', '@group example2'], $test_file),
|
Chris@0
|
284 ],
|
Chris@0
|
285 ],
|
Chris@0
|
286 ],
|
Chris@0
|
287 ],
|
Chris@0
|
288 ],
|
Chris@0
|
289 ]);
|
Chris@0
|
290 }
|
Chris@0
|
291
|
Chris@0
|
292 /**
|
Chris@0
|
293 * @covers ::getTestClasses
|
Chris@0
|
294 */
|
Chris@0
|
295 public function testGetTestClasses() {
|
Chris@0
|
296 $this->setupVfsWithTestClasses();
|
Chris@0
|
297 $class_loader = $this->prophesize(ClassLoader::class);
|
Chris@0
|
298 $module_handler = $this->prophesize(ModuleHandlerInterface::class);
|
Chris@0
|
299
|
Chris@0
|
300 $test_discovery = new TestTestDiscovery('vfs://drupal', $class_loader->reveal(), $module_handler->reveal());
|
Chris@0
|
301
|
Chris@0
|
302 $extensions = [
|
Chris@0
|
303 'test_module' => new Extension('vfs://drupal', 'module', 'modules/test_module/test_module.info.yml'),
|
Chris@0
|
304 ];
|
Chris@0
|
305 $test_discovery->setExtensions($extensions);
|
Chris@0
|
306 $result = $test_discovery->getTestClasses();
|
Chris@0
|
307 $this->assertCount(2, $result);
|
Chris@0
|
308 $this->assertEquals([
|
Chris@0
|
309 'example' => [
|
Chris@0
|
310 'Drupal\Tests\test_module\Functional\FunctionalExampleTest' => [
|
Chris@0
|
311 'name' => 'Drupal\Tests\test_module\Functional\FunctionalExampleTest',
|
Chris@0
|
312 'description' => 'Test description',
|
Chris@0
|
313 'group' => 'example',
|
Chris@0
|
314 'type' => 'PHPUnit-Functional',
|
Chris@0
|
315 ],
|
Chris@0
|
316 ],
|
Chris@0
|
317 'example2' => [
|
Chris@0
|
318 'Drupal\Tests\test_module\Functional\FunctionalExampleTest2' => [
|
Chris@0
|
319 'name' => 'Drupal\Tests\test_module\Functional\FunctionalExampleTest2',
|
Chris@0
|
320 'description' => 'Test description',
|
Chris@0
|
321 'group' => 'example2',
|
Chris@0
|
322 'type' => 'PHPUnit-Functional',
|
Chris@0
|
323 ],
|
Chris@0
|
324 'Drupal\Tests\test_module\Kernel\KernelExampleTest3' => [
|
Chris@0
|
325 'name' => 'Drupal\Tests\test_module\Kernel\KernelExampleTest3',
|
Chris@0
|
326 'description' => 'Test description',
|
Chris@0
|
327 'group' => 'example2',
|
Chris@0
|
328 'type' => 'PHPUnit-Kernel',
|
Chris@0
|
329 ],
|
Chris@0
|
330 ],
|
Chris@0
|
331 ], $result);
|
Chris@0
|
332 }
|
Chris@0
|
333
|
Chris@0
|
334 /**
|
Chris@0
|
335 * @covers ::getTestClasses
|
Chris@0
|
336 */
|
Chris@0
|
337 public function testGetTestClassesWithSelectedTypes() {
|
Chris@0
|
338 $this->setupVfsWithTestClasses();
|
Chris@0
|
339 $class_loader = $this->prophesize(ClassLoader::class);
|
Chris@0
|
340 $module_handler = $this->prophesize(ModuleHandlerInterface::class);
|
Chris@0
|
341
|
Chris@0
|
342 $test_discovery = new TestTestDiscovery('vfs://drupal', $class_loader->reveal(), $module_handler->reveal());
|
Chris@0
|
343
|
Chris@0
|
344 $extensions = [
|
Chris@0
|
345 'test_module' => new Extension('vfs://drupal', 'module', 'modules/test_module/test_module.info.yml'),
|
Chris@0
|
346 ];
|
Chris@0
|
347 $test_discovery->setExtensions($extensions);
|
Chris@0
|
348 $result = $test_discovery->getTestClasses(NULL, ['PHPUnit-Kernel']);
|
Chris@0
|
349 $this->assertCount(2, $result);
|
Chris@0
|
350 $this->assertEquals([
|
Chris@0
|
351 'example' => [],
|
Chris@0
|
352 'example2' => [
|
Chris@0
|
353 'Drupal\Tests\test_module\Kernel\KernelExampleTest3' => [
|
Chris@0
|
354 'name' => 'Drupal\Tests\test_module\Kernel\KernelExampleTest3',
|
Chris@0
|
355 'description' => 'Test description',
|
Chris@0
|
356 'group' => 'example2',
|
Chris@0
|
357 'type' => 'PHPUnit-Kernel',
|
Chris@0
|
358 ],
|
Chris@0
|
359 ],
|
Chris@0
|
360 ], $result);
|
Chris@0
|
361 }
|
Chris@0
|
362
|
Chris@0
|
363 /**
|
Chris@0
|
364 * @covers ::getPhpunitTestSuite
|
Chris@0
|
365 * @dataProvider providerTestGetPhpunitTestSuite
|
Chris@0
|
366 */
|
Chris@0
|
367 public function testGetPhpunitTestSuite($classname, $expected) {
|
Chris@0
|
368 $this->assertEquals($expected, TestDiscovery::getPhpunitTestSuite($classname));
|
Chris@0
|
369 }
|
Chris@0
|
370
|
Chris@0
|
371 public function providerTestGetPhpunitTestSuite() {
|
Chris@0
|
372 $data = [];
|
Chris@0
|
373 $data['simpletest-webtest'] = ['\Drupal\rest\Tests\NodeTest', FALSE];
|
Chris@0
|
374 $data['simpletest-kerneltest'] = ['\Drupal\hal\Tests\FileNormalizeTest', FALSE];
|
Chris@0
|
375 $data['module-unittest'] = [static::class, 'Unit'];
|
Chris@0
|
376 $data['module-kerneltest'] = ['\Drupal\KernelTests\Core\Theme\TwigMarkupInterfaceTest', 'Kernel'];
|
Chris@0
|
377 $data['module-functionaltest'] = ['\Drupal\FunctionalTests\BrowserTestBaseTest', 'Functional'];
|
Chris@0
|
378 $data['module-functionaljavascripttest'] = ['\Drupal\Tests\toolbar\FunctionalJavascript\ToolbarIntegrationTest', 'FunctionalJavascript'];
|
Chris@0
|
379 $data['core-unittest'] = ['\Drupal\Tests\ComposerIntegrationTest', 'Unit'];
|
Chris@0
|
380 $data['core-unittest2'] = ['Drupal\Tests\Core\DrupalTest', 'Unit'];
|
Chris@0
|
381 $data['core-kerneltest'] = ['\Drupal\KernelTests\KernelTestBaseTest', 'Kernel'];
|
Chris@0
|
382 $data['core-functionaltest'] = ['\Drupal\FunctionalTests\ExampleTest', 'Functional'];
|
Chris@0
|
383 $data['core-functionaljavascripttest'] = ['\Drupal\FunctionalJavascriptTests\ExampleTest', 'FunctionalJavascript'];
|
Chris@0
|
384
|
Chris@0
|
385 return $data;
|
Chris@0
|
386 }
|
Chris@0
|
387
|
Chris@0
|
388 }
|
Chris@0
|
389
|
Chris@0
|
390 class TestTestDiscovery extends TestDiscovery {
|
Chris@0
|
391
|
Chris@0
|
392 /**
|
Chris@0
|
393 * @var \Drupal\Core\Extension\Extension[]
|
Chris@0
|
394 */
|
Chris@0
|
395 protected $extensions = [];
|
Chris@0
|
396
|
Chris@0
|
397 public function setExtensions(array $extensions) {
|
Chris@0
|
398 $this->extensions = $extensions;
|
Chris@0
|
399 }
|
Chris@0
|
400
|
Chris@0
|
401 /**
|
Chris@0
|
402 * {@inheritdoc}
|
Chris@0
|
403 */
|
Chris@0
|
404 protected function getExtensions() {
|
Chris@0
|
405 return $this->extensions;
|
Chris@0
|
406 }
|
Chris@0
|
407
|
Chris@0
|
408 }
|
Chris@0
|
409
|
Chris@0
|
410 namespace Drupal\simpletest\Tests;
|
Chris@0
|
411
|
Chris@0
|
412 use Drupal\simpletest\WebTestBase;
|
Chris@0
|
413
|
Chris@0
|
414 /**
|
Chris@0
|
415 * Tests the Simpletest UI internal browser.
|
Chris@0
|
416 *
|
Chris@0
|
417 * @group simpletest
|
Chris@0
|
418 */
|
Chris@0
|
419 class ExampleSimpleTest extends WebTestBase {
|
Chris@0
|
420 }
|