From ea8ed5067d3c4e0b98e1bf8ef30461b6d3d5d7ff Mon Sep 17 00:00:00 2001 From: Robbie Averill Date: Sun, 17 Dec 2017 16:09:22 +1300 Subject: [PATCH] FIX Allow Requirements::block to handle module resource paths --- src/View/Requirements_Backend.php | 6 +++- tests/php/View/RequirementsTest.php | 51 ++++++++++++++++++++++------- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/src/View/Requirements_Backend.php b/src/View/Requirements_Backend.php index abee657b8..1473ff22b 100644 --- a/src/View/Requirements_Backend.php +++ b/src/View/Requirements_Backend.php @@ -733,10 +733,14 @@ class Requirements_Backend * Note that blocking should be used sparingly because it's hard to trace where an file is * being blocked from. * - * @param string|int $fileOrID + * @param string|int $fileOrID Relative path from webroot, module resource reference or + * requirement API ID */ public function block($fileOrID) { + if (is_string($fileOrID)) { + $fileOrID = ModuleResourceLoader::singleton()->resolvePath($fileOrID); + } $this->blocked[$fileOrID] = $fileOrID; } diff --git a/tests/php/View/RequirementsTest.php b/tests/php/View/RequirementsTest.php index 6001322fc..a0311abb2 100644 --- a/tests/php/View/RequirementsTest.php +++ b/tests/php/View/RequirementsTest.php @@ -3,10 +3,8 @@ namespace SilverStripe\View\Tests; use InvalidArgumentException; -use SilverStripe\Control\Controller; use SilverStripe\Core\Injector\Injector; use SilverStripe\Dev\SapphireTest; -use SilverStripe\Control\Director; use SilverStripe\View\Requirements; use SilverStripe\View\ArrayData; use SilverStripe\Assets\Tests\Storage\AssetStoreTest\TestAssetStore; @@ -669,8 +667,9 @@ class RequirementsTest extends SapphireTest $this->setupRequirements($backend); $backend->javascript($basePath . '/a.js'); - $this->assertTrue( - count($backend->getJavascript()) == 1, + $this->assertCount( + 1, + $backend->getJavascript(), "There should be only 1 file included in required javascript." ); $this->assertArrayHasKey( @@ -680,14 +679,16 @@ class RequirementsTest extends SapphireTest ); $backend->javascript($basePath . '/b.js'); - $this->assertTrue( - count($backend->getJavascript()) == 2, + $this->assertCount( + 2, + $backend->getJavascript(), "There should be 2 files included in required javascript." ); $backend->block($basePath . '/a.js'); - $this->assertTrue( - count($backend->getJavascript()) == 1, + $this->assertCount( + 1, + $backend->getJavascript(), "There should be only 1 file included in required javascript." ); $this->assertArrayNotHasKey( @@ -702,8 +703,9 @@ class RequirementsTest extends SapphireTest ); $backend->css($basePath . '/a.css'); - $this->assertTrue( - count($backend->getCSS()) == 1, + $this->assertCount( + 1, + $backend->getCSS(), "There should be only 1 file included in required css." ); $this->assertArrayHasKey( @@ -713,12 +715,37 @@ class RequirementsTest extends SapphireTest ); $backend->block($basePath . '/a.css'); - $this->assertTrue( - count($backend->getCSS()) == 0, + $this->assertCount( + 0, + $backend->getCSS(), "There should be nothing in required css after file has been blocked." ); } + public function testAppendAndBlockWithModuleResourceLoader() + { + $basePath = $this->getThemeRoot(); + + /** @var Requirements_Backend $backend */ + $backend = Injector::inst()->create(Requirements_Backend::class); + $this->setupRequirements($backend); + + // Note: assumes that client/styles/debug.css is "exposed" + $backend->css('silverstripe/framework:client/styles/debug.css'); + $this->assertCount( + 1, + $backend->getCSS(), + 'Module resource can be loaded via resources reference' + ); + + $backend->block('silverstripe/framework:client/styles/debug.css'); + $this->assertCount( + 0, + $backend->getCSS(), + 'Module resource can be blocked via resources reference' + ); + } + public function testConditionalTemplateRequire() { $testPath = $this->getThemeRoot();