FIX Allow Requirements::block to handle module resource paths

This commit is contained in:
Robbie Averill 2017-12-17 16:09:22 +13:00
parent 1c72d6946d
commit ea8ed5067d
2 changed files with 44 additions and 13 deletions

View File

@ -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;
}

View File

@ -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();