summaryrefslogtreecommitdiffstats
path: root/tests/core
diff options
context:
space:
mode:
authorRoeland Jago Douma <roeland@famdouma.nl>2015-03-03 12:52:27 +0100
committerRoeland Jago Douma <roeland@famdouma.nl>2015-03-11 16:37:42 +0100
commit1a0f9c375be12502d9b016c6bdb4c898ec765bbd (patch)
tree6b287f2d71e94740b364d17a5f23424d5f6668aa /tests/core
parentcfaee93552b519b8e017e63fd5a82b1e5c9f951b (diff)
downloadnextcloud-server-1a0f9c375be12502d9b016c6bdb4c898ec765bbd.tar.gz
nextcloud-server-1a0f9c375be12502d9b016c6bdb4c898ec765bbd.zip
Avatar controller moved to AppFrameWork
* Original avatarcontroller migrated to the appframework * Added DataDisplayResponse that show data inline in the browser (used to retrun the image) * Removed some unneeded code * Added unit tests for the avatarcontroller
Diffstat (limited to 'tests/core')
-rw-r--r--tests/core/avatar/avatarcontrollertest.php360
1 files changed, 360 insertions, 0 deletions
diff --git a/tests/core/avatar/avatarcontrollertest.php b/tests/core/avatar/avatarcontrollertest.php
new file mode 100644
index 00000000000..1cd621b070c
--- /dev/null
+++ b/tests/core/avatar/avatarcontrollertest.php
@@ -0,0 +1,360 @@
+<?php
+/**
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @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 <http://www.gnu.org/licenses/>
+ *
+ */
+namespace OC\Core\Avatar;
+
+use OC;
+use OC\Core\Application;
+use OCP\AppFramework\IAppContainer;
+use OCP\Security\ISecureRandom;
+use OC\Files\Filesystem;
+use OCP\AppFramework\Http;
+use OCP\Image;
+
+/**
+ * Overwrite is_uploaded_file in this namespace to allow proper unit testing of
+ * the postAvatar call.
+ */
+function is_uploaded_file($filename) {
+ return file_exists($filename);
+}
+
+/**
+ * Class AvatarControllerTest
+ *
+ * @package OC\Core\Avatar
+ */
+class AvatarControllerTest extends \Test\TestCase {
+
+ /** @var IAppContainer */
+ private $container;
+ /** @var string */
+ private $user;
+ /** @var string */
+ private $oldUser;
+ /** @var AvatarController */
+ private $avatarController;
+
+ private $avatarMock;
+
+ private $userMock;
+
+ protected function setUp() {
+ $app = new Application;
+ $this->container = $app->getContainer();
+ $this->container['AppName'] = 'core';
+ $this->container['AvatarManager'] = $this->getMockBuilder('OCP\IAvatarManager')
+ ->disableOriginalConstructor()->getMock();
+ $this->container['Cache'] = $this->getMockBuilder('OCP\ICache')
+ ->disableOriginalConstructor()->getMock();
+ $this->container['L10N'] = $this->getMockBuilder('OCP\IL10N')
+ ->disableOriginalConstructor()->getMock();
+ $this->container['L10N']->method('t')->will($this->returnArgument(0));
+ $this->container['UserManager'] = $this->getMockBuilder('OCP\IUserManager')
+ ->disableOriginalConstructor()->getMock();
+ $this->container['UserSession'] = $this->getMockBuilder('OCP\IUserSession')
+ ->disableOriginalConstructor()->getMock();
+ $this->container['Request'] = $this->getMockBuilder('OCP\IRequest')
+ ->disableOriginalConstructor()->getMock();
+
+
+ $this->avatarMock = $this->getMockBuilder('OCP\IAvatar')
+ ->disableOriginalConstructor()->getMock();
+ $this->userMock = $this->getMockBuilder('OCP\IUser')
+ ->disableOriginalConstructor()->getMock();
+
+ $this->avatarController = $this->container['AvatarController'];
+
+ // Store current User
+ $this->oldUser = \OC_User::getUser();
+
+ // Create a dummy user
+ $this->user = \OC::$server->getSecureRandom()->getLowStrengthGenerator()->generate(12, ISecureRandom::CHAR_LOWER);
+
+ OC::$server->getUserManager()->createUser($this->user, $this->user);
+ \OC_Util::tearDownFS();
+ \OC_User::setUserId('');
+ Filesystem::tearDown();
+ \OC_User::setUserId($this->user);
+ \OC_Util::setupFS($this->user);
+
+ // Configure userMock
+ $this->userMock->method('getDisplayName')->willReturn($this->user);
+ $this->userMock->method('getUID')->willReturn($this->user);
+ $this->container['UserManager']->method('get')->willReturn($this->userMock);
+ $this->container['UserSession']->method('getUser')->willReturn($this->userMock);
+
+ }
+
+ public function tearDown() {
+ \OC_Util::tearDownFS();
+ \OC_User::setUserId('');
+ Filesystem::tearDown();
+ OC::$server->getUserManager()->get($this->user)->delete();
+ \OC_User::setIncognitoMode(false);
+
+ \OC::$server->getSession()->set('public_link_authenticated', '');
+
+ // Set old user
+ \OC_User::setUserId($this->oldUser);
+ \OC_Util::setupFS($this->oldUser);
+ }
+
+ /**
+ * Fetch an avatar if a user has no avatar
+ */
+ public function testGetAvatarNoAvatar() {
+ $this->container['AvatarManager']->method('getAvatar')->willReturn($this->avatarMock);
+ $response = $this->avatarController->getAvatar($this->user, 32);
+
+ //Comment out unitl JS is fixed
+ //$this->assertEquals($response->getStatus(), Http::STATUS_NOT_FOUND);
+ $this->assertEquals($response->getData()['data']['displayname'], $this->user);
+ }
+
+ /**
+ * Fetch the users avatar
+ */
+ public function testGetAvatar() {
+ $image = new Image(OC::$SERVERROOT.'/tests/data/testimage.jpg');
+ $this->avatarMock->method('get')->willReturn($image);
+ $this->container['AvatarManager']->method('getAvatar')->willReturn($this->avatarMock);
+
+ $response = $this->avatarController->getAvatar($this->user, 32);
+
+ $this->assertEquals($response->getStatus(), Http::STATUS_OK);
+
+ $image2 = new Image($response->getData());
+ $this->assertEquals($image->mimeType(), $image2->mimeType());
+ $this->assertEquals(crc32($response->getData()), $response->getEtag());
+ }
+
+ /**
+ * Make sure we get the correct size
+ */
+ public function testGetAvatarSize() {
+ $this->avatarMock->expects($this->once())
+ ->method('get')
+ ->with($this->equalTo(32));
+
+ $this->container['AvatarManager']->method('getAvatar')->willReturn($this->avatarMock);
+
+ $this->avatarController->getAvatar($this->user, 32);
+ }
+
+ /**
+ * We cannot get avatars that are 0 or negative
+ */
+ public function testGetAvatarSizeMin() {
+ $this->avatarMock->expects($this->once())
+ ->method('get')
+ ->with($this->equalTo(64));
+
+ $this->container['AvatarManager']->method('getAvatar')->willReturn($this->avatarMock);
+
+ $this->avatarController->getAvatar($this->user, 0);
+ }
+
+ /**
+ * We do not support avatars larger than 2048*2048
+ */
+ public function testGetAvatarSizeMax() {
+ $this->avatarMock->expects($this->once())
+ ->method('get')
+ ->with($this->equalTo(2048));
+
+ $this->container['AvatarManager']->method('getAvatar')->willReturn($this->avatarMock);
+
+ $this->avatarController->getAvatar($this->user, 2049);
+ }
+
+ /**
+ * Remove an avatar
+ */
+ public function testDeleteAvatar() {
+ $this->container['AvatarManager']->method('getAvatar')->willReturn($this->avatarMock);
+
+ $response = $this->avatarController->deleteAvatar();
+ $this->assertEquals($response->getStatus(), Http::STATUS_OK);
+ }
+
+ /**
+ * Test what happens if the removing of the avatar fails
+ */
+ public function testDeleteAvatarException() {
+ $this->avatarMock->method('remove')->will($this->throwException(new \Exception("foo")));
+ $this->container['AvatarManager']->method('getAvatar')->willReturn($this->avatarMock);
+
+ $response = $this->avatarController->deleteAvatar();
+ $this->assertEquals($response->getStatus(), Http::STATUS_BAD_REQUEST);
+ }
+
+ /**
+ * Trying to get a tmp avatar when it is not available. 404
+ */
+ public function testTmpAvatarNoTmp() {
+ $response = $this->avatarController->getTmpAvatar();
+ $this->assertEquals($response->getStatus(), Http::STATUS_NOT_FOUND);
+ }
+
+ /**
+ * Fetch tmp avatar
+ */
+ public function testTmpAvatarValid() {
+ $this->container['Cache']->method('get')->willReturn(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg'));
+
+ $response = $this->avatarController->getTmpAvatar();
+ $this->assertEquals($response->getStatus(), Http::STATUS_OK);
+ }
+
+
+ /**
+ * When trying to post a new avatar a path or image should be posted.
+ */
+ public function testPostAvatarNoPathOrImage() {
+ $response = $this->avatarController->postAvatar(null);
+
+ $this->assertEquals($response->getStatus(), Http::STATUS_BAD_REQUEST);
+ }
+
+ /**
+ * Test a correct post of an avatar using POST
+ */
+ public function testPostAvatarFile() {
+ //Create temp file
+ $fileName = tempnam(null, "avatarTest");
+ $copyRes = copy(OC::$SERVERROOT.'/tests/data/testimage.jpg', $fileName);
+ $this->assertTrue($copyRes);
+
+ //Create file in cache
+ $view = new \OC\Files\View('/'.$this->user.'/cache');
+ $view->file_put_contents('avatar_upload', file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg'));
+
+ //Create request return
+ $reqRet = ['error' => [0], 'tmp_name' => [$fileName]];
+ $this->container['Request']->method('getUploadedFile')->willReturn($reqRet);
+
+ $response = $this->avatarController->postAvatar(null);
+
+ //On correct upload always respond with the notsquare message
+ $this->assertEquals($response->getData()['data'], 'notsquare');
+
+ //File should be deleted
+ $this->assertFalse(file_exists($fileName));
+ }
+
+ /**
+ * Test invalid post os an avatar using POST
+ */
+ public function testPostAvatarInvalidFile() {
+ //Create request return
+ $reqRet = ['error' => [1], 'tmp_name' => ['foo']];
+ $this->container['Request']->method('getUploadedFile')->willReturn($reqRet);
+
+ $response = $this->avatarController->postAvatar(null);
+
+ $this->assertEquals($response->getStatus(), Http::STATUS_BAD_REQUEST);
+ }
+
+ /**
+ * Check what happens when we upload a GIF
+ * TODO: Finish
+ */
+ public function testPostAvatarFileGif() {
+ //Create temp file
+ $fileName = tempnam(null, "avatarTest");
+ $copyRes = copy(OC::$SERVERROOT.'/tests/data/testimage.gif', $fileName);
+ $this->assertTrue($copyRes);
+
+ //Create file in cache
+ $view = new \OC\Files\View('/'.$this->user.'/cache');
+ $view->file_put_contents('avatar_upload', file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.gif'));
+
+ //Create request return
+ $reqRet = ['error' => [0], 'tmp_name' => [$fileName]];
+ $this->container['Request']->method('getUploadedFile')->willReturn($reqRet);
+
+ $response = $this->avatarController->postAvatar(null);
+
+ $this->assertEquals($response->getData()['data']['message'], 'Unknown filetype');
+
+ //File should be deleted
+ $this->assertFalse(file_exists($fileName));
+ }
+
+ /**
+ * Test posting avatar from existing file
+ */
+ public function testPostAvatarFromFile() {
+ //Create file in cache
+ $view = new \OC\Files\View('/'.$this->user.'/files');
+ $view->file_put_contents('avatar.jpg', file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg'));
+
+ //Create request return
+ $response = $this->avatarController->postAvatar('avatar.jpg');
+
+ //On correct upload always respond with the notsquare message
+ $this->assertEquals($response->getData()['data'], 'notsquare');
+ }
+
+ /**
+ * Test invalid crop argment
+ */
+ public function testPostCroppedAvatarInvalidCrop() {
+ $response = $this->avatarController->postCroppedAvatar([]);
+
+ $this->assertEquals($response->getStatus(), Http::STATUS_BAD_REQUEST);
+ }
+
+ /**
+ * Test no tmp avatar to crop
+ */
+ public function testPostCroppedAvatarNoTmpAvatar() {
+ $response = $this->avatarController->postCroppedAvatar(['x' => 0, 'y' => 0, 'w' => 10, 'h' => 10]);
+
+ $this->assertEquals($response->getStatus(), Http::STATUS_BAD_REQUEST);
+ }
+
+ /**
+ * Test with non square crop
+ */
+ public function testPostCroppedAvatarNoSquareCrop() {
+ $this->container['Cache']->method('get')->willReturn(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg'));
+
+ $this->avatarMock->method('set')->will($this->throwException(new \OC\NotSquareException));
+ $this->container['AvatarManager']->method('getAvatar')->willReturn($this->avatarMock);
+ $response = $this->avatarController->postCroppedAvatar(['x' => 0, 'y' => 0, 'w' => 10, 'h' => 11]);
+
+ $this->assertEquals($response->getStatus(), Http::STATUS_BAD_REQUEST);
+ }
+
+ /**
+ * Check for proper reply on proper crop argument
+ */
+ public function testPostCroppedAvatarValidCrop() {
+ $this->container['Cache']->method('get')->willReturn(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg'));
+ $this->container['AvatarManager']->method('getAvatar')->willReturn($this->avatarMock);
+ $response = $this->avatarController->postCroppedAvatar(['x' => 0, 'y' => 0, 'w' => 10, 'h' => 10]);
+
+ $this->assertEquals($response->getStatus(), Http::STATUS_OK);
+ $this->assertEquals($response->getData()['status'], 'success');
+ }
+
+}