aboutsummaryrefslogtreecommitdiffstats
path: root/tests/lib/DirectEditing/ManagerTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lib/DirectEditing/ManagerTest.php')
-rw-r--r--tests/lib/DirectEditing/ManagerTest.php315
1 files changed, 315 insertions, 0 deletions
diff --git a/tests/lib/DirectEditing/ManagerTest.php b/tests/lib/DirectEditing/ManagerTest.php
new file mode 100644
index 00000000000..2ad7f98df49
--- /dev/null
+++ b/tests/lib/DirectEditing/ManagerTest.php
@@ -0,0 +1,315 @@
+<?php
+
+/**
+ * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace Test\DirectEditing;
+
+use OC\DirectEditing\Manager;
+use OC\Files\Node\File;
+use OCP\AppFramework\Http\DataResponse;
+use OCP\AppFramework\Http\NotFoundResponse;
+use OCP\AppFramework\Http\Response;
+use OCP\DirectEditing\ACreateEmpty;
+use OCP\DirectEditing\IEditor;
+use OCP\DirectEditing\IToken;
+use OCP\Encryption\IManager;
+use OCP\Files\Folder;
+use OCP\Files\IRootFolder;
+use OCP\IDBConnection;
+use OCP\IL10N;
+use OCP\IUser;
+use OCP\IUserSession;
+use OCP\L10N\IFactory;
+use OCP\Security\ISecureRandom;
+use OCP\Server;
+use PHPUnit\Framework\MockObject\MockObject;
+use Test\TestCase;
+
+class CreateEmpty extends ACreateEmpty {
+ public function getId(): string {
+ return 'createEmpty';
+ }
+
+ public function getName(): string {
+ return 'create empty file';
+ }
+
+ public function getExtension(): string {
+ return '.txt';
+ }
+
+ public function getMimetype(): string {
+ return 'text/plain';
+ }
+}
+
+class Editor implements IEditor {
+ public function getId(): string {
+ return 'testeditor';
+ }
+
+ public function getName(): string {
+ return 'Test editor';
+ }
+
+ public function getMimetypes(): array {
+ return [ 'text/plain' ];
+ }
+
+
+ public function getMimetypesOptional(): array {
+ return [];
+ }
+
+ public function getCreators(): array {
+ return [
+ new CreateEmpty()
+ ];
+ }
+
+ public function isSecure(): bool {
+ return false;
+ }
+
+
+ public function open(IToken $token): Response {
+ return new DataResponse('edit page');
+ }
+}
+
+/**
+ * Class ManagerTest
+ *
+ * @package Test\DirectEditing
+ * @group DB
+ */
+class ManagerTest extends TestCase {
+ private $manager;
+ /**
+ * @var Editor
+ */
+ private $editor;
+ /**
+ * @var MockObject|ISecureRandom
+ */
+ private $random;
+ /**
+ * @var IDBConnection
+ */
+ private $connection;
+ /**
+ * @var MockObject|IUserSession
+ */
+ private $userSession;
+ /**
+ * @var MockObject|IRootFolder
+ */
+ private $rootFolder;
+ /**
+ * @var MockObject|Folder
+ */
+ private $userFolder;
+ /**
+ * @var MockObject|IL10N
+ */
+ private $l10n;
+ /**
+ * @var MockObject|IManager
+ */
+ private $encryptionManager;
+
+ protected function setUp(): void {
+ parent::setUp();
+
+ $this->editor = new Editor();
+
+ $this->random = $this->createMock(ISecureRandom::class);
+ $this->connection = Server::get(IDBConnection::class);
+ $this->userSession = $this->createMock(IUserSession::class);
+ $this->rootFolder = $this->createMock(IRootFolder::class);
+ $this->userFolder = $this->createMock(Folder::class);
+ $this->l10n = $this->createMock(IL10N::class);
+ $this->encryptionManager = $this->createMock(IManager::class);
+
+ $l10nFactory = $this->createMock(IFactory::class);
+ $l10nFactory->expects($this->once())
+ ->method('get')
+ ->willReturn($this->l10n);
+
+
+ $this->rootFolder->expects($this->any())
+ ->method('getUserFolder')
+ ->willReturn($this->userFolder);
+
+ $user = $this->createMock(IUser::class);
+ $user->expects(self::any())
+ ->method('getUID')
+ ->willReturn('admin');
+ $this->userSession->expects(self::any())
+ ->method('getUser')
+ ->willReturn($user);
+
+ $this->manager = new Manager(
+ $this->random, $this->connection, $this->userSession, $this->rootFolder, $l10nFactory, $this->encryptionManager
+ );
+
+ $this->manager->registerDirectEditor($this->editor);
+ }
+
+ public function testEditorRegistration(): void {
+ $this->assertEquals($this->manager->getEditors(), ['testeditor' => $this->editor]);
+ }
+
+
+ public function testCreateToken(): void {
+ $expectedToken = 'TOKEN' . time();
+ $file = $this->createMock(File::class);
+ $file->expects($this->any())
+ ->method('getId')
+ ->willReturn(123);
+ $this->random->expects($this->once())
+ ->method('generate')
+ ->willReturn($expectedToken);
+ $folder = $this->createMock(Folder::class);
+ $this->userFolder
+ ->method('nodeExists')
+ ->willReturnMap([
+ ['/File.txt', false],
+ ['/', true],
+ ]);
+ $this->userFolder
+ ->method('get')
+ ->with('/')
+ ->willReturn($folder);
+ $folder->expects($this->once())
+ ->method('newFile')
+ ->willReturn($file);
+ $token = $this->manager->create('/File.txt', 'testeditor', 'createEmpty');
+ $this->assertEquals($token, $expectedToken);
+ }
+
+ public function testCreateTokenAccess(): void {
+ $expectedToken = 'TOKEN' . time();
+ $file = $this->createMock(File::class);
+ $file->expects($this->any())
+ ->method('getId')
+ ->willReturn(123);
+ $this->random->expects($this->once())
+ ->method('generate')
+ ->willReturn($expectedToken);
+ $folder = $this->createMock(Folder::class);
+ $this->userFolder
+ ->method('nodeExists')
+ ->willReturnMap([
+ ['/File.txt', false],
+ ['/', true],
+ ]);
+ $this->userFolder
+ ->method('get')
+ ->with('/')
+ ->willReturn($folder);
+ $folder->expects($this->once())
+ ->method('newFile')
+ ->willReturn($file);
+ $this->manager->create('/File.txt', 'testeditor', 'createEmpty');
+ $firstResult = $this->manager->edit($expectedToken);
+ $secondResult = $this->manager->edit($expectedToken);
+ $this->assertInstanceOf(DataResponse::class, $firstResult);
+ $this->assertInstanceOf(NotFoundResponse::class, $secondResult);
+ }
+
+ public function testOpenByPath(): void {
+ $expectedToken = 'TOKEN' . time();
+ $file = $this->createMock(File::class);
+ $file->expects($this->any())
+ ->method('getId')
+ ->willReturn(123);
+ $file->expects($this->any())
+ ->method('getPath')
+ ->willReturn('/admin/files/File.txt');
+ $this->random->expects($this->once())
+ ->method('generate')
+ ->willReturn($expectedToken);
+ $this->userFolder
+ ->method('nodeExists')
+ ->willReturnMap([
+ ['/File.txt', false],
+ ['/', true],
+ ]);
+ $this->userFolder
+ ->method('get')
+ ->with('/File.txt')
+ ->willReturn($file);
+ $this->userFolder
+ ->method('getRelativePath')
+ ->willReturn('/File.txt');
+ $this->manager->open('/File.txt', 'testeditor');
+ $firstResult = $this->manager->edit($expectedToken);
+ $secondResult = $this->manager->edit($expectedToken);
+ $this->assertInstanceOf(DataResponse::class, $firstResult);
+ $this->assertInstanceOf(NotFoundResponse::class, $secondResult);
+ }
+
+ public function testOpenById(): void {
+ $expectedToken = 'TOKEN' . time();
+ $fileRead = $this->createMock(File::class);
+ $fileRead->method('getPermissions')
+ ->willReturn(1);
+ $fileRead->expects($this->any())
+ ->method('getId')
+ ->willReturn(123);
+ $fileRead->expects($this->any())
+ ->method('getPath')
+ ->willReturn('/admin/files/shared_file.txt');
+ $file = $this->createMock(File::class);
+ $file->method('getPermissions')
+ ->willReturn(1);
+ $file->expects($this->any())
+ ->method('getId')
+ ->willReturn(123);
+ $file->expects($this->any())
+ ->method('getPath')
+ ->willReturn('/admin/files/File.txt');
+ $this->random->expects($this->once())
+ ->method('generate')
+ ->willReturn($expectedToken);
+ $folder = $this->createMock(Folder::class);
+ $folder->expects($this->any())
+ ->method('getById')
+ ->willReturn([
+ $fileRead,
+ $file
+ ]);
+ $this->userFolder
+ ->method('nodeExists')
+ ->willReturnMap([
+ ['/File.txt', false],
+ ['/', true],
+ ]);
+ $this->userFolder
+ ->method('get')
+ ->with('/')
+ ->willReturn($folder);
+ $this->userFolder
+ ->method('getRelativePath')
+ ->willReturn('/File.txt');
+
+ $this->manager->open('/', 'testeditor', 123);
+ $firstResult = $this->manager->edit($expectedToken);
+ $secondResult = $this->manager->edit($expectedToken);
+ $this->assertInstanceOf(DataResponse::class, $firstResult);
+ $this->assertInstanceOf(NotFoundResponse::class, $secondResult);
+ }
+
+ public function testCreateFileAlreadyExists(): void {
+ $this->expectException(\RuntimeException::class);
+ $this->userFolder
+ ->method('nodeExists')
+ ->with('/File.txt')
+ ->willReturn(true);
+
+ $this->manager->create('/File.txt', 'testeditor', 'createEmpty');
+ }
+}