ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
FinderTest.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
26 
31 class FinderTest extends TestCase
32 {
36  private function getFlatFileSystemStructure(): \PHPUnit\Framework\MockObject\MockObject
37  {
38  $fileSystem = $this->getMockBuilder(Filesystem\Filesystem::class)->getMock();
39 
40  $metadata = [
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),
44  ];
45 
46  $fileSystem
47  ->expects($this->atLeast(1))
48  ->method('listContents')
49  ->willReturnCallback(function ($path) use ($metadata) {
50  if ('/' === $path) {
51  return $metadata;
52  }
53 
54  return [];
55  });
56 
57  return $fileSystem;
58  }
59 
63  private function getNestedFileSystemStructure(): \PHPUnit\Framework\MockObject\MockObject
64  {
65  $fileSystem = $this->getMockBuilder(Filesystem\Filesystem::class)->getMock();
66 
67  $rootMetadata = [
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),
71  ];
72 
73  $level1Metadata = [
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),
78  ];
79 
80  $level11Metadata = [
81  new Filesystem\DTO\Metadata('dir_1/dir_1_1/file_5.cpp', MetadataType::FILE),
82  ];
83 
84  $level12Metadata = [
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),
88  ];
89 
90  $fileSystem
91  ->expects($this->atLeast(1))
92  ->method('listContents')
93  ->willReturnCallback(function ($path) use (
94  $rootMetadata,
95  $level1Metadata,
96  $level11Metadata,
97  $level12Metadata
98  ) {
99  if ('/' === $path) {
100  return $rootMetadata;
101  }
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;
108  }
109 
110  return [];
111  });
112 
113  return $fileSystem;
114  }
115 
120  {
121  $fileSystem = $this->getMockBuilder(Filesystem\Filesystem::class)->getMock();
122 
123  $fileSystem
124  ->method('listContents')
125  ->willReturn([]);
126 
127  $finder = (new Finder($fileSystem))->in(['/']);
128 
129  $this->assertEmpty(iterator_count($finder));
130  }
131 
136  {
137  $finder = (new Finder($this->getFlatFileSystemStructure()))->in(['/']);
138 
139  $this->assertCount(3, $finder);
140  $this->assertCount(1, $finder->directories());
141  $this->assertCount(2, $finder->files());
142  }
143 
148  {
149  $finder = (new Finder($this->getNestedFileSystemStructure()))->in(['/']);
150 
151  $this->assertCount(11, $finder);
152  $this->assertCount(4, $finder->directories());
153  $this->assertCount(7, $finder->files());
154  }
155 
160  {
161  $finder = (new Finder($this->getNestedFileSystemStructure()))->in(['/']);
162 
163  $level0Finder = $finder->depth(0);
164  $this->assertCount(3, $level0Finder);
165  $this->assertCount(1, $level0Finder->directories());
166  $this->assertCount(2, $level0Finder->files());
167 
168  $greaterLevel0Finder = $finder->depth('> 0');
169  $this->assertCount(8, $greaterLevel0Finder);
170  $this->assertCount(3, $greaterLevel0Finder->directories());
171  $this->assertCount(5, $greaterLevel0Finder->files());
172 
173  $greaterOrEqualLevel0Finder = $finder->depth('>= 0');
174  $this->assertCount(11, $greaterOrEqualLevel0Finder);
175  $this->assertCount(4, $greaterOrEqualLevel0Finder->directories());
176  $this->assertCount(7, $greaterOrEqualLevel0Finder->files());
177 
178  $lowerOrEqualLevel1Finder = $finder->depth('<= 1');
179  $this->assertCount(7, $lowerOrEqualLevel1Finder);
180  $this->assertCount(3, $lowerOrEqualLevel1Finder->directories());
181  $this->assertCount(4, $lowerOrEqualLevel1Finder->files());
182 
183  $lowerLevel2Finder = $finder->depth('< 2');
184  $this->assertCount(7, $lowerLevel2Finder);
185  $this->assertCount(3, $lowerLevel2Finder->directories());
186  $this->assertCount(4, $lowerLevel2Finder->files());
187 
188  $exactlyLevel2Finder = $finder->depth(2);
189  $this->assertCount(4, $exactlyLevel2Finder);
190  $this->assertCount(1, $exactlyLevel2Finder->directories());
191  $this->assertCount(3, $exactlyLevel2Finder->files());
192  }
193 
198  {
199  $finder = (new Finder($this->getNestedFileSystemStructure()))->in(['/']);
200 
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());
205 
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());
210  }
211 
216  {
217  $now = new \DateTimeImmutable('2019-03-30 13:00:00');
218 
219  $fs = $this->getNestedFileSystemStructure();
220  $fs->method('has')->willReturn(true);
221 
222  $fs
223  ->expects($this->atLeast(1))
224  ->method('getTimestamp')
225  ->willReturnCallback(function ($path) use ($now): \DateTimeImmutable {
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'),
235  };
236  });
237 
238  $finder = (new Finder($fs))->in(['/']);
239 
240  for ($i = 1; $i <= 7; $i++) {
241  $this->assertCount(8 - $i, $finder->date('>= 2019-03-30 1' . (2 + $i) . ':00')->files());
242  }
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());
249 
250  return $fs;
251  }
252 
256  public function testFinderWillFilterFilesBySize(): void
257  {
258  $fs = $this->getNestedFileSystemStructure();
259  $fs->method('has')->willReturn(true);
260 
261  $fs->expects($this->atLeast(1))
262  ->method('getSize')
263  ->willReturnCallback(function ($path): \ILIAS\Data\DataSize {
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),
273  };
274  });
275 
276  $finder = (new Finder($fs))->in(['/']);
277 
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());
283 
284  $this->assertCount(3, $finder->size('> 1Mi')->files());
285  $this->assertCount(2, $finder->size('>= 1Gi')->files());
286  }
287 
292  {
293  $finder = (new Finder($fs))->in(['/']);
294 
295  $this->assertEquals('file_1.txt', $finder->files()->sortByTime()->getIterator()->current()->getPath());
296  $this->assertEquals(
297  'dir_1/dir_1_2/file_7.cpp',
298  $finder->files()->sortByTime()->reverseSorting()->getIterator()->current()->getPath()
299  );
300 
301  $this->assertEquals('dir_1', $finder->sortByName()->getIterator()->current()->getPath());
302  $this->assertEquals('file_2.mp3', $finder->sortByName()->reverseSorting()->getIterator()->current()->getPath());
303 
304  $this->assertEquals('dir_1', $finder->sortByType()->getIterator()->current()->getPath());
305  $this->assertEquals('file_2.mp3', $finder->sortByType()->reverseSorting()->getIterator()->current()->getPath());
306 
307  $customSortFinder = $finder->sort(function (Filesystem\DTO\Metadata $left, Filesystem\DTO\Metadata $right): int {
308  if ('dir_1/dir_1_1/file_5.cpp' === $left->getPath()) {
309  return -1;
310  }
311 
312  return 1;
313  });
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());
318  }
319 }
getFlatFileSystemStructure()
Definition: FinderTest.php:36
testFinderWillFindFilesAndFoldersInFlatStructure()
Definition: FinderTest.php:135
testSortingWorksAsExpected(Filesystem\Filesystem $fs)
testFinderWillFilterFilesAndFoldersByCreationTimestamp
Definition: FinderTest.php:291
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...
Definition: DataSize.php:30
getNestedFileSystemStructure()
Definition: FinderTest.php:63
$path
Definition: ltiservices.php:30
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
testFinderWillFindNoFilesOrFoldersInAnEmptyDirectory()
Definition: FinderTest.php:119
testFinderWillFilterFilesAndFoldersByCreationTimestamp()
Definition: FinderTest.php:215
testFinderWillFindFilesAndFoldersInNestedStructure()
Definition: FinderTest.php:147
testFinderWillFindFilesAndFoldersForACertainDirectoryDepth()
Definition: FinderTest.php:159
testFinderWillFilterFilesBySize()
Definition: FinderTest.php:256
testFinderWillNotSearchInExcludedFolders()
Definition: FinderTest.php:197