mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
Tests: Add support for running unit tests via grunt with karma
- Update QUnit to 1.23.1 - Remove unused dl#dl from test/index.html - Remove unused map#imgmap from test/index.html - Ensure all urls to data use baseURI - Add the 'grunt karma:main' task - customContextFile & customDebugFile - Add 'npm run jenkins' script Close gh-3744 Fixes gh-1999
This commit is contained in:
parent
e84d3bc02e
commit
ecd8ddea33
@ -5,3 +5,5 @@ node_js:
|
||||
- "6"
|
||||
- "8"
|
||||
- "9"
|
||||
addons:
|
||||
chrome: stable
|
||||
|
84
Gruntfile.js
84
Gruntfile.js
@ -147,6 +147,88 @@ module.exports = function( grunt ) {
|
||||
"tween"
|
||||
]
|
||||
},
|
||||
karma: {
|
||||
options: {
|
||||
customContextFile: "test/karma.context.html",
|
||||
customDebugFile: "test/karma.debug.html",
|
||||
frameworks: [ "qunit" ],
|
||||
middleware: [ "mockserver" ],
|
||||
plugins: [
|
||||
"karma-*",
|
||||
{
|
||||
"middleware:mockserver": [
|
||||
"factory",
|
||||
require( "./test/middleware-mockserver.js" )
|
||||
]
|
||||
}
|
||||
],
|
||||
files: [
|
||||
"test/data/jquery-1.9.1.js",
|
||||
"external/qunit-assert-step/qunit-assert-step.js",
|
||||
"external/sinon/sinon.js",
|
||||
"external/npo/npo.js",
|
||||
"external/requirejs/require.js",
|
||||
"test/data/testinit.js",
|
||||
|
||||
"dist/jquery.min.js",
|
||||
|
||||
// Replacement for testinit.js#loadTests()
|
||||
"test/data/testrunner.js",
|
||||
"test/unit/basic.js",
|
||||
"test/unit/core.js",
|
||||
"test/unit/callbacks.js",
|
||||
"test/unit/deferred.js",
|
||||
"test/unit/deprecated.js",
|
||||
"test/unit/support.js",
|
||||
"test/unit/data.js",
|
||||
"test/unit/queue.js",
|
||||
"test/unit/attributes.js",
|
||||
"test/unit/event.js",
|
||||
"test/unit/selector.js",
|
||||
"test/unit/traversing.js",
|
||||
"test/unit/manipulation.js",
|
||||
"test/unit/wrap.js",
|
||||
"test/unit/css.js",
|
||||
"test/unit/serialize.js",
|
||||
"test/unit/ajax.js",
|
||||
"test/unit/effects.js",
|
||||
"test/unit/offset.js",
|
||||
"test/unit/dimensions.js",
|
||||
"test/unit/animation.js",
|
||||
"test/unit/tween.js",
|
||||
"test/unit/ready.js",
|
||||
|
||||
{ pattern: "dist/jquery.js", included: false, served: true },
|
||||
{ pattern: "dist/*.map", included: false, served: true },
|
||||
{ pattern: "external/qunit/qunit.css", included: false, served: true },
|
||||
{
|
||||
pattern: "test/**/*.@(js|css|jpg|html|xml)",
|
||||
included: false,
|
||||
served: true
|
||||
}
|
||||
],
|
||||
reporters: [ "dots" ],
|
||||
autoWatch: false,
|
||||
concurrency: 3,
|
||||
captureTimeout: 20 * 1000,
|
||||
|
||||
// To debug tests with Karma:
|
||||
// - Run 'grunt karma:chrome' or 'grunt karma:firefox'
|
||||
// (any karma subtask that has singleRun=false)
|
||||
// - Press "Debug" in the opened browser window.
|
||||
singleRun: false
|
||||
},
|
||||
main: {
|
||||
browsers: [ "ChromeHeadless" ],
|
||||
singleRun: true
|
||||
},
|
||||
chrome: {
|
||||
browsers: [ "Chrome" ]
|
||||
},
|
||||
firefox: {
|
||||
browsers: [ "Firefox" ]
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
files: [ "<%= eslint.dev.src %>" ],
|
||||
tasks: [ "dev" ]
|
||||
@ -222,6 +304,7 @@ module.exports = function( grunt ) {
|
||||
"newer:uglify",
|
||||
"remove_map_comment",
|
||||
"dist:*",
|
||||
"qunit_fixture",
|
||||
"compare_size"
|
||||
] );
|
||||
|
||||
@ -231,6 +314,7 @@ module.exports = function( grunt ) {
|
||||
"uglify",
|
||||
"remove_map_comment",
|
||||
"dist:*",
|
||||
"qunit_fixture",
|
||||
"eslint:dist",
|
||||
"test:fast",
|
||||
"compare_size"
|
||||
|
10
README.md
10
README.md
@ -323,20 +323,20 @@ fireNative( jQuery("#elem")[0], "click" );
|
||||
### Add random number to url to stop caching ###
|
||||
|
||||
```js
|
||||
url( "some/url.php" );
|
||||
url( "some/url" );
|
||||
```
|
||||
|
||||
Example:
|
||||
|
||||
```js
|
||||
url("data/test.html");
|
||||
url("index.html");
|
||||
|
||||
=> "data/test.html?10538358428943"
|
||||
=> "data/index.html?10538358428943"
|
||||
|
||||
|
||||
url("data/test.php?foo=bar");
|
||||
url("mock.php?foo=bar");
|
||||
|
||||
=> "data/test.php?foo=bar&10538358345554"
|
||||
=> "data/mock.php?foo=bar&10538358345554"
|
||||
```
|
||||
|
||||
|
||||
|
22
build/tasks/qunit_fixture.js
Normal file
22
build/tasks/qunit_fixture.js
Normal file
@ -0,0 +1,22 @@
|
||||
var fs = require( "fs" );
|
||||
|
||||
module.exports = function( grunt ) {
|
||||
grunt.registerTask( "qunit_fixture", function() {
|
||||
var dest = "./test/data/qunit-fixture.js";
|
||||
fs.writeFileSync(
|
||||
dest,
|
||||
"// Generated by build/tasks/qunit_fixture.js\n" +
|
||||
"QUnit.config.fixture = " +
|
||||
JSON.stringify(
|
||||
fs.readFileSync(
|
||||
"./test/data/qunit-fixture.html",
|
||||
"utf8"
|
||||
).toString()
|
||||
) +
|
||||
";\n" +
|
||||
"// Compat with QUnit 1.x:\n" +
|
||||
"document.getElementById( \"qunit-fixture\" ).innerHTML = QUnit.config.fixture;\n"
|
||||
);
|
||||
grunt.log.ok( "Updated " + dest + "." );
|
||||
} );
|
||||
};
|
12
external/qunit/qunit.css
vendored
12
external/qunit/qunit.css
vendored
@ -1,12 +1,12 @@
|
||||
/*!
|
||||
* QUnit 1.20.0
|
||||
* http://qunitjs.com/
|
||||
* QUnit 1.23.1
|
||||
* https://qunitjs.com/
|
||||
*
|
||||
* Copyright jQuery Foundation and other contributors
|
||||
* Released under the MIT license
|
||||
* http://jquery.org/license
|
||||
* https://jquery.org/license
|
||||
*
|
||||
* Date: 2015-10-27T17:53Z
|
||||
* Date: 2016-04-12T17:29Z
|
||||
*/
|
||||
|
||||
/** Font Family and Sizes */
|
||||
@ -120,6 +120,10 @@
|
||||
display: list-item;
|
||||
}
|
||||
|
||||
#qunit-tests.hidepass {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#qunit-tests.hidepass li.running,
|
||||
#qunit-tests.hidepass li.pass {
|
||||
visibility: hidden;
|
||||
|
2480
external/qunit/qunit.js
vendored
2480
external/qunit/qunit.js
vendored
File diff suppressed because it is too large
Load Diff
16
package.json
16
package.json
@ -39,18 +39,25 @@
|
||||
"grunt-eslint": "20.0.0",
|
||||
"grunt-git-authors": "3.2.0",
|
||||
"grunt-jsonlint": "1.1.0",
|
||||
"grunt-karma": "2.0.0",
|
||||
"grunt-newer": "1.3.0",
|
||||
"grunt-npmcopy": "0.1.0",
|
||||
"gzip-js": "0.3.2",
|
||||
"husky": "0.14.3",
|
||||
"insight": "0.8.4",
|
||||
"jsdom": "5.6.1",
|
||||
"karma": "1.7.0",
|
||||
"karma-browserstack-launcher": "1.3.0",
|
||||
"karma-chrome-launcher": "2.2.0",
|
||||
"karma-firefox-launcher": "1.0.1",
|
||||
"karma-qunit": "1.2.1",
|
||||
"load-grunt-tasks": "3.5.2",
|
||||
"native-promise-only": "0.8.1",
|
||||
"promises-aplus-tests": "2.1.2",
|
||||
"q": "1.5.0",
|
||||
"qunit-assert-step": "1.1.1",
|
||||
"qunitjs": "2.4.0",
|
||||
"qunit-assert-step": "1.0.3",
|
||||
"qunitjs": "1.23.1",
|
||||
"raw-body": "2.2.0",
|
||||
"requirejs": "2.3.3",
|
||||
"sinon": "2.3.7",
|
||||
"sizzle": "2.3.3",
|
||||
@ -61,8 +68,9 @@
|
||||
"scripts": {
|
||||
"build": "npm install && grunt",
|
||||
"start": "grunt watch",
|
||||
"test": "grunt && grunt test:slow",
|
||||
"precommit": "grunt lint:newer",
|
||||
"test": "grunt && grunt test:slow karma:main",
|
||||
"jenkins": "grunt && grunt test:slow",
|
||||
"precommit": "grunt lint:newer qunit_fixture",
|
||||
"commitmsg": "node node_modules/commitplease"
|
||||
},
|
||||
"commitplease": {
|
||||
|
@ -1,5 +0,0 @@
|
||||
<?php
|
||||
$type = $_REQUEST['content-type'];
|
||||
header("Content-type: $type");
|
||||
echo $_REQUEST['response']
|
||||
?>
|
@ -1 +0,0 @@
|
||||
ok( "<?php echo $_SERVER['REQUEST_METHOD'] ?>" === "GET", "request method is <?php echo $_SERVER['REQUEST_METHOD'] ?>" );
|
@ -1 +0,0 @@
|
||||
<?php echo $_SERVER['REQUEST_METHOD'] ?>
|
@ -15,7 +15,7 @@ jQuery(function() {
|
||||
}, 200 );
|
||||
var number = 50;
|
||||
while( number-- ) {
|
||||
jQuery.ajax("../name.php?wait=10");
|
||||
jQuery.ajax("../mock.php?action=wait&wait=10");
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
@ -1,4 +0,0 @@
|
||||
<?php header("Content-type: atom+xml") ?>
|
||||
<root>
|
||||
<element />
|
||||
</root>
|
@ -1,3 +0,0 @@
|
||||
<?php
|
||||
sleep(30);
|
||||
?>
|
@ -7,7 +7,7 @@
|
||||
<script src="../iframeTest.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<iframe id="dont_return" src="dont_return.php"></iframe>
|
||||
<iframe id="dont_return" src="../mock.php?action=wait&wait=30"></iframe>
|
||||
<script>
|
||||
var timeoutId, $,
|
||||
timeoutFired = false;
|
||||
|
14
test/data/csp.include.html
Normal file
14
test/data/csp.include.html
Normal file
@ -0,0 +1,14 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>CSP Test Page</title>
|
||||
<script src="../jquery.js"></script>
|
||||
<script src="iframeTest.js"></script>
|
||||
<script src="support/csp.js"></script>
|
||||
<script src="support/getComputedSupport.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<p>CSP Test Page</p>
|
||||
</body>
|
||||
</html>
|
@ -1 +0,0 @@
|
||||
<?php echo file_get_contents('php://input'); ?>
|
@ -1 +0,0 @@
|
||||
<?php echo $_SERVER['QUERY_STRING']; ?>
|
@ -1,6 +0,0 @@
|
||||
<?php
|
||||
|
||||
header("HTTP/1.0 400 Bad Request");
|
||||
header("Content-Type: application/json");
|
||||
|
||||
echo '{ "code": 40, "message": "Bad Request" }';
|
@ -1,5 +0,0 @@
|
||||
<?php
|
||||
|
||||
header("HTTP/1.0 400 Bad Request");
|
||||
|
||||
echo "plain text message";
|
@ -1,24 +0,0 @@
|
||||
<?php
|
||||
error_reporting(0);
|
||||
|
||||
$ts = $_REQUEST['ts'];
|
||||
$etag = md5($ts);
|
||||
|
||||
$ifNoneMatch = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : "";
|
||||
preg_match('/"([^"]+)"/', $ifNoneMatch, $matches);
|
||||
$ifNoneMatch = isset($matches[1]) ? $matches[1] : false;
|
||||
|
||||
if ($ifNoneMatch == $etag) {
|
||||
header('HTTP/1.0 304 Not Modified');
|
||||
die; // stop processing
|
||||
}
|
||||
|
||||
header("Etag: W/\"" . $etag . "\"");
|
||||
|
||||
if ( $ifNoneMatch ) {
|
||||
echo "OK: " . $etag;
|
||||
} else {
|
||||
echo "FAIL";
|
||||
}
|
||||
|
||||
?>
|
@ -18,7 +18,7 @@ jQuery( function () {
|
||||
oldIE into thinking the dom is ready, but it's not...
|
||||
leaving this check here for future trailblazers to attempt
|
||||
fixing this...-->
|
||||
<script type="text/javascript" src="../longLoadScript.php?sleep=1"></script>
|
||||
<script type="text/javascript" src="../mock.php?action=wait&wait=1"></script>
|
||||
<div id="container" style="height: 300px"></div>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -18,7 +18,7 @@ jQuery( document ).ready(function () {
|
||||
oldIE into thinking the dom is ready, but it's not...
|
||||
leaving this check here for future trailblazers to attempt
|
||||
fixing this...-->
|
||||
<script type="text/javascript" src="../longLoadScript.php?sleep=1"></script>
|
||||
<script type="text/javascript" src="../mock.php?action=wait&wait=1"></script>
|
||||
<div id="container" style="height: 300px"></div>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,23 +0,0 @@
|
||||
<?php
|
||||
|
||||
header( "Sample-Header: Hello World" );
|
||||
header( "Empty-Header: " );
|
||||
header( "Sample-Header2: Hello World 2" );
|
||||
|
||||
$headers = array();
|
||||
|
||||
foreach( $_SERVER as $key => $value ) {
|
||||
|
||||
$key = str_replace( "_" , "-" , substr( $key , 0 , 5 ) == "HTTP_" ? substr( $key , 5 ) : $key );
|
||||
$headers[ $key ] = $value;
|
||||
|
||||
}
|
||||
|
||||
foreach( explode( "_" , $_GET[ "keys" ] ) as $key ) {
|
||||
|
||||
// Only echo if key exists in the header
|
||||
if ( isset( $headers[ strtoupper( $key ) ] ) ) {
|
||||
echo "$key: " . @$headers[ strtoupper( $key ) ] . "\n";
|
||||
}
|
||||
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
<?php
|
||||
error_reporting(0);
|
||||
|
||||
$ts = $_REQUEST['ts'];
|
||||
|
||||
$ifModifiedSince = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) : false;
|
||||
if ($ifModifiedSince == $ts) {
|
||||
header('HTTP/1.0 304 Not Modified');
|
||||
die; // stop processing
|
||||
}
|
||||
|
||||
header("Last-Modified: " . $ts);
|
||||
|
||||
if ( $ifModifiedSince ) {
|
||||
echo "OK: " . $ts;
|
||||
} else {
|
||||
echo "FAIL";
|
||||
}
|
||||
|
||||
?>
|
@ -1,13 +0,0 @@
|
||||
<?php
|
||||
error_reporting(0);
|
||||
if ( $_REQUEST['header'] ) {
|
||||
header("Content-type: application/json");
|
||||
}
|
||||
|
||||
$json = $_REQUEST['json'];
|
||||
if($json) {
|
||||
echo '[ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ]';
|
||||
} else {
|
||||
echo '{ "data": {"lang": "en", "length": 25} }';
|
||||
}
|
||||
?>
|
@ -1,14 +0,0 @@
|
||||
<?php
|
||||
error_reporting(0);
|
||||
$callback = $_REQUEST['callback'];
|
||||
if ( ! $callback ) {
|
||||
$callback = explode("?",end(explode("/",$_SERVER['REQUEST_URI'])));
|
||||
$callback = $callback[0];
|
||||
}
|
||||
$json = $_REQUEST['json'];
|
||||
if($json) {
|
||||
echo $callback . '([ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ])';
|
||||
} else {
|
||||
echo $callback . '({ "data": {"lang": "en", "length": 25} })';
|
||||
}
|
||||
?>
|
@ -1,4 +0,0 @@
|
||||
<?php
|
||||
sleep((int)$_GET['sleep']);
|
||||
header('Content-type: text/javascript');
|
||||
?>
|
244
test/data/mock.php
Normal file
244
test/data/mock.php
Normal file
@ -0,0 +1,244 @@
|
||||
<?php
|
||||
/**
|
||||
* Keep in sync with /test/middleware-mockserver.js
|
||||
*/
|
||||
class MockServer {
|
||||
protected function contentType( $req ) {
|
||||
$type = $req->query['contentType'];
|
||||
header("Content-type: $type");
|
||||
echo $req->query['response'];
|
||||
}
|
||||
|
||||
protected function wait( $req ) {
|
||||
$wait = (int) $req->query['wait'];
|
||||
sleep( $wait );
|
||||
if ( isset( $req->query['script'] ) ) {
|
||||
header( 'Content-type: text/javascript' );
|
||||
} else {
|
||||
header( 'Content-type: text/html' );
|
||||
echo 'ERROR <script>ok( true, "mock executed" );</script>';
|
||||
}
|
||||
}
|
||||
|
||||
protected function name( $req ) {
|
||||
if ( $req->query['name'] === 'foo' ) {
|
||||
echo 'bar';
|
||||
} elseif ( $_POST['name'] === 'peter' ) {
|
||||
echo 'pan';
|
||||
} else {
|
||||
echo 'ERROR';
|
||||
}
|
||||
}
|
||||
|
||||
protected function xml( $req ) {
|
||||
header( 'Content-type: text/xml' );
|
||||
if ( $req->query['cal'] !== '5-2' && $_POST['cal'] !== '5-2' ) {
|
||||
echo '<error>ERROR</error>';
|
||||
return;
|
||||
}
|
||||
echo "<math><calculation>5-2</calculation><result>3</result></math>\n";
|
||||
}
|
||||
|
||||
protected function atom( $req ) {
|
||||
header( 'Content-type: atom+xml' );
|
||||
echo '<root><element /></root>';
|
||||
}
|
||||
|
||||
protected function script( $req ) {
|
||||
if ( isset( $req->query['header'] ) ) {
|
||||
if ( $req->query['header'] === 'ecma' ) {
|
||||
header( 'Content-type: application/ecmascript' );
|
||||
} else {
|
||||
header( 'Content-type: text/javascript' );
|
||||
}
|
||||
} else {
|
||||
header( 'Content-type: text/html' );
|
||||
}
|
||||
echo 'ok( true, "mock executed" );';
|
||||
}
|
||||
|
||||
// Used to be in test.js, but was renamed to testbar.php
|
||||
// https://github.com/jquery/jquery/commit/d89c278a33#commitcomment-23423165
|
||||
protected function testbar( $req ) {
|
||||
echo 'this.testBar = "bar";
|
||||
jQuery("#ap").html("bar");
|
||||
ok( true, "mock executed");';
|
||||
}
|
||||
|
||||
protected function json( $req ) {
|
||||
if ( isset( $req->query['header'] ) ) {
|
||||
header( 'Content-type: application/json' );
|
||||
}
|
||||
|
||||
if ( isset( $req->query['array'] ) ) {
|
||||
echo '[ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ]';
|
||||
} else {
|
||||
echo '{ "data": {"lang": "en", "length": 25} }';
|
||||
}
|
||||
}
|
||||
|
||||
protected function jsonp( $req ) {
|
||||
if ( isset( $req->query['callback'] ) ) {
|
||||
$callback = $req->query['callback'];
|
||||
} elseif ( $req->method === 'GET' ) {
|
||||
// Try REST-like path
|
||||
preg_match( '/\/([^\/?]+)\?.+$/', $req->url, $m );
|
||||
$callback = $m[1];
|
||||
} else {
|
||||
$callback = $_POST['callback'];
|
||||
}
|
||||
if ( isset( $req->query['array'] ) ) {
|
||||
echo $callback . '([ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ])';
|
||||
} else {
|
||||
echo $callback . '({ "data": {"lang": "en", "length": 25} })';
|
||||
}
|
||||
}
|
||||
|
||||
protected function xmlOverJsonp( $req ) {
|
||||
$callback = $_REQUEST['callback'];
|
||||
$text = json_encode( file_get_contents( __DIR__ . '/with_fries.xml' ) );
|
||||
echo "$callback($text)\n";
|
||||
}
|
||||
|
||||
protected function error( $req ) {
|
||||
header( 'HTTP/1.0 400 Bad Request' );
|
||||
if ( isset( $req->query['json'] ) ) {
|
||||
header( 'Content-Type: application/json' );
|
||||
echo '{ "code": 40, "message": "Bad Request" }';
|
||||
} else {
|
||||
echo 'plain text message';
|
||||
}
|
||||
}
|
||||
|
||||
protected function headers( $req ) {
|
||||
header( 'Sample-Header: Hello World' );
|
||||
header( 'Empty-Header: ' );
|
||||
header( 'Sample-Header2: Hello World 2' );
|
||||
|
||||
foreach ( explode( '|' , $req->query[ 'keys' ] ) as $key ) {
|
||||
// Only echo if key exists in the header
|
||||
if ( isset( $req->headers[ strtoupper( $key ) ] ) ) {
|
||||
echo "$key: " . $req->headers[ strtoupper( $key ) ] . "\n";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected function echoData( $req ) {
|
||||
echo file_get_contents('php://input');
|
||||
}
|
||||
|
||||
protected function echoQuery( $req ) {
|
||||
echo $_SERVER['QUERY_STRING'];
|
||||
}
|
||||
|
||||
protected function echoMethod( $req ) {
|
||||
echo $req->method;
|
||||
}
|
||||
|
||||
protected function echoHtml( $req ) {
|
||||
header( 'Content-type: text/html' );
|
||||
echo '<div id="method">' . $req->method . '</div>';
|
||||
echo '<div id="query">' . $_SERVER['QUERY_STRING'] . '</div>';
|
||||
echo '<div id="data">' . file_get_contents('php://input') . '</div>';
|
||||
}
|
||||
|
||||
protected function etag( $req ) {
|
||||
$hash = md5( $req->query['ts'] );
|
||||
$etag = 'W/"' . $hash . '"';
|
||||
|
||||
$ifNoneMatch = isset( $req->headers['IF-NONE-MATCH'] ) ? $req->headers['IF-NONE-MATCH'] : '';
|
||||
if ($ifNoneMatch === $etag) {
|
||||
header('HTTP/1.0 304 Not Modified');
|
||||
return;
|
||||
}
|
||||
|
||||
header("Etag: $etag");
|
||||
echo "ETag: $etag\n";
|
||||
if ( $ifNoneMatch ) {
|
||||
echo "If-None-Match: $ifNoneMatch\n";
|
||||
}
|
||||
}
|
||||
|
||||
protected function ims( $req ) {
|
||||
$ts = $req->query['ts'];
|
||||
|
||||
$ims = isset( $req->headers['IF-MODIFIED-SINCE'] ) ? $req->headers['IF-MODIFIED-SINCE'] : '';
|
||||
if ($ims === $ts) {
|
||||
header('HTTP/1.0 304 Not Modified');
|
||||
return;
|
||||
}
|
||||
|
||||
header("Last-Modified: $ts");
|
||||
echo "Last-Modified: $ts\n";
|
||||
if ( $ims ) {
|
||||
echo "If-Modified-Since: $ims\n";
|
||||
}
|
||||
}
|
||||
|
||||
protected function status( $req ) {
|
||||
header( "HTTP/1.0 {$req->query['code']} {$req->query['text']}" );
|
||||
}
|
||||
|
||||
protected function testHTML( $req ) {
|
||||
header( 'Content-type: text/html' );
|
||||
$html = file_get_contents( __DIR__ . '/test.include.html' );
|
||||
$html = str_replace( '{{baseURL}}', $req->query['baseURL'], $html );
|
||||
echo $html;
|
||||
}
|
||||
|
||||
protected function cspFrame( $req ) {
|
||||
// This is CSP only for browsers with "Content-Security-Policy" header support
|
||||
// i.e. no old WebKit or old Firefox
|
||||
header( "Content-Security-Policy: default-src 'self'; report-uri ./mock.php?action=cspLog" );
|
||||
header( 'Content-type: text/html' );
|
||||
echo file_get_contents( __DIR__ . '/csp.include.html' );
|
||||
}
|
||||
|
||||
protected function cspLog( $req ) {
|
||||
file_put_contents( $this->cspFile, 'error' );
|
||||
}
|
||||
|
||||
protected function cspClean( $req ) {
|
||||
file_put_contents( $this->cspFile, '' );
|
||||
unlink( $this->cspFile );
|
||||
}
|
||||
|
||||
public function __construct() {
|
||||
$this->cspFile = __DIR__ . '/support/csp.log';
|
||||
}
|
||||
|
||||
public function respond( stdClass $req ) {
|
||||
if ( !isset( $req->query['action'] ) || !method_exists( $this, $req->query['action'] ) ) {
|
||||
header( "HTTP/1.0 400 Bad Request" );
|
||||
echo "Invalid action query.\n";
|
||||
return;
|
||||
}
|
||||
$this->{$req->query['action']}( $req );
|
||||
}
|
||||
}
|
||||
|
||||
// Don't include PHP errors in http response
|
||||
error_reporting( 0 );
|
||||
|
||||
// Collect headers
|
||||
$headers = array();
|
||||
foreach ( $_SERVER as $name => $value ) {
|
||||
if ( substr( $name, 0, 5 ) === 'HTTP_' ) {
|
||||
$name = str_replace( '_', '-', substr( $name, 5 ) );
|
||||
$headers[$name] = $value;
|
||||
} elseif ( $name === 'CONTENT_LENGTH' ) {
|
||||
$headers['CONTENT-LENGTH'] = $value;
|
||||
} elseif ( $name === 'CONTENT_TYPE' ) {
|
||||
$headers['CONTENT-TYPE'] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
$mock = new MockServer();
|
||||
$req = (object) array(
|
||||
'query' => $_GET,
|
||||
'headers' => $headers,
|
||||
'method' => $_SERVER['REQUEST_METHOD'],
|
||||
'url' => $_SERVER['REQUEST_URI'],
|
||||
);
|
||||
$mock->respond( $req );
|
@ -1,24 +0,0 @@
|
||||
<?php
|
||||
error_reporting(0);
|
||||
$wait = $_REQUEST['wait'];
|
||||
if($wait) {
|
||||
sleep($wait);
|
||||
}
|
||||
$xml = $_REQUEST['xml'];
|
||||
if($xml) {
|
||||
header("Content-type: text/xml");
|
||||
$result = ($xml == "5-2") ? "3" : "?";
|
||||
echo "<math><calculation>$xml</calculation><result>$result</result></math>";
|
||||
die();
|
||||
}
|
||||
$name = $_REQUEST['name'];
|
||||
if($name == 'foo') {
|
||||
echo "bar";
|
||||
die();
|
||||
} else if($name == 'peter') {
|
||||
echo "pan";
|
||||
die();
|
||||
}
|
||||
|
||||
echo 'ERROR <script type="text/javascript">ok( true, "name.php executed" );</script>';
|
||||
?>
|
@ -1,5 +0,0 @@
|
||||
<?php
|
||||
|
||||
header('HTTP/1.0 204 No Content');
|
||||
|
||||
?>
|
@ -1,12 +0,0 @@
|
||||
<div id="post">
|
||||
<?php
|
||||
foreach( $_POST as $key=>$value )
|
||||
echo "<b id='$key'>$value</b>";
|
||||
?>
|
||||
</div>
|
||||
<div id="get">
|
||||
<?php
|
||||
foreach( $_GET as $key=>$value )
|
||||
echo "<b id='$key'>$value</b>";
|
||||
?>
|
||||
</div>
|
237
test/data/qunit-fixture.html
Normal file
237
test/data/qunit-fixture.html
Normal file
@ -0,0 +1,237 @@
|
||||
<p id="firstp">See <a id="simon1" href="http://simon.incutio.com/archive/2003/03/25/#getElementsBySelector" rel="bookmark">this blog entry</a> for more information.</p>
|
||||
<p id="ap">
|
||||
Here are some links in a normal paragraph: <a id="google" href="http://www.google.com/" title="Google!">Google</a>,
|
||||
<a id="groups" href="http://groups.google.com/" class="GROUPS">Google Groups (Link)</a>.
|
||||
This link has <code><a href="http://smin" id="anchor1">class="blog"</a></code>:
|
||||
<a href="http://diveintomark.org/" class="blog" hreflang="en" id="mark">diveintomark</a>
|
||||
|
||||
</p>
|
||||
<div id="foo">
|
||||
<p id="sndp">Everything inside the red border is inside a div with <code>id="foo"</code>.</p>
|
||||
<p lang="en" id="en">This is a normal link: <a id="yahoo" href="http://www.yahoo.com/" class="blogTest">Yahoo</a></p>
|
||||
<p id="sap">This link has <code><a href="#2" id="anchor2">class="blog"</a></code>: <a href="http://simon.incutio.com/" class="blog link" id="simon">Simon Willison's Weblog</a></p>
|
||||
|
||||
</div>
|
||||
<div id="nothiddendiv" style="height:1px;background:white;" class="nothiddendiv">
|
||||
<div id="nothiddendivchild"></div>
|
||||
</div>
|
||||
<span id="name+value"></span>
|
||||
<p id="first">Try them out:</p>
|
||||
<ul id="firstUL"></ul>
|
||||
<ol id="empty"></ol>
|
||||
<form id="form" action="formaction">
|
||||
<label for="action" id="label-for">Action:</label>
|
||||
<input type="text" name="action" value="Test" id="text1" maxlength="30"/>
|
||||
<input type="text" name="text2" value="Test" id="text2" disabled="disabled"/>
|
||||
<input type="radio" name="radio1" id="radio1" value="on"/>
|
||||
|
||||
<input type="radio" name="radio2" id="radio2" checked="checked"/>
|
||||
<input type="checkbox" name="check" id="check1" checked="checked"/>
|
||||
<input type="checkbox" id="check2" value="on"/>
|
||||
|
||||
<input type="hidden" name="hidden" id="hidden1"/>
|
||||
<input type="text" style="display:none;" name="foo[bar]" id="hidden2"/>
|
||||
|
||||
<input type="text" id="name" name="name" value="name" />
|
||||
<input type="search" id="search" name="search" value="search" />
|
||||
|
||||
<button id="button" name="button" type="button">Button</button>
|
||||
|
||||
<textarea id="area1" maxlength="30">foobar</textarea>
|
||||
|
||||
<select name="select1" id="select1">
|
||||
<option id="option1a" class="emptyopt" value="">Nothing</option>
|
||||
<option id="option1b" value="1">1</option>
|
||||
<option id="option1c" value="2">2</option>
|
||||
<option id="option1d" value="3">3</option>
|
||||
</select>
|
||||
<select name="select2" id="select2">
|
||||
<option id="option2a" class="emptyopt" value="">Nothing</option>
|
||||
<option id="option2b" value="1">1</option>
|
||||
<option id="option2c" value="2">2</option>
|
||||
<option id="option2d" selected="selected" value="3">3</option>
|
||||
</select>
|
||||
<select name="select3" id="select3" multiple="multiple">
|
||||
<option id="option3a" class="emptyopt" value="">Nothing</option>
|
||||
<option id="option3b" selected="selected" value="1">1</option>
|
||||
<option id="option3c" selected="selected" value="2">2</option>
|
||||
<option id="option3d" value="3">3</option>
|
||||
<option id="option3e">no value</option>
|
||||
</select>
|
||||
<select name="select4" id="select4" multiple="multiple">
|
||||
<optgroup disabled="disabled">
|
||||
<option id="option4a" class="emptyopt" value="">Nothing</option>
|
||||
<option id="option4b" disabled="disabled" selected="selected" value="1">1</option>
|
||||
<option id="option4c" selected="selected" value="2">2</option>
|
||||
</optgroup>
|
||||
<option selected="selected" disabled="disabled" id="option4d" value="3">3</option>
|
||||
<option id="option4e">no value</option>
|
||||
</select>
|
||||
<select name="select5" id="select5">
|
||||
<option id="option5a" value="3">1</option>
|
||||
<option id="option5b" value="2">2</option>
|
||||
<option id="option5c" value="1" data-attr="">3</option>
|
||||
</select>
|
||||
|
||||
<object id="object1" codebase="stupid">
|
||||
<param name="p1" value="x1" />
|
||||
<param name="p2" value="x2" />
|
||||
</object>
|
||||
|
||||
<span id="台北Táiběi"></span>
|
||||
<span id="台北" lang="中文"></span>
|
||||
<span id="utf8class1" class="台北Táiběi 台北"></span>
|
||||
<span id="utf8class2" class="台北"></span>
|
||||
<span id="foo:bar" class="foo:bar"></span>
|
||||
<span id="test.foo[5]bar" class="test.foo[5]bar"></span>
|
||||
|
||||
<foo_bar id="foobar">test element</foo_bar>
|
||||
</form>
|
||||
<b id="floatTest">Float test.</b>
|
||||
<iframe id="iframe" name="iframe"></iframe>
|
||||
<form id="lengthtest">
|
||||
<input type="text" id="length" name="test"/>
|
||||
<input type="text" id="idTest" name="id"/>
|
||||
</form>
|
||||
<table id="table"></table>
|
||||
|
||||
<form id="name-tests">
|
||||
<!-- Inputs with a grouped name attribute. -->
|
||||
<input name="types[]" id="types_all" type="checkbox" value="all" />
|
||||
<input name="types[]" id="types_anime" type="checkbox" value="anime" />
|
||||
<input name="types[]" id="types_movie" type="checkbox" value="movie" />
|
||||
</form>
|
||||
|
||||
<form id="testForm" action="#" method="get">
|
||||
<textarea name="T3" rows="2" cols="15">?
|
||||
Z</textarea>
|
||||
<input type="hidden" name="H1" value="x" />
|
||||
<input type="hidden" name="H2" />
|
||||
<input name="PWD" type="password" value="" />
|
||||
<input name="T1" type="text" />
|
||||
<input name="T2" type="text" value="YES" readonly="readonly" />
|
||||
<input type="checkbox" name="C1" value="1" />
|
||||
<input type="checkbox" name="C2" />
|
||||
<input type="radio" name="R1" value="1" />
|
||||
<input type="radio" name="R1" value="2" />
|
||||
<input type="text" name="My Name" value="me" />
|
||||
<input type="reset" name="reset" value="NO" />
|
||||
<select name="S1">
|
||||
<option value="abc">ABC</option>
|
||||
<option value="abc">ABC</option>
|
||||
<option value="abc">ABC</option>
|
||||
</select>
|
||||
<select name="S2" multiple="multiple" size="3">
|
||||
<option value="abc">ABC</option>
|
||||
<option value="abc">ABC</option>
|
||||
<option value="abc">ABC</option>
|
||||
</select>
|
||||
<select name="S3">
|
||||
<option selected="selected">YES</option>
|
||||
</select>
|
||||
<select name="S4">
|
||||
<option value="" selected="selected">NO</option>
|
||||
</select>
|
||||
<input type="submit" name="sub1" value="NO" />
|
||||
<input type="submit" name="sub2" value="NO" />
|
||||
<input type="image" name="sub3" value="NO" />
|
||||
<button name="sub4" type="submit" value="NO">NO</button>
|
||||
<input name="D1" type="text" value="NO" disabled="disabled" />
|
||||
<input type="checkbox" checked="checked" disabled="disabled" name="D2" value="NO" />
|
||||
<input type="radio" name="D3" value="NO" checked="checked" disabled="disabled" />
|
||||
<select name="D4" disabled="disabled">
|
||||
<option selected="selected" value="NO">NO</option>
|
||||
</select>
|
||||
<input id="list-test" type="text" />
|
||||
<datalist id="datalist">
|
||||
<option value="option"></option>
|
||||
</datalist>
|
||||
</form>
|
||||
<div id="moretests">
|
||||
<form>
|
||||
<div id="checkedtest" style="display:none;">
|
||||
<input type="radio" name="checkedtestradios" checked="checked"/>
|
||||
<input type="radio" name="checkedtestradios" value="on"/>
|
||||
<input type="checkbox" name="checkedtestcheckboxes" checked="checked"/>
|
||||
<input type="checkbox" name="checkedtestcheckboxes" />
|
||||
</div>
|
||||
</form>
|
||||
<div id="nonnodes"><span id="nonnodesElement">hi</span> there <!-- mon ami --></div>
|
||||
<div id="t2037">
|
||||
<div><div class="hidden">hidden</div></div>
|
||||
</div>
|
||||
<div id="t6652">
|
||||
<div></div>
|
||||
</div>
|
||||
<div id="no-clone-exception"><object><embed></embed></object></div>
|
||||
</div>
|
||||
|
||||
<div id="tabindex-tests">
|
||||
<ol id="listWithTabIndex" tabindex="5">
|
||||
<li id="foodWithNegativeTabIndex" tabindex="-1">Rice</li>
|
||||
<li id="foodNoTabIndex">Beans</li>
|
||||
<li>Blinis</li>
|
||||
<li>Tofu</li>
|
||||
</ol>
|
||||
|
||||
<div id="divWithNoTabIndex">I'm hungry. I should...</div>
|
||||
<span>...</span><a href="#" id="linkWithNoTabIndex">Eat lots of food</a><span>...</span> |
|
||||
<span>...</span><a href="#" id="linkWithTabIndex" tabindex="2">Eat a little food</a><span>...</span> |
|
||||
<span>...</span><a href="#" id="linkWithNegativeTabIndex" tabindex="-1">Eat no food</a><span>...</span>
|
||||
<span>...</span><a id="linkWithNoHrefWithNoTabIndex">Eat a burger</a><span>...</span>
|
||||
<span>...</span><a id="linkWithNoHrefWithTabIndex" tabindex="1">Eat some funyuns</a><span>...</span>
|
||||
<span>...</span><a id="linkWithNoHrefWithNegativeTabIndex" tabindex="-1">Eat some funyuns</a><span>...</span>
|
||||
<input id="inputWithoutTabIndex"/>
|
||||
<button id="buttonWithoutTabIndex"></button>
|
||||
<textarea id="textareaWithoutTabIndex"></textarea>
|
||||
<menu type="popup">
|
||||
<menuitem id="menuitemWithoutTabIndex" command="submitbutton" default/>
|
||||
</menu>
|
||||
</div>
|
||||
|
||||
<div id="liveHandlerOrder">
|
||||
<span id="liveSpan1"><a href="#" id="liveLink1"></a></span>
|
||||
<span id="liveSpan2"><a href="#" id="liveLink2"></a></span>
|
||||
</div>
|
||||
|
||||
<div id="siblingTest">
|
||||
<em id="siblingfirst">1</em>
|
||||
<em id="siblingnext">2</em>
|
||||
<em id="siblingthird">
|
||||
<em id="siblingchild">
|
||||
<em id="siblinggrandchild">
|
||||
<em id="siblinggreatgrandchild"></em>
|
||||
</em>
|
||||
</em>
|
||||
</em>
|
||||
<span id="siblingspan"></span>
|
||||
</div>
|
||||
<div id="fx-test-group" style="position: absolute; width: 1px; height: 1px; overflow: hidden;">
|
||||
<div id="fx-queue" name="test">
|
||||
<div id="fadein" class='chain-test' name='div'>fadeIn<div>fadeIn</div></div>
|
||||
<div id="fadeout" class='chain-test chain-test-out'>fadeOut<div>fadeOut</div></div>
|
||||
|
||||
<div id="show" class='chain-test'>show<div>show</div></div>
|
||||
<div id="hide" class='chain-test chain-test-out'>hide<div>hide</div></div>
|
||||
<div id="easehide" class='chain-test chain-test-out'>hide<div>hide</div></div>
|
||||
|
||||
<div id="togglein" class='chain-test'>togglein<div>togglein</div></div>
|
||||
<div id="toggleout" class='chain-test chain-test-out'>toggleout<div>toggleout</div></div>
|
||||
<div id="easetoggleout" class='chain-test chain-test-out'>toggleout<div>toggleout</div></div>
|
||||
|
||||
<div id="slideup" class='chain-test'>slideUp<div>slideUp</div></div>
|
||||
<div id="slidedown" class='chain-test chain-test-out'>slideDown<div>slideDown</div></div>
|
||||
<div id="easeslideup" class='chain-test'>slideUp<div>slideUp</div></div>
|
||||
|
||||
<div id="slidetogglein" class='chain-test'>slideToggleIn<div>slideToggleIn</div></div>
|
||||
<div id="slidetoggleout" class='chain-test chain-test-out'>slideToggleOut<div>slideToggleOut</div></div>
|
||||
|
||||
<div id="fadetogglein" class='chain-test'>fadeToggleIn<div>fadeToggleIn</div></div>
|
||||
<div id="fadetoggleout" class='chain-test chain-test-out'>fadeToggleOut<div>fadeToggleOut</div></div>
|
||||
|
||||
<div id="fadeto" class='chain-test'>fadeTo<div>fadeTo</div></div>
|
||||
</div>
|
||||
|
||||
<div id="fx-tests"></div>
|
||||
<span id="display"></span>
|
||||
</div>
|
4
test/data/qunit-fixture.js
Normal file
4
test/data/qunit-fixture.js
Normal file
File diff suppressed because one or more lines are too long
@ -1,11 +0,0 @@
|
||||
<?php
|
||||
error_reporting(0);
|
||||
if ( $_REQUEST['header'] ) {
|
||||
if ( $_REQUEST['header'] == "ecma" ) {
|
||||
header("Content-type: application/ecmascript");
|
||||
} else {
|
||||
header("Content-type: text/javascript");
|
||||
}
|
||||
}
|
||||
?>
|
||||
ok( true, "Script executed correctly." );
|
@ -1,5 +0,0 @@
|
||||
<?php
|
||||
|
||||
header( "HTTP/1.0 $_GET[status] $_GET[text]" );
|
||||
|
||||
?>
|
@ -1,3 +0,0 @@
|
||||
<?php
|
||||
file_put_contents("csp.log", "", LOCK_EX);
|
||||
?>
|
@ -1,3 +0,0 @@
|
||||
<?php
|
||||
file_put_contents("csp.log", "error", LOCK_EX);
|
||||
?>
|
@ -1,19 +0,0 @@
|
||||
<?php
|
||||
# This test page checks CSP only for browsers with "Content-Security-Policy" header support
|
||||
# i.e. no old WebKit or old Firefox
|
||||
header("Content-Security-Policy: default-src 'self'; report-uri csp-log.php");
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>CSP Test Page</title>
|
||||
<script src="../../jquery.js"></script>
|
||||
<script src="../iframeTest.js"></script>
|
||||
<script src="csp.js"></script>
|
||||
<script src="getComputedSupport.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<p>CSP Test Page</p>
|
||||
</body>
|
||||
</html>
|
@ -1,7 +1,7 @@
|
||||
html text<br/>
|
||||
<script type="text/javascript">/* <![CDATA[ */
|
||||
testFoo = "foo"; jQuery('#foo').html('foo');
|
||||
ok( true, "test.html executed" );
|
||||
ok( true, "test.include.html executed" );
|
||||
/* ]]> */</script>
|
||||
<script src="data/testbar.php"></script>
|
||||
<script src="{{baseURL}}mock.php?action=testbar"></script>
|
||||
blabla
|
@ -1,7 +0,0 @@
|
||||
html text<br/>
|
||||
<script type="text/javascript">/* <![CDATA[ */
|
||||
testFoo = "foo"; jQuery('#foo').html('foo');
|
||||
ok( true, "test.php executed" );
|
||||
/* ]]> */</script>
|
||||
<script src="data/testbar.php?<?php srand(); echo time() . '' . rand(); ?>"></script>
|
||||
blabla
|
@ -1,3 +0,0 @@
|
||||
this.testBar = "bar";
|
||||
jQuery("#ap").html("bar");
|
||||
ok( true, "testbar.php executed");
|
@ -1,6 +1,11 @@
|
||||
/* eslint no-multi-str: "off" */
|
||||
|
||||
var baseURL = "",
|
||||
// baseURL is intentionally set to "data/" instead of "".
|
||||
// This is not just for convenience (since most files are in data/)
|
||||
// but also to ensure that urls without prefix fail.
|
||||
// Otherwise it's easy to write tests that pass on test/index.html
|
||||
// but fail in Karma runner (where the baseURL is different).
|
||||
var baseURL = "data/",
|
||||
supportjQuery = this.jQuery,
|
||||
|
||||
// see RFC 2606
|
||||
@ -148,11 +153,13 @@ window.fireNative = document.createEvent ?
|
||||
/**
|
||||
* Add random number to url to stop caching
|
||||
*
|
||||
* @example url("data/test.html")
|
||||
* @result "data/test.html?10538358428943"
|
||||
* Also prefixes with baseURL automatically.
|
||||
*
|
||||
* @example url("data/test.php?foo=bar")
|
||||
* @result "data/test.php?foo=bar&10538358345554"
|
||||
* @example url("index.html")
|
||||
* @result "data/index.html?10538358428943"
|
||||
*
|
||||
* @example url("mock.php?foo=bar")
|
||||
* @result "data/mock.php?foo=bar&10538358345554"
|
||||
*/
|
||||
function url( value ) {
|
||||
return baseURL + value + ( /\?/.test( value ) ? "&" : "?" ) +
|
||||
@ -239,7 +246,7 @@ this.testIframe = function( title, fileName, func, wrapper ) {
|
||||
var done = assert.async(),
|
||||
$iframe = supportjQuery( "<iframe/>" )
|
||||
.css( { position: "absolute", top: "0", left: "-600px", width: "500px" } )
|
||||
.attr( { id: "qunit-fixture-iframe", src: url( "./data/" + fileName ) } );
|
||||
.attr( { id: "qunit-fixture-iframe", src: url( fileName ) } );
|
||||
|
||||
// Test iframes are expected to invoke this via startIframeTest (cf. iframeTest.js)
|
||||
window.iframeCallback = function() {
|
||||
@ -264,14 +271,20 @@ this.testIframe = function( title, fileName, func, wrapper ) {
|
||||
};
|
||||
this.iframeCallback = undefined;
|
||||
|
||||
// Tests are always loaded async
|
||||
QUnit.config.autostart = false;
|
||||
if ( window.__karma__ ) {
|
||||
// In Karma, files are served from /base
|
||||
baseURL = "base/test/data/";
|
||||
} else {
|
||||
// Tests are always loaded async
|
||||
// except when running tests in Karma (See Gruntfile)
|
||||
QUnit.config.autostart = false;
|
||||
}
|
||||
|
||||
// Leverage QUnit URL parsing to detect testSwarm environment and "basic" testing mode
|
||||
QUnit.isSwarm = ( QUnit.urlParams.swarmURL + "" ).indexOf( "http" ) === 0;
|
||||
QUnit.basicTests = ( QUnit.urlParams.module + "" ) === "basic";
|
||||
|
||||
this.loadTests = function() {
|
||||
|
||||
// Leverage QUnit URL parsing to detect testSwarm environment and "basic" testing mode
|
||||
QUnit.isSwarm = ( QUnit.urlParams.swarmURL + "" ).indexOf( "http" ) === 0;
|
||||
QUnit.basicTests = ( QUnit.urlParams.module + "" ) === "basic";
|
||||
|
||||
// Get testSubproject from testrunner first
|
||||
require( [ "data/testrunner.js" ], function() {
|
||||
var i = 0,
|
||||
|
@ -1,7 +0,0 @@
|
||||
<?php
|
||||
error_reporting(0);
|
||||
$callback = $_REQUEST['callback'];
|
||||
$json = $_REQUEST['json'];
|
||||
$text = json_encode(file_get_contents(dirname(__FILE__)."/with_fries.xml"));
|
||||
echo "$callback($text)";
|
||||
?>
|
247
test/index.html
247
test/index.html
@ -42,250 +42,7 @@
|
||||
<!-- Test HTML -->
|
||||
<!-- this iframe is outside the #qunit-fixture so it won't waste time by constantly reloading; the tests are "safe" and clean up after themselves -->
|
||||
<iframe id="loadediframe" name="loadediframe" style="display:none;" src="data/iframe.html"></iframe>
|
||||
<dl id="dl" style="position:absolute;top:-32767px;left:-32767px;width:1px;">
|
||||
<div id="qunit-fixture">
|
||||
<p id="firstp">See <a id="simon1" href="http://simon.incutio.com/archive/2003/03/25/#getElementsBySelector" rel="bookmark">this blog entry</a> for more information.</p>
|
||||
<p id="ap">
|
||||
Here are some links in a normal paragraph: <a id="google" href="http://www.google.com/" title="Google!">Google</a>,
|
||||
<a id="groups" href="http://groups.google.com/" class="GROUPS">Google Groups (Link)</a>.
|
||||
This link has <code><a href="http://smin" id="anchor1">class="blog"</a></code>:
|
||||
<a href="http://diveintomark.org/" class="blog" hreflang="en" id="mark">diveintomark</a>
|
||||
|
||||
</p>
|
||||
<div id="foo">
|
||||
<p id="sndp">Everything inside the red border is inside a div with <code>id="foo"</code>.</p>
|
||||
<p lang="en" id="en">This is a normal link: <a id="yahoo" href="http://www.yahoo.com/" class="blogTest">Yahoo</a></p>
|
||||
<p id="sap">This link has <code><a href="#2" id="anchor2">class="blog"</a></code>: <a href="http://simon.incutio.com/" class="blog link" id="simon">Simon Willison's Weblog</a></p>
|
||||
|
||||
</div>
|
||||
<div id="nothiddendiv" style="height:1px;background:white;" class="nothiddendiv">
|
||||
<div id="nothiddendivchild"></div>
|
||||
</div>
|
||||
<span id="name+value"></span>
|
||||
<p id="first">Try them out:</p>
|
||||
<ul id="firstUL"></ul>
|
||||
<ol id="empty"></ol>
|
||||
<form id="form" action="formaction">
|
||||
<label for="action" id="label-for">Action:</label>
|
||||
<input type="text" name="action" value="Test" id="text1" maxlength="30"/>
|
||||
<input type="text" name="text2" value="Test" id="text2" disabled="disabled"/>
|
||||
<input type="radio" name="radio1" id="radio1" value="on"/>
|
||||
|
||||
<input type="radio" name="radio2" id="radio2" checked="checked"/>
|
||||
<input type="checkbox" name="check" id="check1" checked="checked"/>
|
||||
<input type="checkbox" id="check2" value="on"/>
|
||||
|
||||
<input type="hidden" name="hidden" id="hidden1"/>
|
||||
<input type="text" style="display:none;" name="foo[bar]" id="hidden2"/>
|
||||
|
||||
<input type="text" id="name" name="name" value="name" />
|
||||
<input type="search" id="search" name="search" value="search" />
|
||||
|
||||
<button id="button" name="button" type="button">Button</button>
|
||||
|
||||
<textarea id="area1" maxlength="30">foobar</textarea>
|
||||
|
||||
<select name="select1" id="select1">
|
||||
<option id="option1a" class="emptyopt" value="">Nothing</option>
|
||||
<option id="option1b" value="1">1</option>
|
||||
<option id="option1c" value="2">2</option>
|
||||
<option id="option1d" value="3">3</option>
|
||||
</select>
|
||||
<select name="select2" id="select2">
|
||||
<option id="option2a" class="emptyopt" value="">Nothing</option>
|
||||
<option id="option2b" value="1">1</option>
|
||||
<option id="option2c" value="2">2</option>
|
||||
<option id="option2d" selected="selected" value="3">3</option>
|
||||
</select>
|
||||
<select name="select3" id="select3" multiple="multiple">
|
||||
<option id="option3a" class="emptyopt" value="">Nothing</option>
|
||||
<option id="option3b" selected="selected" value="1">1</option>
|
||||
<option id="option3c" selected="selected" value="2">2</option>
|
||||
<option id="option3d" value="3">3</option>
|
||||
<option id="option3e">no value</option>
|
||||
</select>
|
||||
<select name="select4" id="select4" multiple="multiple">
|
||||
<optgroup disabled="disabled">
|
||||
<option id="option4a" class="emptyopt" value="">Nothing</option>
|
||||
<option id="option4b" disabled="disabled" selected="selected" value="1">1</option>
|
||||
<option id="option4c" selected="selected" value="2">2</option>
|
||||
</optgroup>
|
||||
<option selected="selected" disabled="disabled" id="option4d" value="3">3</option>
|
||||
<option id="option4e">no value</option>
|
||||
</select>
|
||||
<select name="select5" id="select5">
|
||||
<option id="option5a" value="3">1</option>
|
||||
<option id="option5b" value="2">2</option>
|
||||
<option id="option5c" value="1" data-attr="">3</option>
|
||||
</select>
|
||||
|
||||
<object id="object1" codebase="stupid">
|
||||
<param name="p1" value="x1" />
|
||||
<param name="p2" value="x2" />
|
||||
</object>
|
||||
|
||||
<span id="台北Táiběi"></span>
|
||||
<span id="台北" lang="中文"></span>
|
||||
<span id="utf8class1" class="台北Táiběi 台北"></span>
|
||||
<span id="utf8class2" class="台北"></span>
|
||||
<span id="foo:bar" class="foo:bar"></span>
|
||||
<span id="test.foo[5]bar" class="test.foo[5]bar"></span>
|
||||
|
||||
<foo_bar id="foobar">test element</foo_bar>
|
||||
</form>
|
||||
<b id="floatTest">Float test.</b>
|
||||
<iframe id="iframe" name="iframe"></iframe>
|
||||
<form id="lengthtest">
|
||||
<input type="text" id="length" name="test"/>
|
||||
<input type="text" id="idTest" name="id"/>
|
||||
</form>
|
||||
<table id="table"></table>
|
||||
|
||||
<form id="name-tests">
|
||||
<!-- Inputs with a grouped name attribute. -->
|
||||
<input name="types[]" id="types_all" type="checkbox" value="all" />
|
||||
<input name="types[]" id="types_anime" type="checkbox" value="anime" />
|
||||
<input name="types[]" id="types_movie" type="checkbox" value="movie" />
|
||||
</form>
|
||||
|
||||
<form id="testForm" action="#" method="get">
|
||||
<textarea name="T3" rows="2" cols="15">?
|
||||
Z</textarea>
|
||||
<input type="hidden" name="H1" value="x" />
|
||||
<input type="hidden" name="H2" />
|
||||
<input name="PWD" type="password" value="" />
|
||||
<input name="T1" type="text" />
|
||||
<input name="T2" type="text" value="YES" readonly="readonly" />
|
||||
<input type="checkbox" name="C1" value="1" />
|
||||
<input type="checkbox" name="C2" />
|
||||
<input type="radio" name="R1" value="1" />
|
||||
<input type="radio" name="R1" value="2" />
|
||||
<input type="text" name="My Name" value="me" />
|
||||
<input type="reset" name="reset" value="NO" />
|
||||
<select name="S1">
|
||||
<option value="abc">ABC</option>
|
||||
<option value="abc">ABC</option>
|
||||
<option value="abc">ABC</option>
|
||||
</select>
|
||||
<select name="S2" multiple="multiple" size="3">
|
||||
<option value="abc">ABC</option>
|
||||
<option value="abc">ABC</option>
|
||||
<option value="abc">ABC</option>
|
||||
</select>
|
||||
<select name="S3">
|
||||
<option selected="selected">YES</option>
|
||||
</select>
|
||||
<select name="S4">
|
||||
<option value="" selected="selected">NO</option>
|
||||
</select>
|
||||
<input type="submit" name="sub1" value="NO" />
|
||||
<input type="submit" name="sub2" value="NO" />
|
||||
<input type="image" name="sub3" value="NO" />
|
||||
<button name="sub4" type="submit" value="NO">NO</button>
|
||||
<input name="D1" type="text" value="NO" disabled="disabled" />
|
||||
<input type="checkbox" checked="checked" disabled="disabled" name="D2" value="NO" />
|
||||
<input type="radio" name="D3" value="NO" checked="checked" disabled="disabled" />
|
||||
<select name="D4" disabled="disabled">
|
||||
<option selected="selected" value="NO">NO</option>
|
||||
</select>
|
||||
<input id="list-test" type="text" />
|
||||
<datalist id="datalist">
|
||||
<option value="option"></option>
|
||||
</datalist>
|
||||
</form>
|
||||
<div id="moretests">
|
||||
<form>
|
||||
<div id="checkedtest" style="display:none;">
|
||||
<input type="radio" name="checkedtestradios" checked="checked"/>
|
||||
<input type="radio" name="checkedtestradios" value="on"/>
|
||||
<input type="checkbox" name="checkedtestcheckboxes" checked="checked"/>
|
||||
<input type="checkbox" name="checkedtestcheckboxes" />
|
||||
</div>
|
||||
</form>
|
||||
<div id="nonnodes"><span id="nonnodesElement">hi</span> there <!-- mon ami --></div>
|
||||
<div id="t2037">
|
||||
<div><div class="hidden">hidden</div></div>
|
||||
</div>
|
||||
<div id="t6652">
|
||||
<div></div>
|
||||
</div>
|
||||
<div id="no-clone-exception"><object><embed></embed></object></div>
|
||||
</div>
|
||||
|
||||
<div id="tabindex-tests">
|
||||
<ol id="listWithTabIndex" tabindex="5">
|
||||
<li id="foodWithNegativeTabIndex" tabindex="-1">Rice</li>
|
||||
<li id="foodNoTabIndex">Beans</li>
|
||||
<li>Blinis</li>
|
||||
<li>Tofu</li>
|
||||
</ol>
|
||||
|
||||
<div id="divWithNoTabIndex">I'm hungry. I should...</div>
|
||||
<span>...</span><a href="#" id="linkWithNoTabIndex">Eat lots of food</a><span>...</span> |
|
||||
<span>...</span><a href="#" id="linkWithTabIndex" tabindex="2">Eat a little food</a><span>...</span> |
|
||||
<span>...</span><a href="#" id="linkWithNegativeTabIndex" tabindex="-1">Eat no food</a><span>...</span>
|
||||
<span>...</span><a id="linkWithNoHrefWithNoTabIndex">Eat a burger</a><span>...</span>
|
||||
<span>...</span><a id="linkWithNoHrefWithTabIndex" tabindex="1">Eat some funyuns</a><span>...</span>
|
||||
<span>...</span><a id="linkWithNoHrefWithNegativeTabIndex" tabindex="-1">Eat some funyuns</a><span>...</span>
|
||||
<input id="inputWithoutTabIndex"/>
|
||||
<button id="buttonWithoutTabIndex"></button>
|
||||
<textarea id="textareaWithoutTabIndex"></textarea>
|
||||
<menu type="popup">
|
||||
<menuitem id="menuitemWithoutTabIndex" command="submitbutton" default/>
|
||||
</menu>
|
||||
</div>
|
||||
|
||||
<div id="liveHandlerOrder">
|
||||
<span id="liveSpan1"><a href="#" id="liveLink1"></a></span>
|
||||
<span id="liveSpan2"><a href="#" id="liveLink2"></a></span>
|
||||
</div>
|
||||
|
||||
<div id="siblingTest">
|
||||
<em id="siblingfirst">1</em>
|
||||
<em id="siblingnext">2</em>
|
||||
<em id="siblingthird">
|
||||
<em id="siblingchild">
|
||||
<em id="siblinggrandchild">
|
||||
<em id="siblinggreatgrandchild"></em>
|
||||
</em>
|
||||
</em>
|
||||
</em>
|
||||
<span id="siblingspan"></span>
|
||||
</div>
|
||||
<div id="fx-test-group" style="position: absolute; width: 1px; height: 1px; overflow: hidden;">
|
||||
<div id="fx-queue" name="test">
|
||||
<div id="fadein" class='chain-test' name='div'>fadeIn<div>fadeIn</div></div>
|
||||
<div id="fadeout" class='chain-test chain-test-out'>fadeOut<div>fadeOut</div></div>
|
||||
|
||||
<div id="show" class='chain-test'>show<div>show</div></div>
|
||||
<div id="hide" class='chain-test chain-test-out'>hide<div>hide</div></div>
|
||||
<div id="easehide" class='chain-test chain-test-out'>hide<div>hide</div></div>
|
||||
|
||||
<div id="togglein" class='chain-test'>togglein<div>togglein</div></div>
|
||||
<div id="toggleout" class='chain-test chain-test-out'>toggleout<div>toggleout</div></div>
|
||||
<div id="easetoggleout" class='chain-test chain-test-out'>toggleout<div>toggleout</div></div>
|
||||
|
||||
<div id="slideup" class='chain-test'>slideUp<div>slideUp</div></div>
|
||||
<div id="slidedown" class='chain-test chain-test-out'>slideDown<div>slideDown</div></div>
|
||||
<div id="easeslideup" class='chain-test'>slideUp<div>slideUp</div></div>
|
||||
|
||||
<div id="slidetogglein" class='chain-test'>slideToggleIn<div>slideToggleIn</div></div>
|
||||
<div id="slidetoggleout" class='chain-test chain-test-out'>slideToggleOut<div>slideToggleOut</div></div>
|
||||
|
||||
<div id="fadetogglein" class='chain-test'>fadeToggleIn<div>fadeToggleIn</div></div>
|
||||
<div id="fadetoggleout" class='chain-test chain-test-out'>fadeToggleOut<div>fadeToggleOut</div></div>
|
||||
|
||||
<div id="fadeto" class='chain-test'>fadeTo<div>fadeTo</div></div>
|
||||
</div>
|
||||
|
||||
<div id="fx-tests"></div>
|
||||
<span id="display"></span>
|
||||
</div>
|
||||
</div>
|
||||
</dl>
|
||||
<map name="imgmap" id="imgmap">
|
||||
<area shape="rect" coords="0,0,200,50">
|
||||
</map>
|
||||
|
||||
<div id="qunit-fixture"></div>
|
||||
<script src="data/qunit-fixture.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
45
test/karma.context.html
Normal file
45
test/karma.context.html
Normal file
@ -0,0 +1,45 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" id="html">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>CONTEXT</title>
|
||||
<!-- Karma serves this page from /context.html. Other files are served from /base -->
|
||||
<link rel="stylesheet" href="/base/test/data/testsuite.css" />
|
||||
</head>
|
||||
<body id="body">
|
||||
<div id="qunit"></div>
|
||||
|
||||
<!-- Start: jQuery Test HTML -->
|
||||
<!-- this iframe is outside the #qunit-fixture so it won't waste time by constantly reloading; the tests are "safe" and clean up after themselves -->
|
||||
<iframe id="loadediframe" name="loadediframe" style="display:none;" src="/base/test/data/iframe.html"></iframe>
|
||||
<div id="qunit-fixture"></div>
|
||||
<!-- End: jQuery Test HTML -->
|
||||
|
||||
<!-- Start: Karma boilerplate -->
|
||||
<script src="/context.js"></script>
|
||||
<script>
|
||||
%CLIENT_CONFIG%
|
||||
window.__karma__.setupContext(window);
|
||||
|
||||
%MAPPINGS%
|
||||
</script>
|
||||
%SCRIPTS%
|
||||
<!-- End: Karma boilerplate -->
|
||||
|
||||
<script src="/base/test/data/qunit-fixture.js"></script>
|
||||
<script>
|
||||
// Workaround: Remove call to window.__karma__.loaded()
|
||||
// in favour of calling window.__karma__.start() at window.onload
|
||||
// because tests such as unit/ready.js should run after document ready
|
||||
window.addEventListener('load', function() {
|
||||
window.__karma__.start();
|
||||
|
||||
// Workaround: https://github.com/karma-runner/karma-qunit/issues/92
|
||||
QUnit.testStart(function () {
|
||||
// Restore content
|
||||
document.getElementById("qunit-fixture").innerHTML = QUnit.config.fixture;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
47
test/karma.debug.html
Normal file
47
test/karma.debug.html
Normal file
@ -0,0 +1,47 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" id="html">
|
||||
<head>
|
||||
%X_UA_COMPATIBLE%
|
||||
<title>DEBUG</title>
|
||||
<meta charset="utf-8">
|
||||
<!-- Karma serves this page from /context.html. Other files are served from /base -->
|
||||
<link rel="stylesheet" href="/base/external/qunit/qunit.css" />
|
||||
<link rel="stylesheet" href="/base/test/data/testsuite.css" />
|
||||
</head>
|
||||
<body id="body">
|
||||
<div id="qunit"></div>
|
||||
|
||||
<!-- Start: jQuery Test HTML -->
|
||||
<!-- this iframe is outside the #qunit-fixture so it won't waste time by constantly reloading; the tests are "safe" and clean up after themselves -->
|
||||
<iframe id="loadediframe" name="loadediframe" style="display:none;" src="/base/test/data/iframe.html"></iframe>
|
||||
<div id="qunit-fixture"></div>
|
||||
<!-- End: jQuery Test HTML -->
|
||||
|
||||
<!-- Start: Karma boilerplate -->
|
||||
<script src="/context.js"></script>
|
||||
<script src="/debug.js"></script>
|
||||
<script>
|
||||
%CLIENT_CONFIG%
|
||||
|
||||
%MAPPINGS%
|
||||
</script>
|
||||
%SCRIPTS%
|
||||
<!-- End: Karma boilerplate -->
|
||||
|
||||
<script src="/base/test/data/qunit-fixture.js"></script>
|
||||
<script>
|
||||
// Workaround: Remove call to window.__karma__.loaded()
|
||||
// in favour of calling window.__karma__.start() at window.onload
|
||||
// because tests such as unit/ready.js should run after document ready
|
||||
window.addEventListener('load', function() {
|
||||
window.__karma__.start();
|
||||
|
||||
// Workaround: https://github.com/karma-runner/karma-qunit/issues/92
|
||||
QUnit.testStart(function () {
|
||||
// Restore content
|
||||
document.getElementById("qunit-fixture").innerHTML = QUnit.config.fixture;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
284
test/middleware-mockserver.js
Normal file
284
test/middleware-mockserver.js
Normal file
@ -0,0 +1,284 @@
|
||||
/* eslint-env node */
|
||||
var url = require( "url" );
|
||||
var fs = require( "fs" );
|
||||
var getRawBody = require( "raw-body" );
|
||||
|
||||
var cspLog = "";
|
||||
/**
|
||||
* Keep in sync with /test/mock.php
|
||||
*/
|
||||
var mocks = {
|
||||
contentType: function( req, resp ) {
|
||||
resp.writeHead( 200, {
|
||||
"content-type": req.query.contentType
|
||||
} );
|
||||
resp.end( req.query.response );
|
||||
},
|
||||
wait: function( req, resp ) {
|
||||
var wait = Number( req.query.wait ) * 1000;
|
||||
setTimeout( function() {
|
||||
if ( req.query.script ) {
|
||||
resp.writeHead( 200, { "content-type": "text/javascript" } );
|
||||
} else {
|
||||
resp.writeHead( 200, { "content-type": "text/html" } );
|
||||
resp.end( "ERROR <script>ok( true, \"mock executed\" );</script>" );
|
||||
}
|
||||
}, wait );
|
||||
},
|
||||
name: function( req, resp, next ) {
|
||||
resp.writeHead( 200 );
|
||||
if ( req.query.name === "foo" ) {
|
||||
resp.end( "bar" );
|
||||
return;
|
||||
}
|
||||
getBody( req ).then( function( body ) {
|
||||
if ( body === "name=peter" ) {
|
||||
resp.end( "pan" );
|
||||
} else {
|
||||
resp.end( "ERROR" );
|
||||
}
|
||||
}, next );
|
||||
},
|
||||
xml: function( req, resp, next ) {
|
||||
var content = "<math><calculation>5-2</calculation><result>3</result></math>";
|
||||
resp.writeHead( 200, { "content-type": "text/xml" } );
|
||||
|
||||
if ( req.query.cal === "5-2" ) {
|
||||
resp.end( content );
|
||||
return;
|
||||
}
|
||||
getBody( req ).then( function( body ) {
|
||||
if ( body === "cal=5-2" ) {
|
||||
resp.end( content );
|
||||
} else {
|
||||
resp.end( "<error>ERROR</error>" );
|
||||
}
|
||||
}, next );
|
||||
},
|
||||
atom: function( req, resp, next ) {
|
||||
resp.writeHead( 200, { "content-type": "atom+xml" } );
|
||||
resp.end( "<root><element /></root>" );
|
||||
},
|
||||
script: function( req, resp ) {
|
||||
if ( req.query.header === "ecma" ) {
|
||||
resp.writeHead( 200, { "content-type": "application/ecmascript" } );
|
||||
} else if ( req.query.header ) {
|
||||
resp.writeHead( 200, { "content-type": "text/javascript" } );
|
||||
} else {
|
||||
resp.writeHead( 200, { "content-type": "text/html" } );
|
||||
}
|
||||
resp.end( "ok( true, \"mock executed\" );" );
|
||||
},
|
||||
testbar: function( req, resp ) {
|
||||
resp.writeHead( 200 );
|
||||
resp.end(
|
||||
"this.testBar = 'bar'; " +
|
||||
"jQuery('#ap').html('bar'); " +
|
||||
"ok( true, 'mock executed');"
|
||||
);
|
||||
},
|
||||
json: function( req, resp ) {
|
||||
if ( req.query.header ) {
|
||||
resp.writeHead( 200, { "content-type": "application/json" } );
|
||||
}
|
||||
if ( req.query.array ) {
|
||||
resp.end( JSON.stringify(
|
||||
[ { name: "John", age: 21 }, { name: "Peter", age: 25 } ]
|
||||
) );
|
||||
} else {
|
||||
resp.end( JSON.stringify(
|
||||
{ data: { lang: "en", length: 25 } }
|
||||
) );
|
||||
}
|
||||
},
|
||||
jsonp: function( req, resp, next ) {
|
||||
var callback;
|
||||
if ( req.query.callback ) {
|
||||
callback = Promise.resolve( req.query.callback );
|
||||
} else if ( req.method === "GET" ) {
|
||||
callback = Promise.resolve( req.url.match( /^.+\/([^\/?.]+)\?.+$/ )[ 1 ] );
|
||||
} else {
|
||||
callback = getBody( req ).then( function( body ) {
|
||||
return body.trim().replace( "callback=", "" );
|
||||
} );
|
||||
}
|
||||
var json = req.query.array ?
|
||||
JSON.stringify(
|
||||
[ { name: "John", age: 21 }, { name: "Peter", age: 25 } ]
|
||||
) :
|
||||
JSON.stringify(
|
||||
{ data: { lang: "en", length: 25 } }
|
||||
);
|
||||
callback.then( function( cb ) {
|
||||
resp.end( cb + "(" + json + ")" );
|
||||
}, next );
|
||||
},
|
||||
xmlOverJsonp: function( req, resp ) {
|
||||
var callback = req.query.callback;
|
||||
var body = fs.readFileSync( __dirname + "/data/with_fries.xml" ).toString();
|
||||
resp.writeHead( 200 );
|
||||
resp.end( callback + "(" + JSON.stringify( body ) + ")\n" );
|
||||
},
|
||||
error: function( req, resp ) {
|
||||
if ( req.query.json ) {
|
||||
resp.writeHead( 400, { "content-type": "application/json" } );
|
||||
resp.end( "{ \"code\": 40, \"message\": \"Bad Request\" }" );
|
||||
} else {
|
||||
resp.writeHead( 400 );
|
||||
resp.end( "plain text message" );
|
||||
}
|
||||
},
|
||||
headers: function( req, resp ) {
|
||||
resp.writeHead( 200, {
|
||||
"Sample-Header": "Hello World",
|
||||
"Empty-Header": "",
|
||||
"Sample-Header2": "Hello World 2"
|
||||
} );
|
||||
req.query.keys.split( "|" ).forEach( function( key ) {
|
||||
if ( req.headers[ key.toLowerCase() ] ) {
|
||||
resp.write( key + ": " + req.headers[ key.toLowerCase() ] + "\n" );
|
||||
}
|
||||
} );
|
||||
resp.end();
|
||||
},
|
||||
echoData: function( req, resp, next ) {
|
||||
getBody( req ).then( function( body ) {
|
||||
resp.end( body );
|
||||
}, next );
|
||||
},
|
||||
echoQuery: function( req, resp ) {
|
||||
resp.end( req.parsed.search.slice( 1 ) );
|
||||
},
|
||||
echoMethod: function( req, resp ) {
|
||||
resp.end( req.method );
|
||||
},
|
||||
echoHtml: function( req, resp, next ) {
|
||||
resp.writeHead( 200, { "Content-Type": "text/html" } );
|
||||
resp.write( "<div id='method'>" + req.method + "</div>" );
|
||||
resp.write( "<div id='query'>" + req.parsed.search.slice( 1 ) + "</div>" );
|
||||
getBody( req ).then( function( body ) {
|
||||
resp.write( "<div id='data'>" + body + "</div>" );
|
||||
resp.end( body );
|
||||
}, next );
|
||||
},
|
||||
etag: function( req, resp ) {
|
||||
var hash = Number( req.query.ts ).toString( 36 );
|
||||
var etag = "W/\"" + hash + "\"";
|
||||
if ( req.headers[ "if-none-match" ] === etag ) {
|
||||
resp.writeHead( 304 );
|
||||
resp.end();
|
||||
return;
|
||||
}
|
||||
resp.writeHead( 200, {
|
||||
"Etag": etag
|
||||
} );
|
||||
resp.end();
|
||||
},
|
||||
ims: function( req, resp, next ) {
|
||||
var ts = req.query.ts;
|
||||
if ( req.headers[ "if-modified-since" ] === ts ) {
|
||||
resp.writeHead( 304 );
|
||||
resp.end();
|
||||
return;
|
||||
}
|
||||
resp.writeHead( 200, {
|
||||
"Last-Modified": ts
|
||||
} );
|
||||
resp.end();
|
||||
},
|
||||
status: function( req, resp, next ) {
|
||||
resp.writeHead( Number( req.query.code ) );
|
||||
resp.end();
|
||||
},
|
||||
testHTML: function( req, resp ) {
|
||||
resp.writeHead( 200, { "Content-Type": "text/html" } );
|
||||
var body = fs.readFileSync( __dirname + "/data/test.include.html" ).toString();
|
||||
body = body.replace( /{{baseURL}}/g, req.query.baseURL );
|
||||
resp.end( body );
|
||||
},
|
||||
cspFrame: function( req, resp ) {
|
||||
resp.writeHead( 200, {
|
||||
"Content-Type": "text/html",
|
||||
"Content-Security-Policy": "default-src 'self'; report-uri /base/test/data/mock.php?action=cspLog"
|
||||
} );
|
||||
var body = fs.readFileSync( __dirname + "/data/csp.include.html" ).toString();
|
||||
resp.end( body );
|
||||
},
|
||||
cspLog: function( req, resp ) {
|
||||
cspLog = "error";
|
||||
resp.writeHead( 200 );
|
||||
resp.end();
|
||||
},
|
||||
cspClean: function( req, resp ) {
|
||||
cspLog = "";
|
||||
resp.writeHead( 200 );
|
||||
resp.end();
|
||||
}
|
||||
};
|
||||
var handlers = {
|
||||
"test/data/mock.php": function( req, resp, next ) {
|
||||
if ( !mocks[ req.query.action ] ) {
|
||||
resp.writeHead( 400 );
|
||||
resp.end( "Invalid action query.\n" );
|
||||
console.log( "Invalid action query:", req.method, req.url );
|
||||
return;
|
||||
}
|
||||
mocks[ req.query.action ]( req, resp, next );
|
||||
},
|
||||
"test/data/support/csp.log": function( req, resp ) {
|
||||
resp.writeHead( 200 );
|
||||
resp.end( cspLog );
|
||||
},
|
||||
"test/data/404.txt": function( req, resp ) {
|
||||
resp.writeHead( 404 );
|
||||
resp.end( "" );
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Connect-compatible middleware factory for mocking server responses.
|
||||
* Used by Ajax unit tests when run via Karma.
|
||||
*
|
||||
* Despite Karma using Express, it uses Connect to deal with custom middleware,
|
||||
* which passes the raw Node Request and Response objects instead of the
|
||||
* Express versions of these (e.g. no req.path, req.query, resp.set).
|
||||
*/
|
||||
function MockserverMiddlewareFactory() {
|
||||
/**
|
||||
* @param {http.IncomingMessage} req
|
||||
* @param {http.ServerResponse} resp
|
||||
* @param {Function} next Continue request handling
|
||||
*/
|
||||
return function( req, resp, next ) {
|
||||
var method = req.method,
|
||||
parsed = url.parse( req.url, /* parseQuery */ true ),
|
||||
path = parsed.pathname.replace( /^\/base\//, "" ),
|
||||
query = parsed.query,
|
||||
subReq = Object.assign( Object.create( req ), {
|
||||
query: query,
|
||||
parsed: parsed
|
||||
} );
|
||||
|
||||
if ( /^test\/data\/mock.php\//.test( path ) ) {
|
||||
// Support REST-like Apache PathInfo
|
||||
path = "test\/data\/mock.php";
|
||||
}
|
||||
|
||||
if ( !handlers[ path ] ) {
|
||||
next();
|
||||
return;
|
||||
}
|
||||
|
||||
handlers[ path ]( subReq, resp, next );
|
||||
};
|
||||
}
|
||||
|
||||
function getBody( req ) {
|
||||
return req.method !== "POST" ?
|
||||
Promise.resolve( "" ) :
|
||||
getRawBody( req, {
|
||||
encoding: true
|
||||
} );
|
||||
}
|
||||
|
||||
module.exports = MockserverMiddlewareFactory;
|
File diff suppressed because it is too large
Load Diff
@ -127,7 +127,7 @@ QUnit.test( "attr(String)", function( assert ) {
|
||||
|
||||
assert.equal( jQuery( option ).prop( "selected" ), true, "Make sure that a single option is selected, even when in an optgroup." );
|
||||
|
||||
$img = jQuery( "<img style='display:none' width='215' height='53' src='data/1x1.jpg'/>" ).appendTo( "body" );
|
||||
$img = jQuery( "<img style='display:none' width='215' height='53' src='" + baseURL + "1x1.jpg'/>" ).appendTo( "body" );
|
||||
assert.equal( $img.attr( "width" ), "215", "Retrieve width attribute on an element with display:none." );
|
||||
assert.equal( $img.attr( "height" ), "53", "Retrieve height attribute on an element with display:none." );
|
||||
|
||||
@ -780,7 +780,7 @@ QUnit.test( "prop('tabindex')", function( assert ) {
|
||||
|
||||
QUnit.test( "image.prop( 'tabIndex' )", function( assert ) {
|
||||
assert.expect( 1 );
|
||||
var image = jQuery( "<img src='data/1x1.jpg' />" )
|
||||
var image = jQuery( "<img src='" + baseURL + "1x1.jpg' />" )
|
||||
.appendTo( "#qunit-fixture" );
|
||||
assert.equal( image.prop( "tabIndex" ), -1, "tabIndex on image" );
|
||||
} );
|
||||
|
@ -8,7 +8,7 @@ QUnit.test( "ajax", function( assert ) {
|
||||
|
||||
jQuery.ajax( {
|
||||
type: "GET",
|
||||
url: url( "data/name.php?name=foo" ),
|
||||
url: url( "mock.php?action=name&name=foo" ),
|
||||
success: function( msg ) {
|
||||
assert.strictEqual( msg, "bar", "Check for GET" );
|
||||
done.pop()();
|
||||
@ -17,7 +17,7 @@ QUnit.test( "ajax", function( assert ) {
|
||||
|
||||
jQuery.ajax( {
|
||||
type: "POST",
|
||||
url: url( "data/name.php" ),
|
||||
url: url( "mock.php?action=name" ),
|
||||
data: "name=peter",
|
||||
success: function( msg ) {
|
||||
assert.strictEqual( msg, "pan", "Check for POST" );
|
||||
@ -25,7 +25,7 @@ QUnit.test( "ajax", function( assert ) {
|
||||
}
|
||||
} );
|
||||
|
||||
jQuery( "#first" ).load( url( "data/name.html" ), function() {
|
||||
jQuery( "#first" ).load( url( "name.html" ), function() {
|
||||
assert.ok( /^ERROR/.test( jQuery( "#first" ).text() ),
|
||||
"Check if content was injected into the DOM" );
|
||||
done.pop()();
|
||||
|
@ -188,7 +188,7 @@ QUnit.test( "globalEval execution after script injection (#7862)", function( ass
|
||||
var now,
|
||||
script = document.createElement( "script" );
|
||||
|
||||
script.src = "data/longLoadScript.php?sleep=2";
|
||||
script.src = baseURL + "mock.php?action=wait&wait=2&script=1";
|
||||
|
||||
now = jQuery.now();
|
||||
document.body.appendChild( script );
|
||||
@ -1627,10 +1627,10 @@ QUnit.test( "jQuery.parseHTML", function( assert ) {
|
||||
QUnit.test( "jQuery.parseHTML(<a href>) - gh-2965", function( assert ) {
|
||||
assert.expect( 1 );
|
||||
|
||||
var html = "<a href='test.html'></a>",
|
||||
var html = "<a href='example.html'></a>",
|
||||
href = jQuery.parseHTML( html )[ 0 ].href;
|
||||
|
||||
assert.ok( /\/test\.html$/.test( href ), "href is not lost after parsing anchor" );
|
||||
assert.ok( /\/example\.html$/.test( href ), "href is not lost after parsing anchor" );
|
||||
} );
|
||||
|
||||
if ( jQuery.support.createHTMLDocument ) {
|
||||
|
@ -1066,7 +1066,7 @@ QUnit.test( "can't get css for disconnected in IE<9, see #10254 and #8388", func
|
||||
assert.expect( 2 );
|
||||
var span, div;
|
||||
|
||||
span = jQuery( "<span/>" ).css( "background-image", "url(data/1x1.jpg)" );
|
||||
span = jQuery( "<span/>" ).css( "background-image", "url(" + baseURL + "1x1.jpg)" );
|
||||
assert.notEqual( span.css( "background-image" ), null, "can't get background-image in IE<9, see #10254" );
|
||||
|
||||
div = jQuery( "<div/>" ).css( "top", 10 );
|
||||
@ -1374,7 +1374,6 @@ QUnit.test(
|
||||
"Clearing a Cloned Element's Style Shouldn't Clear the Original Element's Style (#8908)",
|
||||
24,
|
||||
function( assert ) {
|
||||
var baseUrl = document.location.href.replace( /([^\/]*)$/, "" );
|
||||
var done = assert.async();
|
||||
var styles = [ {
|
||||
name: "backgroundAttachment",
|
||||
@ -1388,7 +1387,7 @@ QUnit.test(
|
||||
|
||||
// Firefox returns auto's value
|
||||
name: "backgroundImage",
|
||||
value: [ "url('test.png')", "url(" + baseUrl + "test.png)", "url(\"" + baseUrl + "test.png\")" ],
|
||||
value: [ "url('test.png')", "url(" + baseURL + "test.png)", "url(\"" + baseURL + "test.png\")" ],
|
||||
expected: [ "none", "url(\"http://static.jquery.com/files/rocker/images/logo_jquery_215x53.gif\")" ]
|
||||
}, {
|
||||
name: "backgroundPosition",
|
||||
|
@ -777,7 +777,7 @@ QUnit.test( ".removeData should not throw exceptions. (#10080)", function( asser
|
||||
} );
|
||||
|
||||
// change the url to trigger unload
|
||||
frame.attr( "src", "data/iframe.html?param=true" );
|
||||
frame.attr( "src", baseURL + "iframe.html?param=true" );
|
||||
} );
|
||||
|
||||
QUnit.test( ".data only checks element attributes once. #8909", function( assert ) {
|
||||
|
2
test/unit/effects.js
vendored
2
test/unit/effects.js
vendored
@ -33,7 +33,7 @@ QUnit.module( "effects", {
|
||||
|
||||
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "sanity check", function( assert ) {
|
||||
assert.expect( 1 );
|
||||
assert.equal( jQuery( "#dl:visible, #qunit-fixture:visible, #foo:visible" ).length, 3, "QUnit state is correct for testing effects" );
|
||||
assert.equal( jQuery( "#qunit-fixture:visible, #foo:visible" ).length, 2, "QUnit state is correct for testing effects" );
|
||||
} );
|
||||
|
||||
QUnit.test( "show() basic", function( assert ) {
|
||||
|
@ -1281,8 +1281,7 @@ QUnit.test( ".trigger() doesn't bubble load event (#10717)", function( assert )
|
||||
assert.ok( false, "load fired on window" );
|
||||
} );
|
||||
|
||||
// It's not an image, but as long as it fires load...
|
||||
jQuery( "<img src='index.html' />" )
|
||||
jQuery( "<img src='" + baseURL + "1x1.jpg' />" )
|
||||
.appendTo( "body" )
|
||||
.on( "load", function() {
|
||||
assert.ok( true, "load fired on img" );
|
||||
@ -1443,7 +1442,7 @@ QUnit.test( "Submit event can be stopped (#11049)", function( assert ) {
|
||||
// handler making it impossible to feature-detect the support.
|
||||
QUnit[ /(ipad|iphone|ipod)/i.test( navigator.userAgent ) ? "skip" : "test" ](
|
||||
"on(beforeunload)", 1, function( assert ) {
|
||||
var iframe = jQuery( jQuery.parseHTML( "<iframe src='data/event/onbeforeunload.html'><iframe>" ) );
|
||||
var iframe = jQuery( jQuery.parseHTML( "<iframe src='" + baseURL + "event/onbeforeunload.html'><iframe>" ) );
|
||||
var done = assert.async();
|
||||
|
||||
window.onmessage = function( event ) {
|
||||
|
@ -2377,7 +2377,7 @@ QUnit.asyncTest( "html() - script exceptions bubble (#11743)", 2, function( asse
|
||||
assert.ok( true, "Exception thrown in remote script" );
|
||||
};
|
||||
|
||||
jQuery( "#qunit-fixture" ).html( "<script src='data/badcall.js'></script>" );
|
||||
jQuery( "#qunit-fixture" ).html( "<script src='" + baseURL + "badcall.js'></script>" );
|
||||
assert.ok( true, "Exception ignored" );
|
||||
} else {
|
||||
assert.ok( true, "No jQuery.ajax" );
|
||||
@ -2463,7 +2463,7 @@ QUnit.test( "script evaluation (#11795)", function( assert ) {
|
||||
|
||||
if ( jQuery.ajax ) {
|
||||
Globals.register( "testBar" );
|
||||
jQuery( "#qunit-fixture" ).append( "<script src='" + url( "data/testbar.php" ) + "'/>" );
|
||||
jQuery( "#qunit-fixture" ).append( "<script src='" + url( "mock.php?action=testbar" ) + "'/>" );
|
||||
assert.strictEqual( window.testBar, "bar", "Global script evaluation" );
|
||||
} else {
|
||||
assert.ok( true, "No jQuery.ajax" );
|
||||
|
@ -771,12 +771,12 @@ QUnit.test( "offsetParent", function( assert ) {
|
||||
assert.equal( div[ 0 ], document.documentElement, "The html element is the offsetParent of the body." );
|
||||
assert.equal( div[ 1 ], jQuery( "#nothiddendiv" )[ 0 ], "The div is the offsetParent." );
|
||||
|
||||
area = jQuery( "#imgmap area" ).offsetParent();
|
||||
assert.equal( area[ 0 ], document.documentElement, "The html element is the offsetParent of the body." );
|
||||
area = jQuery( "<map name=\"imgmap\"><area shape=\"rect\" coords=\"0,0,200,50\"></map>" ).appendTo( "body" ).find( "area" );
|
||||
assert.equal( area.offsetParent()[ 0 ], document.documentElement, "The html element is the offsetParent of a map area." );
|
||||
area.remove();
|
||||
|
||||
div = jQuery( "<div>" ).css( { "position": "absolute" } ).appendTo( "body" );
|
||||
assert.equal( div.offsetParent()[ 0 ], document.documentElement, "Absolutely positioned div returns html as offset parent, see #12139" );
|
||||
|
||||
div.remove();
|
||||
} );
|
||||
|
||||
|
@ -39,7 +39,7 @@ if ( jQuery.css ) {
|
||||
// i.e. no old WebKit or old Firefox
|
||||
testIframe(
|
||||
"Check CSP (https://developer.mozilla.org/en-US/docs/Security/CSP) restrictions",
|
||||
"support/csp.php",
|
||||
"mock.php?action=cspFrame",
|
||||
function( assert, jQuery, window, document, support ) {
|
||||
var done = assert.async();
|
||||
|
||||
@ -47,9 +47,9 @@ testIframe(
|
||||
assert.deepEqual( jQuery.extend( {}, support ), computedSupport,
|
||||
"No violations of CSP polices" );
|
||||
|
||||
supportjQuery.get( "data/support/csp.log" ).done( function( data ) {
|
||||
supportjQuery.get( baseURL + "support/csp.log" ).done( function( data ) {
|
||||
assert.equal( data, "", "No log request should be sent" );
|
||||
supportjQuery.get( "data/support/csp-clean.php" ).done( done );
|
||||
supportjQuery.get( baseURL + "mock.php?action=cspClean" ).done( done );
|
||||
} );
|
||||
}
|
||||
);
|
||||
|
@ -608,7 +608,7 @@ QUnit.test( "parents([String])", function( assert ) {
|
||||
assert.equal( jQuery( "#groups" ).parents( "p" )[ 0 ].id, "ap", "Filtered parents check" );
|
||||
assert.equal( jQuery( "#groups" ).parents( "div" )[ 0 ].id, "qunit-fixture", "Filtered parents check2" );
|
||||
assert.deepEqual( jQuery( "#groups" ).parents( "p, div" ).get(), q( "ap", "qunit-fixture" ), "Check for multiple filters" );
|
||||
assert.deepEqual( jQuery( "#en, #sndp" ).parents().get(), q( "foo", "qunit-fixture", "dl", "body", "html" ), "Check for unique results from parents" );
|
||||
assert.deepEqual( jQuery( "#en, #sndp" ).parents().get(), q( "foo", "qunit-fixture", "body", "html" ), "Check for unique results from parents" );
|
||||
} );
|
||||
|
||||
QUnit.test( "parentsUntil([String])", function( assert ) {
|
||||
@ -621,11 +621,11 @@ QUnit.test( "parentsUntil([String])", function( assert ) {
|
||||
assert.deepEqual( jQuery( "#groups" ).parentsUntil( "#html" ).get(), parents.slice( 0, -1 ).get(), "Simple parentsUntil check" );
|
||||
assert.equal( jQuery( "#groups" ).parentsUntil( "#ap" ).length, 0, "Simple parentsUntil check" );
|
||||
assert.deepEqual( jQuery( "#nonnodes" ).contents().eq( 1 ).parentsUntil( "#html" ).eq( 0 ).get(), q( "nonnodes" ), "Text node parentsUntil check" );
|
||||
assert.deepEqual( jQuery( "#groups" ).parentsUntil( "#html, #body" ).get(), parents.slice( 0, 3 ).get(), "Less simple parentsUntil check" );
|
||||
assert.deepEqual( jQuery( "#groups" ).parentsUntil( "#html, #body" ).get(), parents.slice( 0, 2 ).get(), "Less simple parentsUntil check" );
|
||||
assert.deepEqual( jQuery( "#groups" ).parentsUntil( "#html", "div" ).get(), jQuery( "#qunit-fixture" ).get(), "Filtered parentsUntil check" );
|
||||
assert.deepEqual( jQuery( "#groups" ).parentsUntil( "#html", "p,div,dl" ).get(), parents.slice( 0, 3 ).get(), "Multiple-filtered parentsUntil check" );
|
||||
assert.deepEqual( jQuery( "#groups" ).parentsUntil( "#html", "p,div" ).get(), parents.slice( 0, 2 ).get(), "Multiple-filtered parentsUntil check" );
|
||||
assert.equal( jQuery( "#groups" ).parentsUntil( "#html", "span" ).length, 0, "Filtered parentsUntil check, no match" );
|
||||
assert.deepEqual( jQuery( "#groups, #ap" ).parentsUntil( "#html", "p,div,dl" ).get(), parents.slice( 0, 3 ).get(), "Multi-source, multiple-filtered parentsUntil check" );
|
||||
assert.deepEqual( jQuery( "#groups, #ap" ).parentsUntil( "#html", "p,div" ).get(), parents.slice( 0, 2 ).get(), "Multi-source, multiple-filtered parentsUntil check" );
|
||||
} );
|
||||
|
||||
QUnit.test( "next([String])", function( assert ) {
|
||||
@ -784,7 +784,7 @@ QUnit[ "content" in document.createElement( "template" ) ? "test" : "skip" ](
|
||||
jQuery( "#qunit-fixture" ).append(
|
||||
"<template id='template'>" +
|
||||
" <script>testScript = 1;</script>" +
|
||||
" <img src='data/1x1.jpg' onload='testImgOnload = 1' >" +
|
||||
" <img src='" + baseURL + "1x1.jpg' onload='testImgOnload = 1' >" +
|
||||
"</template>"
|
||||
);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user