packages/deriver/tests/Unit/Finder/DirectoryScanTest.php

1<?php
2
3declare (strict_types=1);
4
5namespace Tests\Unit\Finder;
6
7use Deriver\Finder\DirectoryScan;
8use Deriver\Finder\PathPattern;
9use org\bovigo\vfs\vfsStream;
10use org\bovigo\vfs\vfsStreamDirectory;
11use org\bovigo\vfs\vfsStreamFile;
12use Override;
13use PHPUnit\Framework\Attributes\CoversClass;
14use PHPUnit\Framework\Attributes\Small;
15use PHPUnit\Framework\Attributes\UsesClass;
16use PHPUnit\Framework\TestCase;
17
18#[CoversClass(DirectoryScan::class)]
19#[UsesClass(PathPattern::class)]
20#[Small]
21final class DirectoryScanTest extends TestCase
22{
23    /**
24     * @throws \org\bovigo\vfs\vfsStreamException
25     */
26    public function testFilesPruneExcludedDirectoriesAndSymbolicLinks(): void
27    {
28        $root = vfsStream::setup('project', null, ['keep.php' => '', 'skip' => ['sub' => ['file.php' => '']]]);
29        /** vfsStream has no link targets; link mode exercises lstat-based pruning. */
30        (new class ('alias.php') extends vfsStreamFile {
31            #[Override]
32            public function getType(): int
33            {
34                return 0120000;
35            }
36        })->at($root);
37        (new class ('loop') extends vfsStreamDirectory {
38            #[Override]
39            public function getType(): int
40            {
41                return 0120000;
42            }
43        })->at($root);
44        self::assertTrue(is_link($root->url() . '/alias.php'));
45        self::assertTrue(is_link($root->url() . '/loop'));
46        $files = (new DirectoryScan())->files($root->url(), [], [new PathPattern('skip')]);
47        self::assertSame([$root->url() . '/keep.php'], iterator_to_array($files, false));
48    }
49}
50