Makes sure all converters keys are lowercased before any conversion is taking place...
[jquery.git] / test / unit / ajax.js
index d262988..9d088f3 100644 (file)
@@ -240,6 +240,53 @@ test("jQuery.ajax() - error callbacks", function() {
        });
 });
 
+test("jQuery.ajax() - textStatus and errorThrown values", function() {
+
+       var nb = 2;
+
+       expect( 2 * nb );
+       stop();
+
+       function startN() {
+               if ( !( --nb ) ) {
+                       start();
+               }
+       }
+
+       /*
+       Safari 3.x returns "OK" instead of "Not Found"
+       Safari 4.x doesn't have this issue so the test should be re-instated once
+       we drop support for 3.x
+
+       jQuery.ajax({
+               url: url("data/nonExistingURL"),
+               error: function( _ , textStatus , errorThrown ){
+                       strictEqual( textStatus, "error", "textStatus is 'error' for 404" );
+                       strictEqual( errorThrown, "Not Found", "errorThrown is 'Not Found' for 404");
+                       startN();
+               }
+       });
+       */
+
+       jQuery.ajax({
+               url: url("data/name.php?wait=5"),
+               error: function( _ , textStatus , errorThrown ){
+                       strictEqual( textStatus, "abort", "textStatus is 'abort' for abort" );
+                       strictEqual( errorThrown, "abort", "errorThrown is 'abort' for abort");
+                       startN();
+               }
+       }).abort();
+
+       jQuery.ajax({
+               url: url("data/name.php?wait=5"),
+               error: function( _ , textStatus , errorThrown ){
+                       strictEqual( textStatus, "mystatus", "textStatus is 'mystatus' for abort('mystatus')" );
+                       strictEqual( errorThrown, "mystatus", "errorThrown is 'mystatus' for abort('mystatus')");
+                       startN();
+               }
+       }).abort( "mystatus" );
+});
+
 test("jQuery.ajax() - responseText on error", function() {
 
        expect( 1 );
@@ -374,6 +421,18 @@ test(".ajax() - contentType" , function() {
 
 });
 
+test(".ajax() - protocol-less urls", function() {
+       expect(1);
+
+       jQuery.ajax({
+               url: "//somedomain.com",
+               beforeSend: function( xhr, settings ) {
+                       equals(settings.url, location.protocol + "//somedomain.com", "Make sure that the protocol is added.");
+                       return false;
+               }
+       });
+});
+
 test(".ajax() - hash", function() {
        expect(3);
 
@@ -856,7 +915,7 @@ test("serialize()", function() {
 });
 
 test("jQuery.param()", function() {
-       expect(22);
+       expect(23);
 
        equals( !jQuery.ajaxSettings.traditional, true, "traditional flag, falsy by default" );
 
@@ -919,6 +978,9 @@ test("jQuery.param()", function() {
 
        params = { param1: null };
        equals( jQuery.param(params,false), "param1=null", "Make sure that null params aren't traversed." );
+
+       params = {'test': {'length': 3, 'foo': 'bar'} };
+       equals( jQuery.param( params, false ), "test%5Blength%5D=3&test%5Bfoo%5D=bar", "Sub-object with a length property" );
 });
 
 test("synchronous request", function() {
@@ -1139,10 +1201,11 @@ test("jQuery.get(String, Hash, Function) - parse xml and use text() on nodes", f
 });
 
 test("jQuery.getScript(String, Function) - with callback", function() {
-       expect(2);
+       expect(3);
        stop();
-       jQuery.getScript(url("data/test.js"), function() {
+       jQuery.getScript(url("data/test.js"), function( data, _, jXHR ) {
                equals( foobar, "bar", 'Check if script was evaluated' );
+               strictEqual( data, jXHR.responseText, "Same-domain script requests returns the source of the script (#8082)" );
                setTimeout(start, 100);
        });
 });
@@ -1158,10 +1221,10 @@ test("jQuery.getScript(String, Function) - no callback", function() {
 jQuery.each( [ "Same Domain", "Cross Domain" ] , function( crossDomain , label ) {
 
        test("jQuery.ajax() - JSONP, " + label, function() {
-               expect(17);
+               expect(16);
 
                var count = 0;
-               function plus(){ if ( ++count == 17 ) start(); }
+               function plus(){ if ( ++count == 16 ) start(); }
 
                stop();
 
@@ -1269,23 +1332,6 @@ jQuery.each( [ "Same Domain", "Cross Domain" ] , function( crossDomain , label )
                        url: "data/jsonp.php",
                        dataType: "jsonp",
                        crossDomain: crossDomain,
-                       data: {
-                               callback: "?"
-                       },
-                       success: function(data){
-                               ok( data.data, "JSON results returned (GET, processed data callback)" );
-                               plus();
-                       },
-                       error: function(data){
-                               ok( false, "Ajax error JSON (GET, processed data callback)" );
-                               plus();
-                       }
-               });
-
-               jQuery.ajax({
-                       url: "data/jsonp.php",
-                       dataType: "jsonp",
-                       crossDomain: crossDomain,
                        jsonp: "callback",
                        success: function(data){
                                ok( data.data, "JSON results returned (GET, data obj callback)" );
@@ -1593,17 +1639,32 @@ test("jQuery.getJSON(String, Function) - JSON object with absolute url to local
        });
 });
 
-test("jQuery.post - data", function() {
-       expect(2);
+test("jQuery.post - data", 3, function() {
        stop();
 
-       jQuery.post(url("data/name.php"), {xml: "5-2", length: 3}, function(xml){
-               jQuery('math', xml).each(function() {
-                       equals( jQuery('calculation', this).text(), '5-2', 'Check for XML' );
-                       equals( jQuery('result', this).text(), '3', 'Check for XML' );
-               });
-               start();
-       });
+       jQuery.when(
+               jQuery.post( url( "data/name.php" ), { xml: "5-2", length: 3 }, function( xml ) {
+                       jQuery( 'math', xml ).each( function() {
+                               equals( jQuery( 'calculation', this ).text(), '5-2', 'Check for XML' );
+                               equals( jQuery( 'result', this ).text(), '3', 'Check for XML' );
+                       })
+               }),
+
+               jQuery.ajax({
+                       url: url('data/echoData.php'),
+                       type: "POST",
+                       data: {
+                               'test': {
+                                       'length': 7,
+                                               'foo': 'bar'
+                               }
+                       },
+                       success: function( data ) {
+                               strictEqual( data, 'test%5Blength%5D=7&test%5Bfoo%5D=bar', 'Check if a sub-object with a length param is serialized correctly');
+                       }
+               })
+       ).then( start, start );
+
 });
 
 test("jQuery.post(String, Hash, Function) - simple with xml", function() {
@@ -1911,9 +1972,9 @@ test( "jQuery.ajax - Location object as url (#7531)", 1, function () {
 
 test( "jQuery.ajax - statusCode" , function() {
 
-       var count = 10;
+       var count = 12;
 
-       expect( 16 );
+       expect( 20 );
        stop();
 
        function countComplete() {
@@ -1975,7 +2036,77 @@ test( "jQuery.ajax - statusCode" , function() {
                        }
                }).statusCode( createStatusCodes( "all (immediately with method)" , isSuccess ) );
 
+               var testString = "";
+
+               jQuery.ajax( url( uri ), {
+                       success: function( a , b , jXHR ) {
+                               ok( isSuccess , "success" );
+                               var statusCode = {};
+                               statusCode[ jXHR.status ] = function() {
+                                       testString += "B";
+                               };
+                               jXHR.statusCode( statusCode );
+                               testString += "A";
+                       },
+                       error: function( jXHR ) {
+                               ok( ! isSuccess , "error" );
+                               var statusCode = {};
+                               statusCode[ jXHR.status ] = function() {
+                                       testString += "B";
+                               };
+                               jXHR.statusCode( statusCode );
+                               testString += "A";
+                       },
+                       complete: function() {
+                               strictEqual( testString , "AB" , "Test statusCode callbacks are ordered like " +
+                                               ( isSuccess ? "success" :  "error" ) + " callbacks" );
+                               countComplete();
+                       }
+               } );
+
        });
+});
+
+test("jQuery.ajax - transitive conversions", function() {
+
+       expect( 8 );
+
+       stop();
+
+       jQuery.when(
+
+               jQuery.ajax( url("data/json.php") , {
+                       converters: {
+                               "json myJson": function( data ) {
+                                       ok( true , "converter called" );
+                                       return data;
+                               }
+                       },
+                       dataType: "myJson",
+                       success: function() {
+                               ok( true , "Transitive conversion worked" );
+                               strictEqual( this.dataTypes[0] , "text" , "response was retrieved as text" );
+                               strictEqual( this.dataTypes[1] , "myjson" , "request expected myjson dataType" );
+                       }
+               }),
+
+               jQuery.ajax( url("data/json.php") , {
+                       converters: {
+                               "json myJson": function( data ) {
+                                       ok( true , "converter called (*)" );
+                                       return data;
+                               }
+                       },
+                       contents: false, /* headers are wrong so we ignore them */
+                       dataType: "* myJson",
+                       success: function() {
+                               ok( true , "Transitive conversion worked (*)" );
+                               strictEqual( this.dataTypes[0] , "text" , "response was retrieved as text (*)" );
+                               strictEqual( this.dataTypes[1] , "myjson" , "request expected myjson dataType (*)" );
+                       }
+               })
+
+       ).then( start , start );
 
 });