diff options
author | Morris Jobke <hey@morrisjobke.de> | 2021-03-22 21:48:51 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-22 21:48:51 +0100 |
commit | 1c074e76028b65c4158097a35254fbf7ebe8749c (patch) | |
tree | cbfa973fdad69df0f06347673575b9481bab09de /tests | |
parent | 1eb084cfd37875adfe37301dcef7801634f7e28a (diff) | |
parent | b38618c8139a8017590ea59064184307a93f9808 (diff) | |
download | nextcloud-server-1c074e76028b65c4158097a35254fbf7ebe8749c.tar.gz nextcloud-server-1c074e76028b65c4158097a35254fbf7ebe8749c.zip |
Merge pull request #26198 from nextcloud/unified-search-node
Handle limit offset and sorting in files search
Diffstat (limited to 'tests')
-rw-r--r-- | tests/lib/Files/Node/FolderTest.php | 310 |
1 files changed, 202 insertions, 108 deletions
diff --git a/tests/lib/Files/Node/FolderTest.php b/tests/lib/Files/Node/FolderTest.php index 1ba052b8de4..1d541556c0b 100644 --- a/tests/lib/Files/Node/FolderTest.php +++ b/tests/lib/Files/Node/FolderTest.php @@ -14,13 +14,20 @@ use OC\Files\Config\CachedMountInfo; use OC\Files\FileInfo; use OC\Files\Mount\Manager; use OC\Files\Mount\MountPoint; +use OC\Files\Node\Folder; use OC\Files\Node\Node; use OC\Files\Node\Root; +use OC\Files\Search\SearchComparison; +use OC\Files\Search\SearchOrder; +use OC\Files\Search\SearchQuery; use OC\Files\Storage\Temporary; use OC\Files\Storage\Wrapper\Jail; use OC\Files\View; use OCP\Files\Mount\IMountPoint; use OCP\Files\NotFoundException; +use OCP\Files\Search\ISearchComparison; +use OCP\Files\Search\ISearchOrder; +use OCP\Files\Search\ISearchQuery; use OCP\Files\Storage; /** @@ -32,7 +39,7 @@ use OCP\Files\Storage; */ class FolderTest extends NodeTest { protected function createTestNode($root, $view, $path) { - return new \OC\Files\Node\Folder($root, $view, $path); + return new Folder($root, $view, $path); } protected function getNodeClass() { @@ -65,10 +72,10 @@ class FolderTest extends NodeTest { ->with('/bar/foo') ->willReturn([ new FileInfo('/bar/foo/asd', null, 'foo/asd', ['fileid' => 2, 'path' => '/bar/foo/asd', 'name' => 'asd', 'size' => 100, 'mtime' => 50, 'mimetype' => 'text/plain'], null), - new FileInfo('/bar/foo/qwerty', null, 'foo/qwerty', ['fileid' => 3, 'path' => '/bar/foo/qwerty', 'name' => 'qwerty', 'size' => 200, 'mtime' => 55, 'mimetype' => 'httpd/unix-directory'], null) + new FileInfo('/bar/foo/qwerty', null, 'foo/qwerty', ['fileid' => 3, 'path' => '/bar/foo/qwerty', 'name' => 'qwerty', 'size' => 200, 'mtime' => 55, 'mimetype' => 'httpd/unix-directory'], null), ]); - $node = new \OC\Files\Node\Folder($root, $view, '/bar/foo'); + $node = new Folder($root, $view, '/bar/foo'); $children = $node->getDirectoryListing(); $this->assertEquals(2, count($children)); $this->assertInstanceOf('\OC\Files\Node\File', $children[0]); @@ -96,7 +103,7 @@ class FolderTest extends NodeTest { ->method('get') ->with('/bar/foo/asd'); - $node = new \OC\Files\Node\Folder($root, $view, '/bar/foo'); + $node = new Folder($root, $view, '/bar/foo'); $node->get('asd'); } @@ -113,14 +120,14 @@ class FolderTest extends NodeTest { ->method('getUser') ->willReturn($this->user); - $child = new \OC\Files\Node\Folder($root, $view, '/bar/foo/asd'); + $child = new Folder($root, $view, '/bar/foo/asd'); $root->expects($this->once()) ->method('get') ->with('/bar/foo/asd') ->willReturn($child); - $node = new \OC\Files\Node\Folder($root, $view, '/bar/foo'); + $node = new Folder($root, $view, '/bar/foo'); $this->assertTrue($node->nodeExists('asd')); } @@ -142,7 +149,7 @@ class FolderTest extends NodeTest { ->with('/bar/foo/asd') ->will($this->throwException(new NotFoundException())); - $node = new \OC\Files\Node\Folder($root, $view, '/bar/foo'); + $node = new Folder($root, $view, '/bar/foo'); $this->assertFalse($node->nodeExists('asd')); } @@ -169,8 +176,8 @@ class FolderTest extends NodeTest { ->with('/bar/foo/asd') ->willReturn(true); - $node = new \OC\Files\Node\Folder($root, $view, '/bar/foo'); - $child = new \OC\Files\Node\Folder($root, $view, '/bar/foo/asd'); + $node = new Folder($root, $view, '/bar/foo'); + $child = new Folder($root, $view, '/bar/foo/asd'); $result = $node->newFolder('asd'); $this->assertEquals($child, $result); } @@ -196,7 +203,7 @@ class FolderTest extends NodeTest { ->with('/bar/foo') ->willReturn($this->getFileInfo(['permissions' => \OCP\Constants::PERMISSION_READ])); - $node = new \OC\Files\Node\Folder($root, $view, '/bar/foo'); + $node = new Folder($root, $view, '/bar/foo'); $node->newFolder('asd'); } @@ -223,7 +230,7 @@ class FolderTest extends NodeTest { ->with('/bar/foo/asd') ->willReturn(true); - $node = new \OC\Files\Node\Folder($root, $view, '/bar/foo'); + $node = new Folder($root, $view, '/bar/foo'); $child = new \OC\Files\Node\File($root, $view, '/bar/foo/asd'); $result = $node->newFile('asd'); $this->assertEquals($child, $result); @@ -250,7 +257,7 @@ class FolderTest extends NodeTest { ->with('/bar/foo') ->willReturn($this->getFileInfo(['permissions' => \OCP\Constants::PERMISSION_READ])); - $node = new \OC\Files\Node\Folder($root, $view, '/bar/foo'); + $node = new Folder($root, $view, '/bar/foo'); $node->newFile('asd'); } @@ -272,7 +279,7 @@ class FolderTest extends NodeTest { ->with('/bar/foo') ->willReturn(100); - $node = new \OC\Files\Node\Folder($root, $view, '/bar/foo'); + $node = new Folder($root, $view, '/bar/foo'); $this->assertEquals(100, $node->getFreeSpace()); } @@ -285,43 +292,35 @@ class FolderTest extends NodeTest { $root = $this->getMockBuilder(Root::class) ->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager]) ->getMock(); - $root->expects($this->any()) - ->method('getUser') + $root->method('getUser') ->willReturn($this->user); $storage = $this->createMock(Storage::class); $storage->method('getId')->willReturn(''); $cache = $this->getMockBuilder(Cache::class)->setConstructorArgs([$storage])->getMock(); - $storage->expects($this->once()) - ->method('getCache') + $storage->method('getCache') ->willReturn($cache); $mount = $this->createMock(IMountPoint::class); - $mount->expects($this->once()) - ->method('getStorage') + $mount->method('getStorage') ->willReturn($storage); - $mount->expects($this->once()) - ->method('getInternalPath') + $mount->method('getInternalPath') ->willReturn('foo'); - $cache->expects($this->once()) - ->method('search') - ->with('%qw%') + $cache->method('searchQuery') ->willReturn([ - ['fileid' => 3, 'path' => 'foo/qwerty', 'name' => 'qwerty', 'size' => 200, 'mtime' => 55, 'mimetype' => 'text/plain'] + new CacheEntry(['fileid' => 3, 'path' => 'foo/qwerty', 'name' => 'qwerty', 'size' => 200, 'mtime' => 55, 'mimetype' => 'text/plain']), ]); - $root->expects($this->once()) - ->method('getMountsIn') + $root->method('getMountsIn') ->with('/bar/foo') ->willReturn([]); - $root->expects($this->once()) - ->method('getMount') + $root->method('getMount') ->with('/bar/foo') ->willReturn($mount); - $node = new \OC\Files\Node\Folder($root, $view, '/bar/foo'); + $node = new Folder($root, $view, '/bar/foo'); $result = $node->search('qw'); $this->assertEquals(1, count($result)); $this->assertEquals('/bar/foo/qwerty', $result[0]->getPath()); @@ -346,32 +345,24 @@ class FolderTest extends NodeTest { $cache = $this->getMockBuilder(Cache::class)->setConstructorArgs([$storage])->getMock(); $mount = $this->createMock(IMountPoint::class); - $mount->expects($this->once()) - ->method('getStorage') + $mount->method('getStorage') ->willReturn($storage); - $mount->expects($this->once()) - ->method('getInternalPath') + $mount->method('getInternalPath') ->willReturn('files'); - $storage->expects($this->once()) - ->method('getCache') + $storage->method('getCache') ->willReturn($cache); - $cache->expects($this->once()) - ->method('search') - ->with('%qw%') + $cache->method('searchQuery') ->willReturn([ - ['fileid' => 3, 'path' => 'files/foo', 'name' => 'qwerty', 'size' => 200, 'mtime' => 55, 'mimetype' => 'text/plain'], - ['fileid' => 3, 'path' => 'files_trashbin/foo2.d12345', 'name' => 'foo2.d12345', 'size' => 200, 'mtime' => 55, 'mimetype' => 'text/plain'], + new CacheEntry(['fileid' => 3, 'path' => 'files/foo', 'name' => 'qwerty', 'size' => 200, 'mtime' => 55, 'mimetype' => 'text/plain']), ]); - $root->expects($this->once()) - ->method('getMountsIn') + $root->method('getMountsIn') ->with('') ->willReturn([]); - $root->expects($this->once()) - ->method('getMount') + $root->method('getMount') ->with('') ->willReturn($mount); @@ -389,43 +380,35 @@ class FolderTest extends NodeTest { $root = $this->getMockBuilder(Root::class) ->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager]) ->getMock(); - $root->expects($this->any()) - ->method('getUser') + $root->method('getUser') ->willReturn($this->user); $storage = $this->createMock(Storage::class); $storage->method('getId')->willReturn(''); $cache = $this->getMockBuilder(Cache::class)->setConstructorArgs([$storage])->getMock(); $mount = $this->createMock(IMountPoint::class); - $mount->expects($this->once()) - ->method('getStorage') + $mount->method('getStorage') ->willReturn($storage); - $mount->expects($this->once()) - ->method('getInternalPath') + $mount->method('getInternalPath') ->willReturn(''); - $storage->expects($this->once()) - ->method('getCache') + $storage->method('getCache') ->willReturn($cache); - $cache->expects($this->once()) - ->method('search') - ->with('%qw%') + $cache->method('searchQuery') ->willReturn([ - ['fileid' => 3, 'path' => 'foo/qwerty', 'name' => 'qwerty', 'size' => 200, 'mtime' => 55, 'mimetype' => 'text/plain'] + new CacheEntry(['fileid' => 3, 'path' => 'foo/qwerty', 'name' => 'qwerty', 'size' => 200, 'mtime' => 55, 'mimetype' => 'text/plain']), ]); - $root->expects($this->once()) - ->method('getMountsIn') + $root->method('getMountsIn') ->with('/bar') ->willReturn([]); - $root->expects($this->once()) - ->method('getMount') + $root->method('getMount') ->with('/bar') ->willReturn($mount); - $node = new \OC\Files\Node\Folder($root, $view, '/bar'); + $node = new Folder($root, $view, '/bar'); $result = $node->search('qw'); $this->assertEquals(1, count($result)); $this->assertEquals('/bar/foo/qwerty', $result[0]->getPath()); @@ -451,62 +434,50 @@ class FolderTest extends NodeTest { $subMount = $this->getMockBuilder(MountPoint::class)->setConstructorArgs([null, ''])->getMock(); $mount = $this->createMock(IMountPoint::class); - $mount->expects($this->once()) - ->method('getStorage') + $mount->method('getStorage') ->willReturn($storage); - $mount->expects($this->once()) - ->method('getInternalPath') + $mount->method('getInternalPath') ->willReturn('foo'); - $subMount->expects($this->once()) - ->method('getStorage') + $subMount->method('getStorage') ->willReturn($subStorage); - $subMount->expects($this->once()) - ->method('getMountPoint') + $subMount->method('getMountPoint') ->willReturn('/bar/foo/bar/'); - $storage->expects($this->once()) - ->method('getCache') + $storage->method('getCache') ->willReturn($cache); - $subStorage->expects($this->once()) - ->method('getCache') + $subStorage->method('getCache') ->willReturn($subCache); - $cache->expects($this->once()) - ->method('search') - ->with('%qw%') + $cache->method('searchQuery') ->willReturn([ - ['fileid' => 3, 'path' => 'foo/qwerty', 'name' => 'qwerty', 'size' => 200, 'mtime' => 55, 'mimetype' => 'text/plain'] + new CacheEntry(['fileid' => 3, 'path' => 'foo/qwerty', 'name' => 'qwerty', 'size' => 200, 'mtime' => 55, 'mimetype' => 'text/plain']), ]); - $subCache->expects($this->once()) - ->method('search') - ->with('%qw%') + $subCache->method('searchQuery') ->willReturn([ - ['fileid' => 4, 'path' => 'asd/qweasd', 'name' => 'qweasd', 'size' => 200, 'mtime' => 55, 'mimetype' => 'text/plain'] + new CacheEntry(['fileid' => 4, 'path' => 'asd/qweasd', 'name' => 'qweasd', 'size' => 200, 'mtime' => 55, 'mimetype' => 'text/plain']), ]); - $root->expects($this->once()) - ->method('getMountsIn') + $root->method('getMountsIn') ->with('/bar/foo') ->willReturn([$subMount]); - $root->expects($this->once()) - ->method('getMount') + $root->method('getMount') ->with('/bar/foo') ->willReturn($mount); - $node = new \OC\Files\Node\Folder($root, $view, '/bar/foo'); + $node = new Folder($root, $view, '/bar/foo'); $result = $node->search('qw'); $this->assertEquals(2, count($result)); } public function testIsSubNode() { $file = new Node(null, null, '/foo/bar'); - $folder = new \OC\Files\Node\Folder(null, null, '/foo'); + $folder = new Folder(null, null, '/foo'); $this->assertTrue($folder->isSubNode($file)); $this->assertFalse($folder->isSubNode($folder)); @@ -562,7 +533,7 @@ class FolderTest extends NodeTest { ->with('/bar/foo') ->willReturn($mount); - $node = new \OC\Files\Node\Folder($root, $view, '/bar/foo'); + $node = new Folder($root, $view, '/bar/foo'); $result = $node->getById(1); $this->assertEquals(1, count($result)); $this->assertEquals('/bar/foo/qwerty', $result[0]->getPath()); @@ -611,7 +582,7 @@ class FolderTest extends NodeTest { ->with('/bar') ->willReturn($mount); - $node = new \OC\Files\Node\Folder($root, $view, '/bar'); + $node = new Folder($root, $view, '/bar'); $result = $node->getById(1); $this->assertEquals(1, count($result)); $this->assertEquals('/bar', $result[0]->getPath()); @@ -665,7 +636,7 @@ class FolderTest extends NodeTest { ->with('/bar/foo') ->willReturn($mount); - $node = new \OC\Files\Node\Folder($root, $view, '/bar/foo'); + $node = new Folder($root, $view, '/bar/foo'); $result = $node->getById(1); $this->assertEquals(0, count($result)); } @@ -711,7 +682,7 @@ class FolderTest extends NodeTest { '/bar/foo/asd/', 1, '' - ) + ), ]); $storage->expects($this->any()) @@ -733,7 +704,7 @@ class FolderTest extends NodeTest { ->with('/bar/foo') ->willReturn($mount1); - $node = new \OC\Files\Node\Folder($root, $view, '/bar/foo'); + $node = new Folder($root, $view, '/bar/foo'); $result = $node->getById(1); $this->assertEquals(2, count($result)); $this->assertEquals('/bar/foo/qwerty', $result[0]->getPath()); @@ -745,7 +716,7 @@ class FolderTest extends NodeTest { // input, existing, expected ['foo', [], 'foo'], ['foo', ['foo'], 'foo (2)'], - ['foo', ['foo', 'foo (2)'], 'foo (3)'] + ['foo', ['foo', 'foo (2)'], 'foo (3)'], ]; } @@ -775,7 +746,7 @@ class FolderTest extends NodeTest { return false; }); - $node = new \OC\Files\Node\Folder($root, $view, $folderPath); + $node = new Folder($root, $view, $folderPath); $this->assertEquals($expected, $node->getNonExistingName($name)); } @@ -810,30 +781,30 @@ class FolderTest extends NodeTest { 'mtime' => $baseTime, 'mimetype' => 'text/plain', 'size' => 3, - 'permissions' => \OCP\Constants::PERMISSION_ALL + 'permissions' => \OCP\Constants::PERMISSION_ALL, ]); $id2 = $cache->put('bar/foo/old.txt', [ 'storage_mtime' => $baseTime - 100, 'mtime' => $baseTime - 100, 'mimetype' => 'text/plain', 'size' => 3, - 'permissions' => \OCP\Constants::PERMISSION_READ + 'permissions' => \OCP\Constants::PERMISSION_READ, ]); $cache->put('bar/asd/outside.txt', [ 'storage_mtime' => $baseTime, 'mtime' => $baseTime, 'mimetype' => 'text/plain', - 'size' => 3 + 'size' => 3, ]); $id3 = $cache->put('bar/foo/older.txt', [ 'storage_mtime' => $baseTime - 600, 'mtime' => $baseTime - 600, 'mimetype' => 'text/plain', 'size' => 3, - 'permissions' => \OCP\Constants::PERMISSION_ALL + 'permissions' => \OCP\Constants::PERMISSION_ALL, ]); - $node = new \OC\Files\Node\Folder($root, $view, $folderPath, $folderInfo); + $node = new Folder($root, $view, $folderPath, $folderInfo); $nodes = $node->getRecent(5); @@ -874,7 +845,7 @@ class FolderTest extends NodeTest { 'mtime' => $baseTime, 'mimetype' => \OCP\Files\FileInfo::MIMETYPE_FOLDER, 'size' => 3, - 'permissions' => 0 + 'permissions' => 0, ]); $id2 = $cache->put('bar/foo/folder/bar.txt', [ 'storage_mtime' => $baseTime, @@ -882,7 +853,7 @@ class FolderTest extends NodeTest { 'mimetype' => 'text/plain', 'size' => 3, 'parent' => $id1, - 'permissions' => \OCP\Constants::PERMISSION_ALL + 'permissions' => \OCP\Constants::PERMISSION_ALL, ]); $id3 = $cache->put('bar/foo/folder/asd.txt', [ 'storage_mtime' => $baseTime - 100, @@ -890,10 +861,10 @@ class FolderTest extends NodeTest { 'mimetype' => 'text/plain', 'size' => 3, 'parent' => $id1, - 'permissions' => \OCP\Constants::PERMISSION_ALL + 'permissions' => \OCP\Constants::PERMISSION_ALL, ]); - $node = new \OC\Files\Node\Folder($root, $view, $folderPath, $folderInfo); + $node = new Folder($root, $view, $folderPath, $folderInfo); $nodes = $node->getRecent(5); @@ -925,7 +896,7 @@ class FolderTest extends NodeTest { $storage = new Temporary(); $jail = new Jail([ 'storage' => $storage, - 'root' => 'folder' + 'root' => 'folder', ]); $mount = new MountPoint($jail, '/bar/foo'); @@ -940,16 +911,16 @@ class FolderTest extends NodeTest { 'mtime' => $baseTime, 'mimetype' => 'text/plain', 'size' => 3, - 'permissions' => \OCP\Constants::PERMISSION_ALL + 'permissions' => \OCP\Constants::PERMISSION_ALL, ]); $cache->put('outside.txt', [ 'storage_mtime' => $baseTime - 100, 'mtime' => $baseTime - 100, 'mimetype' => 'text/plain', - 'size' => 3 + 'size' => 3, ]); - $node = new \OC\Files\Node\Folder($root, $view, $folderPath, $folderInfo); + $node = new Folder($root, $view, $folderPath, $folderInfo); $nodes = $node->getRecent(5); $ids = array_map(function (Node $node) { @@ -957,4 +928,127 @@ class FolderTest extends NodeTest { }, $nodes); $this->assertEquals([$id1], $ids); } + + public function offsetLimitProvider() { + return [ + [0, 10, [10, 11, 12, 13, 14, 15, 16, 17], []], + [0, 5, [10, 11, 12, 13, 14], []], + [0, 2, [10, 11], []], + [3, 2, [13, 14], []], + [3, 5, [13, 14, 15, 16, 17], []], + [5, 2, [15, 16], []], + [6, 2, [16, 17], []], + [7, 2, [17], []], + [10, 2, [], []], + [0, 5, [16, 10, 14, 11, 12], [new SearchOrder(ISearchOrder::DIRECTION_ASCENDING, 'mtime')]], + [3, 2, [11, 12], [new SearchOrder(ISearchOrder::DIRECTION_ASCENDING, 'mtime')]], + [0, 5, [14, 15, 16, 10, 11], [ + new SearchOrder(ISearchOrder::DIRECTION_DESCENDING, 'size'), + new SearchOrder(ISearchOrder::DIRECTION_ASCENDING, 'mtime') + ]], + ]; + } + + /** + * @dataProvider offsetLimitProvider + * @param int $offset + * @param int $limit + * @param int[] $expectedIds + * @param ISearchOrder[] $ordering + * @throws NotFoundException + * @throws \OCP\Files\InvalidPathException + */ + public function testSearchSubStoragesLimitOffset(int $offset, int $limit, array $expectedIds, array $ordering) { + $manager = $this->createMock(Manager::class); + /** + * @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view + */ + $view = $this->createMock(View::class); + $root = $this->getMockBuilder(Root::class) + ->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager]) + ->getMock(); + $root->expects($this->any()) + ->method('getUser') + ->willReturn($this->user); + $storage = $this->createMock(Storage::class); + $storage->method('getId')->willReturn(''); + $cache = $this->getMockBuilder(Cache::class)->setConstructorArgs([$storage])->getMock(); + $subCache1 = $this->getMockBuilder(Cache::class)->setConstructorArgs([$storage])->getMock(); + $subStorage1 = $this->createMock(Storage::class); + $subMount1 = $this->getMockBuilder(MountPoint::class)->setConstructorArgs([null, ''])->getMock(); + $subCache2 = $this->getMockBuilder(Cache::class)->setConstructorArgs([$storage])->getMock(); + $subStorage2 = $this->createMock(Storage::class); + $subMount2 = $this->getMockBuilder(MountPoint::class)->setConstructorArgs([null, ''])->getMock(); + + $mount = $this->createMock(IMountPoint::class); + $mount->method('getStorage') + ->willReturn($storage); + $mount->method('getInternalPath') + ->willReturn('foo'); + + $subMount1->method('getStorage') + ->willReturn($subStorage1); + + $subMount1->method('getMountPoint') + ->willReturn('/bar/foo/bar/'); + + $storage->method('getCache') + ->willReturn($cache); + + $subStorage1->method('getCache') + ->willReturn($subCache1); + + $subMount2->method('getStorage') + ->willReturn($subStorage2); + + $subMount2->method('getMountPoint') + ->willReturn('/bar/foo/bar2/'); + + $subStorage2->method('getCache') + ->willReturn($subCache2); + + $cache->method('searchQuery') + ->willReturnCallback(function (ISearchQuery $query) { + return array_slice([ + new CacheEntry(['fileid' => 10, 'path' => 'foo/qwerty', 'name' => 'qwerty', 'size' => 200, 'mtime' => 10, 'mimetype' => 'text/plain']), + new CacheEntry(['fileid' => 11, 'path' => 'foo/qwerty', 'name' => 'qwerty', 'size' => 200, 'mtime' => 20, 'mimetype' => 'text/plain']), + new CacheEntry(['fileid' => 12, 'path' => 'foo/qwerty', 'name' => 'qwerty', 'size' => 200, 'mtime' => 30, 'mimetype' => 'text/plain']), + new CacheEntry(['fileid' => 13, 'path' => 'foo/qwerty', 'name' => 'qwerty', 'size' => 200, 'mtime' => 40, 'mimetype' => 'text/plain']), + ], $query->getOffset(), $query->getOffset() + $query->getLimit()); + }); + + $subCache1->method('searchQuery') + ->willReturnCallback(function (ISearchQuery $query) { + return array_slice([ + new CacheEntry(['fileid' => 14, 'path' => 'foo/qwerty', 'name' => 'qwerty', 'size' => 300, 'mtime' => 15, 'mimetype' => 'text/plain']), + new CacheEntry(['fileid' => 15, 'path' => 'foo/qwerty', 'name' => 'qwerty', 'size' => 300, 'mtime' => 50, 'mimetype' => 'text/plain']), + ], $query->getOffset(), $query->getOffset() + $query->getLimit()); + }); + + $subCache2->method('searchQuery') + ->willReturnCallback(function (ISearchQuery $query) { + return array_slice([ + new CacheEntry(['fileid' => 16, 'path' => 'foo/qwerty', 'name' => 'qwerty', 'size' => 200, 'mtime' => 5, 'mimetype' => 'text/plain']), + new CacheEntry(['fileid' => 17, 'path' => 'foo/qwerty', 'name' => 'qwerty', 'size' => 200, 'mtime' => 60, 'mimetype' => 'text/plain']), + ], $query->getOffset(), $query->getOffset() + $query->getLimit()); + }); + + $root->method('getMountsIn') + ->with('/bar/foo') + ->willReturn([$subMount1, $subMount2]); + + $root->method('getMount') + ->with('/bar/foo') + ->willReturn($mount); + + + $node = new Folder($root, $view, '/bar/foo'); + $comparison = new SearchComparison(ISearchComparison::COMPARE_LIKE, 'name', '%foo%'); + $query = new SearchQuery($comparison, $limit, $offset, $ordering); + $result = $node->search($query); + $ids = array_map(function (Node $info) { + return $info->getId(); + }, $result); + $this->assertEquals($expectedIds, $ids); + } } |