0
0
Fork 0
mirror of https://github.com/nextcloud/server.git synced 2025-01-31 06:43:12 +00:00
nextcloud_server/apps/files/tests/Command/DeleteOrphanedFilesTest.php
Côme Chilliet 1580c8612b
chore(apps): Apply new rector configuration to autouse classes
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2024-10-15 10:40:25 +02:00

136 lines
4.1 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files\Tests\Command;
use OC\Files\View;
use OCA\Files\Command\DeleteOrphanedFiles;
use OCP\Files\IRootFolder;
use OCP\Files\StorageNotAvailableException;
use OCP\IDBConnection;
use OCP\Server;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Test\TestCase;
/**
* Class DeleteOrphanedFilesTest
*
* @group DB
*
* @package OCA\Files\Tests\Command
*/
class DeleteOrphanedFilesTest extends TestCase {
private DeleteOrphanedFiles $command;
private IDBConnection $connection;
private string $user1;
protected function setUp(): void {
parent::setUp();
$this->connection = Server::get(IDBConnection::class);
$this->user1 = $this->getUniqueID('user1_');
$userManager = \OC::$server->getUserManager();
$userManager->createUser($this->user1, 'pass');
$this->command = new DeleteOrphanedFiles($this->connection);
}
protected function tearDown(): void {
$userManager = \OC::$server->getUserManager();
$user1 = $userManager->get($this->user1);
if ($user1) {
$user1->delete();
}
$this->logout();
parent::tearDown();
}
protected function getFile($fileId) {
$query = $this->connection->getQueryBuilder();
$query->select('*')
->from('filecache')
->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId)));
return $query->executeQuery()->fetchAll();
}
protected function getMounts($storageId) {
$query = $this->connection->getQueryBuilder();
$query->select('*')
->from('mounts')
->where($query->expr()->eq('storage_id', $query->createNamedParameter($storageId)));
return $query->executeQuery()->fetchAll();
}
/**
* Test clearing orphaned files
*/
public function testClearFiles(): void {
$input = $this->getMockBuilder(InputInterface::class)
->disableOriginalConstructor()
->getMock();
$output = $this->getMockBuilder(OutputInterface::class)
->disableOriginalConstructor()
->getMock();
$rootFolder = Server::get(IRootFolder::class);
// scan home storage so that mounts are properly setup
$rootFolder->getUserFolder($this->user1)->getStorage()->getScanner()->scan('');
$this->loginAsUser($this->user1);
$view = new View('/' . $this->user1 . '/');
$view->mkdir('files/test');
$fileInfo = $view->getFileInfo('files/test');
$storageId = $fileInfo->getStorage()->getId();
$numericStorageId = $fileInfo->getStorage()->getStorageCache()->getNumericId();
$this->assertCount(1, $this->getFile($fileInfo->getId()), 'Asserts that file is available');
$this->assertCount(1, $this->getMounts($numericStorageId), 'Asserts that mount is available');
$this->command->execute($input, $output);
$this->assertCount(1, $this->getFile($fileInfo->getId()), 'Asserts that file is still available');
$this->assertCount(1, $this->getMounts($numericStorageId), 'Asserts that mount is still available');
$deletedRows = $this->connection->executeUpdate('DELETE FROM `*PREFIX*storages` WHERE `id` = ?', [$storageId]);
$this->assertNotNull($deletedRows, 'Asserts that storage got deleted');
$this->assertSame(1, $deletedRows, 'Asserts that storage got deleted');
// parent folder, `files`, ´test` and `welcome.txt` => 4 elements
$output
->expects($this->exactly(3))
->method('writeln')
->withConsecutive(
['3 orphaned file cache entries deleted'],
['0 orphaned file cache extended entries deleted'],
['1 orphaned mount entries deleted'],
);
$this->command->execute($input, $output);
$this->assertCount(0, $this->getFile($fileInfo->getId()), 'Asserts that file gets cleaned up');
$this->assertCount(0, $this->getMounts($numericStorageId), 'Asserts that mount gets cleaned up');
// Rescan folder to add back to cache before deleting
$rootFolder->getUserFolder($this->user1)->getStorage()->getScanner()->scan('');
// since we deleted the storage it might throw a (valid) StorageNotAvailableException
try {
$view->unlink('files/test');
} catch (StorageNotAvailableException $e) {
}
}
}