summaryrefslogtreecommitdiffstats
path: root/tests/lib/Template/JSResourceLocatorTest.php
diff options
context:
space:
mode:
authorKyle Fazzari <kyrofa@ubuntu.com>2017-11-07 14:54:21 -0800
committerKyle Fazzari <kyrofa@ubuntu.com>2017-11-07 14:54:21 -0800
commit06ba1a8a02f08e066ad97cdd192534c296f3a640 (patch)
tree4086187ac229989089e35cb87262a8d7884cd6c5 /tests/lib/Template/JSResourceLocatorTest.php
parentb0d296639cfc5d0460987787cc9869c5e5473d85 (diff)
downloadnextcloud-server-06ba1a8a02f08e066ad97cdd192534c296f3a640.tar.gz
nextcloud-server-06ba1a8a02f08e066ad97cdd192534c296f3a640.zip
JSResourceLocator: account for symlinks in app path
Signed-off-by: Kyle Fazzari <kyrofa@ubuntu.com>
Diffstat (limited to 'tests/lib/Template/JSResourceLocatorTest.php')
-rw-r--r--tests/lib/Template/JSResourceLocatorTest.php139
1 files changed, 139 insertions, 0 deletions
diff --git a/tests/lib/Template/JSResourceLocatorTest.php b/tests/lib/Template/JSResourceLocatorTest.php
new file mode 100644
index 00000000000..49f0fb67f48
--- /dev/null
+++ b/tests/lib/Template/JSResourceLocatorTest.php
@@ -0,0 +1,139 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Kyle Fazzari <kyrofa@ubuntu.com>
+ *
+ * @author Kyle Fazzari <kyrofa@ubuntu.com>
+ *
+ * @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 Test\Template;
+
+use OC\Template\JSCombiner;
+use OCP\Files\IAppData;
+use OCP\IURLGenerator;
+use OCP\ICache;
+use OC\SystemConfig;
+use OCP\ILogger;
+use OC\Template\JSResourceLocator;
+
+function rrmdir($directory) {
+ $files = array_diff(scandir($directory), array('.','..'));
+ foreach ($files as $file) {
+ if (is_dir($directory . '/' . $file)) {
+ rrmdir($directory . '/' . $file);
+ } else {
+ unlink($directory . '/' . $file);
+ }
+ }
+ return rmdir($directory);
+}
+
+function randomString() {
+ return sha1(uniqid(mt_rand(), true));
+}
+
+class JSResourceLocatorTest extends \Test\TestCase {
+ /** @var IAppData|\PHPUnit_Framework_MockObject_MockObject */
+ protected $appData;
+ /** @var IURLGenerator|\PHPUnit_Framework_MockObject_MockObject */
+ protected $urlGenerator;
+ /** @var SystemConfig|\PHPUnit_Framework_MockObject_MockObject */
+ protected $config;
+ /** @var ICache|\PHPUnit_Framework_MockObject_MockObject */
+ protected $depsCache;
+ /** @var ILogger|\PHPUnit_Framework_MockObject_MockObject */
+ protected $logger;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->appData = $this->createMock(IAppData::class);
+ $this->urlGenerator = $this->createMock(IURLGenerator::class);
+ $this->config = $this->createMock(SystemConfig::class);
+ $this->depsCache = $this->createMock(ICache::class);
+ $this->logger = $this->createMock(ILogger::class);
+ }
+
+ private function jsResourceLocator() {
+ $jsCombiner = new JSCombiner(
+ $this->appData,
+ $this->urlGenerator,
+ $this->depsCache,
+ $this->config,
+ $this->logger
+ );
+ return new JSResourceLocator(
+ $this->logger,
+ 'theme',
+ array('core'=>'map'),
+ array('3rd'=>'party'),
+ $jsCombiner
+ );
+ }
+
+ public function testConstructor() {
+ $locator = $this->jsResourceLocator();
+ $this->assertAttributeEquals('theme', 'theme', $locator);
+ $this->assertAttributeEquals('core', 'serverroot', $locator);
+ $this->assertAttributeEquals(array('core'=>'map','3rd'=>'party'), 'mapping', $locator);
+ $this->assertAttributeEquals('3rd', 'thirdpartyroot', $locator);
+ $this->assertAttributeEquals('map', 'webroot', $locator);
+ $this->assertAttributeEquals(array(), 'resources', $locator);
+ }
+
+ public function testFindWithAppPathSymlink() {
+ // First create new apps path, and a symlink to it
+ $apps_dirname = randomString();
+ $new_apps_path = sys_get_temp_dir() . '/' . $apps_dirname;
+ $new_apps_path_symlink = $new_apps_path . '_link';
+ mkdir($new_apps_path);
+ symlink($apps_dirname, $new_apps_path_symlink);
+
+ // Create an app within that path
+ mkdir($new_apps_path . '/' . 'test-app');
+
+ // Use the symlink as the app path
+ \OC::$APPSROOTS[] = [
+ 'path' => $new_apps_path_symlink,
+ 'url' => '/apps-test',
+ 'writable' => false,
+ ];
+
+ $locator = $this->jsResourceLocator();
+ $locator->find(array('test-app/test-file'));
+
+ $resources = $locator->getResources();
+ $this->assertCount(1, $resources);
+ $resource = $resources[0];
+ $this->assertCount(3, $resource);
+ $root = $resource[0];
+ $webRoot = $resource[1];
+ $file = $resource[2];
+
+ $expectedRoot = $new_apps_path . '/test-app';
+ $expectedWebRoot = '/apps-test/test-app';
+ $expectedFile = 'test-file.js';
+
+ $this->assertEquals($expectedRoot, $root,
+ 'Ensure the app path symlink is resolved into the real path');
+ $this->assertEquals($expectedWebRoot, $webRoot);
+ $this->assertEquals($expectedFile, $file);
+
+ rrmdir($new_apps_path);
+ }
+}