19 declare(strict_types=1);
38 $fileSystem = $this->getMockBuilder(
Filesystem\Filesystem::class)->getMock();
41 new Filesystem\DTO\Metadata(
'file_1.txt', MetadataType::FILE),
42 new Filesystem\DTO\Metadata(
'file_2.mp3', MetadataType::FILE),
43 new Filesystem\DTO\Metadata(
'dir_1', MetadataType::DIRECTORY),
47 ->expects($this->atLeast(1))
48 ->method(
'listContents')
49 ->willReturnCallback(
function (
$path) use ($metadata) {
65 $fileSystem = $this->getMockBuilder(
Filesystem\Filesystem::class)->getMock();
68 new Filesystem\DTO\Metadata(
'file_1.txt', MetadataType::FILE),
69 new Filesystem\DTO\Metadata(
'file_2.mp3', MetadataType::FILE),
70 new Filesystem\DTO\Metadata(
'dir_1', MetadataType::DIRECTORY),
74 new Filesystem\DTO\Metadata(
'dir_1/file_3.log', MetadataType::FILE),
75 new Filesystem\DTO\Metadata(
'dir_1/file_4.php', MetadataType::FILE),
76 new Filesystem\DTO\Metadata(
'dir_1/dir_1_1', MetadataType::DIRECTORY),
77 new Filesystem\DTO\Metadata(
'dir_1/dir_1_2', MetadataType::DIRECTORY),
81 new Filesystem\DTO\Metadata(
'dir_1/dir_1_1/file_5.cpp', MetadataType::FILE),
85 new Filesystem\DTO\Metadata(
'dir_1/dir_1_2/file_6.py', MetadataType::FILE),
86 new Filesystem\DTO\Metadata(
'dir_1/dir_1_2/file_7.cpp', MetadataType::FILE),
87 new Filesystem\DTO\Metadata(
'dir_1/dir_1_2/dir_1_2_1', MetadataType::DIRECTORY),
91 ->expects($this->atLeast(1))
92 ->method(
'listContents')
93 ->willReturnCallback(
function (
$path) use (
100 return $rootMetadata;
102 if (
'dir_1' ===
$path) {
103 return $level1Metadata;
104 } elseif (
'dir_1/dir_1_1' ===
$path) {
105 return $level11Metadata;
106 } elseif (
'dir_1/dir_1_2' ===
$path) {
107 return $level12Metadata;
121 $fileSystem = $this->getMockBuilder(
Filesystem\Filesystem::class)->getMock();
124 ->method(
'listContents')
127 $finder = (
new Finder($fileSystem))->in([
'/']);
129 $this->assertEmpty(iterator_count($finder));
139 $this->assertCount(3, $finder);
140 $this->assertCount(1, $finder->directories());
141 $this->assertCount(2, $finder->files());
151 $this->assertCount(11, $finder);
152 $this->assertCount(4, $finder->directories());
153 $this->assertCount(7, $finder->files());
163 $level0Finder = $finder->depth(0);
164 $this->assertCount(3, $level0Finder);
165 $this->assertCount(1, $level0Finder->directories());
166 $this->assertCount(2, $level0Finder->files());
168 $greaterLevel0Finder = $finder->depth(
'> 0');
169 $this->assertCount(8, $greaterLevel0Finder);
170 $this->assertCount(3, $greaterLevel0Finder->directories());
171 $this->assertCount(5, $greaterLevel0Finder->files());
173 $greaterOrEqualLevel0Finder = $finder->depth(
'>= 0');
174 $this->assertCount(11, $greaterOrEqualLevel0Finder);
175 $this->assertCount(4, $greaterOrEqualLevel0Finder->directories());
176 $this->assertCount(7, $greaterOrEqualLevel0Finder->files());
178 $lowerOrEqualLevel1Finder = $finder->depth(
'<= 1');
179 $this->assertCount(7, $lowerOrEqualLevel1Finder);
180 $this->assertCount(3, $lowerOrEqualLevel1Finder->directories());
181 $this->assertCount(4, $lowerOrEqualLevel1Finder->files());
183 $lowerLevel2Finder = $finder->depth(
'< 2');
184 $this->assertCount(7, $lowerLevel2Finder);
185 $this->assertCount(3, $lowerLevel2Finder->directories());
186 $this->assertCount(4, $lowerLevel2Finder->files());
188 $exactlyLevel2Finder = $finder->depth(2);
189 $this->assertCount(4, $exactlyLevel2Finder);
190 $this->assertCount(1, $exactlyLevel2Finder->directories());
191 $this->assertCount(3, $exactlyLevel2Finder->files());
201 $finderWithExcludedDir = $finder->exclude([
'dir_1/dir_1_1']);
202 $this->assertCount(9, $finderWithExcludedDir);
203 $this->assertCount(3, $finderWithExcludedDir->directories());
204 $this->assertCount(6, $finderWithExcludedDir->files());
206 $finderWithMultipleExcludedDirs = $finder->exclude([
'dir_1/dir_1_1',
'dir_1/dir_1_2/dir_1_2_1']);
207 $this->assertCount(8, $finderWithMultipleExcludedDirs);
208 $this->assertCount(2, $finderWithMultipleExcludedDirs->directories());
209 $this->assertCount(6, $finderWithMultipleExcludedDirs->files());
217 $now = new \DateTimeImmutable(
'2019-03-30 13:00:00');
220 $fs->method(
'has')->willReturn(
true);
223 ->expects($this->atLeast(1))
224 ->method(
'getTimestamp')
226 return match (
$path) {
227 'file_1.txt' => $now,
228 'file_2.mp3' => $now->modify(
'+1 hour'),
229 'dir_1/file_3.log' => $now->modify(
'+2 hour'),
230 'dir_1/file_4.php' => $now->modify(
'+3 hour'),
231 'dir_1/dir_1_1/file_5.cpp' => $now->modify(
'+4 hour'),
232 'dir_1/dir_1_2/file_6.py' => $now->modify(
'+5 hour'),
233 'dir_1/dir_1_2/file_7.cpp' => $now->modify(
'+6 hour'),
234 default => new \DateTimeImmutable(
'now'),
238 $finder = (
new Finder($fs))->in([
'/']);
240 for ($i = 1; $i <= 7; $i++) {
241 $this->assertCount(8 - $i, $finder->date(
'>= 2019-03-30 1' . (2 + $i) .
':00')->files());
243 $this->assertCount(3, $finder->date(
'>= 2019-03-30 15:00 + 2hours')->files());
244 $this->assertCount(2, $finder->date(
'> 2019-03-30 15:00 + 2hours')->files());
245 $this->assertCount(1, $finder->date(
'2019-03-30 15:00 + 2hours')->files());
246 $this->assertCount(2, $finder->date(
'< 2019-03-30 15:00')->files());
247 $this->assertCount(3, $finder->date(
'<= 2019-03-30 15:00')->files());
248 $this->assertCount(2, $finder->date(
'<= 2019-03-30 15:00 - 1minute')->files());
259 $fs->method(
'has')->willReturn(
true);
261 $fs->expects($this->atLeast(1))
264 return match (
$path) {
265 'file_1.txt' =>
new DataSize(PHP_INT_MAX, DataSize::Byte),
266 'file_2.mp3' =>
new DataSize(1024, DataSize::Byte),
267 'dir_1/file_3.log' =>
new DataSize(1024 * 1024 * 1024, DataSize::Byte),
268 'dir_1/file_4.php' =>
new DataSize(1024 * 1024 * 127, DataSize::Byte),
269 'dir_1/dir_1_1/file_5.cpp' =>
new DataSize(1024 * 7, DataSize::Byte),
270 'dir_1/dir_1_2/file_6.py' =>
new DataSize(1024 * 100, DataSize::Byte),
271 'dir_1/dir_1_2/file_7.cpp' =>
new DataSize(1, DataSize::Byte),
272 default =>
new DataSize(0, DataSize::Byte),
276 $finder = (
new Finder($fs))->in([
'/']);
278 $this->assertCount(1, $finder->size(
'< 1Ki')->files());
279 $this->assertCount(2, $finder->size(
'<= 1Ki')->files());
280 $this->assertCount(6, $finder->size(
'>= 1Ki')->files());
281 $this->assertCount(5, $finder->size(
'> 1Ki')->files());
282 $this->assertCount(1, $finder->size(
'1Ki')->files());
284 $this->assertCount(3, $finder->size(
'> 1Mi')->files());
285 $this->assertCount(2, $finder->size(
'>= 1Gi')->files());
293 $finder = (
new Finder($fs))->in([
'/']);
295 $this->assertEquals(
'file_1.txt', $finder->files()->sortByTime()->getIterator()->current()->getPath());
297 'dir_1/dir_1_2/file_7.cpp',
298 $finder->files()->sortByTime()->reverseSorting()->getIterator()->current()->getPath()
301 $this->assertEquals(
'dir_1', $finder->sortByName()->getIterator()->current()->getPath());
302 $this->assertEquals(
'file_2.mp3', $finder->sortByName()->reverseSorting()->getIterator()->current()->getPath());
304 $this->assertEquals(
'dir_1', $finder->sortByType()->getIterator()->current()->getPath());
305 $this->assertEquals(
'file_2.mp3', $finder->sortByType()->reverseSorting()->getIterator()->current()->getPath());
308 if (
'dir_1/dir_1_1/file_5.cpp' === $left->getPath()) {
314 $this->assertEquals(
'dir_1/dir_1_1/file_5.cpp', $customSortFinder->getIterator()->current()->getPath());
315 $all = array_values(iterator_to_array($customSortFinder->reverseSorting()->getIterator()));
316 $last = $all[iterator_count($customSortFinder) - 1];
317 $this->assertEquals(
'dir_1/dir_1_1/file_5.cpp', $last->getPath());
getFlatFileSystemStructure()
testFinderWillFindFilesAndFoldersInFlatStructure()
testSortingWorksAsExpected(Filesystem\Filesystem $fs)
testFinderWillFilterFilesAndFoldersByCreationTimestamp
Interface Observer Contains several chained tasks and infos about them.
This class provides the data size with additional information to remove the work to calculate the siz...
getNestedFileSystemStructure()
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
testFinderWillFindNoFilesOrFoldersInAnEmptyDirectory()
testFinderWillFilterFilesAndFoldersByCreationTimestamp()
testFinderWillFindFilesAndFoldersInNestedStructure()
testFinderWillFindFilesAndFoldersForACertainDirectoryDepth()
testFinderWillFilterFilesBySize()
testFinderWillNotSearchInExcludedFolders()