From 02bfc867efd992c6b5b17bcdc76316cb1c970853 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Molakvo=C3=A6=20=28skjnldsv=29?= Date: Thu, 28 Dec 2017 13:32:45 +0100 Subject: [PATCH] Added tests for various installations types - With root installation - Core css - App inside server root - Secondary apps directory outside server root - With an installation in a sub directory - Core css - App inside server root - Secondary apps directory outside server root MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: John Molakvoæ (skjnldsv) --- lib/private/Template/SCSSCacher.php | 18 +++++++------ tests/lib/Template/SCSSCacherTest.php | 37 +++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/lib/private/Template/SCSSCacher.php b/lib/private/Template/SCSSCacher.php index 8d1eda99ee..ddd0131eac 100644 --- a/lib/private/Template/SCSSCacher.php +++ b/lib/private/Template/SCSSCacher.php @@ -102,7 +102,7 @@ class SCSSCacher { $fileNameCSS = $this->prependBaseurlPrefix(str_replace('.scss', '.css', $fileNameSCSS)); $path = implode('/', $path); - $webDir = $this->getWebDir($path, $app); + $webDir = $this->getWebDir($path, $app, $this->serverRoot, \OC::$WEBROOT); try { $folder = $this->appData->getFolder($app); @@ -187,7 +187,7 @@ class SCSSCacher { $scss = new Compiler(); $scss->setImportPaths([ $path, - \OC::$SERVERROOT . '/core/css/', + $this->serverRoot . '/core/css/', ]); // Continue after throw $scss->setIgnoreErrors(true); @@ -313,17 +313,19 @@ class SCSSCacher { /** * Get WebDir root * @param string $path the css file path - * @param string $app the app name + * @param string $appName the app name + * @param string $serverRoot the server root path + * @param string $webRoot the nextcloud installation root path * @return string the webDir */ - private function getWebDir($path, $app) { + private function getWebDir($path, $appName, $serverRoot, $webRoot) { // Detect if path is within server root AND if path is within an app path - if ( strpos($path, $this->serverRoot) === -1 && $appWebPath = \OC_App::getAppWebPath($app) ) { + if ( !strpos($path, $serverRoot) && $appWebPath = \OC_App::getAppWebPath($appName) ) { // Get the file path within the app directory - $appDirectoryPath = explode($app, $path)[1]; + $appDirectoryPath = explode($appName, $path)[1]; // Remove the webroot - return str_replace(\OC::$WEBROOT, '', $appWebPath.$appDirectoryPath); + return str_replace($webRoot, '', $appWebPath.$appDirectoryPath); } - return \OC::$WEBROOT.substr($path, strlen($this->serverRoot)); + return $webRoot.substr($path, strlen($serverRoot)); } } diff --git a/tests/lib/Template/SCSSCacherTest.php b/tests/lib/Template/SCSSCacherTest.php index 27d427aa34..6ecfc0e7aa 100644 --- a/tests/lib/Template/SCSSCacherTest.php +++ b/tests/lib/Template/SCSSCacherTest.php @@ -384,4 +384,41 @@ class SCSSCacherTest extends \Test\TestCase { $this->assertEquals(substr($result, 1), $actual); } + public function dataGetWebDir() { + return [ + ['/http/core/css', 'core', '', '/http', '/core/css'], + ['/http/apps/test/css', 'test', '', '/http', '/apps/test/css'], + ['/http/nextcloud/core/css', 'core', '/nextcloud', '/http/nextcloud', '/nextcloud/core/css'], + ['/http/nextcloud/apps/test/css', 'test', '/nextcloud', '/http/nextcloud', '/nextcloud/apps/test/css'], + ['/srv/apps2/test/css', 'test', '', '/http', '/apps2/test/css'], + ['/srv/apps2/test/css', 'test', '/nextcloud', '/http/nextcloud', '/apps2/test/css'] + ]; + } + + private function randomString() { + return sha1(uniqid(mt_rand(), true)); + } + + /** + * @param $path + * @param $appName + * @param $webRoot + * @param $serverRoot + * @dataProvider dataGetWebDir + */ + public function testgetWebDir($path, $appName, $webRoot, $serverRoot, $correctWebDir) { + $tmpDir = sys_get_temp_dir().'/'.$this->randomString(); + // Adding fake apps folder and create fake app install + \OC::$APPSROOTS[] = [ + 'path' => $tmpDir.'/srv/apps2', + 'url' => '/apps2', + 'writable' => false + ]; + mkdir($tmpDir.$path, 0777, true); + $actual = self::invokePrivate($this->scssCacher, 'getWebDir', [$tmpDir.$path, $appName, $tmpDir.$serverRoot, $webRoot]); + $this->assertEquals($correctWebDir, $actual); + array_pop(\OC::$APPSROOTS); + rmdir($tmpDir.$path); + } + }