mirror of
https://github.com/mrclay/minify.git
synced 2025-08-12 17:14:24 +02:00
More thorough test_Minify.php
Better var/method naming.
This commit is contained in:
@@ -57,21 +57,21 @@ class Minify {
|
|||||||
* @param string type This should be the filename of the controller without
|
* @param string type This should be the filename of the controller without
|
||||||
* extension. e.g. 'Group'
|
* extension. e.g. 'Group'
|
||||||
*
|
*
|
||||||
* @param array $spec options for the controller's constructor
|
* @param array $ctrlOptions options for the controller's constructor
|
||||||
*
|
*
|
||||||
* @param array $options options passed on to Minify
|
* @param array $minOptions options passed on to Minify
|
||||||
*
|
*
|
||||||
* @return mixed false on failure or array of content and headers sent
|
* @return mixed false on failure or array of content and headers sent
|
||||||
*/
|
*/
|
||||||
public static function serve($type, $spec = array(), $options = array()) {
|
public static function serve($type, $ctrlOptions = array(), $minOptions = array()) {
|
||||||
$class = 'Minify_Controller_' . $type;
|
$class = 'Minify_Controller_' . $type;
|
||||||
if (! class_exists($class, false)) {
|
if (! class_exists($class, false)) {
|
||||||
require_once "Minify/Controller/{$type}.php";
|
require_once "Minify/Controller/{$type}.php";
|
||||||
}
|
}
|
||||||
$ctrl = new $class($spec, $options);
|
$ctrl = new $class($ctrlOptions, $minOptions);
|
||||||
$ret = self::handleRequest($ctrl);
|
$ret = self::handleRequest($ctrl);
|
||||||
if (false === $ret) {
|
if (false === $ret) {
|
||||||
if (! isset($ctrl->options['quiet']) || ! $ctrl->options['quiet']) {
|
if (! isset($ctrl->minOptions['quiet']) || ! $ctrl->minOptions['quiet']) {
|
||||||
header("HTTP/1.0 400 Bad Request");
|
header("HTTP/1.0 400 Bad Request");
|
||||||
exit('400 Bad Request');
|
exit('400 Bad Request');
|
||||||
}
|
}
|
||||||
@@ -95,7 +95,7 @@ class Minify {
|
|||||||
}
|
}
|
||||||
|
|
||||||
self::$_controller = $controller;
|
self::$_controller = $controller;
|
||||||
self::_setOptions();
|
self::_resolveOptions($controller->minOptions);
|
||||||
|
|
||||||
$cgOptions = array(
|
$cgOptions = array(
|
||||||
'lastModifiedTime' => self::$_options['lastModifiedTime']
|
'lastModifiedTime' => self::$_options['lastModifiedTime']
|
||||||
@@ -194,13 +194,12 @@ class Minify {
|
|||||||
private static $_cache = null;
|
private static $_cache = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set class options based on controller's options and defaults
|
* Resolve Minify options based on those passed from controller and Minify's defaults
|
||||||
*
|
*
|
||||||
* @return null
|
* @return null
|
||||||
*/
|
*/
|
||||||
private static function _setOptions()
|
private static function _resolveOptions($ctrlOptions)
|
||||||
{
|
{
|
||||||
$given = self::$_controller->options;
|
|
||||||
self::$_options = array_merge(array(
|
self::$_options = array_merge(array(
|
||||||
// default options
|
// default options
|
||||||
'isPublic' => true
|
'isPublic' => true
|
||||||
@@ -211,16 +210,16 @@ class Minify {
|
|||||||
,'contentTypeCharset' => null // leave out of Content-Type header
|
,'contentTypeCharset' => null // leave out of Content-Type header
|
||||||
,'setExpires' => null // send Expires header
|
,'setExpires' => null // send Expires header
|
||||||
,'quiet' => false
|
,'quiet' => false
|
||||||
), $given);
|
), $ctrlOptions);
|
||||||
$defaultMinifiers = array(
|
$defaultMinifiers = array(
|
||||||
'text/css' => array('Minify_CSS', 'minify')
|
'text/css' => array('Minify_CSS', 'minify')
|
||||||
,'application/x-javascript' => array('Minify_Javascript', 'minify')
|
,'application/x-javascript' => array('Minify_Javascript', 'minify')
|
||||||
,'text/html' => array('Minify_HTML', 'minify')
|
,'text/html' => array('Minify_HTML', 'minify')
|
||||||
);
|
);
|
||||||
if (! isset($given['minifiers'])) {
|
if (! isset($ctrlOptions['minifiers'])) {
|
||||||
$given['minifiers'] = array();
|
$ctrlOptions['minifiers'] = array();
|
||||||
}
|
}
|
||||||
self::$_options['minifiers'] = array_merge($defaultMinifiers, $given['minifiers']);
|
self::$_options['minifiers'] = array_merge($defaultMinifiers, $ctrlOptions['minifiers']);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -18,7 +18,7 @@ class Minify_Controller_Base {
|
|||||||
public $sources = array();
|
public $sources = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var array options to be read by read by Minify
|
* @var array options to be read by Minify
|
||||||
*
|
*
|
||||||
* Any unspecified options will use the default values.
|
* Any unspecified options will use the default values.
|
||||||
*
|
*
|
||||||
@@ -63,7 +63,7 @@ class Minify_Controller_Base {
|
|||||||
* (bool, default = false)
|
* (bool, default = false)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public $options = array();
|
public $minOptions = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var bool was the user request valid
|
* @var bool was the user request valid
|
||||||
@@ -111,7 +111,7 @@ class Minify_Controller_Base {
|
|||||||
}
|
}
|
||||||
$options['lastModifiedTime'] = $max;
|
$options['lastModifiedTime'] = $max;
|
||||||
}
|
}
|
||||||
$this->options = $options;
|
$this->minOptions = $options;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
1
web/test/minify/minified.css
Normal file
1
web/test/minify/minified.css
Normal file
@@ -0,0 +1 @@
|
|||||||
|
@import url(more.css);body,td,th{font-family:Verdana, "Bitstream Vera Sans",sans-serif;font-size:12px}.nav{margin-left:20%}#main-nav{background-color:red;border:1px solid #0f7}div#content h1+p{padding-top:0;margin-top:0}.float-l{float:left}.form-suggest{height:200px;background:#DEE2D0;vertical-align:top}.form-input input{font-size:10px}.hide{display:none}.form-input textarea{font-size:11px;width:350px}.form-label{font-size:10px;font-weight:bold;line-height:25px;padding-right:10px;text-align:right;width:100px;color: #39738F}.font-9{font-size:9px}.form-topic{font-weight:bold}.form-error{color:red}.inline{display:inline}.space-10{clear:both;font-size:10px;height:10px;line-height:10px}.suggest-success{color:green;padding-left:10px;font-size:11px;font-weight:bold}.top{vertical-align:top}table td{padding:3px}a:link,a:active,a:visited,a.postlink{color: #069;text-decoration:none}a:hover{color: #DD6900}a.admin:hover,a.mod:hover{color: #DD6900}a.but,a.but:hover,a.but:visited{color: #000;text-decoration:none}a.topictitle:visited{color: #5493B4}a.topictitle:hover{color: #DD6900}body{color: #000;font:11px Verdana,Arial,Helvetica,sans-serif;margin:0 10px 10px 10px;padding:0;overflow:auto}font,th,td,p{font:12px Verdana,Arial,Helvetica,sans-serif}form{display:inline}hr{border:0px solid #FFF;border-top-width:1px;height:0px}img{border:0 solid}input{font:11px Verdana,Arial,Helvetica,sans-serif}input.button,input.liteoption,.fakebut{background: #FAFAFA;border:1px solid #000;font-size:11px}input.catbutton{background: #FAFAFA;border:1px solid #000;font-size:10px}input.mainoption{background: #FAFAFA;border:1px solid #000;font-size:11px;font-weight:bold}input.post,textarea.post{background: #FFF;border:1px solid #000;font:11px Verdana,Arial,Helvetica,sans-serif;padding-bottom:2px;padding-left:2px}select{background: #FFF;font:11px Verdana,Arial,Helvetica,sans-serif}table{text-align:left}td{vertical-align:middle}td.cat{background-color: #C2C6BA;font-weight:bold;height:20px;letter-spacing:1px;text-indent:4px}td.genmed,.genmed{font-size:11px}td.rowpic{background: #C2C6BA}td.spacerow{background: #E5E6E2}th{background-color: #FADD31;background-image:url(images/cellpic3.gif);background-repeat:repeat-x;color: #68685E;font-size:11px;font-weight:bold;line-height:16px;height:16px;padding-left:8px;padding-right:8px;text-align:center;white-space:nowrap}.admin,.mod{font-size:11px;font-weight:bold}.admin,a.admin,a.admin:visited{color: #FFA34F}.bodyline{background: #FFF;border:1px solid #98AAB1}.center{text-align:center}.code{background: #FAFAFA;border:1px solid #D1D7DC;color: #060;font:12px Courier,"Courier New",sans-serif;padding:5px}.errorline{background: #E5E6E2;border:1px solid #8F8B8B;color:#D92A2A}.explaintitle{color: #5C81B1;font-size:11px;font-weight:bold}.forumline{background: #FFF}.gensmall{font-size:10px}.h1-font{color: #069;display:inline;font:bold 13px Verdana,Arial,Helvetica,sans-serif;margin:0;text-decoration:none}.h2-font{display:inline;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:11px}.height1{height:1px}.height22{height:22px}.height25{height:25px}.height28{height:28px}.height30{height:30px}.height40{height:40px}.helpline{border:0 solid;font-size:10px}.imgfolder{margin:1px 4px 1px 4px}.imgspace{margin-left:1px;margin-right:2px}.imgtopic,.imgicon{margin-left:3px}.left{text-align:left}.maintitle,h1,h2{color: #5C81B1;font:bold 20px/120% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;text-decoration:none}.maxwidth{width:100%}.mod,a.mod,a.mod:visited{color: #060}.name{font-size:11px;font-weight:bold}.nav{font-size:11px;font-weight:bold}.nowrap{white-space:nowrap}.postbody{font-size:12px;line-height:125%}.postbody a{text-decoration:underline}.postdetails{color: #00396A;font-size:10px}.quote{background: #F3F3EF;border:1px solid #C2C6BA;color: #069;font-size:11px;line-height:125%}.right{text-align:right}.row1{background: #F0F0EB}.row2,.helpline{background: #E5E6E2}.row3{background: #DBDBD4}.subtitle,h2{font:bold 18px/180% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;text-decoration:none}.topictitle{color: #000;font-size:11px;font-weight:bold}.underline{text-decoration:underline}.top{vertical-align:top}.image-hspace{margin-right:3px}.clear{clear:both}
|
12
web/test/minify/minified.js
Normal file
12
web/test/minify/minified.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
(function(){var
|
||||||
|
reMailto=/^mailto:my_name_is_(\S+)_and_the_domain_is_(\S+)$/,reRemoveTitleIf=/^my name is/,oo=window.onload,fixHrefs=function(){var i=0,l,m;while(l=document.links[i++]){if(m=l.href.match(reMailto)){l.href='mailto:'+m[1]+'@'+m[2];if(reRemoveTitleIf.test(l.title)){l.title='';}}}};window.onload=function(){oo&&oo();fixHrefs();};})();;var MrClay=window.MrClay||{};MrClay.QueryString=function(){var parse=function(str){var assignments=str.split('&'),obj={},propValue;for(var i=0,l=assignments.length;i<l;++i){propValue=assignments[i].split('=');if(propValue.length>2||-1!=propValue[0].indexOf('+')||propValue[0]==''){continue;}
|
||||||
|
if(propValue.length==1){propValue[1]=propValue[0];}
|
||||||
|
obj[unescape(propValue[0])]=unescape(propValue[1].replace(/\+/g,' '));}
|
||||||
|
return obj;};function construct_(spec){spec=spec||window;if(typeof spec=='object'){this.window=spec;spec=spec.location.search.substr(1);}else{this.window=window;}
|
||||||
|
this.vars=parse(spec);}
|
||||||
|
construct_.reload=function(vars,window_){window_=window_||window;vars=vars||(new MrClay.QueryString(window_)).vars;var l=window_.location,currUrl=l.href,s=MrClay.QueryString.toString(vars),newUrl=l.protocol+'//'+l.hostname+l.pathname
|
||||||
|
+(s?'?'+s:'')+l.hash;if(currUrl==newUrl){l.reload();}else{l.assign(newUrl);}};construct_.get=function(key,default_,window_){window_=window_||window;return(new MrClay.QueryString(window_)).get(key,default_);};construct_.set=function(key,value,window_){window_=window_||window;(new MrClay.QueryString(window_)).set(key,value).reload();};construct_.toString=function(vars){var pieces=[];for(var prop in vars){pieces.push(escape(prop)+'='+escape(vars[prop]));}
|
||||||
|
return pieces.join('&');};construct_.prototype.reload=function(){MrClay.QueryString.reload(this.vars,this.window);return this;};construct_.prototype.get=function(key,default_){if(typeof default_=='undefined'){default_=null;}
|
||||||
|
return(this.vars[key]==null)?default_:this.vars[key];};construct_.prototype.set=function(key,value){var obj={};if(typeof key=='string'){obj[key]=value;}else{obj=key;}
|
||||||
|
for(var prop in obj){if(obj[prop]==null){delete this.vars[prop];}else{this.vars[prop]=obj[prop];}}
|
||||||
|
return this;};construct_.prototype.toString=function(){return QueryString.toString(this.vars);};return construct_;}();
|
@@ -1,23 +1,93 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
require '_inc.php';
|
require '_inc.php';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Note: All Minify classes are E_STRICT except for Cache_Lite_File.
|
* Note: All Minify classes are E_STRICT except for Cache_Lite_File.
|
||||||
*/
|
*/
|
||||||
error_reporting(E_ALL);
|
error_reporting(E_ALL);
|
||||||
|
|
||||||
require 'Minify.php';
|
require 'Minify.php';
|
||||||
|
$tomorrow = time() + 86400;
|
||||||
|
$lastModified = time() - 86400;
|
||||||
|
|
||||||
// cache output files on filesystem
|
|
||||||
if ($minifyCachePath) {
|
|
||||||
Minify::useServerCache($minifyCachePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Minify::$cacheUnencodedVersion = false;
|
|
||||||
|
|
||||||
// serve an array of files as one
|
// Test minifying JS and serving with Expires header
|
||||||
Minify::serve('Files', array(
|
|
||||||
|
$expected = array(
|
||||||
|
// Minify_Javascript always converts to \n line endings
|
||||||
|
'content' => preg_replace('/\\r\\n?/', "\n", file_get_contents($thisDir . '/minify/minified.js'))
|
||||||
|
,'headers' => array (
|
||||||
|
'Cache-Control' => 'public',
|
||||||
|
'Expires' => gmdate('D, d M Y H:i:s \G\M\T', $tomorrow),
|
||||||
|
'Content-Type' => 'application/x-javascript',
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$output = Minify::serve('Files', array(
|
||||||
$thisDir . '/minify/email.js'
|
$thisDir . '/minify/email.js'
|
||||||
,$thisDir . '/minify/QueryString.js'
|
,$thisDir . '/minify/QueryString.js'
|
||||||
|
), array(
|
||||||
|
'quiet' => true
|
||||||
|
,'setExpires' => $tomorrow
|
||||||
|
,'encodeOutput' => false
|
||||||
));
|
));
|
||||||
|
$passed = assertTrue($expected === $output, 'Minify - JS and Expires');
|
||||||
|
echo "\nOutput: " .var_export($output, 1). "\n\n";
|
||||||
|
if (! $passed) {
|
||||||
|
echo "\n\n\n\n---Expected: " .var_export($expected, 1). "\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Test minifying CSS and responding with Etag/Last-Modified
|
||||||
|
|
||||||
|
// don't allow conditional headers
|
||||||
|
unset($_SERVER['HTTP_IF_NONE_MATCH'], $_SERVER['HTTP_IF_MODIFIED_SINCE']);
|
||||||
|
|
||||||
|
$expected = array(
|
||||||
|
'content' => file_get_contents($thisDir . '/minify/minified.css')
|
||||||
|
,'headers' => array (
|
||||||
|
'Last-Modified' => gmdate('D, d M Y H:i:s \G\M\T', $lastModified),
|
||||||
|
'ETag' => "\"{$lastModified}pub\"",
|
||||||
|
'Cache-Control' => 'max-age=0, public, must-revalidate',
|
||||||
|
'Content-Type' => 'text/css',
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$output = Minify::serve('Files', array(
|
||||||
|
$thisDir . '/css/styles.css'
|
||||||
|
,$thisDir . '/css/subsilver.css'
|
||||||
|
), array(
|
||||||
|
'quiet' => true
|
||||||
|
,'lastModifiedTime' => $lastModified
|
||||||
|
,'encodeOutput' => false
|
||||||
|
));
|
||||||
|
$passed = assertTrue($expected === $output, 'Minify - CSS and Etag/Last-Modified');
|
||||||
|
echo "\nOutput: " .var_export($output, 1). "\n\n";
|
||||||
|
if (! $passed) {
|
||||||
|
echo "\n\n\n\n---Expected: " .var_export($expected, 1). "\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Test 304 response
|
||||||
|
|
||||||
|
// simulate conditional headers
|
||||||
|
$_SERVER['HTTP_IF_NONE_MATCH'] = "\"{$lastModified}pub\"";
|
||||||
|
$_SERVER['HTTP_IF_MODIFIED_SINCE'] = gmdate('D, d M Y H:i:s \G\M\T', $lastModified);
|
||||||
|
|
||||||
|
$expected = array (
|
||||||
|
'content' => '',
|
||||||
|
'headers' => array (
|
||||||
|
'_responseCode' => 'HTTP/1.0 304 Not Modified',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
$output = Minify::serve('Files', array(
|
||||||
|
$thisDir . '/css/styles.css'
|
||||||
|
), array(
|
||||||
|
'quiet' => true
|
||||||
|
,'lastModifiedTime' => $lastModified
|
||||||
|
,'encodeOutput' => false
|
||||||
|
));
|
||||||
|
$passed = assertTrue($expected === $output, 'Minify - 304 response');
|
||||||
|
echo "\nOutput: " .var_export($output, 1). "\n\n";
|
||||||
|
if (! $passed) {
|
||||||
|
echo "\n\n\n\n---Expected: " .var_export($expected, 1). "\n\n";
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user