]> source.dussan.org Git - nextcloud-server.git/commitdiff
No longer directly output OC_Image for thumbnails
authorRoeland Jago Douma <roeland@famdouma.nl>
Mon, 16 Mar 2015 11:42:40 +0000 (12:42 +0100)
committerRoeland Jago Douma <roeland@famdouma.nl>
Tue, 24 Mar 2015 17:55:06 +0000 (18:55 +0100)
* Only use public interfaces
  - Injected IPreview
* Added unit tests

apps/files/appinfo/application.php
apps/files/controller/apicontroller.php
apps/files/tests/controller/apicontrollertest.php

index 5203946f8272490b40c316a1ea8673b06e96f783..17637d6447ce131811952f1c3c50638e870ce216 100644 (file)
@@ -8,7 +8,6 @@
 
 namespace OCA\Files\Appinfo;
 
-use OC\AppFramework\Utility\SimpleContainer;
 use OCA\Files\Controller\ApiController;
 use OCP\AppFramework\App;
 use \OCA\Files\Service\TagService;
@@ -18,15 +17,17 @@ class Application extends App {
        public function __construct(array $urlParams=array()) {
                parent::__construct('files', $urlParams);
                $container = $this->getContainer();
+               $server = $container->getServer();
 
                /**
                 * Controllers
                 */
-               $container->registerService('APIController', function (IContainer $c) {
+               $container->registerService('APIController', function (IContainer $c) use ($server) {
                        return new ApiController(
                                $c->query('AppName'),
                                $c->query('Request'),
-                               $c->query('TagService')
+                               $c->query('TagService'),
+                               $server->getPreviewManager()
                        );
                });
 
index de9fa20dde01e9b54798d83299e0504cd1ee3220..d6e62180df30c2f8c3edda8e1b01144dfe279276 100644 (file)
@@ -11,11 +11,11 @@ namespace OCA\Files\Controller;
 use OCP\AppFramework\Http;
 use OCP\AppFramework\Controller;
 use OCP\IRequest;
-use OCP\AppFramework\Http\JSONResponse;
 use OCP\AppFramework\Http\DataResponse;
+use OCP\AppFramework\Http\DataDisplayResponse;
 use OCP\AppFramework\Http\DownloadResponse;
-use OC\Preview;
 use OCA\Files\Service\TagService;
+use OCP\IPreview;
 
 /**
  * Class ApiController
@@ -25,17 +25,22 @@ use OCA\Files\Service\TagService;
 class ApiController extends Controller {
        /** @var TagService */
        private $tagService;
+       /** @var IPreview */
+       private $previewManager;
 
        /**
         * @param string $appName
         * @param IRequest $request
         * @param TagService $tagService
+        * @param IPreview $previewManager
         */
        public function __construct($appName,
                                                                IRequest $request,
-                                                               TagService $tagService){
+                                                               TagService $tagService,
+                                                               IPreview $previewManager){
                parent::__construct($appName, $request);
                $this->tagService = $tagService;
+               $this->previewManager = $previewManager;
        }
 
        /**
@@ -49,19 +54,18 @@ class ApiController extends Controller {
         * @param int $x
         * @param int $y
         * @param string $file URL-encoded filename
-        * @return JSONResponse|DownloadResponse
+        * @return DataResponse|DataDisplayResponse
         */
        public function getThumbnail($x, $y, $file) {
                if($x < 1 || $y < 1) {
-                       return new JSONResponse('Requested size must be numeric and a positive value.', Http::STATUS_BAD_REQUEST);
+                       return new DataResponse(['message' => 'Requested size must be numeric and a positive value.'], Http::STATUS_BAD_REQUEST);
                }
 
-               try {
-                       $preview = new Preview('', 'files', urldecode($file), $x, $y, true);
-                       echo($preview->showPreview('image/png'));
-                       return new DownloadResponse(urldecode($file).'.png', 'image/png');
-               } catch (\Exception $e) {
-                       return new JSONResponse('File not found.', Http::STATUS_NOT_FOUND);
+               $preview = $this->previewManager->createPreview('files/'.urldecode($file), $x, $y, true);
+               if ($preview->valid()) {
+                       return new DataDisplayResponse($preview->data(), Http::STATUS_OK, ['Content-Type' => 'image/png']);
+               } else {
+                       return new DataResponse(['message' => 'File not found.'], Http::STATUS_NOT_FOUND);
                }
        }
 
index 1be7a749a1b4360fa096ebc9814836d3ebb034d1..1d4317f0bca406b5ff3b49dbbee08edc675f8b8d 100644 (file)
@@ -17,6 +17,8 @@ use Test\TestCase;
 use OCP\IRequest;
 use OCA\Files\Service\TagService;
 use OCP\AppFramework\Http\DataResponse;
+use OCP\IPreview;
+use OCP\Image;
 
 /**
  * Class ApiController
@@ -30,6 +32,8 @@ class ApiControllerTest extends TestCase {
        private $request;
        /** @var TagService */
        private $tagService;
+       /** @var IPreview */
+       private $preview;
        /** @var ApiController */
        private $apiController;
 
@@ -40,11 +44,15 @@ class ApiControllerTest extends TestCase {
                $this->tagService = $this->getMockBuilder('\OCA\Files\Service\TagService')
                        ->disableOriginalConstructor()
                        ->getMock();
+               $this->preview = $this->getMockBuilder('\OCP\IPreview')
+                       ->disableOriginalConstructor()
+                       ->getMock();
 
                $this->apiController = new ApiController(
                        $this->appName,
                        $this->request,
-                       $this->tagService
+                       $this->tagService,
+                       $this->preview
                );
        }
 
@@ -240,4 +248,29 @@ class ApiControllerTest extends TestCase {
                $expected = new DataResponse(['message' => 'My error message'], Http::STATUS_NOT_FOUND);
                $this->assertEquals($expected, $this->apiController->updateFileTags('/path.txt', ['Tag1', 'Tag2']));
        }
+
+       public function testGetThumbnailInvalidSize() {
+               $expected = new DataResponse(['message' => 'Requested size must be numeric and a positive value.'], Http::STATUS_BAD_REQUEST);
+               $this->assertEquals($expected, $this->apiController->getThumbnail(0, 0, ''));
+       }
+
+       public function testGetThumbnailInvaidImage() {
+               $this->preview->expects($this->once())
+                       ->method('createPreview')
+                       ->with('files/unknown.jpg', 10, 10, true)
+                       ->willReturn(new Image);
+               $expected = new DataResponse(['message' => 'File not found.'], Http::STATUS_NOT_FOUND);
+               $this->assertEquals($expected, $this->apiController->getThumbnail(10, 10, 'unknown.jpg'));
+       }
+
+       public function testGetThumbnail() {
+               $this->preview->expects($this->once())
+                       ->method('createPreview')
+                       ->with('files/known.jpg', 10, 10, true)
+                       ->willReturn(new Image(\OC::$SERVERROOT.'/tests/data/testimage.jpg'));
+
+               $ret = $this->apiController->getThumbnail(10, 10, 'known.jpg');
+
+               $this->assertEquals(Http::STATUS_OK, $ret->getStatus());
+       }
 }