aboutsummaryrefslogtreecommitdiffstats
path: root/tests/Core/Command/Preview
diff options
context:
space:
mode:
Diffstat (limited to 'tests/Core/Command/Preview')
-rw-r--r--tests/Core/Command/Preview/CleanupTest.php175
-rw-r--r--tests/Core/Command/Preview/RepairTest.php32
2 files changed, 191 insertions, 16 deletions
diff --git a/tests/Core/Command/Preview/CleanupTest.php b/tests/Core/Command/Preview/CleanupTest.php
new file mode 100644
index 00000000000..e4a83246e5b
--- /dev/null
+++ b/tests/Core/Command/Preview/CleanupTest.php
@@ -0,0 +1,175 @@
+<?php
+
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace Core\Command\Preview;
+
+use OC\Core\Command\Preview\Cleanup;
+use OCP\Files\Folder;
+use OCP\Files\IRootFolder;
+use OCP\Files\NotFoundException;
+use OCP\Files\NotPermittedException;
+use PHPUnit\Framework\MockObject\MockObject;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Test\TestCase;
+
+class CleanupTest extends TestCase {
+ private IRootFolder&MockObject $rootFolder;
+ private LoggerInterface&MockObject $logger;
+ private InputInterface&MockObject $input;
+ private OutputInterface&MockObject $output;
+ private Cleanup $repair;
+
+ protected function setUp(): void {
+ parent::setUp();
+ $this->rootFolder = $this->createMock(IRootFolder::class);
+ $this->logger = $this->createMock(LoggerInterface::class);
+ $this->repair = new Cleanup(
+ $this->rootFolder,
+ $this->logger,
+ );
+
+ $this->input = $this->createMock(InputInterface::class);
+ $this->output = $this->createMock(OutputInterface::class);
+ }
+
+ public function testCleanup(): void {
+ $previewFolder = $this->createMock(Folder::class);
+ $previewFolder->expects($this->once())
+ ->method('isDeletable')
+ ->willReturn(true);
+
+ $previewFolder->expects($this->once())
+ ->method('delete');
+
+ $appDataFolder = $this->createMock(Folder::class);
+ $appDataFolder->expects($this->once())->method('get')->with('preview')->willReturn($previewFolder);
+ $appDataFolder->expects($this->once())->method('newFolder')->with('preview');
+
+ $this->rootFolder->expects($this->once())
+ ->method('getAppDataDirectoryName')
+ ->willReturn('appdata_some_id');
+
+ $this->rootFolder->expects($this->once())
+ ->method('get')
+ ->with('appdata_some_id')
+ ->willReturn($appDataFolder);
+
+ $this->output->expects($this->exactly(3))->method('writeln')
+ ->with(self::callback(function (string $message): bool {
+ static $i = 0;
+ return match (++$i) {
+ 1 => $message === 'Preview folder deleted',
+ 2 => $message === 'Preview folder recreated',
+ 3 => $message === 'Previews removed'
+ };
+ }));
+
+ $this->assertEquals(0, $this->repair->run($this->input, $this->output));
+ }
+
+ public function testCleanupWhenNotDeletable(): void {
+ $previewFolder = $this->createMock(Folder::class);
+ $previewFolder->expects($this->once())
+ ->method('isDeletable')
+ ->willReturn(false);
+
+ $previewFolder->expects($this->never())
+ ->method('delete');
+
+ $appDataFolder = $this->createMock(Folder::class);
+ $appDataFolder->expects($this->once())->method('get')->with('preview')->willReturn($previewFolder);
+ $appDataFolder->expects($this->never())->method('newFolder')->with('preview');
+
+ $this->rootFolder->expects($this->once())
+ ->method('getAppDataDirectoryName')
+ ->willReturn('appdata_some_id');
+
+ $this->rootFolder->expects($this->once())
+ ->method('get')
+ ->with('appdata_some_id')
+ ->willReturn($appDataFolder);
+
+ $this->logger->expects($this->once())->method('error')->with("Previews can't be removed: preview folder isn't deletable");
+ $this->output->expects($this->once())->method('writeln')->with("Previews can't be removed: preview folder isn't deletable");
+
+ $this->assertEquals(1, $this->repair->run($this->input, $this->output));
+ }
+
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataForTestCleanupWithDeleteException')]
+ public function testCleanupWithDeleteException(string $exceptionClass, string $errorMessage): void {
+ $previewFolder = $this->createMock(Folder::class);
+ $previewFolder->expects($this->once())
+ ->method('isDeletable')
+ ->willReturn(true);
+
+ $previewFolder->expects($this->once())
+ ->method('delete')
+ ->willThrowException(new $exceptionClass());
+
+ $appDataFolder = $this->createMock(Folder::class);
+ $appDataFolder->expects($this->once())->method('get')->with('preview')->willReturn($previewFolder);
+ $appDataFolder->expects($this->never())->method('newFolder')->with('preview');
+
+ $this->rootFolder->expects($this->once())
+ ->method('getAppDataDirectoryName')
+ ->willReturn('appdata_some_id');
+
+ $this->rootFolder->expects($this->once())
+ ->method('get')
+ ->with('appdata_some_id')
+ ->willReturn($appDataFolder);
+
+ $this->logger->expects($this->once())->method('error')->with($errorMessage);
+ $this->output->expects($this->once())->method('writeln')->with($errorMessage);
+
+ $this->assertEquals(1, $this->repair->run($this->input, $this->output));
+ }
+
+ public static function dataForTestCleanupWithDeleteException(): array {
+ return [
+ [NotFoundException::class, "Previews weren't deleted: preview folder was not found while deleting it"],
+ [NotPermittedException::class, "Previews weren't deleted: you don't have the permission to delete preview folder"],
+ ];
+ }
+
+ public function testCleanupWithCreateException(): void {
+ $previewFolder = $this->createMock(Folder::class);
+ $previewFolder->expects($this->once())
+ ->method('isDeletable')
+ ->willReturn(true);
+
+ $previewFolder->expects($this->once())
+ ->method('delete');
+
+ $appDataFolder = $this->createMock(Folder::class);
+ $appDataFolder->expects($this->once())->method('get')->with('preview')->willReturn($previewFolder);
+ $appDataFolder->expects($this->once())->method('newFolder')->with('preview')->willThrowException(new NotPermittedException());
+
+ $this->rootFolder->expects($this->once())
+ ->method('getAppDataDirectoryName')
+ ->willReturn('appdata_some_id');
+
+ $this->rootFolder->expects($this->once())
+ ->method('get')
+ ->with('appdata_some_id')
+ ->willReturn($appDataFolder);
+
+ $this->output->expects($this->exactly(2))->method('writeln')
+ ->with(self::callback(function (string $message): bool {
+ static $i = 0;
+ return match (++$i) {
+ 1 => $message === 'Preview folder deleted',
+ 2 => $message === "Preview folder was deleted, but you don't have the permission to create preview folder",
+ };
+ }));
+
+ $this->logger->expects($this->once())->method('error')->with("Preview folder was deleted, but you don't have the permission to create preview folder");
+
+ $this->assertEquals(1, $this->repair->run($this->input, $this->output));
+ }
+}
diff --git a/tests/Core/Command/Preview/RepairTest.php b/tests/Core/Command/Preview/RepairTest.php
index d235c0d0aea..9b9cde6dd95 100644
--- a/tests/Core/Command/Preview/RepairTest.php
+++ b/tests/Core/Command/Preview/RepairTest.php
@@ -1,5 +1,9 @@
<?php
+/**
+ * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
namespace Tests\Core\Command\Preview;
use bantu\IniGetWrapper\IniGetWrapper;
@@ -10,11 +14,12 @@ use OCP\Files\Node;
use OCP\IConfig;
use OCP\Lock\ILockingProvider;
use PHPUnit\Framework\MockObject\MockObject;
+use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Formatter\OutputFormatterInterface;
use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\OutputInterface;
use Test\TestCase;
-use Psr\Log\LoggerInterface;
class RepairTest extends TestCase {
/** @var IConfig|MockObject */
@@ -51,8 +56,7 @@ class RepairTest extends TestCase {
$this->iniGetWrapper,
$this->createMock(ILockingProvider::class)
);
- $this->input = $this->getMockBuilder(InputInterface::class)
- ->getMock();
+ $this->input = $this->createMock(InputInterface::class);
$this->input->expects($this->any())
->method('getOption')
->willReturnCallback(function ($parameter) {
@@ -61,16 +65,14 @@ class RepairTest extends TestCase {
}
return null;
});
- $this->output = $this->getMockBuilder(OutputInterface::class)
- ->setMethods(['section', 'writeln', 'write', 'setVerbosity', 'getVerbosity', 'isQuiet', 'isVerbose', 'isVeryVerbose', 'isDebug', 'setDecorated', 'isDecorated', 'setFormatter', 'getFormatter'])
+ $this->output = $this->getMockBuilder(ConsoleOutput::class)
+ ->onlyMethods(['section', 'writeln', 'getFormatter'])
->getMock();
$self = $this;
- $this->output->expects($this->any())
- ->method('section')
- ->willReturn($this->output);
/* We need format method to return a string */
$outputFormatter = $this->createMock(OutputFormatterInterface::class);
+ $outputFormatter->method('isDecorated')->willReturn(false);
$outputFormatter->method('format')->willReturnArgument(0);
$this->output->expects($this->any())
@@ -78,12 +80,12 @@ class RepairTest extends TestCase {
->willReturn($outputFormatter);
$this->output->expects($this->any())
->method('writeln')
- ->willReturnCallback(function ($line) use ($self) {
+ ->willReturnCallback(function ($line) use ($self): void {
$self->outputLines .= $line . "\n";
});
}
- public function emptyTestDataProvider() {
+ public static function dataEmptyTest(): array {
/** directoryNames, expectedOutput */
return [
[
@@ -109,10 +111,8 @@ class RepairTest extends TestCase {
];
}
- /**
- * @dataProvider emptyTestDataProvider
- */
- public function testEmptyExecute($directoryNames, $expectedOutput) {
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataEmptyTest')]
+ public function testEmptyExecute($directoryNames, $expectedOutput): void {
$previewFolder = $this->getMockBuilder(Folder::class)
->getMock();
$directories = array_map(function ($element) {
@@ -141,9 +141,9 @@ class RepairTest extends TestCase {
$previewFolder->expects($this->once())
->method('getDirectoryListing')
->willReturn($directories);
- $this->rootFolder->expects($this->at(0))
+ $this->rootFolder->expects($this->once())
->method('get')
- ->with("appdata_/preview")
+ ->with('appdata_/preview')
->willReturn($previewFolder);
$this->repair->run($this->input, $this->output);