editor = new Editor(); $this->random = $this->createMock(ISecureRandom::class); $this->connection = \OC::$server->getDatabaseConnection(); $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') ->withConsecutive(['/File.txt'], ['/']) ->willReturnOnConsecutiveCalls(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') ->withConsecutive(['/File.txt'], ['/']) ->willReturnOnConsecutiveCalls(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); $folder = $this->createMock(Folder::class); $this->userFolder ->method('nodeExists') ->withConsecutive(['/File.txt'], ['/']) ->willReturnOnConsecutiveCalls(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') ->withConsecutive(['/File.txt'], ['/']) ->willReturnOnConsecutiveCalls(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'); } }