nextcloud-gallery/tests/unit/Service/SearchMediaServiceTest.php

567 lines
14 KiB
PHP

<?php
/**
* Nextcloud - Gallery
*
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Olivier Paroz <galleryapps@oparoz.com>
*
* @copyright Olivier Paroz 2017
*/
namespace OCA\Gallery\Tests\Service;
use OCP\Files\Folder;
use OCA\Gallery\Service\SearchMediaService;
/**
* Class SearchMediaServiceTest
*
* @package OCA\Gallery\Tests\Service
*/
class SearchMediaServiceTest extends \OCA\Gallery\Tests\GalleryUnitTest {
/** @var SearchMediaService */
protected $service;
/**
* Test set up
*/
public function setUp() {
parent::setUp();
$this->service = new SearchMediaService (
$this->appName,
$this->environment,
$this->logger
);
}
public function testIsPreviewAvailable() {
$file = $this->mockBadFile();
$result = self::invokePrivate($this->service, 'isPreviewAvailable', [$file]);
$this->assertFalse($result);
}
public function providesTopFolderData() {
$isReadable = true;
$mounted = false;
$mount = null;
$query = '.nomedia';
$queryResult = false;
$folder1 = $this->mockFolder(
'home::user', 545454,
[
$this->mockJpgFile(11111),
$this->mockJpgFile(22222),
$this->mockJpgFile(33333)
],
$isReadable, $mounted, $mount, $query, $queryResult
);
$folder2 = $this->mockFolder(
'home::user', 767676,
[
$this->mockJpgFile(44444),
$this->mockJpgFile(55555),
$this->mockJpgFile(66666)
],
$isReadable, $mounted, $mount, $query, $queryResult
);
$folder33 = $this->mockFolder(
'home::user', 545454,
[
$this->mockJpgFile(11111),
$this->mockJpgFile(22222),
$this->mockJpgFile(33333)
],
$isReadable, $mounted, $mount, $query, $queryResult
);
$folder3 = $this->mockFolder(
'home::user', 101010, [$folder33], $isReadable, $mounted, $mount, $query, $queryResult
);
$folder33b = $this->mockFolder(
'home::user', 545454,
[
$this->mockJpgFile(11111),
$this->mockJpgFile(22222),
$this->mockJpgFile(33333)
],
$isReadable, $mounted, $mount, $query, $queryResult
);
$folder3b = $this->mockFolder(
'home::user', 101010, [$folder33b], $isReadable, $mounted, $mount, $query, $queryResult
);
$folder44 = $this->mockFolder(
'home::user', 545454,
[
$this->mockJpgFile(11111),
$this->mockJpgFile(22222),
$this->mockJpgFile(33333)
],
$isReadable, $mounted, $mount, $query, $queryResult
);
$folder45 = $this->mockFolder(
'home::user', 767676,
[
$this->mockJpgFile(44444),
$this->mockJpgFile(55555),
$this->mockJpgFile(66666)
],
$isReadable, $mounted, $mount, $query, $queryResult
);
$folder4 = $this->mockFolder(
'home::user', 101010,
[
$folder44,
$folder45
],
$isReadable, $mounted, $mount, $query,
$queryResult
);
$folder5 = $this->mockFolder(
'home::user', 987234,
[
$this->mockJpgFile(998877),
$this->mockJpgFile(998876),
$this->mockNoMediaFile(998875)
],
$isReadable, $mounted, $mount, '.nomedia', true
);
$folder6 = $this->mockFolder(
'webdav::user@domain.com/dav', 545454, [$this->mockJpgFile(11111)], $isReadable, true,
$mount, $query, $queryResult
);
$folder7 = $this->mockFolder(
'home::user', 545454,
[
$this->mockJpgFile(1),
$this->mockJpgFile(2),
$this->mockJpgFile(3),
$this->mockJpgFile(4),
$this->mockJpgFile(5),
],
$isReadable, $mounted, $mount, $query, $queryResult
);
// 2 folders and 3 files, everything is reachable
$config1 = [
$folder1,
$folder2,
$this->mockJpgFile(77777),
$this->mockJpgFile(88888),
$this->mockJpgFile(99999)
];
$folder1Path = 'holidays';
$folder2Path = 'athletics';
$topFolder1 = $this->mockFolder(
'home::user', 909090, $config1, $isReadable, $mounted, $mount, $query, $queryResult
);
$map1 = [
[$topFolder1, ''],
[$folder1, $folder1Path],
[$folder2, $folder2Path],
];
// 2 deepfolder and 3 files. Should return all the files
$config2 = [
$folder3,
$folder3b,
$this->mockJpgFile(77777),
$this->mockJpgFile(88888),
$this->mockJpgFile(99999)
];
$folder3Path = 'ninja';
$folder3bPath = 'racing';
$folder33Path = 'ninja/mma';
$folder33bPath = 'racing/f1';
$topFolder2 = $this->mockFolder(
'home::user', 909090, $config2, $isReadable, $mounted, $mount, $query, $queryResult
);
$map2 = [
[$topFolder2, ''],
[$folder3, $folder3Path],
[$folder3b, $folder3bPath],
[$folder33, $folder33Path],
[$folder33b, $folder33bPath],
];
// 1 deepfolder (with 2 sub-folders) and 3 files. Should return the files and the content of
// 1 folder because we stop looking after we've found at least 1 picture in a sub-sub-folder
$config3 = [
$folder4,
$this->mockJpgFile(77777),
$this->mockJpgFile(88888),
$this->mockJpgFile(99999)
];
$folder4Path = 'trips';
$folder44Path = 'trips/NSA';
$folder45Path = 'trips/GCHQ';
$topFolder3 = $this->mockFolder(
'home::user', 909090, $config3, $isReadable, $mounted, $mount, $query, $queryResult
);
$map3 = [
[$topFolder3, ''],
[$folder4, $folder4Path],
[$folder44, $folder44Path],
[$folder45, $folder45Path],
];
// 1 blacklisted folder and 3 files
$config4 = [
$folder5,
$this->mockJpgFile(77777),
$this->mockJpgFile(88888),
$this->mockJpgFile(99999)
];
$folder5Path = 'food';
$topFolder4 = $this->mockFolder(
'home::user', 909090, $config4, $isReadable, $mounted, $mount, $query, $queryResult
);
$map4 = [
[$topFolder4, ''],
[$folder5, $folder5Path],
];
// 1 standard folder, 1 external share (ignored) and 3 files
$folder1a = $this->mockFolder(
'home::user', 545454,
[
$this->mockJpgFile(11111),
$this->mockJpgFile(22222),
$this->mockJpgFile(33333)
],
$isReadable, $mounted, $mount, $query, $queryResult
);
$config5 = [
$folder1a,
$folder6,
$this->mockJpgFile(77777),
$this->mockJpgFile(88888),
$this->mockJpgFile(99999)
];
$folder6Path = 'pets';
$topFolder5 = $this->mockFolder(
'home::user', 909090, $config5, $isReadable, $mounted, $mount, $query, $queryResult
);
$map5 = [
[$topFolder5, ''],
[$folder1a, $folder1Path],
[$folder6, $folder6Path],
];
// 1 standard folder (3), 1 deep folder and 3 files
$folder1b = $this->mockFolder(
'home::user', 545454,
[
$this->mockJpgFile(11111),
$this->mockJpgFile(22222),
$this->mockJpgFile(33333)
],
$isReadable, $mounted, $mount, $query, $queryResult
);
$config6 = [
$folder1b,
$folder7,
$this->mockJpgFile(77777),
$this->mockJpgFile(88888),
$this->mockJpgFile(99999)
];
$folder7Path = 'missions';
$topFolder6 = $this->mockFolder(
'home::user', 909090, $config6, $isReadable, $mounted, $mount, $query, $queryResult
);
$map6 = [
[$topFolder6, ''],
[$folder1b, $folder1Path],
[$folder7, $folder7Path],
];
return [
[$topFolder1, $map1, 9, 3],
[$topFolder2, $map2, 9, 5],
[$topFolder3, $map3, 6, 3],
[$topFolder4, $map4, 3, 1],
[$topFolder5, $map5, 6, 2],
[$topFolder6, $map6, 10, 3]
];
}
/**
* @dataProvider providesTopFolderData
*
* @param Folder $topFolder
* @param array $map
* @param int $images
* @param int $albums
*
* @internal param int $result
*/
public function testGetMediaFiles($topFolder, $map, $images, $albums) {
$supportedMediaTypes = [
'image/png',
'image/jpeg',
'image/gif'
];
$features = [];
$this->mockNodePath($map);
$response = $this->service->getMediaFiles($topFolder, $supportedMediaTypes, $features);
$this->assertSame($images, sizeof($response[0]));
$this->assertSame($albums, sizeof($response[1]));
}
public function providesFolderWithFilesData() {
$isReadable = true;
$mounted = false;
$mount = null;
$query = '.nomedia';
$queryResult = false;
// The order doesn't matter, but it's easier to compare
// if that matches the order in FileService::getNodeData
$topFolder1Data = [
'path' => '',
'nodeid' => 12121,
'mtime' => null,
'etag' => "5d739f2c156c38b8db8c48603c11cd6c",
'size' => 88888,
'sharedwithuser' => false,
'owner' => [],
'permissions' => 31,
'freespace' => 7777777,
];
$topFolder2Data = $topFolder1Data;
$file1Data = [
'path' => 'rootfile.jpg',
'nodeid' => 11111,
'mtime' => null,
'etag' => "8603c11cd6c5d739f2c156c38b8db8c4",
'size' => 1024,
'sharedwithuser' => false,
'owner' => [],
'permissions' => 31,
'mimetype' => 'image/jpeg',
];
$file1 = $this->mockJpgFile(
$file1Data['nodeid'], 'home::user', $isReadable, $file1Data['path'],
$file1Data['etag'], $file1Data['size'], $file1Data['sharedwithuser'], null,
$file1Data['permissions']
);
$file1a = $this->mockJpgFile(
$file1Data['nodeid'], 'home::user', $isReadable, $file1Data['path'],
$file1Data['etag'], $file1Data['size'], $file1Data['sharedwithuser'], null,
$file1Data['permissions']
);
$ownerUid = 909090;
$ownerName = 'San Akinamoura';
$owner = $this->mockOwner($ownerUid, $ownerName);
$file2Data = [
'path' => 'holidays/everest.jpg',
'nodeid' => 22222,
'mtime' => null,
'etag' => "739f2c156c38b88603c11cd6c5ddb8c4",
'size' => 102410241024,
'sharedwithuser' => true,
'owner' => [
'uid' => $ownerUid,
'displayname' => $ownerName
],
'permissions' => 31,
'mimetype' => 'image/jpeg',
];
$file2 = $this->mockJpgFile(
$file2Data['nodeid'], 'webdav::user@domain.com/dav', $isReadable, $file2Data['path'],
$file2Data['etag'], $file2Data['size'], $file2Data['sharedwithuser'], $owner,
$file2Data['permissions']
);
$album1Data = [
'path' => 'holidays',
'nodeid' => 454545,
'mtime' => null,
'etag' => "56c38b8db8c486035d739f2c1c11cd6c",
'size' => 33333,
'sharedwithuser' => false,
'owner' => [],
'permissions' => 11,
'freespace' => 576576576576,
];
$album1 = $this->mockFolder(
'home::user',
$album1Data['nodeid'], [
$file2
],
$isReadable, $mounted, $mount, $query, $queryResult, $album1Data['sharedwithuser'],
$album1Data['etag'], $album1Data['size'], $album1Data['path'], null,
$album1Data['permissions'], $album1Data['freespace']
);
$topFolder1 = $this->mockFolder(
'home::user',
$topFolder1Data['nodeid'],
[
$file1,
$album1
],
$isReadable, $mounted, $mount, $query, $queryResult, $topFolder1Data['sharedwithuser'],
$topFolder1Data['etag'], $topFolder1Data['size'], $topFolder1Data['path'], null,
$topFolder1Data['permissions'], $topFolder1Data['freespace']
);
$albumIgnored = $this->mockFolder(
'home::user',
$album1Data['nodeid'], [
$file2
],
$isReadable, $mounted, $mount, '.nomedia', true, $album1Data['sharedwithuser'],
$album1Data['etag'], $album1Data['size'], $album1Data['path'], null,
$album1Data['permissions'], $album1Data['freespace']
);
$topFolder2 = $this->mockFolder(
'home::user',
$topFolder1Data['nodeid'],
[
$file1a,
$albumIgnored
],
$isReadable, $mounted, $mount, $query, $queryResult, $topFolder1Data['sharedwithuser'],
$topFolder1Data['etag'], $topFolder1Data['size'], $topFolder1Data['path'], null,
$topFolder1Data['permissions'], $topFolder1Data['freespace']
);
$map1 = [
[$topFolder1, $topFolder1Data['path']],
[$file1, $file1Data['path']],
[$file2, $file2Data['path']],
[$album1, $album1Data['path']],
];
$map2 = [
[$file1a, $file1Data['path']],
[$topFolder2, $topFolder2Data['path']],
];
return [
[
$topFolder1,
$map1, [
[
$file1Data,
$file2Data
],
[
$topFolder1Data['path'] => $topFolder1Data,
$album1Data['path'] => $album1Data,
]
]
],
[
$topFolder2,
$map2, [
[$file1Data],
[$topFolder2Data['path'] => $topFolder2Data,]
]
]
];
}
/**
* @dataProvider providesFolderWithFilesData
*
* @param Folder $topFolder
* @param array $map
* @param array $result
*/
public function testPropertiesOfGetMediaFiles($topFolder, $map, $result) {
$supportedMediaTypes = [
'image/png',
'image/jpeg',
'image/gif'
];
$features = [];
$this->mockNodePath($map);
$response = $this->service->getMediaFiles($topFolder, $supportedMediaTypes, $features);
$this->assertSame($result, $response);
}
public function testGetFile() {
$fileId = 99999;
$storageId = 'home::user';
$file = $this->mockJpgFile($fileId, $storageId);
$this->mockGetResourceFromId($fileId, $file);
$response = $this->service->getFile($fileId);
$this->assertSame($file, $response);
}
/**
* @expectedException \OCA\Gallery\Service\NotFoundServiceException
*/
public function testGetFileWithBadMediaType() {
$fileId = 99999;
$storageId = 'home::user';
$file = $this->mockFile($fileId, $storageId);
$this->mockGetResourceFromId($fileId, $file);
$this->service->getFile($fileId);
}
/**
* @expectedException \OCA\Gallery\Service\NotFoundServiceException
*/
public function testGetFileWithFolderId() {
$fileId = 99999;
$storageId = 'home::user';
$file = $this->mockJpgFile($fileId, $storageId);
$folder = $this->mockFolder($storageId, $fileId, [$file]);
$this->mockGetResourceFromId($fileId, $folder);
$this->service->getFile($fileId);
}
/**
* @param int $uid
* @param string $displayName
*
* @return mixed|object|\PHPUnit_Framework_MockObject_MockObject
*/
private function mockOwner($uid, $displayName) {
$owner = $this->getMockBuilder('OCP\IUser')
->disableOriginalConstructor()
->getMock();
$owner->method('getUID')
->willReturn($uid);
$owner->method('getDisplayName')
->willReturn($displayName);
return $owner;
}
/**
* Mocks Environment->getPathFromVirtualRoot
*
* This is needed for files and albums to find the path to the root and is required to build
* the hierarchy of folders
*
* @param $map
*/
private function mockNodePath($map) {
$this->environment->method('getPathFromVirtualRoot')
->will(
$this->returnValueMap($map)
);
}
}