diff --git a/apps/dav/lib/Avatars/AvatarHome.php b/apps/dav/lib/Avatars/AvatarHome.php
index d3fb2b95f3..9e00fe2e8f 100644
--- a/apps/dav/lib/Avatars/AvatarHome.php
+++ b/apps/dav/lib/Avatars/AvatarHome.php
@@ -23,6 +23,7 @@
namespace OCA\DAV\Avatars;
+use OCP\IAvatarManager;
use Sabre\DAV\Exception\Forbidden;
use Sabre\DAV\Exception\MethodNotAllowed;
use Sabre\DAV\Exception\NotFound;
@@ -30,15 +31,20 @@ use Sabre\DAV\ICollection;
use Sabre\HTTP\URLUtil;
class AvatarHome implements ICollection {
+
+ /** @var array */
private $principalInfo;
+ /** @var IAvatarManager */
+ private $avatarManager;
/**
* AvatarHome constructor.
*
* @param array $principalInfo
*/
- public function __construct($principalInfo) {
+ public function __construct($principalInfo, IAvatarManager $avatarManager) {
$this->principalInfo = $principalInfo;
+ $this->avatarManager = $avatarManager;
}
function createFile($name, $data = null) {
@@ -59,8 +65,8 @@ class AvatarHome implements ICollection {
if ($size <= 0 || $size > 1024) {
throw new MethodNotAllowed('Invalid image size');
}
- $avatar = \OC::$server->getAvatarManager()->getAvatar($this->getName());
- if (!$avatar->exists()) {
+ $avatar = $this->avatarManager->getAvatar($this->getName());
+ if ($avatar === null || !$avatar->exists()) {
throw new NotFound();
}
return new AvatarNode($size, $ext, $avatar);
@@ -77,8 +83,14 @@ class AvatarHome implements ICollection {
}
function childExists($name) {
- $ret = $this->getChild($name);
- return !is_null($ret);
+ try {
+ $ret = $this->getChild($name);
+ return !is_null($ret);
+ } catch (NotFound $ex) {
+ return false;
+ } catch (MethodNotAllowed $ex) {
+ return false;
+ }
}
function delete() {
diff --git a/apps/dav/lib/Avatars/RootCollection.php b/apps/dav/lib/Avatars/RootCollection.php
index 8cad3d3721..8614d5d22b 100644
--- a/apps/dav/lib/Avatars/RootCollection.php
+++ b/apps/dav/lib/Avatars/RootCollection.php
@@ -15,10 +15,11 @@ class RootCollection extends AbstractPrincipalCollection {
* supplied by the authentication backend.
*
* @param array $principalInfo
- * @return IPrincipal
+ * @return AvatarHome
*/
function getChildForPrincipal(array $principalInfo) {
- return new AvatarHome($principalInfo);
+ $avatarManager = \OC::$server->getAvatarManager();
+ return new AvatarHome($principalInfo, $avatarManager);
}
function getName() {
diff --git a/apps/dav/tests/unit/Avatars/AvatarHomeTest.php b/apps/dav/tests/unit/Avatars/AvatarHomeTest.php
new file mode 100644
index 0000000000..ca8306e79a
--- /dev/null
+++ b/apps/dav/tests/unit/Avatars/AvatarHomeTest.php
@@ -0,0 +1,125 @@
+
+ *
+ * @copyright Copyright (c) 2017, ownCloud GmbH
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see
+ *
+ */
+
+
+namespace OCA\DAV\Tests\Unit\Avatars;
+
+
+use OCA\DAV\Avatars\AvatarHome;
+use OCA\DAV\Avatars\AvatarNode;
+use OCP\IAvatar;
+use OCP\IAvatarManager;
+use Sabre\DAV\Exception\MethodNotAllowed;
+use Sabre\DAV\Exception\NotFound;
+use Test\TestCase;
+
+class AvatarHomeTest extends TestCase {
+
+ /** @var AvatarHome */
+ private $home;
+
+ /** @var IAvatarManager | \PHPUnit_Framework_MockObject_MockObject */
+ private $avatarManager;
+
+ public function setUp() {
+ $this->avatarManager = $this->createMock(IAvatarManager::class);
+ $this->home = new AvatarHome(['uri' => 'principals/users/admin'], $this->avatarManager);
+ }
+
+ /**
+ * @expectedException \Sabre\DAV\Exception\Forbidden
+ * @dataProvider providesForbiddenMethods
+ */
+ public function testForbiddenMethods($method) {
+ $this->home->$method('');
+ }
+
+ public function providesForbiddenMethods() {
+ return [
+ ['createFile'],
+ ['createDirectory'],
+ ['delete'],
+ ['setName']
+ ];
+ }
+
+ public function testGetName() {
+ $n = $this->home->getName();
+ self::assertEquals('admin', $n);
+ }
+
+ public function providesTestGetChild() {
+ return [
+ [MethodNotAllowed::class, false, ''],
+ [MethodNotAllowed::class, false, 'bla.foo'],
+ [MethodNotAllowed::class, false, 'bla.png'],
+ [NotFound::class, false, '512.png'],
+ [null, true, '512.png'],
+ ];
+ }
+
+ /**
+ * @dataProvider providesTestGetChild
+ */
+ public function testGetChild($expectedException, $hasAvatar, $path) {
+ if ($expectedException !== null) {
+ $this->expectException($expectedException);
+ }
+ $avatar = null;
+ if ($hasAvatar) {
+ $avatar = $this->createMock(IAvatar::class);
+ $avatar->expects($this->once())->method('exists')->willReturn(true);
+ }
+ $this->avatarManager->expects($this->any())->method('getAvatar')->with('admin')->willReturn($avatar);
+ $avatarNode = $this->home->getChild($path);
+ $this->assertInstanceOf(AvatarNode::class, $avatarNode);
+ }
+
+ public function testGetChildren() {
+ $avatarNodes = $this->home->getChildren();
+ self::assertEquals(0, count($avatarNodes));
+
+ $avatar = $this->createMock(IAvatar::class);
+ $avatar->expects($this->once())->method('exists')->willReturn(true);
+ $this->avatarManager->expects($this->any())->method('getAvatar')->with('admin')->willReturn($avatar);
+ $avatarNodes = $this->home->getChildren();
+ self::assertEquals(1, count($avatarNodes));
+ }
+
+ /**
+ * @dataProvider providesTestGetChild
+ */
+ public function testChildExists($expectedException, $hasAvatar, $path) {
+ $avatar = null;
+ if ($hasAvatar) {
+ $avatar = $this->createMock(IAvatar::class);
+ $avatar->expects($this->once())->method('exists')->willReturn(true);
+ }
+ $this->avatarManager->expects($this->any())->method('getAvatar')->with('admin')->willReturn($avatar);
+ $childExists = $this->home->childExists($path);
+ $this->assertEquals($hasAvatar, $childExists);
+ }
+
+ public function testGetLastModified() {
+ self::assertNull($this->home->getLastModified());
+ }
+
+}
diff --git a/apps/dav/tests/unit/phpunit.xml b/apps/dav/tests/unit/phpunit.xml
index e483515ca7..3f0a9107aa 100644
--- a/apps/dav/tests/unit/phpunit.xml
+++ b/apps/dav/tests/unit/phpunit.xml
@@ -11,9 +11,9 @@
- ../../dav
+ ../../../dav
- ../../dav/tests
+ ../../../dav/tests