From 2390a4852757d843c968f0f20d6a4021f2e38166 Mon Sep 17 00:00:00 2001 From: Sawjan Gurung Date: Tue, 22 Sep 2026 17:07:35 +0545 Subject: [PATCH] test: fix DirectDownloadService phpunit test (#1182) Signed-off-by: Saw-jan --- bootstrap.php | 24 +-- .../lib/Service/DirectDownloadServiceTest.php | 192 +++++++++++------- 2 files changed, 129 insertions(+), 87 deletions(-) diff --git a/bootstrap.php b/bootstrap.php index 91a08e38a..050e0e925 100644 --- a/bootstrap.php +++ b/bootstrap.php @@ -1,34 +1,32 @@ addPsr4("OCA\\OpenProject\\", __DIR__ . '/lib', true); -$classLoader->addPsr4("OCP\\", $serverPath . '/lib/public', true); -$classLoader->addPsr4("OC\\", $serverPath . '/lib/private', true); -$classLoader->addPsr4("OCA\\Files\\", $serverPath . '/apps/files/lib', true); +$classLoader->addPsr4("OCA\\OpenProject\\", $rootDir . '/lib', true); $classLoader->register(); - -set_include_path(get_include_path() . PATH_SEPARATOR . '/usr/share/php'); diff --git a/tests/lib/Service/DirectDownloadServiceTest.php b/tests/lib/Service/DirectDownloadServiceTest.php index e9d54e94a..03230532e 100644 --- a/tests/lib/Service/DirectDownloadServiceTest.php +++ b/tests/lib/Service/DirectDownloadServiceTest.php @@ -8,97 +8,141 @@ namespace OCA\OpenProject\Service; -use OC\User\Session; -use OCA\DAV\Controller\DirectController; -use OCA\OpenProject\AppInfo\Application; +use OC\Files\Node\File; +use OCP\DB\IResult; +use OCP\DB\QueryBuilder\IExpressionBuilder; +use OCP\DB\QueryBuilder\IParameter; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\Files\Folder; use OCP\Files\IRootFolder; -use OCP\IUserManager; +use OCP\Files\IUserFolder; +use OCP\IDBConnection; use PHPUnit\Framework\TestCase; class DirectDownloadServiceTest extends TestCase { private const USER_ID = 'test'; - private const USER_PASSWORD = 'T0T0T0T0T0T0T0'; - /** - * @var DirectDownloadService - */ - private $directDownloadService; - /** - * @var Folder - */ - private $userFolder; + /** - * @var DirectController + * @return mixed */ - private $directController; - - public static function setUpBeforeClass(): void { - $app = new Application(); - $c = $app->getContainer(); - - $userManager = $c->get(IUserManager::class); - $user = $userManager->get(self::USER_ID); - if ($user !== null) { - $user->delete(); + public function getFolderMock(): mixed { + if (interface_exists(IUserFolder::class)) { + return $this->createMock(IUserFolder::class); } - - // create dummy user - $userManager->createUser(self::USER_ID, self::USER_PASSWORD); - } - - protected function setUp(): void { - $app = new Application(); - $c = $app->getContainer(); - - $userManager = $c->get(IUserManager::class); - $user = $userManager->get(self::USER_ID); - $userSession = $c->get(Session::class); - $userSession->setUser($user); - - /** @var DirectDownloadService $directDownloadService */ - $directDownloadService = $c->get(DirectDownloadService::class); - $this->directDownloadService = $directDownloadService; - - /** @var IRootFolder $root */ - $root = $c->get(IRootFolder::class); - $this->userFolder = $root->getUserFolder(self::USER_ID); - - $this->directController = $c->get(DirectController::class); + return $this->createMock(Folder::class); } - public static function tearDownAfterClass(): void { - $app = new Application(); - $c = $app->getContainer(); - $userManager = $c->get(IUserManager::class); - $user = $userManager->get(self::USER_ID); - $user->delete(); + /** + * @param array $rows + * + * @return \Generator + */ + public function dbTableGenerator($rows = []) { + foreach ($rows as $row) { + yield $row; + } } - protected function tearDown(): void { + /** + * @return array + */ + public function directDownloadDataProvider(): array { + return [ + "existent file" => [[ + 'file_id' => 1, + 'expiration' => time() + 3600, + 'user_id' => self::USER_ID, + ]], + "non-existent file" => [[]], + ]; } /** + * @dataProvider directDownloadDataProvider + * * @return void - * @throws \OCP\AppFramework\OCS\OCSBadRequestException - * @throws \OCP\AppFramework\OCS\OCSNotFoundException - * @throws \OCP\Files\InvalidPathException - * @throws \OCP\Files\NotFoundException - * @throws \OCP\Files\NotPermittedException - * @throws \OCP\Lock\LockedException */ - public function testGetDirectDownloadFile() { - // create a file - $originalFile = $this->userFolder->newFile('example.txt', 'dummy content'); - - // create a direct download link and get its token - $response = $this->directController->getUrl($originalFile->getId()); - $directLinkUrl = $response->getData()['url']; - preg_match('/.*\/([^\/]*)$/', $directLinkUrl, $matches); - $directLinkToken = $matches[1]; - - // get the file with our custom service - $serviceFile = $this->directDownloadService->getDirectDownloadFile($directLinkToken); - $this->assertSame($originalFile->getId(), $serviceFile->getId()); - $this->assertSame($originalFile->getContent(), $serviceFile->getContent()); + public function testGetDirectDownloadFile($dbRows) { + $token = '1234abcd'; + + $qExpBuilder = $this->createMock(IExpressionBuilder::class); + $qExpBuilder + ->expects($this->once()) + ->method('eq') + ->with('token', $this->isInstanceOf(IParameter::class)); + + $tableGenerator = $this->dbTableGenerator([$dbRows]); + $resultMock = $this->createMock(IResult::class); + $resultMock + ->method('fetch') + ->willReturnCallback(function () use ($tableGenerator) { + $row = $tableGenerator->current(); + $tableGenerator->next(); + return $row; + }); + $resultMock + ->expects($this->once()) + ->method('closeCursor'); + + $queryBuilderMock = $this->createMock(IQueryBuilder::class); + $queryBuilderMock + ->expects($this->once()) + ->method('select') + ->with('id', 'user_id', 'file_id', 'token', 'expiration') + ->willReturnSelf(); + $queryBuilderMock + ->expects($this->once()) + ->method('from') + ->with('directlink') + ->willReturnSelf(); + $queryBuilderMock + ->expects($this->once()) + ->method('where') + ->willReturnSelf(); + $queryBuilderMock + ->expects($this->once()) + ->method('expr') + ->willReturn($qExpBuilder); + $queryBuilderMock + ->expects($this->once()) + ->method('createNamedParameter') + ->with($token, IQueryBuilder::PARAM_STR) + ->willReturn($this->createMock(IParameter::class)); + $queryBuilderMock + ->expects($this->once()) + ->method('executeQuery') + ->willReturn($resultMock); + $queryBuilderMock + ->expects($this->once()) + ->method('resetQueryParts'); + + $dbMock = $this->createMock(IDBConnection::class); + $dbMock->method('getQueryBuilder') + ->willReturn($queryBuilderMock); + + $fileMock = $this->createMock(File::class); + $folderMock = $this->getFolderMock(); + $folderMock + ->method('getById') + ->with(1) + ->willReturn([$fileMock]); + + $rootFolderMock = $this->createMock(IRootFolder::class); + $rootFolderMock + ->method('getUserFolder') + ->willReturn($folderMock); + + $directDownloadService = new DirectDownloadService( + $dbMock, + $rootFolderMock, + ); + + $result = $directDownloadService->getDirectDownloadFile($token); + + if (isset($dbRows) && !empty($dbRows)) { + $this->assertInstanceOf(File::class, $result); + } else { + $this->assertNull($result); + } } }