summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorLukas Reschke <lukas@statuscode.ch>2017-02-22 10:16:33 +0100
committerGitHub <noreply@github.com>2017-02-22 10:16:33 +0100
commitdb80fbd1cb64eacceca2ffa4b9a0a8bb4c2cfd7d (patch)
tree61fa963e656faf8a64a46b80570c9895346f6e38 /apps
parent54a5fe2aaf7b65389bae141ab6283cc92a920bed (diff)
parente5ddb40a3ec32bc175f44ff613352a3569606746 (diff)
downloadnextcloud-server-db80fbd1cb64eacceca2ffa4b9a0a8bb4c2cfd7d.tar.gz
nextcloud-server-db80fbd1cb64eacceca2ffa4b9a0a8bb4c2cfd7d.zip
Merge pull request #3413 from nextcloud/theming-appdata
Move theming images to AppData
Diffstat (limited to 'apps')
-rw-r--r--apps/theming/appinfo/info.xml8
-rw-r--r--apps/theming/lib/Controller/ThemingController.php60
-rw-r--r--apps/theming/lib/ImageManager.php2
-rw-r--r--apps/theming/lib/Migration/ThemingImages.php77
-rw-r--r--apps/theming/tests/Controller/ThemingControllerTest.php192
-rw-r--r--apps/theming/tests/Migration/ThemingImages.php139
6 files changed, 378 insertions, 100 deletions
diff --git a/apps/theming/appinfo/info.xml b/apps/theming/appinfo/info.xml
index 9ded5c89b87..13a0f161a47 100644
--- a/apps/theming/appinfo/info.xml
+++ b/apps/theming/appinfo/info.xml
@@ -5,7 +5,7 @@
<description>Adjust the Nextcloud theme</description>
<licence>AGPL</licence>
<author>Nextcloud</author>
- <version>1.2.0</version>
+ <version>1.3.0</version>
<namespace>Theming</namespace>
<category>other</category>
@@ -23,4 +23,10 @@
<admin>OCA\Theming\Settings\Admin</admin>
<admin-section>OCA\Theming\Settings\Section</admin-section>
</settings>
+
+ <repair-steps>
+ <post-migration>
+ <step>OCA\Theming\Migration\ThemingImages</step>
+ </post-migration>
+ </repair-steps>
</info>
diff --git a/apps/theming/lib/Controller/ThemingController.php b/apps/theming/lib/Controller/ThemingController.php
index 24ac1c7d8d5..2aa79df2464 100644
--- a/apps/theming/lib/Controller/ThemingController.php
+++ b/apps/theming/lib/Controller/ThemingController.php
@@ -31,12 +31,12 @@ use OCA\Theming\ThemingDefaults;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataDownloadResponse;
+use OCP\AppFramework\Http\FileDisplayResponse;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\Http\NotFoundResponse;
-use OCP\AppFramework\Http\StreamResponse;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Files\File;
-use OCP\Files\IRootFolder;
+use OCP\Files\IAppData;
use OCP\Files\NotFoundException;
use OCP\IConfig;
use OCP\IL10N;
@@ -62,10 +62,10 @@ class ThemingController extends Controller {
private $l;
/** @var IConfig */
private $config;
- /** @var IRootFolder */
- private $rootFolder;
/** @var ITempManager */
private $tempManager;
+ /** @var IAppData */
+ private $appData;
/**
* ThemingController constructor.
@@ -77,8 +77,8 @@ class ThemingController extends Controller {
* @param Util $util
* @param ITimeFactory $timeFactory
* @param IL10N $l
- * @param IRootFolder $rootFolder
* @param ITempManager $tempManager
+ * @param IAppData $appData
*/
public function __construct(
$appName,
@@ -88,8 +88,8 @@ class ThemingController extends Controller {
Util $util,
ITimeFactory $timeFactory,
IL10N $l,
- IRootFolder $rootFolder,
- ITempManager $tempManager
+ ITempManager $tempManager,
+ IAppData $appData
) {
parent::__construct($appName, $request);
@@ -98,8 +98,8 @@ class ThemingController extends Controller {
$this->timeFactory = $timeFactory;
$this->l = $l;
$this->config = $config;
- $this->rootFolder = $rootFolder;
$this->tempManager = $tempManager;
+ $this->appData = $appData;
}
/**
@@ -183,16 +183,22 @@ class ThemingController extends Controller {
Http::STATUS_UNPROCESSABLE_ENTITY
);
}
+
$name = '';
+ try {
+ $folder = $this->appData->getFolder('images');
+ } catch (NotFoundException $e) {
+ $folder = $this->appData->newFolder('images');
+ }
+
if(!empty($newLogo)) {
- $target = $this->rootFolder->newFile('themedinstancelogo');
- stream_copy_to_stream(fopen($newLogo['tmp_name'], 'r'), $target->fopen('w'));
+ $target = $folder->newFile('logo');
+ $target->putContent(file_get_contents($newLogo['tmp_name'], 'r'));
$this->template->set('logoMime', $newLogo['type']);
$name = $newLogo['name'];
}
if(!empty($newBackgroundLogo)) {
- $target = $this->rootFolder->newFile('themedbackgroundlogo');
-
+ $target = $folder->newFile('background');
$image = @imagecreatefromstring(file_get_contents($newBackgroundLogo['tmp_name'], 'r'));
if($image === false) {
return new DataResponse(
@@ -219,7 +225,7 @@ class ThemingController extends Controller {
imagejpeg($image, $tmpFile, 75);
imagedestroy($image);
- stream_copy_to_stream(fopen($tmpFile, 'r'), $target->fopen('w'));
+ $target->putContent(file_get_contents($tmpFile, 'r'));
$this->template->set('backgroundMime', $newBackgroundLogo['type']);
$name = $newBackgroundLogo['name'];
}
@@ -260,22 +266,24 @@ class ThemingController extends Controller {
* @PublicPage
* @NoCSRFRequired
*
- * @return StreamResponse|NotFoundResponse
+ * @return FileDisplayResponse|NotFoundResponse
*/
public function getLogo() {
try {
/** @var File $file */
- $file = $this->rootFolder->get('themedinstancelogo');
+ $file = $this->appData->getFolder('images')->getFile('logo');
} catch (NotFoundException $e) {
return new NotFoundResponse();
}
- $response = new Http\StreamResponse($file->fopen('r'));
+ $response = new FileDisplayResponse($file);
$response->cacheFor(3600);
- $response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime()));
- $response->addHeader('Content-Disposition', 'attachment');
- $response->addHeader('Content-Type', $this->config->getAppValue($this->appName, 'logoMime', ''));
+ $expires = new \DateTime();
+ $expires->setTimestamp($this->timeFactory->getTime());
+ $expires->add(new \DateInterval('PT24H'));
+ $response->addHeader('Expires', $expires->format(\DateTime::RFC2822));
$response->addHeader('Pragma', 'cache');
+ $response->addHeader('Content-Type', $this->config->getAppValue($this->appName, 'logoMime', ''));
return $response;
}
@@ -283,22 +291,24 @@ class ThemingController extends Controller {
* @PublicPage
* @NoCSRFRequired
*
- * @return StreamResponse|NotFoundResponse
+ * @return FileDisplayResponse|NotFoundResponse
*/
public function getLoginBackground() {
try {
/** @var File $file */
- $file = $this->rootFolder->get('themedbackgroundlogo');
+ $file = $this->appData->getFolder('images')->getFile('background');
} catch (NotFoundException $e) {
return new NotFoundResponse();
}
- $response = new StreamResponse($file->fopen('r'));
+ $response = new FileDisplayResponse($file);
$response->cacheFor(3600);
- $response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime()));
- $response->addHeader('Content-Disposition', 'attachment');
- $response->addHeader('Content-Type', $this->config->getAppValue($this->appName, 'backgroundMime', ''));
+ $expires = new \DateTime();
+ $expires->setTimestamp($this->timeFactory->getTime());
+ $expires->add(new \DateInterval('PT24H'));
+ $response->addHeader('Expires', $expires->format(\DateTime::RFC2822));
$response->addHeader('Pragma', 'cache');
+ $response->addHeader('Content-Type', $this->config->getAppValue($this->appName, 'backgroundMime', ''));
return $response;
}
diff --git a/apps/theming/lib/ImageManager.php b/apps/theming/lib/ImageManager.php
index 4cd43e02054..88e456a2969 100644
--- a/apps/theming/lib/ImageManager.php
+++ b/apps/theming/lib/ImageManager.php
@@ -104,7 +104,7 @@ class ImageManager {
$currentFolder = $this->getCacheFolder();
$folders = $this->appData->getDirectoryListing();
foreach ($folders as $folder) {
- if ($folder->getName() !== $currentFolder->getName()) {
+ if ($folder->getName() !== 'images' && $folder->getName() !== $currentFolder->getName()) {
$folder->delete();
}
}
diff --git a/apps/theming/lib/Migration/ThemingImages.php b/apps/theming/lib/Migration/ThemingImages.php
new file mode 100644
index 00000000000..f6f484be8b5
--- /dev/null
+++ b/apps/theming/lib/Migration/ThemingImages.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Julius Härtl <jus@bitgrid.net>
+ *
+ * @author Julius Härtl <jus@bitgrid.net>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OCA\Theming\Migration;
+
+use OCA\Theming\ThemingDefaults;
+use OCP\Files\IAppData;
+use OCP\Files\IRootFolder;
+use OCP\Migration\IRepairStep;
+use OCP\Migration\IOutput;
+use OC\Files\Node\File;
+use OCP\Files\NotFoundException;
+
+class ThemingImages implements IRepairStep {
+
+ private $appData;
+ private $rootFolder;
+
+ public function __construct(IAppData $appData, IRootFolder $rootFolder) {
+ $this->appData = $appData;
+ $this->rootFolder = $rootFolder;
+ }
+
+ /*
+ * @inheritdoc
+ */
+ public function getName() {
+ return 'Move theming files to AppData storage';
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function run(IOutput $output) {
+ $folder = $this->appData->newFolder("images");
+ /** @var File $file */
+ $file = null;
+ try {
+ $file = $this->rootFolder->get('themedinstancelogo');
+ $logo = $folder->newFile('logo');
+ $logo->putContent($file->getContent());
+ $file->delete();
+ } catch (NotFoundException $e) {
+ $output->info('No theming logo image to migrate');
+ }
+
+ try {
+ $file = $this->rootFolder->get('themedbackgroundlogo');
+ $background = $folder->newFile('background');
+ $background->putContent($file->getContent());
+ $file->delete();
+ } catch (NotFoundException $e) {
+ $output->info('No theming background image to migrate');
+ }
+ }
+}
diff --git a/apps/theming/tests/Controller/ThemingControllerTest.php b/apps/theming/tests/Controller/ThemingControllerTest.php
index 97a5e985860..3afcdb847b6 100644
--- a/apps/theming/tests/Controller/ThemingControllerTest.php
+++ b/apps/theming/tests/Controller/ThemingControllerTest.php
@@ -24,14 +24,18 @@
*/
namespace OCA\Theming\Tests\Controller;
+use OC\L10N\L10N;
use OCA\Theming\Controller\ThemingController;
use OCA\Theming\Util;
use OCP\App\IAppManager;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
-use OCP\Files\File;
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\Files\IAppData;
use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
+use OCP\Files\SimpleFS\ISimpleFile;
+use OCP\Files\SimpleFS\ISimpleFolder;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IRequest;
@@ -58,25 +62,25 @@ class ThemingControllerTest extends TestCase {
private $rootFolder;
/** @var ITempManager */
private $tempManager;
- /** @var IAppManager */
+ /** @var IAppManager|\PHPUnit_Framework_MockObject_MockObject */
private $appManager;
+ /** @var IAppData|\PHPUnit_Framework_MockObject_MockObject */
+ private $appData;
public function setUp() {
- $this->request = $this->getMockBuilder('OCP\IRequest')->getMock();
- $this->config = $this->getMockBuilder('OCP\IConfig')->getMock();
- $this->template = $this->getMockBuilder('OCA\Theming\ThemingDefaults')
- ->disableOriginalConstructor()->getMock();
- $this->timeFactory = $this->getMockBuilder('OCP\AppFramework\Utility\ITimeFactory')
- ->disableOriginalConstructor()
- ->getMock();
- $this->l10n = $this->getMockBuilder('OCP\IL10N')->getMock();
- $this->rootFolder = $this->getMockBuilder('OCP\Files\IRootFolder')->getMock();
- $this->appManager = $this->getMockBuilder('OCP\App\IAppManager')->getMock();
+ $this->request = $this->createMock(IRequest::class);
+ $this->config = $this->createMock(IConfig::class);
+ $this->template = $this->createMock(ThemingDefaults::class);
+ $this->timeFactory = $this->createMock(ITimeFactory::class);
+ $this->l10n = $this->createMock(L10N::class);
+ $this->rootFolder = $this->createMock(IRootFolder::class);
+ $this->appManager = $this->createMock(IAppManager::class);
$this->util = new Util($this->config, $this->rootFolder, $this->appManager);
$this->timeFactory->expects($this->any())
->method('getTime')
->willReturn(123);
$this->tempManager = \OC::$server->getTempManager();
+ $this->appData = $this->createMock(IAppData::class);
$this->themingController = new ThemingController(
'theming',
@@ -86,8 +90,8 @@ class ThemingControllerTest extends TestCase {
$this->util,
$this->timeFactory,
$this->l10n,
- $this->rootFolder,
- $this->tempManager
+ $this->tempManager,
+ $this->appData
);
return parent::setUp();
@@ -167,7 +171,15 @@ class ThemingControllerTest extends TestCase {
$this->assertEquals($expected, $this->themingController->updateLogo());
}
- public function testUpdateLogoNormalLogoUpload() {
+ public function dataUpdateImages() {
+ return [
+ [false],
+ [true]
+ ];
+ }
+
+ /** @dataProvider dataUpdateImages */
+ public function testUpdateLogoNormalLogoUpload($folderExists) {
$tmpLogo = \OC::$server->getTempManager()->getTemporaryFolder() . '/logo.svg';
$destination = \OC::$server->getTempManager()->getTemporaryFolder();
@@ -191,20 +203,32 @@ class ThemingControllerTest extends TestCase {
->method('t')
->with('Saved')
->willReturn('Saved');
- $file = $this->getMockBuilder('\\OCP\\Files\\File')
- ->disableOriginalConstructor()
- ->getMock();
- $this->rootFolder
- ->expects($this->once())
+
+
+ $file = $this->createMock(ISimpleFile::class);
+ $folder = $this->createMock(ISimpleFolder::class);
+ if($folderExists) {
+ $this->appData
+ ->expects($this->once())
+ ->method('getFolder')
+ ->with('images')
+ ->willReturn($folder);
+ } else {
+ $this->appData
+ ->expects($this->at(0))
+ ->method('getFolder')
+ ->with('images')
+ ->willThrowException(new NotFoundException());
+ $this->appData
+ ->expects($this->at(1))
+ ->method('newFolder')
+ ->with('images')
+ ->willReturn($folder);
+ }
+ $folder->expects($this->once())
->method('newFile')
- ->with('themedinstancelogo')
+ ->with('logo')
->willReturn($file);
- $file
- ->expects($this->once())
- ->method('fopen')
- ->with('w')
- ->willReturn(fopen($destination . '/themedinstancelogo', 'w'));
-
$expected = new DataResponse(
[
'data' =>
@@ -219,9 +243,9 @@ class ThemingControllerTest extends TestCase {
$this->assertEquals($expected, $this->themingController->updateLogo());
}
- public function testUpdateLogoLoginScreenUpload() {
+ /** @dataProvider dataUpdateImages */
+ public function testUpdateLogoLoginScreenUpload($folderExists) {
$tmpLogo = \OC::$server->getTempManager()->getTemporaryFolder() . '/logo.svg';
- $destination = \OC::$server->getTempManager()->getTemporaryFolder();
touch($tmpLogo);
file_put_contents($tmpLogo, file_get_contents(__DIR__ . '/../../../../tests/data/desktopapp.png'));
@@ -244,20 +268,31 @@ class ThemingControllerTest extends TestCase {
->method('t')
->with('Saved')
->willReturn('Saved');
- $file = $this->getMockBuilder('\\OCP\\Files\\File')
- ->disableOriginalConstructor()
- ->getMock();
- $this->rootFolder
- ->expects($this->once())
+
+ $file = $this->createMock(ISimpleFile::class);
+ $folder = $this->createMock(ISimpleFolder::class);
+ if($folderExists) {
+ $this->appData
+ ->expects($this->once())
+ ->method('getFolder')
+ ->with('images')
+ ->willReturn($folder);
+ } else {
+ $this->appData
+ ->expects($this->at(0))
+ ->method('getFolder')
+ ->with('images')
+ ->willThrowException(new NotFoundException());
+ $this->appData
+ ->expects($this->at(1))
+ ->method('newFolder')
+ ->with('images')
+ ->willReturn($folder);
+ }
+ $folder->expects($this->once())
->method('newFile')
- ->with('themedbackgroundlogo')
+ ->with('background')
->willReturn($file);
- $file
- ->expects($this->once())
- ->method('fopen')
- ->with('w')
- ->willReturn(fopen($destination . '/themedbackgroundlogo', 'w'));
-
$expected = new DataResponse(
[
@@ -274,7 +309,6 @@ class ThemingControllerTest extends TestCase {
public function testUpdateLogoLoginScreenUploadWithInvalidImage() {
$tmpLogo = \OC::$server->getTempManager()->getTemporaryFolder() . '/logo.svg';
- $destination = \OC::$server->getTempManager()->getTemporaryFolder();
touch($tmpLogo);
file_put_contents($tmpLogo, file_get_contents(__DIR__ . '/../../../../tests/data/data.zip'));
@@ -297,14 +331,14 @@ class ThemingControllerTest extends TestCase {
->method('t')
->with('Unsupported image type')
->willReturn('Unsupported image type');
- $file = $this->getMockBuilder('\\OCP\\Files\\File')
- ->disableOriginalConstructor()
- ->getMock();
- $this->rootFolder
+
+ $folder = $this->createMock(ISimpleFolder::class);
+ $this->appData
->expects($this->once())
- ->method('newFile')
- ->with('themedbackgroundlogo')
- ->willReturn($file);
+ ->method('getFolder')
+ ->with('images')
+ ->willReturn($folder);
+
$expected = new DataResponse(
[
'data' =>
@@ -344,8 +378,8 @@ class ThemingControllerTest extends TestCase {
}
public function testGetLogoNotExistent() {
- $this->rootFolder->method('get')
- ->with($this->equalTo('themedinstancelogo'))
+ $this->appData->method('getFolder')
+ ->with($this->equalTo('images'))
->willThrowException(new NotFoundException());
$expected = new Http\NotFoundResponse();
@@ -353,13 +387,17 @@ class ThemingControllerTest extends TestCase {
}
public function testGetLogo() {
- $file = $this->createMock(File::class);
- $this->rootFolder->method('get')
- ->with('themedinstancelogo')
+ $file = $this->createMock(ISimpleFile::class);
+ $folder = $this->createMock(ISimpleFolder::class);
+ $this->appData
+ ->expects($this->once())
+ ->method('getFolder')
+ ->with('images')
+ ->willReturn($folder);
+ $folder->expects($this->once())
+ ->method('getFile')
+ ->with('logo')
->willReturn($file);
- $file->method('fopen')
- ->with('r')
- ->willReturn('mypath');
$this->config
->expects($this->once())
@@ -367,32 +405,38 @@ class ThemingControllerTest extends TestCase {
->with('theming', 'logoMime', '')
->willReturn('text/svg');
- @$expected = new Http\StreamResponse('mypath');
+ @$expected = new Http\FileDisplayResponse($file);
$expected->cacheFor(3600);
- $expected->addHeader('Expires', date(\DateTime::RFC2822, 123));
- $expected->addHeader('Content-Disposition', 'attachment');
- $expected->addHeader('Content-Type', 'text/svg');
+ $expires = new \DateTime();
+ $expires->setTimestamp($this->timeFactory->getTime());
+ $expires->add(new \DateInterval('PT24H'));
+ $expected->addHeader('Expires', $expires->format(\DateTime::RFC2822));
$expected->addHeader('Pragma', 'cache');
+ $expected->addHeader('Content-Type', 'text/svg');
@$this->assertEquals($expected, $this->themingController->getLogo());
}
public function testGetLoginBackgroundNotExistent() {
- $this->rootFolder->method('get')
- ->with('themedbackgroundlogo')
+ $this->appData->method('getFolder')
+ ->with($this->equalTo('images'))
->willThrowException(new NotFoundException());
$expected = new Http\NotFoundResponse();
$this->assertEquals($expected, $this->themingController->getLoginBackground());
}
public function testGetLoginBackground() {
- $file = $this->createMock(File::class);
- $this->rootFolder->method('get')
- ->with('themedbackgroundlogo')
+ $file = $this->createMock(ISimpleFile::class);
+ $folder = $this->createMock(ISimpleFolder::class);
+ $this->appData
+ ->expects($this->once())
+ ->method('getFolder')
+ ->with('images')
+ ->willReturn($folder);
+ $folder->expects($this->once())
+ ->method('getFile')
+ ->with('background')
->willReturn($file);
- $file->method('fopen')
- ->with('r')
- ->willReturn('mypath');
$this->config
->expects($this->once())
@@ -400,12 +444,14 @@ class ThemingControllerTest extends TestCase {
->with('theming', 'backgroundMime', '')
->willReturn('image/png');
- @$expected = new Http\StreamResponse('mypath');
+ @$expected = new Http\FileDisplayResponse($file);
$expected->cacheFor(3600);
- $expected->addHeader('Expires', date(\DateTime::RFC2822, 123));
- $expected->addHeader('Content-Disposition', 'attachment');
- $expected->addHeader('Content-Type', 'image/png');
+ $expires = new \DateTime();
+ $expires->setTimestamp($this->timeFactory->getTime());
+ $expires->add(new \DateInterval('PT24H'));
+ $expected->addHeader('Expires', $expires->format(\DateTime::RFC2822));
$expected->addHeader('Pragma', 'cache');
+ $expected->addHeader('Content-Type', 'image/png');
@$this->assertEquals($expected, $this->themingController->getLoginBackground());
}
diff --git a/apps/theming/tests/Migration/ThemingImages.php b/apps/theming/tests/Migration/ThemingImages.php
new file mode 100644
index 00000000000..e15d0fd1bbc
--- /dev/null
+++ b/apps/theming/tests/Migration/ThemingImages.php
@@ -0,0 +1,139 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Julius Härtl <jus@bitgrid.net>
+ *
+ * @author Julius Härtl <jus@bitgrid.net>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\Theming\Tests\Migration;
+
+use OCP\Files\File;
+use OCP\Files\NotFoundException;
+use OCP\Files\SimpleFS\ISimpleFile;
+use OCP\Files\SimpleFS\ISimpleFolder;
+use OCP\Migration\IOutput;
+use Test\TestCase;
+use OCA\Theming\Migration\ThemingImages;
+use OCP\Files\IAppData;
+use OCP\Files\IRootFolder;
+
+class ThemingImagesTest extends TestCase {
+ /** @var ThemingImages */
+ private $repairStep;
+ /** @var IAppData */
+ private $appData;
+ /** @var IRootFolder */
+ private $rootFolder;
+ /** @var ISimpleFolder */
+ private $imageFolder;
+ /** @var IOutput */
+ private $output;
+
+ public function setUp() {
+ parent::setUp();
+ $this->appData = $this->createMock(IAppData::class);
+ $this->rootFolder = $this->createMock(IRootFolder::class);
+ $this->repairStep = new ThemingImages($this->appData, $this->rootFolder);
+ $this->imageFolder = $this->createMock(ISimpleFolder::class);
+ $this->output = $this->createMock(IOutput::class);
+ }
+
+ public function testGetName() {
+ $this->assertEquals(
+ 'Move theming files to AppData storage',
+ $this->repairStep->getName()
+ );
+ }
+
+ public function testRunNoImages() {
+ $this->appData->expects($this->once())
+ ->method('newFolder')
+ ->willReturn($this->imageFolder);
+ $this->rootFolder->expects($this->any())
+ ->method('get')
+ ->willThrowException(new NotFoundException());
+ $this->imageFolder->expects($this->never())
+ ->method('newFile');
+ $this->output->expects($this->exactly(2))
+ ->method('info');
+ $this->repairStep->run($this->output);
+ }
+
+ public function testRunLogo() {
+ $oldFile = $this->createMock(File::class);
+ $newFile = $this->createMock(ISimpleFile::class);
+
+ $this->appData->expects($this->once())
+ ->method('newFolder')
+ ->willReturn($this->imageFolder);
+ $this->rootFolder->expects($this->at(1))
+ ->method('get')
+ ->with('themedbackgroundlogo')
+ ->willThrowException(new NotFoundException());
+ $this->rootFolder->expects($this->at(0))
+ ->method('get')
+ ->with('themedinstancelogo')
+ ->willReturn($oldFile);
+ $this->imageFolder->expects($this->once())
+ ->method('newFile')
+ ->with('logo')
+ ->willReturn($newFile);
+ $oldFile->expects($this->once())
+ ->method('getContent')
+ ->willReturn('data');
+ $newFile->expects($this->once())
+ ->method('putContent')
+ ->with('data');
+ $oldFile->expects($this->once())
+ ->method('delete');
+
+ $this->repairStep->run($this->output);
+ }
+
+ public function testRunBackground() {
+ $oldFile = $this->createMock(File::class);
+ $newFile = $this->createMock(ISimpleFile::class);
+
+ $this->appData->expects($this->once())
+ ->method('newFolder')
+ ->willReturn($this->imageFolder);
+ $this->rootFolder->expects($this->at(1))
+ ->method('get')
+ ->with('themedbackgroundlogo')
+ ->willReturn($oldFile);
+ $this->rootFolder->expects($this->at(0))
+ ->method('get')
+ ->with('themedinstancelogo')
+ ->willThrowException(new NotFoundException());
+ $this->imageFolder->expects($this->once())
+ ->method('newFile')
+ ->with('background')
+ ->willReturn($newFile);
+ $oldFile->expects($this->once())
+ ->method('getContent')
+ ->willReturn('data');
+ $newFile->expects($this->once())
+ ->method('putContent')
+ ->with('data');
+ $oldFile->expects($this->once())
+ ->method('delete');
+
+ $this->repairStep->run($this->output);
+ }
+}