server = new \Sabre\DAV\Server(); $this->tree = $this->getMockBuilder(Tree::class) ->disableOriginalConstructor() ->getMock(); $userId = $this->getUniqueID('testcustompropertiesuser'); $this->user = $this->getMockBuilder(IUser::class) ->disableOriginalConstructor() ->getMock(); $this->user->expects($this->any()) ->method('getUID') ->willReturn($userId); $this->defaultCalendarValidator = $this->createMock(DefaultCalendarValidator::class); $this->plugin = new CustomPropertiesBackend( $this->server, $this->tree, \OC::$server->getDatabaseConnection(), $this->user, $this->defaultCalendarValidator, ); } protected function tearDown(): void { $connection = \OC::$server->getDatabaseConnection(); $deleteStatement = $connection->prepare( 'DELETE FROM `*PREFIX*properties`' . ' WHERE `userid` = ?' ); $deleteStatement->execute( [ $this->user->getUID(), ] ); $deleteStatement->closeCursor(); } private function createTestNode($class) { $node = $this->getMockBuilder($class) ->disableOriginalConstructor() ->getMock(); $node->expects($this->any()) ->method('getId') ->willReturn(123); $node->expects($this->any()) ->method('getPath') ->willReturn('/dummypath'); return $node; } private function applyDefaultProps($path = '/dummypath'): void { // properties to set $propPatch = new \Sabre\DAV\PropPatch([ 'customprop' => 'value1', 'customprop2' => 'value2', ]); $this->plugin->propPatch( $path, $propPatch ); $propPatch->commit(); $this->assertEmpty($propPatch->getRemainingMutations()); $result = $propPatch->getResult(); $this->assertEquals(200, $result['customprop']); $this->assertEquals(200, $result['customprop2']); } /** * Test that propFind on a missing file soft fails */ public function testPropFindMissingFileSoftFail(): void { $propFind = new \Sabre\DAV\PropFind( '/dummypath', [ 'customprop', 'customprop2', 'unsetprop', ], 0 ); $this->plugin->propFind( '/dummypath', $propFind ); $this->plugin->propFind( '/dummypath', $propFind ); // assert that the above didn't throw exceptions $this->assertTrue(true); } /** * Test setting/getting properties */ public function testSetGetPropertiesForFile(): void { $this->applyDefaultProps(); $propFind = new \Sabre\DAV\PropFind( '/dummypath', [ 'customprop', 'customprop2', 'unsetprop', ], 0 ); $this->plugin->propFind( '/dummypath', $propFind ); $this->assertEquals('value1', $propFind->get('customprop')); $this->assertEquals('value2', $propFind->get('customprop2')); $this->assertEquals(['unsetprop'], $propFind->get404Properties()); } /** * Test getting properties from directory */ public function testGetPropertiesForDirectory(): void { $this->applyDefaultProps('/dummypath'); $this->applyDefaultProps('/dummypath/test.txt'); $propNames = [ 'customprop', 'customprop2', 'unsetprop', ]; $propFindRoot = new \Sabre\DAV\PropFind( '/dummypath', $propNames, 1 ); $propFindSub = new \Sabre\DAV\PropFind( '/dummypath/test.txt', $propNames, 0 ); $this->plugin->propFind( '/dummypath', $propFindRoot ); $this->plugin->propFind( '/dummypath/test.txt', $propFindSub ); // TODO: find a way to assert that no additional SQL queries were // run while doing the second propFind $this->assertEquals('value1', $propFindRoot->get('customprop')); $this->assertEquals('value2', $propFindRoot->get('customprop2')); $this->assertEquals(['unsetprop'], $propFindRoot->get404Properties()); $this->assertEquals('value1', $propFindSub->get('customprop')); $this->assertEquals('value2', $propFindSub->get('customprop2')); $this->assertEquals(['unsetprop'], $propFindSub->get404Properties()); } /** * Test delete property */ public function testDeleteProperty(): void { $this->applyDefaultProps(); $propPatch = new \Sabre\DAV\PropPatch([ 'customprop' => null, ]); $this->plugin->propPatch( '/dummypath', $propPatch ); $propPatch->commit(); $this->assertEmpty($propPatch->getRemainingMutations()); $result = $propPatch->getResult(); $this->assertEquals(204, $result['customprop']); } }