diff --git a/lib/Config/Renderer.php b/lib/Config/Renderer.php
index e741e30410..5e7a92e097 100644
--- a/lib/Config/Renderer.php
+++ b/lib/Config/Renderer.php
@@ -66,7 +66,8 @@ class Renderer {
function setupGlobalVariables() {
$this->renderer->addExtension(new Twig\Assets(array(
'version' => Env::$version,
- 'assets_url' => Env::$assets_url
+ 'assets_url' => Env::$assets_url,
+ 'assets_path' => Env::$assets_path
)));
}
diff --git a/lib/Twig/Assets.php b/lib/Twig/Assets.php
index 5141e22ae5..94b7a046fe 100644
--- a/lib/Twig/Assets.php
+++ b/lib/Twig/Assets.php
@@ -3,11 +3,7 @@ namespace MailPoet\Twig;
if(!defined('ABSPATH')) exit;
-class Assets
- extends \Twig_Extension
- implements \Twig_Extension_GlobalsInterface
-{
-
+class Assets extends \Twig_Extension implements \Twig_Extension_GlobalsInterface {
private $_globals;
public function __construct($globals) {
@@ -47,12 +43,10 @@ class Assets
$output = array();
foreach($stylesheets as $stylesheet) {
- $url = $this->appendVersionToUrl(
- $this->_globals['assets_url'] . '/css/' . $stylesheet
- );
$output[] = sprintf(
- '',
- $url
+ '',
+ $this->_globals['assets_url'],
+ $this->getAssetFilename('css', $stylesheet)
);
}
@@ -64,12 +58,10 @@ class Assets
$output = array();
foreach($scripts as $script) {
- $url = $this->appendVersionToUrl(
- $this->_globals['assets_url'] . '/js/' . $script
- );
$output[] = sprintf(
- '',
- $url
+ '',
+ $this->_globals['assets_url'],
+ $this->getAssetFilename('js', $script)
);
}
@@ -85,4 +77,16 @@ class Assets
public function appendVersionToUrl($url) {
return add_query_arg('mailpoet_version', $this->_globals['version'], $url);
}
-}
+
+ public function getAssetFileName($asset_type, $asset) {
+ $manifest = sprintf(
+ '%s/%s/manifest.json',
+ $this->_globals['assets_path'],
+ $asset_type,
+ $asset
+ );
+ if(!is_file($manifest)) return $asset;
+ $manifest = json_decode(file_get_contents($manifest), true);
+ return (!empty($manifest[$asset])) ? $manifest[$asset] : $asset;
+ }
+}
\ No newline at end of file
diff --git a/tests/unit/Twig/AssetsTest.php b/tests/unit/Twig/AssetsTest.php
index 9a40321e69..2d0877e091 100644
--- a/tests/unit/Twig/AssetsTest.php
+++ b/tests/unit/Twig/AssetsTest.php
@@ -1,54 +1,120 @@
assets_url = 'https://www.testing.com/wp-content/plugins/mailpoet/assets';
+ $this->assets_path = Env::$temp_path;
+ $this->assets_path_js = $this->assets_path . '/js';
+ $this->assets_path_css = $this->assets_path . '/css';
+ $this->assets_manifest_js = $this->assets_path_js . '/manifest.json';
+ $this->assets_manifest_css = $this->assets_path_css . '/manifest.json';
$this->version = '1.2.3';
- $this->assetsExtension = new Assets(array(
- 'assets_url' => $this->assets_url,
- 'version' => $this->version
- ));
+ $this->assets_extension = new Assets(
+ array(
+ 'assets_url' => $this->assets_url,
+ 'assets_path' => $this->assets_path,
+ 'version' => $this->version
+ )
+ );
+ $this->_after(); // delete folders if any were present before the test suite was initialized
}
- function testItGeneratesJavascriptTags() {
- expect($this->assetsExtension->generateJavascript('script1.js', 'script2.js'))->equals(
- ''
+ function _before() {
+ $this->createDir($this->assets_path_js);
+ $this->createDir($this->assets_path_css);
+ }
+
+ function testItGeneratesJavascriptTagsForAssetsUsinManifestFile() {
+ $manifest = file_put_contents(
+ $this->assets_manifest_js,
+ json_encode(
+ array(
+ 'script1.js' => 'script1.hash.js',
+ 'script2.js' => 'script2.hash.js'
+ )
+ )
+ );
+ expect($this->assets_extension->generateJavascript('script1.js', 'script2.js'))->equals(
+ ''
. "\n"
- . ''
+ . ''
);
}
- function testItGeneratesStylesheetTags() {
- expect($this->assetsExtension->generateStylesheet('style1.css', 'style2.css'))->equals(
- ''
+ function testItGeneratesJavascriptTagsForAssetsWhenManifestFileDoesNotExist() {
+ expect($this->assets_extension->generateJavascript('script1.js', 'script2.js'))->equals(
+ ''
. "\n"
- . ''
+ . ''
+ );
+ }
+
+ function testItGeneratesStylesheetTagsForAssetsUsingManifestFile() {
+ $manifest = file_put_contents(
+ $this->assets_manifest_css,
+ json_encode(
+ array(
+ 'style1.css' => 'style1.hash.css',
+ 'style2.css' => 'style2.hash.css'
+ )
+ )
+ );
+ expect($this->assets_extension->generateStylesheet('style1.css', 'style2.css'))->equals(
+ ''
+ . "\n"
+ . ''
+ );
+ }
+
+ function testItGeneratesStylesheetTagsWhenManifestFileDoesNotExist() {
+ expect($this->assets_extension->generateStylesheet('style1.css', 'style2.css'))->equals(
+ ''
+ . "\n"
+ . ''
);
}
function testItGeneratesImageUrls() {
- expect($this->assetsExtension->generateImageUrl('image1.png'))->equals(
+ expect($this->assets_extension->generateImageUrl('image1.png'))->equals(
$this->assets_url . '/img/image1.png?mailpoet_version=' . $this->version
);
}
function testItAppendsVersionToUrl() {
$without_file = 'http://url.com/';
- expect($this->assetsExtension->appendVersionToUrl($without_file))->equals(
+ expect($this->assets_extension->appendVersionToUrl($without_file))->equals(
$without_file . '?mailpoet_version=' . $this->version
);
$with_file = 'http://url.com/file.php';
- expect($this->assetsExtension->appendVersionToUrl($with_file))->equals(
+ expect($this->assets_extension->appendVersionToUrl($with_file))->equals(
$with_file . '?mailpoet_version=' . $this->version
);
$with_folder = 'http://url.com/folder/file.php';
- expect($this->assetsExtension->appendVersionToUrl($with_folder))->equals(
+ expect($this->assets_extension->appendVersionToUrl($with_folder))->equals(
$with_folder . '?mailpoet_version=' . $this->version
);
$with_query_string = 'http://url.com/folder/file.php?name=value';
- expect($this->assetsExtension->appendVersionToUrl($with_query_string))->equals(
+ expect($this->assets_extension->appendVersionToUrl($with_query_string))->equals(
$with_query_string . '&mailpoet_version=' . $this->version
);
}
-}
+
+ function _after() {
+ $this->removeDir($this->assets_path_js);
+ $this->removeDir($this->assets_path_css);
+ }
+
+ private function createDir($dir) {
+ if(is_dir($dir)) return;
+ mkdir($dir);
+ }
+
+ private function removeDir($dir) {
+ if(!is_dir($dir)) return;
+ array_map('unlink', glob($dir . '/*.*'));
+ rmdir($dir);
+ }
+}
\ No newline at end of file