1 QUnit
.module( "ajax", {
2 afterEach: function() {
3 jQuery( document
).off( "ajaxStart ajaxStop ajaxSend ajaxComplete ajaxError ajaxSuccess" );
4 moduleTeardown
.apply( this, arguments
);
9 QUnit
.test( "Unit Testing Environment", function( assert
) {
12 assert
.ok( hasPHP
, "Running in an environment with PHP support. The AJAX tests only run if the environment supports PHP!" );
13 assert
.ok( !isLocal
, "Unit tests are not ran from file:// (especially in Chrome. If you must test from file:// with Chrome, run it with the --allow-file-access-from-files flag!)" );
16 if ( !includesModule( "ajax" ) || ( isLocal
&& !hasPHP
) ) {
20 function addGlobalEvents( expected
, assert
) {
22 expected
= expected
|| "";
23 jQuery( document
).on( "ajaxStart ajaxStop ajaxSend ajaxComplete ajaxError ajaxSuccess", function( e
) {
24 assert
.ok( expected
.indexOf( e
.type
) !== -1, e
.type
);
29 //----------- jQuery.ajax()
32 "XMLHttpRequest - Attempt to block tests because of dangling XHR requests (IE)",
33 "ajax/unreleasedXHR.html",
36 assert
.ok( true, "done" );
40 ajaxTest( "jQuery.ajax() - success callbacks", 8, function( assert
) {
42 setup
: addGlobalEvents( "ajaxStart ajaxStop ajaxSend ajaxComplete ajaxSuccess", assert
),
43 url
: url( "name.html" ),
44 beforeSend: function() {
45 assert
.ok( true, "beforeSend" );
48 assert
.ok( true, "success" );
50 complete: function() {
51 assert
.ok( true, "complete" );
56 ajaxTest( "jQuery.ajax() - success callbacks - (url, options) syntax", 8, function( assert
) {
58 setup
: addGlobalEvents( "ajaxStart ajaxStop ajaxSend ajaxComplete ajaxSuccess", assert
),
59 create: function( options
) {
60 return jQuery
.ajax( url( "name.html" ), options
);
62 beforeSend: function() {
63 assert
.ok( true, "beforeSend" );
66 assert
.ok( true, "success" );
68 complete: function() {
69 assert
.ok( true, "complete" );
74 jQuery
.each( [ " - Same Domain", " - Cross Domain" ], function( crossDomain
, label
) {
75 ajaxTest( "jQuery.ajax() - custom attributes for script tag" + label
, 5,
78 create: function( options
) {
80 options
.crossDomain
= crossDomain
;
81 options
.method
= "POST";
82 options
.dataType
= "script";
83 options
.scriptAttrs
= { id
: "jquery-ajax-test", async
: "async" };
84 xhr
= jQuery
.ajax( url( "mock.php?action=script" ), options
);
85 assert
.equal( jQuery( "#jquery-ajax-test" ).attr( "async" ), "async", "attr value" );
88 beforeSend: function( _jqXhr
, settings
) {
89 assert
.strictEqual( settings
.type
, "GET", "Type changed to GET" );
92 assert
.ok( true, "success" );
94 complete: function() {
95 assert
.ok( true, "complete" );
101 ajaxTest( "jQuery.ajax() - headers for script transport" + label
, 3,
104 create: function( options
) {
105 Globals
.register( "corsCallback" );
106 window
.corsCallback = function( response
) {
107 assert
.strictEqual( response
.headers
[ "x-custom-test-header" ],
108 "test value", "Custom header sent" );
110 options
.crossDomain
= crossDomain
;
111 options
.dataType
= "script";
112 options
.headers
= { "x-custom-test-header": "test value" };
113 return jQuery
.ajax( url( "mock.php?action=script&callback=corsCallback" ), options
);
115 success: function() {
116 assert
.ok( true, "success" );
118 complete: function() {
119 assert
.ok( true, "complete" );
125 ajaxTest( "jQuery.ajax() - scriptAttrs winning over headers" + label
, 4,
128 create: function( options
) {
130 Globals
.register( "corsCallback" );
131 window
.corsCallback = function( response
) {
132 assert
.ok( !response
.headers
[ "x-custom-test-header" ],
133 "headers losing with scriptAttrs" );
135 options
.crossDomain
= crossDomain
;
136 options
.dataType
= "script";
137 options
.scriptAttrs
= { id
: "jquery-ajax-test", async
: "async" };
138 options
.headers
= { "x-custom-test-header": "test value" };
139 xhr
= jQuery
.ajax( url( "mock.php?action=script&callback=corsCallback" ), options
);
140 assert
.equal( jQuery( "#jquery-ajax-test" ).attr( "async" ), "async", "attr value" );
143 success: function() {
144 assert
.ok( true, "success" );
146 complete: function() {
147 assert
.ok( true, "complete" );
154 ajaxTest( "jQuery.ajax() - execute JS when dataType option is provided", 3,
157 create: function( options
) {
158 Globals
.register( "corsCallback" );
159 options
.crossDomain
= true;
160 options
.dataType
= "script";
161 return jQuery
.ajax( url( "mock.php?action=script&header=ecma" ), options
);
163 success: function() {
164 assert
.ok( true, "success" );
166 complete: function() {
167 assert
.ok( true, "complete" );
173 jQuery
.each( [ " - Same Domain", " - Cross Domain" ], function( crossDomain
, label
) {
174 ajaxTest( "jQuery.ajax() - do not execute JS (gh-2432, gh-4822) " + label
, 1, function( assert
) {
176 url
: url( "mock.php?action=script&header" ),
177 crossDomain
: crossDomain
,
178 success: function() {
179 assert
.ok( true, "success" );
185 ajaxTest( "jQuery.ajax() - success callbacks (late binding)", 8, function( assert
) {
187 setup
: addGlobalEvents( "ajaxStart ajaxStop ajaxSend ajaxComplete ajaxSuccess", assert
),
188 url
: url( "name.html" ),
189 beforeSend: function() {
190 assert
.ok( true, "beforeSend" );
193 afterSend: function( request
) {
194 request
.always( function() {
195 assert
.ok( true, "complete" );
196 } ).done( function() {
197 assert
.ok( true, "success" );
198 } ).fail( function() {
199 assert
.ok( false, "error" );
205 ajaxTest( "jQuery.ajax() - success callbacks (oncomplete binding)", 8, function( assert
) {
207 setup
: addGlobalEvents( "ajaxStart ajaxStop ajaxSend ajaxComplete ajaxSuccess", assert
),
208 url
: url( "name.html" ),
209 beforeSend: function() {
210 assert
.ok( true, "beforeSend" );
213 complete: function( xhr
) {
214 xhr
.always( function() {
215 assert
.ok( true, "complete" );
216 } ).done( function() {
217 assert
.ok( true, "success" );
218 } ).fail( function() {
219 assert
.ok( false, "error" );
225 ajaxTest( "jQuery.ajax() - error callbacks", 8, function( assert
) {
227 setup
: addGlobalEvents( "ajaxStart ajaxStop ajaxSend ajaxComplete ajaxError", assert
),
228 url
: url( "mock.php?action=wait&wait=5" ),
229 beforeSend: function() {
230 assert
.ok( true, "beforeSend" );
232 afterSend: function( request
) {
236 assert
.ok( true, "error" );
238 complete: function() {
239 assert
.ok( true, "complete" );
244 ajaxTest( "jQuery.ajax() - textStatus and errorThrown values", 4, function( assert
) {
246 url
: url( "mock.php?action=wait&wait=5" ),
247 error: function( _
, textStatus
, errorThrown
) {
248 assert
.strictEqual( textStatus
, "abort", "textStatus is 'abort' for abort" );
249 assert
.strictEqual( errorThrown
, "abort", "errorThrown is 'abort' for abort" );
251 afterSend: function( request
) {
256 url
: url( "mock.php?action=wait&wait=5" ),
257 error: function( _
, textStatus
, errorThrown
) {
258 assert
.strictEqual( textStatus
, "mystatus", "textStatus is 'mystatus' for abort('mystatus')" );
259 assert
.strictEqual( errorThrown
, "mystatus", "errorThrown is 'mystatus' for abort('mystatus')" );
261 afterSend: function( request
) {
262 request
.abort( "mystatus" );
267 ajaxTest( "jQuery.ajax() - responseText on error", 1, function( assert
) {
269 url
: url( "mock.php?action=error" ),
270 error: function( xhr
) {
271 assert
.strictEqual( xhr
.responseText
, "plain text message", "Test jqXHR.responseText is filled for HTTP errors" );
276 QUnit
.test( "jQuery.ajax() - retry with jQuery.ajax( this )", function( assert
) {
280 done
= assert
.async();
282 url
: url( "mock.php?action=error" ),
288 assert
.ok( true, "Test retrying with jQuery.ajax(this) works" );
290 url
: url( "mock.php?action=error&x=2" ),
291 beforeSend: function() {
292 if ( !previousUrl
) {
293 previousUrl
= this.url
;
295 assert
.strictEqual( this.url
, previousUrl
, "url parameters are not re-appended" );
309 ajaxTest( "jQuery.ajax() - headers", 8, function( assert
) {
312 jQuery( document
).on( "ajaxSend", function( evt
, xhr
) {
313 xhr
.setRequestHeader( "ajax-send", "test" );
316 url
: url( "mock.php?action=headers&keys=siMPle|SometHing-elsE|OthEr|Nullable|undefined|Empty|ajax-send" ),
317 headers
: supportjQuery
.extend( {
319 "SometHing-elsE": "other value",
320 "OthEr": "something else",
322 "undefined": undefined
324 // Support: IE 9 - 11+
325 // IE can receive empty headers but not send them.
326 }, QUnit
.isIE
? {} : {
329 success: function( data
, _
, xhr
) {
331 requestHeaders
= jQuery
.extend( this.headers
, {
335 for ( i
in requestHeaders
) {
336 tmp
.push( i
, ": ", requestHeaders
[ i
] + "", "\n" );
338 tmp
= tmp
.join( "" );
340 assert
.strictEqual( data
, tmp
, "Headers were sent" );
341 assert
.strictEqual( xhr
.getResponseHeader( "Sample-Header" ), "Hello World", "Sample header received" );
342 assert
.ok( data
.indexOf( "undefined" ) < 0, "Undefined header value was not sent" );
343 assert
.strictEqual( xhr
.getResponseHeader( "Empty-Header" ), "", "Empty header received" );
344 assert
.strictEqual( xhr
.getResponseHeader( "Sample-Header2" ), "Hello World 2", "Second sample header received" );
345 assert
.strictEqual( xhr
.getResponseHeader( "List-Header" ), "Item 1, Item 2", "List header received" );
346 assert
.strictEqual( xhr
.getResponseHeader( "constructor" ), "prototype collision (constructor)", "constructor header received" );
347 assert
.strictEqual( xhr
.getResponseHeader( "__proto__" ), null, "Undefined __proto__ header not received" );
352 ajaxTest( "jQuery.ajax() - Accept header", 1, function( assert
) {
354 url
: url( "mock.php?action=headers&keys=accept" ),
356 Accept
: "very wrong accept value"
358 beforeSend: function( xhr
) {
359 xhr
.setRequestHeader( "Accept", "*/*" );
361 success: function( data
) {
362 assert
.strictEqual( data
, "accept: */*\n", "Test Accept header is set to last value provided" );
367 ajaxTest( "jQuery.ajax() - contentType", 2, function( assert
) {
370 url
: url( "mock.php?action=headers&keys=content-type" ),
372 success: function( data
) {
373 assert
.strictEqual( data
, "content-type: test\n", "Test content-type is sent when options.contentType is set" );
377 url
: url( "mock.php?action=headers&keys=content-type" ),
379 success: function( data
) {
381 // Some server/interpreter combinations always supply a Content-Type to scripts
382 data
= data
|| "content-type: \n";
383 assert
.strictEqual( data
, "content-type: \n", "Test content-type is not set when options.contentType===false" );
389 ajaxTest( "jQuery.ajax() - protocol-less urls", 1, function( assert
) {
391 url
: "//somedomain.com",
392 beforeSend: function( xhr
, settings
) {
393 assert
.equal( settings
.url
, location
.protocol
+ "//somedomain.com", "Make sure that the protocol is added." );
400 ajaxTest( "jQuery.ajax() - URL fragment component preservation", 5, function( assert
) {
403 url
: baseURL
+ "name.html#foo",
404 beforeSend: function( xhr
, settings
) {
405 assert
.equal( settings
.url
, baseURL
+ "name.html#foo",
406 "hash preserved for request with no query component." );
412 url
: baseURL
+ "name.html?abc#foo",
413 beforeSend: function( xhr
, settings
) {
414 assert
.equal( settings
.url
, baseURL
+ "name.html?abc#foo",
415 "hash preserved for request with query component." );
421 url
: baseURL
+ "name.html?abc#foo",
425 beforeSend: function( xhr
, settings
) {
426 assert
.equal( settings
.url
, baseURL
+ "name.html?abc&test=123#foo",
427 "hash preserved for request with query component and data." );
433 url
: baseURL
+ "name.html?abc#foo",
444 beforeSend: function( xhr
, settings
) {
445 assert
.equal( settings
.url
, baseURL
+ "name.html?abc&test=123&devo=hat#foo",
446 "hash preserved for request with query component and array data." );
452 url
: baseURL
+ "name.html?abc#brownies",
457 beforeSend: function( xhr
, settings
) {
458 // Clear the cache-buster param value
459 var url
= settings
.url
.replace( /_=[^&#]+/, "_=" );
460 assert
.equal( url
, baseURL
+ "name.html?abc&devo=hat&_=#brownies",
461 "hash preserved for cache-busting request with query component and data." );
469 ajaxTest( "jQuery.ajax() - traditional param encoding", 4, function( assert
) {
479 beforeSend: function( xhr
, settings
) {
480 assert
.equal( settings
.url
, "/?devo=hat&answer=42&quux=a%20space", "Simple case" );
490 "b[]": [ "b1", "b2" ]
492 beforeSend: function( xhr
, settings
) {
493 assert
.equal( settings
.url
, "/?a=1&a=2&a=3&b%5B%5D=b1&b%5B%5D=b2", "Arrays" );
502 "a": [ [ 1, 2 ], [ 3, 4 ], 5 ]
504 beforeSend: function( xhr
, settings
) {
505 assert
.equal( settings
.url
, "/?a=1%2C2&a=3%2C4&a=5", "Nested arrays" );
514 "a": [ "w", [ [ "x", "y" ], "z" ] ]
517 beforeSend: function( xhr
, settings
) {
518 var url
= settings
.url
.replace( /\d{3,}/, "" );
519 assert
.equal( url
, "/?a=w&a=x%2Cy%2Cz&_=", "Cache-buster" );
527 ajaxTest( "jQuery.ajax() - cross-domain detection", 8, function( assert
) {
528 function request( url
, title
, crossDomainOrOptions
) {
529 return jQuery
.extend( {
532 beforeSend: function( _
, s
) {
533 assert
.ok( crossDomainOrOptions
=== false ? !s
.crossDomain
: s
.crossDomain
, title
);
537 }, crossDomainOrOptions
);
540 var loc
= document
.location
,
541 samePort
= loc
.port
|| ( loc
.protocol
=== "http:" ? 80 : 443 ),
542 otherPort
= loc
.port
=== 666 ? 667 : 666,
543 otherProtocol
= loc
.protocol
=== "http:" ? "https:" : "http:";
547 loc
.protocol
+ "//" + loc
.hostname
+ ":" + samePort
,
548 "Test matching ports are not detected as cross-domain",
552 otherProtocol
+ "//" + loc
.host
,
553 "Test different protocols are detected as cross-domain"
557 "Adobe AIR app:/ URL detected as cross-domain"
560 loc
.protocol
+ "//example.invalid:" + ( loc
.port
|| 80 ),
561 "Test different hostnames are detected as cross-domain"
564 loc
.protocol
+ "//" + loc
.hostname
+ ":" + otherPort
,
565 "Test different ports are detected as cross-domain"
569 "Test about:blank is detected as cross-domain"
572 loc
.protocol
+ "//" + loc
.host
,
573 "Test forced crossDomain is detected as cross-domain",
579 " https://otherdomain.com",
580 "Cross-domain url with leading space is detected as cross-domain"
585 ajaxTest( "jQuery.ajax() - abort", 9, function( assert
) {
587 setup
: addGlobalEvents( "ajaxStart ajaxStop ajaxSend ajaxError ajaxComplete", assert
),
588 url
: url( "mock.php?action=wait&wait=5" ),
589 beforeSend: function() {
590 assert
.ok( true, "beforeSend" );
592 afterSend: function( xhr
) {
593 assert
.strictEqual( xhr
.readyState
, 1, "XHR readyState indicates successful dispatch" );
595 assert
.strictEqual( xhr
.readyState
, 0, "XHR readyState indicates successful abortion" );
598 complete: function() {
599 assert
.ok( true, "complete" );
604 ajaxTest( "jQuery.ajax() - native abort", 2, function( assert
) {
606 url
: url( "mock.php?action=wait&wait=1" ),
608 var xhr
= new window
.XMLHttpRequest();
609 setTimeout( function() {
614 error: function( xhr
, msg
) {
615 assert
.strictEqual( msg
, "error", "Native abort triggers error callback" );
617 complete: function() {
618 assert
.ok( true, "complete" );
623 ajaxTest( "jQuery.ajax() - native timeout", 2, function( assert
) {
625 url
: url( "mock.php?action=wait&wait=1" ),
627 var xhr
= new window
.XMLHttpRequest();
631 error: function( xhr
, msg
) {
632 assert
.strictEqual( msg
, "error", "Native timeout triggers error callback" );
634 complete: function() {
635 assert
.ok( true, "complete" );
640 ajaxTest( "jQuery.ajax() - events with context", 12, function( assert
) {
641 var context
= document
.createElement( "div" );
643 function event( e
) {
644 assert
.equal( this, context
, e
.type
);
647 function callback( msg
) {
649 assert
.equal( this, context
, "context is preserved on callback " + msg
);
655 jQuery( context
).appendTo( "#foo" )
656 .on( "ajaxSend", event
)
657 .on( "ajaxComplete", event
)
658 .on( "ajaxError", event
)
659 .on( "ajaxSuccess", event
);
662 url
: url( "name.html" ),
664 beforeSend
: callback( "beforeSend" ),
665 success
: callback( "success" ),
666 complete
: callback( "complete" )
668 url
: url( "404.txt" ),
670 beforeSend
: callback( "beforeSend" ),
671 error
: callback( "error" ),
672 complete
: callback( "complete" )
677 ajaxTest( "jQuery.ajax() - events without context", 3, function( assert
) {
678 function nocallback( msg
) {
680 assert
.equal( typeof this.url
, "string", "context is settings on callback " + msg
);
684 url
: url( "404.txt" ),
685 beforeSend
: nocallback( "beforeSend" ),
686 error
: nocallback( "error" ),
687 complete
: nocallback( "complete" )
691 ajaxTest( "trac-15118 - jQuery.ajax() - function without jQuery.event", 1, function( assert
) {
694 url
: url( "mock.php?action=json" ),
696 holder
= jQuery
.event
;
699 complete: function() {
700 assert
.ok( true, "Call can be made without jQuery.event" );
701 jQuery
.event
= holder
;
707 ajaxTest( "trac-15160 - jQuery.ajax() - request manually aborted in ajaxSend", 3, function( assert
) {
710 jQuery( document
).on( "ajaxSend", function( e
, jqXHR
) {
714 jQuery( document
).on( "ajaxError ajaxComplete", function( e
, jqXHR
) {
715 assert
.equal( jqXHR
.statusText
, "abort", "jqXHR.statusText equals abort on global ajaxComplete and ajaxError events" );
718 url
: url( "name.html" ),
720 complete: function() {
721 assert
.ok( true, "complete" );
726 ajaxTest( "jQuery.ajax() - context modification", 1, function( assert
) {
728 url
: url( "name.html" ),
730 beforeSend: function() {
733 afterSend: function() {
734 assert
.strictEqual( this.context
.test
, "foo", "Make sure the original object is maintained." );
740 ajaxTest( "jQuery.ajax() - context modification through ajaxSetup", 3, function( assert
) {
747 assert
.strictEqual( jQuery
.ajaxSettings
.context
, obj
, "Make sure the context is properly set in ajaxSettings." );
750 url
: url( "name.html" ),
751 success: function() {
752 assert
.strictEqual( this, obj
, "Make sure the original object is maintained." );
755 url
: url( "name.html" ),
757 success: function() {
758 assert
.ok( this !== obj
, "Make sure overriding context is possible." );
764 ajaxTest( "jQuery.ajax() - disabled globals", 3, function( assert
) {
766 setup
: addGlobalEvents( "", assert
),
768 url
: url( "name.html" ),
769 beforeSend: function() {
770 assert
.ok( true, "beforeSend" );
772 success: function() {
773 assert
.ok( true, "success" );
775 complete: function() {
776 assert
.ok( true, "complete" );
781 ajaxTest( "jQuery.ajax() - xml: non-namespace elements inside namespaced elements", 3, function( assert
) {
783 url
: url( "with_fries.xml" ),
785 success: function( resp
) {
786 assert
.equal( jQuery( "properties", resp
).length
, 1, "properties in responseXML" );
787 assert
.equal( jQuery( "jsconf", resp
).length
, 1, "jsconf in responseXML" );
788 assert
.equal( jQuery( "thing", resp
).length
, 2, "things in responseXML" );
793 ajaxTest( "jQuery.ajax() - xml: non-namespace elements inside namespaced elements (over JSONP)", 3, function( assert
) {
795 url
: url( "mock.php?action=xmlOverJsonp" ),
796 dataType
: "jsonp xml",
797 success: function( resp
) {
798 assert
.equal( jQuery( "properties", resp
).length
, 1, "properties in responseXML" );
799 assert
.equal( jQuery( "jsconf", resp
).length
, 1, "jsconf in responseXML" );
800 assert
.equal( jQuery( "thing", resp
).length
, 2, "things in responseXML" );
805 ajaxTest( "jQuery.ajax() - HEAD requests", 2, function( assert
) {
808 url
: url( "name.html" ),
810 success: function( data
, status
, xhr
) {
811 assert
.ok( /Date/i.test( xhr
.getAllResponseHeaders() ), "No Date in HEAD response" );
815 url
: url( "name.html" ),
820 success: function( data
, status
, xhr
) {
821 assert
.ok( /Date/i.test( xhr
.getAllResponseHeaders() ), "No Date in HEAD response with data" );
827 ajaxTest( "jQuery.ajax() - beforeSend", 1, function( assert
) {
829 url
: url( "name.html" ),
830 beforeSend: function() {
833 success: function() {
834 assert
.ok( this.check
, "check beforeSend was executed" );
839 ajaxTest( "jQuery.ajax() - beforeSend, cancel request manually", 2, function( assert
) {
842 return jQuery
.ajax( {
843 url
: url( "name.html" ),
844 beforeSend: function( xhr
) {
845 assert
.ok( true, "beforeSend got called, canceling" );
848 success: function() {
849 assert
.ok( false, "request didn't get canceled" );
851 complete: function() {
852 assert
.ok( false, "request didn't get canceled" );
855 assert
.ok( false, "request didn't get canceled" );
859 fail: function( _
, reason
) {
860 assert
.strictEqual( reason
, "canceled", "canceled request must fail with 'canceled' status text" );
865 ajaxTest( "jQuery.ajax() - dataType html", 5, function( assert
) {
868 Globals
.register( "testFoo" );
869 Globals
.register( "testBar" );
872 url
: url( "mock.php?action=testHTML&baseURL=" + baseURL
),
873 success: function( data
) {
874 assert
.ok( data
.match( /^html text/ ), "Check content for datatype html" );
875 jQuery( "#ap" ).html( data
);
876 assert
.strictEqual( window
[ "testFoo" ], "foo", "Check if script was evaluated for datatype html" );
877 assert
.strictEqual( window
[ "testBar" ], "bar", "Check if script src was evaluated for datatype html" );
882 ajaxTest( "jQuery.ajax() - do execute scripts if JSONP from unsuccessful responses", 1, function( assert
) {
883 var testMsg
= "Unsuccessful JSONP requests should have a JSON body";
886 url
: url( "mock.php?action=errorWithScript" ),
887 // error is the significant assertion
888 error: function( xhr
) {
889 var expected
= { "status": 404, "msg": "Not Found" };
890 assert
.deepEqual( xhr
.responseJSON
, expected
, testMsg
);
895 ajaxTest( "jQuery.ajax() - do not execute scripts from unsuccessful responses (gh-4250)", 11, function( assert
) {
896 var globalEval
= jQuery
.globalEval
;
898 var failConverters
= {
899 "text script": function() {
900 assert
.ok( false, "No converter for unsuccessful response" );
904 function request( title
, options
) {
905 var testMsg
= title
+ ": expected file missing status";
906 return jQuery
.extend( {
907 beforeSend: function() {
908 jQuery
.globalEval = function() {
909 assert
.ok( false, "Should not eval" );
912 complete: function() {
913 jQuery
.globalEval
= globalEval
;
915 // error is the significant assertion
916 error: function( xhr
) {
917 assert
.strictEqual( xhr
.status
, 404, testMsg
);
919 success: function() {
920 assert
.ok( false, "Unanticipated success" );
929 url
: url( "404.txt" )
933 "HTML reply with dataType",
936 url
: url( "404.txt" )
942 url
: url( "mock.php?action=errorWithScript&withScriptContentType" )
948 url
: url( "mock.php?action=errorWithScript" )
952 "script reply with dataType",
955 url
: url( "mock.php?action=errorWithScript&withScriptContentType" )
959 "non-script reply with dataType",
962 url
: url( "mock.php?action=errorWithScript" )
966 "script reply with converter",
968 converters
: failConverters
,
969 url
: url( "mock.php?action=errorWithScript&withScriptContentType" )
973 "non-script reply with converter",
975 converters
: failConverters
,
976 url
: url( "mock.php?action=errorWithScript" )
980 "script reply with converter and dataType",
982 converters
: failConverters
,
984 url
: url( "mock.php?action=errorWithScript&withScriptContentType" )
988 "non-script reply with converter and dataType",
990 converters
: failConverters
,
992 url
: url( "mock.php?action=errorWithScript" )
996 "JSONP reply with dataType",
999 url
: url( "mock.php?action=errorWithScript" ),
1000 beforeSend: function() {
1001 jQuery
.globalEval = function( response
) {
1002 assert
.ok( /"status": 404, "msg": "Not Found"/.test( response
), "Error object returned" );
1010 ajaxTest( "jQuery.ajax() - synchronous request", 1, function( assert
) {
1012 url
: url( "json_obj.js" ),
1016 afterSend: function( xhr
) {
1017 assert
.ok( /^\{ "data"/.test( xhr
.responseText
), "check returned text" );
1022 ajaxTest( "jQuery.ajax() - synchronous request with callbacks", 2, function( assert
) {
1024 url
: url( "json_obj.js" ),
1028 afterSend: function( xhr
) {
1030 xhr
.done( function( data
) {
1031 assert
.ok( true, "success callback executed" );
1034 assert
.ok( /^\{ "data"/.test( result
), "check returned text" );
1039 QUnit
.test( "jQuery.ajax(), jQuery.get[Script|JSON](), jQuery.post(), pass-through request object", function( assert
) {
1041 var done
= assert
.async();
1042 var target
= "name.html",
1046 success = function() {
1049 jQuery( document
).on( "ajaxError.passthru", function( e
, xml
) {
1051 errorEx
+= ": " + xml
.status
;
1053 jQuery( document
).one( "ajaxStop", function() {
1054 assert
.equal( successCount
, 5, "Check all ajax calls successful" );
1055 assert
.equal( errorCount
, 0, "Check no ajax errors (status" + errorEx
+ ")" );
1056 jQuery( document
).off( "ajaxError.passthru" );
1059 Globals
.register( "testBar" );
1061 assert
.ok( jQuery
.get( url( target
), success
), "get" );
1062 assert
.ok( jQuery
.post( url( target
), success
), "post" );
1063 assert
.ok( jQuery
.getScript( url( "mock.php?action=testbar" ), success
), "script" );
1064 assert
.ok( jQuery
.getJSON( url( "json_obj.js" ), success
), "json" );
1065 assert
.ok( jQuery
.ajax( {
1071 ajaxTest( "jQuery.ajax() - cache", 28, function( assert
) {
1072 var re
= /_=(.*?)(&|$)/g,
1073 rootUrl
= baseURL
+ "text.txt";
1075 function request( url
, title
) {
1079 beforeSend: function() {
1083 assert
.equal( this.url
.indexOf( rootUrl
), 0, "root url not mangled: " + this.url
);
1084 assert
.equal( /\&.*\?/.test( this.url
), false, "parameter delimiters in order" );
1086 while ( ( tmp
= re
.exec( this.url
) ) ) {
1087 assert
.strictEqual( parameter
, undefined, title
+ ": only one 'no-cache' parameter" );
1088 parameter
= tmp
[ 1 ];
1089 assert
.notStrictEqual( parameter
, "tobereplaced555", title
+ ": parameter (if it was there) was replaced" );
1107 rootUrl
+ "?pizza=true",
1111 rootUrl
+ "?_=tobereplaced555",
1115 rootUrl
+ "?pizza=true&_=tobereplaced555",
1116 "1 parameter and _="
1119 rootUrl
+ "?_=tobereplaced555&tv=false",
1120 "_= and 1 parameter"
1123 rootUrl
+ "?name=David&_=tobereplaced555&washere=true",
1124 "2 parameters surrounding _="
1129 jQuery
.each( [ " - Same Domain", " - Cross Domain" ], function( crossDomain
, label
) {
1131 ajaxTest( "jQuery.ajax() - JSONP - Query String (?n)" + label
, 4, function( assert
) {
1134 url
: baseURL
+ "mock.php?action=jsonp&callback=?",
1136 crossDomain
: crossDomain
,
1137 success: function( data
) {
1138 assert
.ok( data
.data
, "JSON results returned (GET, url callback)" );
1142 url
: baseURL
+ "mock.php?action=jsonp&callback=??",
1144 crossDomain
: crossDomain
,
1145 success: function( data
) {
1146 assert
.ok( data
.data
, "JSON results returned (GET, url context-free callback)" );
1150 url
: baseURL
+ "mock.php/???action=jsonp",
1152 crossDomain
: crossDomain
,
1153 success: function( data
) {
1154 assert
.ok( data
.data
, "JSON results returned (GET, REST-like)" );
1158 url
: baseURL
+ "mock.php/???action=jsonp&array=1",
1160 crossDomain
: crossDomain
,
1161 success: function( data
) {
1162 assert
.ok( Array
.isArray( data
), "JSON results returned (GET, REST-like with param)" );
1168 ajaxTest( "jQuery.ajax() - JSONP - Explicit callback param" + label
, 10, function( assert
) {
1171 Globals
.register( "functionToCleanUp" );
1172 Globals
.register( "XXX" );
1173 Globals
.register( "jsonpResults" );
1174 window
[ "jsonpResults" ] = function( data
) {
1175 assert
.ok( data
[ "data" ], "JSON results returned (GET, custom callback function)" );
1179 url
: baseURL
+ "mock.php?action=jsonp",
1181 crossDomain
: crossDomain
,
1183 success: function( data
) {
1184 assert
.ok( data
[ "data" ], "JSON results returned (GET, data obj callback)" );
1187 url
: baseURL
+ "mock.php?action=jsonp",
1189 crossDomain
: crossDomain
,
1190 jsonpCallback
: "jsonpResults",
1191 success: function( data
) {
1193 typeof window
[ "jsonpResults" ],
1195 "should not rewrite original function"
1197 assert
.ok( data
.data
, "JSON results returned (GET, custom callback name)" );
1200 url
: baseURL
+ "mock.php?action=jsonp",
1202 crossDomain
: crossDomain
,
1203 jsonpCallback
: "functionToCleanUp",
1204 success: function( data
) {
1205 assert
.ok( data
[ "data" ], "JSON results returned (GET, custom callback name to be cleaned up)" );
1206 assert
.strictEqual( window
[ "functionToCleanUp" ], true, "Callback was removed (GET, custom callback name to be cleaned up)" );
1209 url
: baseURL
+ "mock.php?action=jsonp",
1211 crossDomain
: crossDomain
,
1212 jsonpCallback
: "functionToCleanUp",
1213 beforeSend: function( jqXHR
) {
1218 xhr
.fail( function() {
1219 assert
.ok( true, "Ajax error JSON (GET, custom callback name to be cleaned up)" );
1220 assert
.strictEqual( window
[ "functionToCleanUp" ], true, "Callback was removed after early abort (GET, custom callback name to be cleaned up)" );
1224 url
: baseURL
+ "mock.php?action=jsonp&callback=XXX",
1227 jsonpCallback
: "XXX",
1228 crossDomain
: crossDomain
,
1229 beforeSend: function() {
1230 assert
.ok( /action=jsonp&callback=XXX&_=\d+$/.test( this.url
), "The URL wasn't messed with (GET, custom callback name with no url manipulation)" );
1232 success: function( data
) {
1233 assert
.ok( data
[ "data" ], "JSON results returned (GET, custom callback name with no url manipulation)" );
1239 ajaxTest( "jQuery.ajax() - JSONP - Callback in data" + label
, 2, function( assert
) {
1242 url
: baseURL
+ "mock.php?action=jsonp",
1244 crossDomain
: crossDomain
,
1246 success: function( data
) {
1247 assert
.ok( data
.data
, "JSON results returned (GET, data callback)" );
1251 url
: baseURL
+ "mock.php?action=jsonp",
1253 crossDomain
: crossDomain
,
1254 data
: "callback=??",
1255 success: function( data
) {
1256 assert
.ok( data
.data
, "JSON results returned (GET, data context-free callback)" );
1262 ajaxTest( "jQuery.ajax() - JSONP - POST" + label
, 3, function( assert
) {
1266 url
: baseURL
+ "mock.php?action=jsonp",
1268 crossDomain
: crossDomain
,
1269 success: function( data
) {
1270 assert
.ok( data
[ "data" ], "JSON results returned (POST, no callback)" );
1275 url
: baseURL
+ "mock.php?action=jsonp",
1278 crossDomain
: crossDomain
,
1279 success: function( data
) {
1280 assert
.ok( data
[ "data" ], "JSON results returned (POST, data callback)" );
1285 url
: baseURL
+ "mock.php?action=jsonp",
1288 crossDomain
: crossDomain
,
1289 success: function( data
) {
1290 assert
.ok( data
[ "data" ], "JSON results returned (POST, data obj callback)" );
1296 ajaxTest( "jQuery.ajax() - JSONP" + label
, 3, function( assert
) {
1299 url
: baseURL
+ "mock.php?action=jsonp",
1301 crossDomain
: crossDomain
,
1302 success: function( data
) {
1303 assert
.ok( data
.data
, "JSON results returned (GET, no callback)" );
1307 create: function( options
) {
1308 var request
= jQuery
.ajax( options
),
1309 promise
= request
.then( function( data
) {
1310 assert
.ok( data
.data
, "first request: JSON results returned (GET, no callback)" );
1311 request
= jQuery
.ajax( this ).done( function( data
) {
1312 assert
.ok( data
.data
, "this re-used: JSON results returned (GET, no callback)" );
1314 promise
.abort
= request
.abort
;
1317 promise
.abort
= request
.abort
;
1320 url
: baseURL
+ "mock.php?action=jsonp",
1322 crossDomain
: crossDomain
,
1328 ajaxTest( "jQuery.ajax() - no JSONP auto-promotion" + label
, 4, function( assert
) {
1331 url
: baseURL
+ "mock.php?action=jsonp",
1333 crossDomain
: crossDomain
,
1334 success: function() {
1335 assert
.ok( false, "JSON parsing should have failed (no callback)" );
1338 assert
.ok( true, "JSON parsing failed, JSONP not used (no callback)" );
1342 url
: baseURL
+ "mock.php?action=jsonp&callback=?",
1344 crossDomain
: crossDomain
,
1345 success: function() {
1346 assert
.ok( false, "JSON parsing should have failed (ULR callback)" );
1349 assert
.ok( true, "JSON parsing failed, JSONP not used (URL callback)" );
1353 url
: baseURL
+ "mock.php?action=jsonp",
1355 crossDomain
: crossDomain
,
1357 success: function() {
1358 assert
.ok( false, "JSON parsing should have failed (data callback=?)" );
1361 assert
.ok( true, "JSON parsing failed, JSONP not used (data callback=?)" );
1365 url
: baseURL
+ "mock.php?action=jsonp",
1367 crossDomain
: crossDomain
,
1368 data
: "callback=??",
1369 success: function() {
1370 assert
.ok( false, "JSON parsing should have failed (data callback=??)" );
1373 assert
.ok( true, "JSON parsing failed, JSONP not used (data callback=??)" );
1379 ajaxTest( "jQuery.ajax() - JSON - no ? replacement" + label
, 9, function( assert
) {
1382 url
: baseURL
+ "mock.php?action=json&callback=?",
1384 crossDomain
: crossDomain
,
1385 beforeSend: function( _jqXhr
, settings
) {
1386 var queryString
= settings
.url
.replace( /^[^?]*\?/, "" );
1388 queryString
.indexOf( "jQuery" ) === -1,
1389 "jQuery callback not inserted into the URL (URL callback)"
1392 queryString
.indexOf( "callback=?" ) > -1,
1393 "\"callback=?\" present in the URL unchanged (URL callback)"
1396 success: function( data
) {
1397 assert
.ok( data
.data
, "JSON results returned (URL callback)" );
1401 url
: baseURL
+ "mock.php?action=json",
1403 crossDomain
: crossDomain
,
1405 beforeSend: function( _jqXhr
, settings
) {
1406 var queryString
= settings
.url
.replace( /^[^?]*\?/, "" );
1408 queryString
.indexOf( "jQuery" ) === -1,
1409 "jQuery callback not inserted into the URL (data callback=?)"
1412 queryString
.indexOf( "callback=?" ) > -1,
1413 "\"callback=?\" present in the URL unchanged (data callback=?)"
1416 success: function( data
) {
1417 assert
.ok( data
.data
, "JSON results returned (data callback=?)" );
1421 url
: baseURL
+ "mock.php?action=json",
1423 crossDomain
: crossDomain
,
1424 data
: "callback=??",
1425 beforeSend: function( _jqXhr
, settings
) {
1426 var queryString
= settings
.url
.replace( /^[^?]*\?/, "" );
1428 queryString
.indexOf( "jQuery" ) === -1,
1429 "jQuery callback not inserted into the URL (data callback=??)"
1432 queryString
.indexOf( "callback=??" ) > -1,
1433 "\"callback=?\" present in the URL unchanged (data callback=??)"
1436 success: function( data
) {
1437 assert
.ok( data
.data
, "JSON results returned (data callback=??)" );
1446 "jQuery.ajax() - script, CSP script-src compat (gh-3969)",
1447 "mock.php?action=cspAjaxScript",
1448 function( assert
, jQuery
, window
, document
, type
, downloadedScriptCalled
) {
1451 assert
.strictEqual( type
, "GET", "Type changed to GET" );
1452 assert
.strictEqual( downloadedScriptCalled
, true, "External script called" );
1456 ajaxTest( "jQuery.ajax() - script, Remote", 2, function( assert
) {
1459 Globals
.register( "testBar" );
1461 url
: url( "mock.php?action=testbar" ),
1463 success: function() {
1464 assert
.strictEqual( window
[ "testBar" ], "bar", "Script results returned (GET, no callback)" );
1469 ajaxTest( "jQuery.ajax() - script, Remote with POST", 4, function( assert
) {
1472 Globals
.register( "testBar" );
1474 url
: url( "mock.php?action=testbar" ),
1475 beforeSend: function( _jqXhr
, settings
) {
1476 assert
.strictEqual( settings
.type
, "GET", "Type changed to GET" );
1480 success: function( data
, status
) {
1481 assert
.strictEqual( window
[ "testBar" ], "bar", "Script results returned (POST, no callback)" );
1482 assert
.strictEqual( status
, "success", "Script results returned (POST, no callback)" );
1487 ajaxTest( "jQuery.ajax() - script, Remote with scheme-less URL", 2, function( assert
) {
1490 Globals
.register( "testBar" );
1492 url
: url( "mock.php?action=testbar" ),
1494 success: function() {
1495 assert
.strictEqual( window
[ "testBar" ], "bar", "Script results returned (GET, no callback)" );
1500 ajaxTest( "jQuery.ajax() - malformed JSON", 2, function( assert
) {
1502 url
: baseURL
+ "badjson.js",
1504 error: function( xhr
, msg
, detailedMsg
) {
1505 assert
.strictEqual( msg
, "parsererror", "A parse error occurred." );
1506 assert
.ok( /(invalid|error|exception)/i.test( detailedMsg
), "Detailed parsererror message provided" );
1511 ajaxTest( "jQuery.ajax() - JSON by content-type", 10, function( assert
) {
1514 url
: baseURL
+ "mock.php?action=json",
1519 success: function( json
) {
1520 assert
.ok( json
.length
>= 2, "Check length" );
1521 assert
.strictEqual( json
[ 0 ][ "name" ], "John", "Check JSON: first, name" );
1522 assert
.strictEqual( json
[ 0 ][ "age" ], 21, "Check JSON: first, age" );
1523 assert
.strictEqual( json
[ 1 ][ "name" ], "Peter", "Check JSON: second, name" );
1524 assert
.strictEqual( json
[ 1 ][ "age" ], 25, "Check JSON: second, age" );
1528 url
: baseURL
+ "mock.php?action=json",
1539 success: function( json
) {
1540 assert
.ok( json
.length
>= 2, "Check length" );
1541 assert
.strictEqual( json
[ 0 ][ "name" ], "John", "Check JSON: first, name" );
1542 assert
.strictEqual( json
[ 0 ][ "age" ], 21, "Check JSON: first, age" );
1543 assert
.strictEqual( json
[ 1 ][ "name" ], "Peter", "Check JSON: second, name" );
1544 assert
.strictEqual( json
[ 1 ][ "age" ], 25, "Check JSON: second, age" );
1550 ajaxTest( "jQuery.ajax() - JSON by content-type disabled with options", 12, function( assert
) {
1553 url
: url( "mock.php?action=json" ),
1561 success: function( text
) {
1562 assert
.strictEqual( typeof text
, "string", "json wasn't auto-determined" );
1563 var json
= JSON
.parse( text
);
1564 assert
.ok( json
.length
>= 2, "Check length" );
1565 assert
.strictEqual( json
[ 0 ][ "name" ], "John", "Check JSON: first, name" );
1566 assert
.strictEqual( json
[ 0 ][ "age" ], 21, "Check JSON: first, age" );
1567 assert
.strictEqual( json
[ 1 ][ "name" ], "Peter", "Check JSON: second, name" );
1568 assert
.strictEqual( json
[ 1 ][ "age" ], 25, "Check JSON: second, age" );
1572 url
: url( "mock.php?action=json" ),
1586 success: function( text
) {
1587 assert
.strictEqual( typeof text
, "string", "json wasn't auto-determined" );
1588 var json
= JSON
.parse( text
);
1589 assert
.ok( json
.length
>= 2, "Check length" );
1590 assert
.strictEqual( json
[ 0 ][ "name" ], "John", "Check JSON: first, name" );
1591 assert
.strictEqual( json
[ 0 ][ "age" ], 21, "Check JSON: first, age" );
1592 assert
.strictEqual( json
[ 1 ][ "name" ], "Peter", "Check JSON: second, name" );
1593 assert
.strictEqual( json
[ 1 ][ "age" ], 25, "Check JSON: second, age" );
1599 ajaxTest( "jQuery.ajax() - simple get", 1, function( assert
) {
1602 url
: url( "mock.php?action=name&name=foo" ),
1603 success: function( msg
) {
1604 assert
.strictEqual( msg
, "bar", "Check for GET" );
1609 ajaxTest( "jQuery.ajax() - simple post", 1, function( assert
) {
1612 url
: url( "mock.php?action=name" ),
1614 success: function( msg
) {
1615 assert
.strictEqual( msg
, "pan", "Check for POST" );
1620 ajaxTest( "jQuery.ajax() - data option - empty bodies for non-GET requests", 1, function( assert
) {
1622 url
: baseURL
+ "mock.php?action=echoData",
1625 success: function( result
) {
1626 assert
.strictEqual( result
, "" );
1631 ajaxTest( "jQuery.ajax() - data - x-www-form-urlencoded (gh-2658)", 1, function( assert
) {
1634 data
: { devo
: "A Beautiful World" },
1636 beforeSend: function( _
, s
) {
1637 assert
.strictEqual( s
.data
, "devo=A+Beautiful+World", "data is '+'-encoded" );
1644 ajaxTest( "jQuery.ajax() - data - text/plain (gh-2658)", 2, function( assert
) {
1648 data
: { devo
: "A Beautiful World" },
1650 contentType
: "text/plain",
1651 beforeSend: function( _
, s
) {
1652 assert
.strictEqual( s
.data
, "devo=A%20Beautiful%20World", "data is %20-encoded" );
1662 value
: "A Beautiful World"
1666 contentType
: "text/plain",
1667 beforeSend: function( _
, s
) {
1668 assert
.strictEqual( s
.data
, "devo=A%20Beautiful%20World", "data is %20-encoded" );
1676 ajaxTest( "jQuery.ajax() - don't escape %20 with contentType override (gh-4119)", 1, function( assert
) {
1679 contentType
: "application/x-www-form-urlencoded",
1680 headers
: { "content-type": "application/json" },
1683 data
: "{\"val\":\"%20\"}",
1684 beforeSend: function( _
, s
) {
1685 assert
.strictEqual( s
.data
, "{\"val\":\"%20\"}", "data is not %20-encoded" );
1692 ajaxTest( "jQuery.ajax() - escape %20 with contentType override (gh-4119)", 1, function( assert
) {
1695 contentType
: "application/json",
1696 headers
: { "content-type": "application/x-www-form-urlencoded" },
1699 data
: "{\"val\":\"%20\"}",
1700 beforeSend: function( _
, s
) {
1701 assert
.strictEqual( s
.data
, "{\"val\":\"+\"}", "data is %20-encoded" );
1708 ajaxTest( "jQuery.ajax() - override contentType with header (gh-4119)", 1, function( assert
) {
1711 contentType
: "application/json",
1712 headers
: { "content-type": "application/x-www-form-urlencoded" },
1713 beforeSend: function( _
, s
) {
1714 assert
.strictEqual( s
.contentType
, "application/x-www-form-urlencoded",
1715 "contentType is overwritten" );
1722 ajaxTest( "jQuery.ajax() - data - no processing POST", 2, function( assert
) {
1726 data
: { devo
: "A Beautiful World" },
1728 contentType
: "x-special-sauce",
1730 beforeSend: function( _
, s
) {
1731 assert
.deepEqual( s
.data
, { devo
: "A Beautiful World" }, "data is not processed" );
1741 value
: "A Beautiful World"
1745 contentType
: "x-special-sauce",
1747 beforeSend: function( _
, s
) {
1748 assert
.deepEqual( s
.data
, [
1751 value
: "A Beautiful World"
1753 ], "data is not processed" );
1761 ajaxTest( "jQuery.ajax() - data - no processing GET", 2, function( assert
) {
1765 data
: { devo
: "A Beautiful World" },
1767 contentType
: "x-something-else",
1769 beforeSend: function( _
, s
) {
1770 assert
.deepEqual( s
.data
, { devo
: "A Beautiful World" }, "data is not processed" );
1780 value
: "A Beautiful World"
1784 contentType
: "x-something-else",
1786 beforeSend: function( _
, s
) {
1787 assert
.deepEqual( s
.data
, [
1790 value
: "A Beautiful World"
1792 ], "data is not processed" );
1800 ajaxTest( "jQuery.ajax() - data - process string with GET", 2, function( assert
) {
1805 contentType
: "x-something-else",
1807 beforeSend: function( _
, s
) {
1808 assert
.equal( s
.url
, "bogus.html?a=1&b=2", "added data to url" );
1809 assert
.equal( s
.data
, undefined, "removed data from settings" );
1816 var ifModifiedNow
= new Date();
1819 /* jQuery.each arguments start */
1822 " (no cache)": false
1824 function( label
, cache
) {
1827 "If-Modified-Since": {
1828 url
: "mock.php?action=ims",
1832 url
: "mock.php?action=etag",
1834 // Support: TestSwarm
1835 // TestSwarm is now proxied via Cloudflare which cuts out
1836 // headers relevant for ETag tests, failing them. We're still
1837 // running those tests in Karma on Chrome & Firefox (including
1839 qunitMethod
: QUnit
.isSwarm
? "skip" : "test"
1842 function( type
, data
) {
1843 var url
= baseURL
+ data
.url
+ "&ts=" + ifModifiedNow
++;
1844 QUnit
[ data
.qunitMethod
]( "jQuery.ajax() - " + type
+
1845 " support" + label
, function( assert
) {
1847 var done
= assert
.async();
1852 success: function( _
, status
) {
1853 assert
.strictEqual( status
, "success", "Initial status is 'success'" );
1858 success: function( data
, status
, jqXHR
) {
1859 assert
.strictEqual( status
, "notmodified", "Following status is 'notmodified'" );
1860 assert
.strictEqual( jqXHR
.status
, 304, "XHR status is 304" );
1861 assert
.equal( data
, null, "no response body is given" );
1863 complete: function() {
1873 /* jQuery.each arguments end */
1876 ajaxTest( "jQuery.ajax() - failing cross-domain (non-existing)", 1, function( assert
) {
1880 url
: "https://example.invalid",
1881 error: function( xhr
, _
, e
) {
1882 assert
.ok( true, "file not found: " + xhr
.status
+ " => " + e
);
1887 ajaxTest( "jQuery.ajax() - failing cross-domain", 1, function( assert
) {
1889 url
: "https://" + externalHost
,
1890 error: function( xhr
, _
, e
) {
1891 assert
.ok( true, "access denied: " + xhr
.status
+ " => " + e
);
1896 ajaxTest( "jQuery.ajax() - atom+xml", 1, function( assert
) {
1898 url
: url( "mock.php?action=atom" ),
1899 success: function() {
1900 assert
.ok( true, "success" );
1905 QUnit
.test( "jQuery.ajax() - statusText", function( assert
) {
1907 var done
= assert
.async();
1908 jQuery
.ajax( url( "mock.php?action=status&code=200&text=Hello" ) ).done( function( _
, statusText
, jqXHR
) {
1909 assert
.strictEqual( statusText
, "success", "callback status text ok for success" );
1910 assert
.ok( [ "Hello", "OK", "success" ].indexOf( jqXHR
.statusText
) > -1,
1911 "jqXHR status text ok for success (" + jqXHR
.statusText
+ ")" );
1912 jQuery
.ajax( url( "mock.php?action=status&code=404&text=World" ) ).fail( function( jqXHR
, statusText
) {
1913 assert
.strictEqual( statusText
, "error", "callback status text ok for error" );
1919 QUnit
.test( "jQuery.ajax() - statusCode", function( assert
) {
1920 assert
.expect( 20 );
1921 var done
= assert
.async(),
1924 function countComplete() {
1930 function createStatusCodes( name
, isSuccess
) {
1931 name
= "Test " + name
+ " " + ( isSuccess
? "success" : "error" );
1934 assert
.ok( isSuccess
, name
);
1937 assert
.ok( !isSuccess
, name
);
1943 /* jQuery.each arguments start */
1948 function( uri
, isSuccess
) {
1949 jQuery
.ajax( url( uri
), {
1950 statusCode
: createStatusCodes( "in options", isSuccess
),
1951 complete
: countComplete
1954 jQuery
.ajax( url( uri
), {
1955 complete
: countComplete
1956 } ).statusCode( createStatusCodes( "immediately with method", isSuccess
) );
1958 jQuery
.ajax( url( uri
), {
1959 complete: function( jqXHR
) {
1960 jqXHR
.statusCode( createStatusCodes( "on complete", isSuccess
) );
1965 jQuery
.ajax( url( uri
), {
1966 complete: function( jqXHR
) {
1967 setTimeout( function() {
1968 jqXHR
.statusCode( createStatusCodes( "very late binding", isSuccess
) );
1974 jQuery
.ajax( url( uri
), {
1975 statusCode
: createStatusCodes( "all (options)", isSuccess
),
1976 complete: function( jqXHR
) {
1977 jqXHR
.statusCode( createStatusCodes( "all (on complete)", isSuccess
) );
1978 setTimeout( function() {
1979 jqXHR
.statusCode( createStatusCodes( "all (very late binding)", isSuccess
) );
1983 } ).statusCode( createStatusCodes( "all (immediately with method)", isSuccess
) );
1985 var testString
= "";
1987 jQuery
.ajax( url( uri
), {
1988 success: function( a
, b
, jqXHR
) {
1989 assert
.ok( isSuccess
, "success" );
1990 var statusCode
= {};
1991 statusCode
[ jqXHR
.status
] = function() {
1994 jqXHR
.statusCode( statusCode
);
1997 error: function( jqXHR
) {
1998 assert
.ok( !isSuccess
, "error" );
1999 var statusCode
= {};
2000 statusCode
[ jqXHR
.status
] = function() {
2003 jqXHR
.statusCode( statusCode
);
2006 complete: function() {
2010 "Test statusCode callbacks are ordered like " + ( isSuccess
? "success" : "error" ) + " callbacks"
2017 /* jQuery.each arguments end*/
2021 ajaxTest( "jQuery.ajax() - transitive conversions", 8, function( assert
) {
2024 url
: url( "mock.php?action=json" ),
2026 "json myJson": function( data
) {
2027 assert
.ok( true, "converter called" );
2032 success: function() {
2033 assert
.ok( true, "Transitive conversion worked" );
2034 assert
.strictEqual( this.dataTypes
[ 0 ], "text", "response was retrieved as text" );
2035 assert
.strictEqual( this.dataTypes
[ 1 ], "myjson", "request expected myjson dataType" );
2039 url
: url( "mock.php?action=json" ),
2041 "json myJson": function( data
) {
2042 assert
.ok( true, "converter called (*)" );
2046 contents
: false, /* headers are wrong so we ignore them */
2047 dataType
: "* myJson",
2048 success: function() {
2049 assert
.ok( true, "Transitive conversion worked (*)" );
2050 assert
.strictEqual( this.dataTypes
[ 0 ], "text", "response was retrieved as text (*)" );
2051 assert
.strictEqual( this.dataTypes
[ 1 ], "myjson", "request expected myjson dataType (*)" );
2057 ajaxTest( "jQuery.ajax() - overrideMimeType", 2, function( assert
) {
2060 url
: url( "mock.php?action=json" ),
2061 beforeSend: function( xhr
) {
2062 xhr
.overrideMimeType( "application/json" );
2064 success: function( json
) {
2065 assert
.ok( json
.data
, "Mimetype overridden using beforeSend" );
2069 url
: url( "mock.php?action=json" ),
2070 mimeType
: "application/json",
2071 success: function( json
) {
2072 assert
.ok( json
.data
, "Mimetype overridden using mimeType option" );
2078 ajaxTest( "jQuery.ajax() - empty json gets to error callback instead of success callback.", 1, function( assert
) {
2080 url
: url( "mock.php?action=echoData" ),
2081 error: function( _
, __
, error
) {
2082 assert
.equal( typeof error
=== "object", true, "Didn't get back error object for empty json response" );
2088 ajaxTest( "trac-2688 - jQuery.ajax() - beforeSend, cancel request", 2, function( assert
) {
2090 create: function() {
2091 return jQuery
.ajax( {
2092 url
: url( "name.html" ),
2093 beforeSend: function() {
2094 assert
.ok( true, "beforeSend got called, canceling" );
2097 success: function() {
2098 assert
.ok( false, "request didn't get canceled" );
2100 complete: function() {
2101 assert
.ok( false, "request didn't get canceled" );
2104 assert
.ok( false, "request didn't get canceled" );
2108 fail: function( _
, reason
) {
2109 assert
.strictEqual( reason
, "canceled", "canceled request must fail with 'canceled' status text" );
2114 ajaxTest( "trac-2806 - jQuery.ajax() - data option - evaluate function values", 1, function( assert
) {
2116 url
: baseURL
+ "mock.php?action=echoQuery",
2122 success: function( result
) {
2123 assert
.strictEqual( result
, "action=echoQuery&key=value" );
2128 QUnit
.test( "trac-7531 - jQuery.ajax() - Location object as url", function( assert
) {
2134 xhr
= jQuery
.ajax( {
2135 url
: window
.location
2142 assert
.ok( success
, "document.location did not generate exception" );
2145 jQuery
.each( [ " - Same Domain", " - Cross Domain" ], function( crossDomain
, label
) {
2146 ajaxTest( "trac-7578 - jQuery.ajax() - JSONP - default for cache option" + label
, 1, function( assert
) {
2148 url
: baseURL
+ "mock.php?action=jsonp",
2150 crossDomain
: crossDomain
,
2151 beforeSend: function() {
2152 assert
.strictEqual( this.cache
, false, "cache must be false on JSON request" );
2160 ajaxTest( "trac-8107 - jQuery.ajax() - multiple method signatures introduced in 1.5", 4, function( assert
) {
2163 create: function() {
2164 return jQuery
.ajax();
2167 assert
.ok( true, "With no arguments" );
2171 create: function() {
2172 return jQuery
.ajax( baseURL
+ "name.html" );
2175 assert
.ok( true, "With only string URL argument" );
2179 create: function() {
2180 return jQuery
.ajax( baseURL
+ "name.html", {} );
2183 assert
.ok( true, "With string URL param and map" );
2187 create: function( options
) {
2188 return jQuery
.ajax( options
);
2190 url
: baseURL
+ "name.html",
2191 success: function() {
2192 assert
.ok( true, "With only map" );
2198 jQuery
.each( [ " - Same Domain", " - Cross Domain" ], function( crossDomain
, label
) {
2199 ajaxTest( "trac-8205 - jQuery.ajax() - JSONP - re-use callbacks name" + label
, 4, function( assert
) {
2201 url
: baseURL
+ "mock.php?action=jsonp",
2203 crossDomain
: crossDomain
,
2204 beforeSend: function( jqXHR
, s
) {
2205 s
.callback
= s
.jsonpCallback
;
2207 assert
.ok( this.callback
in window
, "JSONP callback name is in the window" );
2209 success: function() {
2210 var previous
= this;
2213 previous
.jsonpCallback
,
2215 "jsonpCallback option is set back to default in callbacks"
2219 !( this.callback
in window
),
2220 "JSONP callback name was removed from the window"
2224 url
: baseURL
+ "mock.php?action=jsonp",
2226 crossDomain
: crossDomain
,
2227 beforeSend: function() {
2228 assert
.strictEqual( this.jsonpCallback
, previous
.callback
, "JSONP callback name is re-used" );
2237 QUnit
.test( "trac-9887 - jQuery.ajax() - Context with circular references (trac-9887)", function( assert
) {
2240 var success
= false,
2242 context
.field
= context
;
2244 jQuery
.ajax( "non-existing", {
2246 beforeSend: function() {
2247 assert
.ok( this === context
, "context was not deep extended" );
2255 assert
.ok( success
, "context with circular reference did not generate an exception" );
2258 jQuery
.each( [ "as argument", "in settings object" ], function( inSetting
, title
) {
2260 function request( assert
, url
, test
) {
2262 create: function() {
2263 return jQuery
.ajax( inSetting
? { url
: url
} : url
);
2266 assert
.ok( true, ( test
|| url
) + " " + title
);
2271 ajaxTest( "trac-10093 - jQuery.ajax() - falsy url " + title
, 4, function( assert
) {
2273 request( assert
, "", "empty string" ),
2274 request( assert
, false ),
2275 request( assert
, null ),
2276 request( assert
, undefined )
2281 ajaxTest( "trac-11151 - jQuery.ajax() - parse error body", 2, function( assert
) {
2283 url
: url( "mock.php?action=error&json=1" ),
2284 dataFilter: function( string
) {
2285 assert
.ok( false, "dataFilter called" );
2288 error: function( jqXHR
) {
2289 assert
.strictEqual( jqXHR
.responseText
, "{ \"code\": 40, \"message\": \"Bad Request\" }", "Error body properly set" );
2290 assert
.deepEqual( jqXHR
.responseJSON
, { code
: 40, message
: "Bad Request" }, "Error body properly parsed" );
2295 ajaxTest( "trac-11426 - jQuery.ajax() - loading binary data shouldn't throw an exception in IE", 1, function( assert
) {
2297 url
: url( "1x1.jpg" ),
2298 success: function( data
) {
2299 assert
.ok( data
=== undefined || /JFIF/.test( data
), "success callback reached" );
2304 if ( typeof window
.ArrayBuffer
=== "undefined" || typeof new XMLHttpRequest().responseType
!== "string" ) {
2306 QUnit
.skip( "No ArrayBuffer support in XHR", jQuery
.noop
);
2309 // No built-in support for binary data, but it's easy to add via a prefilter
2310 jQuery
.ajaxPrefilter( "arraybuffer", function( s
) {
2311 s
.xhrFields
= { responseType
: "arraybuffer" };
2312 s
.responseFields
.arraybuffer
= "response";
2313 s
.converters
[ "binary arraybuffer" ] = true;
2316 ajaxTest( "gh-2498 - jQuery.ajax() - binary data shouldn't throw an exception", 2, function( assert
) {
2318 url
: url( "1x1.jpg" ),
2319 dataType
: "arraybuffer",
2320 success: function( data
, s
, jqxhr
) {
2321 assert
.ok( data
instanceof window
.ArrayBuffer
, "correct data type" );
2322 assert
.ok( jqxhr
.response
instanceof window
.ArrayBuffer
, "data in jQXHR" );
2328 QUnit
.test( "trac-11743 - jQuery.ajax() - script, throws exception", function( assert
) {
2330 var done
= assert
.async();
2331 var onerror
= window
.onerror
;
2332 window
.onerror = function() {
2333 assert
.ok( true, "Exception thrown" );
2334 window
.onerror
= onerror
;
2338 url
: baseURL
+ "badjson.js",
2344 jQuery
.each( [ "method", "type" ], function( _
, globalOption
) {
2345 function request( assert
, option
) {
2347 url
: url( "mock.php?action=echoData" ),
2349 success: function( msg
) {
2350 assert
.strictEqual( msg
, "hello", "Check for POST (no override)" );
2354 options
[ option
] = "GET";
2355 options
.success = function( msg
) {
2356 assert
.strictEqual( msg
, "", "Check for no POST (overriding with " + option
+ ")" );
2363 "trac-12004 - jQuery.ajax() - method is an alias of type - " +
2364 globalOption
+ " set globally", 3,
2365 function( assert
) {
2369 options
[ globalOption
] = "POST";
2370 jQuery
.ajaxSetup( options
);
2373 request( assert
, "type" ),
2374 request( assert
, "method" ),
2382 ajaxTest( "trac-13276 - jQuery.ajax() - compatibility between XML documents from ajax requests and parsed string", 1, function( assert
) {
2384 url
: baseURL
+ "dashboard.xml",
2386 success: function( ajaxXML
) {
2387 var parsedXML
= jQuery( jQuery
.parseXML( "<tab title=\"Added\">blibli</tab>" ) ).find( "tab" );
2388 ajaxXML
= jQuery( ajaxXML
);
2390 ajaxXML
.find( "infowindowtab" ).append( parsedXML
);
2392 assert
.strictEqual( e
, undefined, "error" );
2395 assert
.strictEqual( ajaxXML
.find( "tab" ).length
, 3, "Parsed node was added properly" );
2400 ajaxTest( "trac-13292 - jQuery.ajax() - converter is bypassed for 204 requests", 3, function( assert
) {
2402 url
: baseURL
+ "mock.php?action=status&code=204&text=No+Content",
2403 dataType
: "testing",
2405 "* testing": function() {
2406 throw "converter was called";
2409 success: function( data
, status
, jqXHR
) {
2410 assert
.strictEqual( jqXHR
.status
, 204, "status code is 204" );
2411 assert
.strictEqual( status
, "nocontent", "status text is 'nocontent'" );
2412 assert
.strictEqual( data
, undefined, "data is undefined" );
2414 error: function( _
, status
, error
) {
2415 assert
.ok( false, "error" );
2416 assert
.strictEqual( status
, "parsererror", "Parser Error" );
2417 assert
.strictEqual( error
, "converter was called", "Converter was called" );
2422 ajaxTest( "trac-13388 - jQuery.ajax() - responseXML", 3, function( assert
) {
2424 url
: url( "with_fries.xml" ),
2426 success: function( resp
, _
, jqXHR
) {
2427 assert
.notStrictEqual( resp
, undefined, "XML document exists" );
2428 assert
.ok( "responseXML" in jqXHR
, "jqXHR.responseXML exists" );
2429 assert
.strictEqual( resp
, jqXHR
.responseXML
, "jqXHR.responseXML is set correctly" );
2434 ajaxTest( "trac-13922 - jQuery.ajax() - converter is bypassed for HEAD requests", 3, function( assert
) {
2436 url
: baseURL
+ "mock.php?action=json",
2442 "text json": function() {
2443 throw "converter was called";
2446 success: function( data
, status
) {
2447 assert
.ok( true, "success" );
2448 assert
.strictEqual( status
, "nocontent", "data is undefined" );
2449 assert
.strictEqual( data
, undefined, "data is undefined" );
2451 error: function( _
, status
, error
) {
2452 assert
.ok( false, "error" );
2453 assert
.strictEqual( status
, "parsererror", "Parser Error" );
2454 assert
.strictEqual( error
, "converter was called", "Converter was called" );
2459 // Chrome 78 dropped support for synchronous XHR requests inside of
2460 // beforeunload, unload, pagehide, and visibilitychange event handlers.
2461 // See https://bugs.chromium.org/p/chromium/issues/detail?id=952452
2462 // Safari 13 did similar changes. The below check will catch them both.
2463 if ( !/webkit/i.test( navigator
.userAgent
) ) {
2465 "trac-14379 - jQuery.ajax() on unload",
2466 "ajax/onunload.html",
2467 function( assert
, jQuery
, window
, document
, status
) {
2469 assert
.strictEqual( status
, "success", "Request completed" );
2474 ajaxTest( "trac-14683 - jQuery.ajax() - Exceptions thrown synchronously by xhr.send should be caught", 4, function( assert
) {
2476 url
: baseURL
+ "mock.php?action=echoData",
2479 toString: function() {
2480 throw "Can't parse";
2484 done: function( data
) {
2485 assert
.ok( false, "done: " + data
);
2487 fail: function( jqXHR
, status
, error
) {
2488 assert
.ok( true, "exception caught: " + error
);
2489 assert
.strictEqual( jqXHR
.status
, 0, "proper status code" );
2490 assert
.strictEqual( status
, "error", "proper status" );
2493 url
: "https://" + externalHost
+ ":80q",
2494 done: function( data
) {
2495 assert
.ok( false, "done: " + data
);
2497 fail: function( _
, status
, error
) {
2498 assert
.ok( true, "fail: " + status
+ " - " + error
);
2503 ajaxTest( "gh-2587 - when content-type not xml, but looks like one", 1, function( assert
) {
2505 url
: url( "mock.php?action=contentType" ),
2507 contentType
: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
2508 "response": "<test/>"
2510 success: function( result
) {
2514 "Should handle it as a string, not xml"
2520 ajaxTest( "gh-2587 - when content-type not xml, but looks like one", 1, function( assert
) {
2522 url
: url( "mock.php?action=contentType" ),
2524 contentType
: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
2525 "response": "<test/>"
2527 success: function( result
) {
2531 "Should handle it as a string, not xml"
2537 ajaxTest( "gh-2587 - when content-type not json, but looks like one", 1, function( assert
) {
2539 url
: url( "mock.php?action=contentType" ),
2541 contentType
: "test/jsontest",
2542 "response": JSON
.stringify( { test
: "test" } )
2544 success: function( result
) {
2548 "Should handle it as a string, not json"
2554 ajaxTest( "gh-2587 - when content-type not html, but looks like one", 1, function( assert
) {
2556 url
: url( "mock.php?action=contentType" ),
2558 contentType
: "test/htmltest",
2559 "response": "<p>test</p>"
2561 success: function( result
) {
2565 "Should handle it as a string, not html"
2571 ajaxTest( "gh-2587 - when content-type not javascript, but looks like one", 1, function( assert
) {
2573 url
: url( "mock.php?action=contentType" ),
2575 contentType
: "test/testjavascript",
2576 "response": "alert(1)"
2578 success: function( result
) {
2582 "Should handle it as a string, not javascript"
2588 ajaxTest( "gh-2587 - when content-type not ecmascript, but looks like one", 1, function( assert
) {
2590 url
: url( "mock.php?action=contentType" ),
2592 contentType
: "test/testjavascript",
2593 "response": "alert(1)"
2595 success: function( result
) {
2599 "Should handle it as a string, not ecmascript"
2605 //----------- jQuery.ajaxPrefilter()
2607 ajaxTest( "jQuery.ajaxPrefilter() - abort", 1, function( assert
) {
2612 // Ensure prefix does not throw an error
2613 jQuery
.ajaxPrefilter( "+prefix", function( options
, _
, jqXHR
) {
2614 if ( options
.abortInPrefilter
) {
2619 abortInPrefilter
: true,
2621 assert
.ok( false, "error callback called" );
2623 fail: function( _
, reason
) {
2624 assert
.strictEqual( reason
, "canceled", "Request aborted by the prefilter must fail with 'canceled' status text" );
2629 //----------- jQuery.ajaxSetup()
2631 QUnit
.test( "jQuery.ajaxSetup()", function( assert
) {
2633 var done
= assert
.async();
2635 url
: url( "mock.php?action=name&name=foo" ),
2636 success: function( msg
) {
2637 assert
.strictEqual( msg
, "bar", "Check for GET" );
2644 QUnit
.test( "jQuery.ajaxSetup({ timeout: Number }) - with global timeout", function( assert
) {
2646 var done
= assert
.async();
2649 assert
.ok( passed
++ < 2, "Error callback executed" );
2650 if ( passed
=== 2 ) {
2651 jQuery( document
).off( "ajaxError.setupTest" );
2655 fail = function( a
, b
) {
2656 assert
.ok( false, "Check for timeout failed " + a
+ " " + b
);
2660 jQuery( document
).on( "ajaxError.setupTest", pass
);
2668 url
: url( "mock.php?action=wait&wait=5" ),
2674 QUnit
.test( "jQuery.ajaxSetup({ timeout: Number }) with localtimeout", function( assert
) {
2676 var done
= assert
.async();
2683 url
: url( "mock.php?action=wait&wait=1" ),
2685 assert
.ok( false, "Check for local timeout failed" );
2688 success: function() {
2689 assert
.ok( true, "Check for local timeout" );
2695 //----------- domManip()
2697 QUnit
.test( "trac-11264 - domManip() - no side effect because of ajaxSetup or global events", function( assert
) {
2704 jQuery( document
).on( "ajaxStart ajaxStop", function() {
2705 assert
.ok( false, "Global event triggered" );
2708 jQuery( "#qunit-fixture" ).append( "<script src='" + baseURL
+ "mock.php?action=script'></script>" );
2710 jQuery( document
).off( "ajaxStart ajaxStop" );
2714 "jQuery#load() - always use GET method even if overridden through ajaxSetup (trac-11264)",
2715 function( assert
) {
2717 var done
= assert
.async();
2723 jQuery( "#qunit-fixture" ).load( baseURL
+ "mock.php?action=echoMethod", function( method
) {
2724 assert
.equal( method
, "GET" );
2731 "jQuery#load() - should resolve with correct context",
2732 function( assert
) {
2734 var done
= assert
.async();
2735 var ps
= jQuery( "<p></p><p></p>" );
2738 ps
.appendTo( "#qunit-fixture" );
2740 ps
.load( baseURL
+ "mock.php?action=echoMethod", function() {
2741 assert
.strictEqual( this, ps
[ i
++ ] );
2751 "trac-11402 - domManip() - script in comments are properly evaluated",
2752 function( assert
) {
2754 jQuery( "#qunit-fixture" ).load( baseURL
+ "cleanScript.html", assert
.async() );
2758 //----------- jQuery.get()
2760 QUnit
.test( "jQuery.get( String, Hash, Function ) - parse xml and use text() on nodes", function( assert
) {
2762 var done
= assert
.async();
2763 jQuery
.get( url( "dashboard.xml" ), function( xml
) {
2765 jQuery( "tab", xml
).each( function() {
2766 content
.push( jQuery( this ).text() );
2768 assert
.strictEqual( content
[ 0 ], "blabla", "Check first tab" );
2769 assert
.strictEqual( content
[ 1 ], "blublu", "Check second tab" );
2774 QUnit
.test( "trac-8277 - jQuery.get( String, Function ) - data in ajaxSettings", function( assert
) {
2776 var done
= assert
.async();
2780 jQuery
.get( url( "mock.php?action=echoQuery" ), function( data
) {
2781 assert
.ok( /helloworld$/.test( data
), "Data from ajaxSettings was used" );
2786 QUnit
.test( "jQuery.get( String, null-ish, String ) - dataType with null callback (gh-4989)",
2787 function( assert
) {
2789 var done
= assert
.async( 2 );
2791 jQuery
.get( url( "mock.php?action=json&header" ), null, "json" )
2792 .then( function( json
) {
2793 assert
.deepEqual( json
, { data
: { lang
: "en", length
: 25 } },
2794 "`dataType: \"json\"` applied with a `null` callback" );
2798 jQuery
.get( url( "mock.php?action=json&header" ), null, "text" )
2799 .then( function( text
) {
2800 assert
.strictEqual( text
, "{\"data\":{\"lang\":\"en\",\"length\":25}}",
2801 "`dataType: \"text\"` applied with a `null` callback" );
2806 //----------- jQuery.getJSON()
2808 QUnit
.test( "jQuery.getJSON( String, Hash, Function ) - JSON array", function( assert
) {
2810 var done
= assert
.async();
2812 url( "mock.php?action=json" ),
2817 assert
.ok( json
.length
>= 2, "Check length" );
2818 assert
.strictEqual( json
[ 0 ][ "name" ], "John", "Check JSON: first, name" );
2819 assert
.strictEqual( json
[ 0 ][ "age" ], 21, "Check JSON: first, age" );
2820 assert
.strictEqual( json
[ 1 ][ "name" ], "Peter", "Check JSON: second, name" );
2821 assert
.strictEqual( json
[ 1 ][ "age" ], 25, "Check JSON: second, age" );
2827 QUnit
.test( "jQuery.getJSON( String, Function ) - JSON object", function( assert
) {
2829 var done
= assert
.async();
2830 jQuery
.getJSON( url( "mock.php?action=json" ), function( json
) {
2831 if ( json
&& json
[ "data" ] ) {
2832 assert
.strictEqual( json
[ "data" ][ "lang" ], "en", "Check JSON: lang" );
2833 assert
.strictEqual( json
[ "data" ].length
, 25, "Check JSON: length" );
2839 QUnit
.test( "jQuery.getJSON( String, Function ) - JSON object with absolute url to local content", function( assert
) {
2841 var done
= assert
.async();
2842 var absoluteUrl
= url( "mock.php?action=json" );
2844 // Make a relative URL absolute relative to the document location
2845 if ( !/^[a-z][a-z0-9+.-]*:/i.test( absoluteUrl
) ) {
2847 // An absolute path replaces everything after the host
2848 if ( absoluteUrl
.charAt( 0 ) === "/" ) {
2849 absoluteUrl
= window
.location
.href
.replace( /(:\/*[^/]*).*$/, "$1" ) + absoluteUrl
;
2851 // A relative path replaces the last slash-separated path segment
2853 absoluteUrl
= window
.location
.href
.replace( /[^/]*$/, "" ) + absoluteUrl
;
2857 jQuery
.getJSON( absoluteUrl
, function( json
) {
2858 assert
.strictEqual( json
.data
.lang
, "en", "Check JSON: lang" );
2859 assert
.strictEqual( json
.data
.length
, 25, "Check JSON: length" );
2864 //----------- jQuery.getScript()
2866 QUnit
.test( "jQuery.getScript( String, Function ) - with callback",
2867 function( assert
) {
2869 var done
= assert
.async();
2871 Globals
.register( "testBar" );
2872 jQuery
.getScript( url( "mock.php?action=testbar" ), function() {
2873 assert
.strictEqual( window
[ "testBar" ], "bar", "Check if script was evaluated" );
2879 QUnit
.test( "jQuery.getScript( String, Function ) - no callback", function( assert
) {
2881 Globals
.register( "testBar" );
2882 jQuery
.getScript( url( "mock.php?action=testbar" ) ).done( assert
.async() );
2885 QUnit
.test( "trac-8082 - jQuery.getScript( String, Function ) - source as responseText", function( assert
) {
2887 var done
= assert
.async();
2889 Globals
.register( "testBar" );
2890 jQuery
.getScript( url( "mock.php?action=testbar" ), function( data
, _
, jqXHR
) {
2891 assert
.strictEqual( data
, jqXHR
.responseText
, "Same-domain script requests returns the source of the script" );
2896 QUnit
.test( "jQuery.getScript( Object ) - with callback", function( assert
) {
2898 var done
= assert
.async();
2900 Globals
.register( "testBar" );
2902 url
: url( "mock.php?action=testbar" ),
2903 success: function() {
2904 assert
.strictEqual( window
[ "testBar" ], "bar", "Check if script was evaluated" );
2910 QUnit
.test( "jQuery.getScript( Object ) - no callback", function( assert
) {
2912 Globals
.register( "testBar" );
2913 jQuery
.getScript( { url
: url( "mock.php?action=testbar" ) } ).done( assert
.async() );
2916 // //----------- jQuery.fn.load()
2918 // check if load can be called with only url
2919 QUnit
.test( "jQuery.fn.load( String )", function( assert
) {
2922 beforeSend: function() {
2923 assert
.strictEqual( this.type
, "GET", "no data means GET request" );
2926 jQuery( "#first" ).load( baseURL
+ "name.html", assert
.async() );
2929 QUnit
.test( "jQuery.fn.load() - 404 error callbacks", function( assert
) {
2931 var done
= assert
.async();
2933 addGlobalEvents( "ajaxStart ajaxStop ajaxSend ajaxComplete ajaxError", assert
)();
2934 jQuery( document
).on( "ajaxStop", done
);
2935 jQuery( "<div></div>" ).load( baseURL
+ "404.txt", function() {
2936 assert
.ok( true, "complete" );
2940 // check if load can be called with url and null data
2941 QUnit
.test( "jQuery.fn.load( String, null )", function( assert
) {
2944 beforeSend: function() {
2945 assert
.strictEqual( this.type
, "GET", "no data means GET request" );
2948 jQuery( "#first" ).load( baseURL
+ "name.html", null, assert
.async() );
2951 // check if load can be called with url and undefined data
2952 QUnit
.test( "jQuery.fn.load( String, undefined )", function( assert
) {
2955 beforeSend: function() {
2956 assert
.strictEqual( this.type
, "GET", "no data means GET request" );
2959 jQuery( "#first" ).load( baseURL
+ "name.html", undefined, assert
.async() );
2962 // check if load can be called with only url
2963 QUnit
.test( "jQuery.fn.load( URL_SELECTOR )", function( assert
) {
2965 var done
= assert
.async();
2966 jQuery( "#first" ).load( baseURL
+ "test3.html div.user", function() {
2967 assert
.strictEqual( jQuery( this ).children( "div" ).length
, 2, "Verify that specific elements were injected" );
2972 // Selector should be trimmed to avoid leading spaces (trac-14773)
2973 QUnit
.test( "jQuery.fn.load( URL_SELECTOR with spaces )", function( assert
) {
2975 var done
= assert
.async();
2976 jQuery( "#first" ).load( baseURL
+ "test3.html #superuser ", function() {
2977 assert
.strictEqual( jQuery( this ).children( "div" ).length
, 1, "Verify that specific elements were injected" );
2982 // Selector should be trimmed to avoid leading spaces (trac-14773)
2983 // Selector should include any valid non-HTML whitespace (gh-3003)
2984 QUnit
.test( "jQuery.fn.load( URL_SELECTOR with non-HTML whitespace(gh-3003) )", function( assert
) {
2986 var done
= assert
.async();
2987 jQuery( "#first" ).load( baseURL
+ "test3.html #whitespace\\\\xA0 ", function() {
2988 assert
.strictEqual( jQuery( this ).children( "div" ).length
, 1, "Verify that specific elements were injected" );
2993 QUnit
.test( "jQuery.fn.load( String, Function ) - simple: inject text into DOM", function( assert
) {
2995 var done
= assert
.async();
2996 jQuery( "#first" ).load( url( "name.html" ), function() {
2997 assert
.ok( /^ERROR/.test( jQuery( "#first" ).text() ), "Check if content was injected into the DOM" );
3002 QUnit
.test( "jQuery.fn.load( String, Function ) - check scripts", function( assert
) {
3004 var done
= assert
.async();
3005 var verifyEvaluation = function() {
3006 assert
.strictEqual( window
[ "testBar" ], "bar", "Check if script src was evaluated after load" );
3007 assert
.strictEqual( jQuery( "#ap" ).html(), "bar", "Check if script evaluation has modified DOM" );
3011 Globals
.register( "testFoo" );
3012 Globals
.register( "testBar" );
3014 jQuery( "#first" ).load( url( "mock.php?action=testHTML&baseURL=" + baseURL
), function() {
3015 assert
.ok( jQuery( "#first" ).html().match( /^html text/ ), "Check content after loading html" );
3016 assert
.strictEqual( jQuery( "#foo" ).html(), "foo", "Check if script evaluation has modified DOM" );
3017 assert
.strictEqual( window
[ "testFoo" ], "foo", "Check if script was evaluated after load" );
3018 setTimeout( verifyEvaluation
, 600 );
3022 QUnit
.test( "jQuery.fn.load( String, Function ) - check file with only a script tag", function( assert
) {
3024 var done
= assert
.async();
3025 Globals
.register( "testFoo" );
3027 jQuery( "#first" ).load( url( "test2.html" ), function() {
3028 assert
.strictEqual( jQuery( "#foo" ).html(), "foo", "Check if script evaluation has modified DOM" );
3029 assert
.strictEqual( window
[ "testFoo" ], "foo", "Check if script was evaluated after load" );
3034 QUnit
.test( "jQuery.fn.load( String, Function ) - dataFilter in ajaxSettings", function( assert
) {
3036 var done
= assert
.async();
3038 dataFilter: function() {
3039 return "Hello World";
3042 jQuery( "<div></div>" ).load( url( "name.html" ), function( responseText
) {
3043 assert
.strictEqual( jQuery( this ).html(), "Hello World", "Test div was filled with filtered data" );
3044 assert
.strictEqual( responseText
, "Hello World", "Test callback receives filtered data" );
3049 QUnit
.test( "jQuery.fn.load( String, Object, Function )", function( assert
) {
3051 var done
= assert
.async();
3052 jQuery( "<div></div>" ).load( url( "mock.php?action=echoHtml" ), {
3055 var $node
= jQuery( this );
3056 assert
.strictEqual( $node
.find( "#method" ).text(), "POST", "Check method" );
3057 assert
.strictEqual( $node
.find( "#data" ).text(), "bar=ok", "Check if data is passed correctly" );
3062 QUnit
.test( "jQuery.fn.load( String, String, Function )", function( assert
) {
3064 var done
= assert
.async();
3066 jQuery( "<div></div>" ).load( url( "mock.php?action=echoHtml" ), "foo=3&bar=ok", function() {
3067 var $node
= jQuery( this );
3068 assert
.strictEqual( $node
.find( "#method" ).text(), "GET", "Check method" );
3069 assert
.ok( $node
.find( "#query" ).text().match( /foo=3&bar=ok/ ), "Check if a string of data is passed correctly" );
3074 QUnit
.test( "jQuery.fn.load() - callbacks get the correct parameters", function( assert
) {
3076 var completeArgs
= {},
3077 done
= assert
.async();
3080 success: function( _
, status
, jqXHR
) {
3081 completeArgs
[ this.url
] = [ jqXHR
.responseText
, status
, jqXHR
];
3083 error: function( jqXHR
, status
) {
3084 completeArgs
[ this.url
] = [ jqXHR
.responseText
, status
, jqXHR
];
3093 url
: baseURL
+ "mock.php?action=echoQuery&arg=pop"
3097 url
: baseURL
+ "404.txt"
3100 function( options
) {
3101 return jQuery
.Deferred( function( defer
) {
3102 jQuery( "#foo" ).load( options
.url
, function() {
3103 var args
= arguments
;
3104 assert
.strictEqual( completeArgs
[ options
.url
].length
, args
.length
, "same number of arguments (" + options
.type
+ ")" );
3105 jQuery
.each( completeArgs
[ options
.url
], function( i
, value
) {
3106 assert
.strictEqual( args
[ i
], value
, "argument #" + i
+ " is the same (" + options
.type
+ ")" );
3115 QUnit
.test( "trac-2046 - jQuery.fn.load( String, Function ) with ajaxSetup on dataType json", function( assert
) {
3117 var done
= assert
.async();
3122 jQuery( document
).on( "ajaxComplete", function( e
, xml
, s
) {
3123 assert
.strictEqual( s
.dataType
, "html", "Verify the load() dataType was html" );
3124 jQuery( document
).off( "ajaxComplete" );
3127 jQuery( "#first" ).load( baseURL
+ "test3.html" );
3130 QUnit
.test( "trac-10524 - jQuery.fn.load() - data specified in ajaxSettings is merged in", function( assert
) {
3132 var done
= assert
.async();
3142 jQuery( "#foo" ).load( baseURL
+ "mock.php?action=echoQuery", data
);
3143 jQuery( document
).on( "ajaxComplete", function( event
, jqXHR
, options
) {
3144 assert
.ok( ~options
.data
.indexOf( "foo=bar" ), "Data from ajaxSettings was used" );
3149 // //----------- jQuery.post()
3151 QUnit
.test( "jQuery.post() - data", function( assert
) {
3153 var done
= assert
.async();
3157 url( "mock.php?action=xml" ),
3162 jQuery( "math", xml
).each( function() {
3163 assert
.strictEqual( jQuery( "calculation", this ).text(), "5-2", "Check for XML" );
3164 assert
.strictEqual( jQuery( "result", this ).text(), "3", "Check for XML" );
3169 url
: url( "mock.php?action=echoData" ),
3177 success: function( data
) {
3178 assert
.strictEqual( data
, "test%5Blength%5D=7&test%5Bfoo%5D=bar", "Check if a sub-object with a length param is serialized correctly" );
3184 QUnit
.test( "jQuery.post( String, Hash, Function ) - simple with xml", function( assert
) {
3186 var done
= assert
.async();
3190 url( "mock.php?action=xml" ),
3195 jQuery( "math", xml
).each( function() {
3196 assert
.strictEqual( jQuery( "calculation", this ).text(), "5-2", "Check for XML" );
3197 assert
.strictEqual( jQuery( "result", this ).text(), "3", "Check for XML" );
3201 jQuery
.post( url( "mock.php?action=xml&cal=5-2" ), {}, function( xml
) {
3202 jQuery( "math", xml
).each( function() {
3203 assert
.strictEqual( jQuery( "calculation", this ).text(), "5-2", "Check for XML" );
3204 assert
.strictEqual( jQuery( "result", this ).text(), "3", "Check for XML" );
3207 ).always( function() {
3212 QUnit
.test( "jQuery[get|post]( options ) - simple with xml", function( assert
) {
3214 var done
= assert
.async();
3216 jQuery
.when
.apply( jQuery
,
3217 jQuery
.map( [ "get", "post" ], function( method
) {
3218 return jQuery
[ method
]( {
3219 url
: url( "mock.php?action=xml" ),
3223 success: function( xml
) {
3224 jQuery( "math", xml
).each( function() {
3225 assert
.strictEqual( jQuery( "result", this ).text(), "3", "Check for XML" );
3230 ).always( function() {
3235 //----------- jQuery.active
3237 QUnit
.test( "jQuery.active", function( assert
) {
3239 assert
.ok( jQuery
.active
=== 0, "ajax active counter should be zero: " + jQuery
.active
);
3242 ajaxTest( "jQuery.ajax() - FormData", 1, function( assert
) {
3243 var formData
= new FormData();
3244 formData
.append( "key1", "value1" );
3245 formData
.append( "key2", "value2" );
3248 url
: url( "mock.php?action=formData" ),
3251 success: function( data
) {
3252 assert
.strictEqual( data
, "key1 -> value1, key2 -> value2",
3253 "FormData sent correctly" );
3258 ajaxTest( "jQuery.ajax() - URLSearchParams", 1, function( assert
) {
3259 var urlSearchParams
= new URLSearchParams();
3260 urlSearchParams
.append( "name", "peter" );
3263 url
: url( "mock.php?action=name" ),
3265 data
: urlSearchParams
,
3266 success: function( data
) {
3267 assert
.strictEqual( data
, "pan", "URLSearchParams sent correctly" );
3270 }, QUnit
.testUnlessIE
);
3272 ajaxTest( "jQuery.ajax() - Blob", 1, function( assert
) {
3273 var blob
= new Blob( [ "name=peter" ], { type
: "text/plain" } );
3276 url
: url( "mock.php?action=name" ),
3279 success: function( data
) {
3280 assert
.strictEqual( data
, "pan", "Blob sent correctly" );
3285 ajaxTest( "jQuery.ajax() - non-plain object", 1, function( assert
) {
3287 url
: url( "mock.php?action=name" ),
3289 data
: Object
.create( { name
: "peter" } ),
3290 success: function( data
) {
3291 assert
.strictEqual( data
, "ERROR", "Data correctly not sent" );
3296 ajaxTest( "jQuery.ajax() - non-plain object with processData: true", 1, function( assert
) {
3298 url
: url( "mock.php?action=name" ),
3301 data
: Object
.create( { name
: "peter" } ),
3302 success: function( data
) {
3303 assert
.strictEqual( data
, "pan", "Data sent correctly" );