You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nextcloud-server/apps/files_trashbin/tests/Command/ExpireTrashTest.php

157 lines
4.4 KiB

<?php
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files_Trashbin\Tests\Command;
use OCA\Files_Trashbin\Command\ExpireTrash;
use OCA\Files_Trashbin\Expiration;
use OCA\Files_Trashbin\Helper;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Files\IRootFolder;
use OCP\Files\Node;
use OCP\IConfig;
use OCP\IUser;
use OCP\IUserManager;
use OCP\Server;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Test\TestCase;
/**
* Class ExpireTrashTest
*
* @group DB
*
* @package OCA\Files_Trashbin\Tests\Command
*/
class ExpireTrashTest extends TestCase {
private Expiration $expiration;
private Node $userFolder;
private IConfig $config;
private IUserManager $userManager;
private IUser $user;
private ITimeFactory $timeFactory;
protected function setUp(): void {
parent::setUp();
$this->config = Server::get(IConfig::class);
$this->timeFactory = $this->createMock(ITimeFactory::class);
$this->expiration = Server::get(Expiration::class);
$this->invokePrivate($this->expiration, 'timeFactory', [$this->timeFactory]);
$userId = self::getUniqueID('user');
$this->userManager = Server::get(IUserManager::class);
$this->user = $this->userManager->createUser($userId, $userId);
$this->loginAsUser($userId);
$this->userFolder = Server::get(IRootFolder::class)->getUserFolder($userId);
}
protected function tearDown(): void {
$this->logout();
if (isset($this->user)) {
$this->user->delete();
}
$this->invokePrivate($this->expiration, 'timeFactory', [Server::get(ITimeFactory::class)]);
parent::tearDown();
}
/**
* @dataProvider retentionObligationProvider
*/
public function testRetentionObligation(string $obligation, string $quota, int $elapsed, int $fileSize, bool $shouldExpire): void {
$this->config->setSystemValues(['trashbin_retention_obligation' => $obligation]);
$this->expiration->setRetentionObligation($obligation);
$this->user->setQuota($quota);
$bytes = 'ABCDEFGHIKLMNOPQRSTUVWXYZ';
$file = 'foo.txt';
$this->userFolder->newFile($file, substr($bytes, 0, $fileSize));
$filemtime = $this->userFolder->get($file)->getMTime();
$this->timeFactory->expects($this->any())
->method('getTime')
->willReturn($filemtime + $elapsed);
$this->userFolder->get($file)->delete();
$this->userFolder->getStorage()
->getCache()
->put('files_trashbin', ['size' => $fileSize, 'unencrypted_size' => $fileSize]);
$userId = $this->user->getUID();
$trashFiles = Helper::getTrashFiles('/', $userId);
$this->assertEquals(1, count($trashFiles));
$outputInterface = $this->createMock(OutputInterface::class);
$inputInterface = $this->createMock(InputInterface::class);
$inputInterface->expects($this->any())
->method('getArgument')
->with('user_id')
->willReturn([$userId]);
$command = new ExpireTrash(
Server::get(LoggerInterface::class),
Server::get(IUserManager::class),
$this->expiration
);
$this->invokePrivate($command, 'execute', [$inputInterface, $outputInterface]);
$trashFiles = Helper::getTrashFiles('/', $userId);
$this->assertEquals($shouldExpire ? 0 : 1, count($trashFiles));
}
public static function retentionObligationProvider(): array {
$hour = 3600; // 60 * 60
$oneDay = 24 * $hour;
$fiveDays = 24 * 5 * $hour;
$tenDays = 24 * 10 * $hour;
$elevenDays = 24 * 11 * $hour;
return [
['disabled', '20 B', 0, 1, false],
['auto', '20 B', 0, 5, false],
['auto', '20 B', 0, 21, true],
['0, auto', '20 B', 0, 21, true],
['0, auto', '20 B', $oneDay, 5, false],
['0, auto', '20 B', $oneDay, 19, true],
['0, auto', '20 B', 0, 19, true],
['auto, 0', '20 B', $oneDay, 19, true],
['auto, 0', '20 B', $oneDay, 21, true],
['auto, 0', '20 B', 0, 5, false],
['auto, 0', '20 B', 0, 19, true],
['1, auto', '20 B', 0, 5, false],
['1, auto', '20 B', $fiveDays, 5, false],
['1, auto', '20 B', $fiveDays, 21, true],
['auto, 1', '20 B', 0, 21, true],
['auto, 1', '20 B', 0, 5, false],
['auto, 1', '20 B', $fiveDays, 5, true],
['auto, 1', '20 B', $oneDay, 5, false],
['2, 10', '20 B', $fiveDays, 5, false],
['2, 10', '20 B', $fiveDays, 20, true],
['2, 10', '20 B', $elevenDays, 5, true],
['10, 2', '20 B', $fiveDays, 5, false],
['10, 2', '20 B', $fiveDays, 21, false],
['10, 2', '20 B', $tenDays, 5, false],
['10, 2', '20 B', $elevenDays, 5, true]
];
}
}