diff options
Diffstat (limited to 'tests/lib/Template/CSSResourceLocatorTest.php')
-rw-r--r-- | tests/lib/Template/CSSResourceLocatorTest.php | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/tests/lib/Template/CSSResourceLocatorTest.php b/tests/lib/Template/CSSResourceLocatorTest.php new file mode 100644 index 00000000000..2ae37999b32 --- /dev/null +++ b/tests/lib/Template/CSSResourceLocatorTest.php @@ -0,0 +1,123 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace Test\Template; + +use OC\AppConfig; +use OC\Files\AppData\AppData; +use OC\Files\AppData\Factory; +use OC\Template\CSSResourceLocator; +use OCA\Theming\ThemingDefaults; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\Files\IAppData; +use OCP\ICacheFactory; +use OCP\IConfig; +use OCP\IURLGenerator; +use Psr\Log\LoggerInterface; + +class CSSResourceLocatorTest extends \Test\TestCase { + /** @var IAppData|\PHPUnit\Framework\MockObject\MockObject */ + protected $appData; + /** @var IURLGenerator|\PHPUnit\Framework\MockObject\MockObject */ + protected $urlGenerator; + /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ + protected $config; + /** @var ThemingDefaults|\PHPUnit\Framework\MockObject\MockObject */ + protected $themingDefaults; + /** @var ICacheFactory|\PHPUnit\Framework\MockObject\MockObject */ + protected $cacheFactory; + /** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */ + protected $logger; + /** @var ITimeFactory|\PHPUnit\Framework\MockObject\MockObject */ + private $timeFactory; + /** @var AppConfig|\PHPUnit\Framework\MockObject\MockObject */ + private $appConfig; + + protected function setUp(): void { + parent::setUp(); + + $this->logger = $this->createMock(LoggerInterface::class); + $this->appData = $this->createMock(AppData::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->config = $this->createMock(IConfig::class); + $this->cacheFactory = $this->createMock(ICacheFactory::class); + $this->themingDefaults = $this->createMock(ThemingDefaults::class); + $this->timeFactory = $this->createMock(ITimeFactory::class); + $this->appConfig = $this->createMock(AppConfig::class); + } + + private function cssResourceLocator() { + /** @var Factory|\PHPUnit\Framework\MockObject\MockObject $factory */ + $factory = $this->createMock(Factory::class); + $factory->method('get')->with('css')->willReturn($this->appData); + return new CSSResourceLocator( + $this->logger, + 'theme', + ['core' => 'map'], + ['3rd' => 'party'], + ); + } + + private function rrmdir($directory) { + $files = array_diff(scandir($directory), ['.','..']); + foreach ($files as $file) { + if (is_dir($directory . '/' . $file)) { + $this->rrmdir($directory . '/' . $file); + } else { + unlink($directory . '/' . $file); + } + } + return rmdir($directory); + } + + private function randomString() { + return sha1(uniqid(mt_rand(), true)); + } + + public function testFindWithAppPathSymlink(): void { + // First create new apps path, and a symlink to it + $apps_dirname = $this->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-css-app'); + + // Use the symlink as the app path + \OC::$APPSROOTS[] = [ + 'path' => $new_apps_path_symlink, + 'url' => '/css-apps-test', + 'writable' => false, + ]; + + $locator = $this->cssResourceLocator(); + $locator->find(['test-css-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-css-app'; + $expectedWebRoot = \OC::$WEBROOT . '/css-apps-test/test-css-app'; + $expectedFile = 'test-file.css'; + + $this->assertEquals($expectedRoot, $root, + 'Ensure the app path symlink is resolved into the real path'); + $this->assertEquals($expectedWebRoot, $webRoot); + $this->assertEquals($expectedFile, $file); + + array_pop(\OC::$APPSROOTS); + unlink($new_apps_path_symlink); + $this->rrmdir($new_apps_path); + } +} |