Just restore window.JSON in the getJSON test, don't try to delete the value.
[jquery.git] / test / unit / ajax.js
index a049fec..d827a15 100644 (file)
@@ -70,6 +70,44 @@ test("jQuery.ajax() - error callbacks", function() {
        });
 });
 
+test("Ajax events with context", function() {
+       expect(6);
+       
+       stop();
+       var context = document.createElement("div");
+       
+       function event(e){
+               equals( this, context, e.type );
+       }
+
+       function callback(){
+               equals( this, context, "context is preserved on callback" );
+       }
+       
+       jQuery('#foo').add(context)
+                       .ajaxSend(event)
+                       .ajaxComplete(event)
+                       .ajaxError(event)
+                       .ajaxSuccess(event);
+
+       jQuery.ajax({
+               url: url("data/name.html"),
+               beforeSend: callback,
+               success: callback,
+               error: callback,
+               complete:function(){
+                       callback.call(this);
+                       setTimeout(proceed, 300);
+               },
+               context:context
+       });
+       
+       function proceed(){
+               jQuery('#foo').add(context).unbind();
+               start();
+       }
+});
+
 test("jQuery.ajax() - disabled globals", function() {
        expect( 3 );
        stop();
@@ -183,7 +221,7 @@ test("jQuery.ajax - dataType html", function() {
 });
 
 test("serialize()", function() {
-       expect(6);
+       expect(5);
 
        equals( jQuery('#form').serialize(),
                "action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&search=search&select1=&select2=3&select3=1&select3=2",
@@ -205,24 +243,56 @@ test("serialize()", function() {
                "action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&search=search&select1=&select2=3&select3=1&select3=2&T3=%3F%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=",
                'Multiple form serialization as query string');
 
+  /* Temporarily disabled. Opera 10 has problems with form serialization.
        equals( jQuery('#form, #testForm :input').serialize(),
                "action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&search=search&select1=&select2=3&select3=1&select3=2&T3=%3F%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=",
                'Mixed form/input serialization as query string');
+       */
 });
 
 test("jQuery.param()", function() {
-       expect(4);
+       expect(13);
+       
+  equals( jQuery.param.traditional, undefined, "traditional flag, undefined by default" );
+  
+       var params = {foo:"bar", baz:42, quux:"All your base are belong to us"};
+       equals( jQuery.param(params), "foo=bar&baz=42&quux=All+your+base+are+belong+to+us", "simple" );
+
+       params = {someName: [1, 2, 3], regularThing: "blah" };
+       equals( jQuery.param(params), "someName%5B%5D=1&someName%5B%5D=2&someName%5B%5D=3&regularThing=blah", "with array" );
+
+       params = {foo: ['a', 'b', 'c']};
+       equals( jQuery.param(params), "foo%5B%5D=a&foo%5B%5D=b&foo%5B%5D=c", "with array of strings" );
+
+       params = {foo: ["baz", 42, "All your base are belong to us"] };
+       equals( jQuery.param(params), "foo%5B%5D=baz&foo%5B%5D=42&foo%5B%5D=All+your+base+are+belong+to+us", "more array" );
+
+       params = {foo: { bar: 'baz', beep: 42, quux: 'All your base are belong to us' } };
+       equals( jQuery.param(params), "foo%5Bbar%5D=baz&foo%5Bbeep%5D=42&foo%5Bquux%5D=All+your+base+are+belong+to+us", "even more arrays" );
+       
+       params = { a:[1,2], b:{ c:3, d:[4,5], e:{ x:[6], y:7, z:[8,9] }, f:true, g:false, h:undefined }, i:[10,11], j:true, k:false, l:[undefined,0], m:"cowboy hat?" };
+       equals( jQuery.param(params), "a%5B%5D=1&a%5B%5D=2&b%5Bc%5D=3&b%5Bd%5D%5B%5D=4&b%5Bd%5D%5B%5D=5&b%5Be%5D%5Bx%5D%5B%5D=6&b%5Be%5D%5By%5D=7&b%5Be%5D%5Bz%5D%5B%5D=8&b%5Be%5D%5Bz%5D%5B%5D=9&b%5Bf%5D=true&b%5Bg%5D=false&b%5Bh%5D=undefined&i%5B%5D=10&i%5B%5D=11&j=true&k=false&l%5B%5D=undefined&l%5B%5D=0&m=cowboy+hat%3F", "huge structure" );
+       
+       jQuery.param.traditional = true;
+       
        var params = {foo:"bar", baz:42, quux:"All your base are belong to us"};
        equals( jQuery.param(params), "foo=bar&baz=42&quux=All+your+base+are+belong+to+us", "simple" );
 
        params = {someName: [1, 2, 3], regularThing: "blah" };
        equals( jQuery.param(params), "someName=1&someName=2&someName=3&regularThing=blah", "with array" );
 
+       params = {foo: ['a', 'b', 'c']};
+       equals( jQuery.param(params), "foo=a&foo=b&foo=c", "with array of strings" );
+
        params = {"foo[]":["baz", 42, "All your base are belong to us"]};
        equals( jQuery.param(params), "foo%5B%5D=baz&foo%5B%5D=42&foo%5B%5D=All+your+base+are+belong+to+us", "more array" );
 
        params = {"foo[bar]":"baz", "foo[beep]":42, "foo[quux]":"All your base are belong to us"};
        equals( jQuery.param(params), "foo%5Bbar%5D=baz&foo%5Bbeep%5D=42&foo%5Bquux%5D=All+your+base+are+belong+to+us", "even more arrays" );
+       
+       params = { a:[1,2], b:{ c:3, d:[4,5], e:{ x:[6], y:7, z:[8,9] }, f:true, g:false, h:undefined }, i:[10,11], j:true, k:false, l:[undefined,0], m:"cowboy hat?" };
+       equals( jQuery.param(params), "a=1&a=2&b=%5Bobject+Object%5D&i=10&i=11&j=true&k=false&l=undefined&l=0&m=cowboy+hat%3F", "huge structure" );
+
 });
 
 test("synchronous request", function() {
@@ -269,19 +339,20 @@ test("pass-through request object", function() {
 
 test("ajax cache", function () {
        expect(18);
+       
        stop();
 
        var count = 0;
 
        jQuery("#firstp").bind("ajaxSuccess", function (e, xml, s) {
                var re = /_=(.*?)(&|$)/g;
-       var oldOne = null;
+               var oldOne = null;
                for (var i = 0; i < 6; i++) {
-         var ret = re.exec(s.url);
+                       var ret = re.exec(s.url);
                        if (!ret) {
                                break;
                        }
-         oldOne = ret[1];
+                       oldOne = ret[1];
                }
                equals(i, 1, "Test to make sure only one 'no-cache' parameter is there");
                ok(oldOne != "tobereplaced555", "Test to be sure parameter (if it was there) was replaced");
@@ -297,6 +368,10 @@ test("ajax cache", function () {
        ok( jQuery.ajax({url: "data/text.php?name=David&_=tobereplaced555&washere=true", cache:false}), "test with 2 parameters surrounding _= one" );
 });
 
+/*
+ * Test disabled.
+ * The assertions expect that the passed-in object will be modified,
+ * which shouldn't be the case. Fixes #5439.
 test("global ajaxSettings", function() {
        expect(2);
 
@@ -318,6 +393,7 @@ test("global ajaxSettings", function() {
 
        jQuery.ajaxSettings = tmp;
 });
+*/
 
 test("load(String)", function() {
        expect(1);
@@ -642,8 +718,12 @@ test("jQuery.ajax() - script, Remote with POST", function() {
                type: "POST",
                dataType: "script",
                success: function(data, status){
-                       ok( foobar, "Script results returned (GET, no callback)" );
-                       equals( status, "success", "Script results returned (GET, no callback)" );
+                       ok( foobar, "Script results returned (POST, no callback)" );
+                       equals( status, "success", "Script results returned (POST, no callback)" );
+                       start();
+               },
+               error: function(xhr) {
+                       ok( false, "ajax error, status code: " + xhr.status );
                        start();
                }
        });
@@ -668,9 +748,10 @@ test("jQuery.ajax() - script, Remote with scheme-less URL", function() {
 });
 
 test("jQuery.getJSON(String, Hash, Function) - JSON array", function() {
-       expect(4);
+       expect(5);
        stop();
        jQuery.getJSON(url("data/json.php"), {json: "array"}, function(json) {
+         ok( json.length >= 2, "Check length");
          equals( json[0].name, 'John', 'Check JSON: first, name' );
          equals( json[0].age, 21, 'Check JSON: first, age' );
          equals( json[1].name, 'Peter', 'Check JSON: second, name' );
@@ -683,12 +764,33 @@ test("jQuery.getJSON(String, Function) - JSON object", function() {
        expect(2);
        stop();
        jQuery.getJSON(url("data/json.php"), function(json) {
-         equals( json.data.lang, 'en', 'Check JSON: lang' );
-         equals( json.data.length, 25, 'Check JSON: length' );
+         if (json && json.data) {
+                 equals( json.data.lang, 'en', 'Check JSON: lang' );
+                 equals( json.data.length, 25, 'Check JSON: length' );
+         }
          start();
        });
 });
 
+test("jQuery.getJSON - Using Native JSON", function() {
+       expect(2);
+       
+       var old = window.JSON;
+       JSON = {
+               parse: function(str){
+                       ok( true, "Verifying that parse method was run" );
+                       return true;
+               }
+       };
+
+       stop();
+       jQuery.getJSON(url("data/json.php"), function(json) {
+               window.JSON = old;
+               equals( json, true, "Verifying return value" );
+               start();
+       });
+});
+
 test("jQuery.getJSON(String, Function) - JSON object with absolute url to local content", function() {
        expect(2);
 
@@ -764,7 +866,7 @@ test("jQuery.ajaxSetup({timeout: Number}) with localtimeout", function() {
 
        jQuery.ajax({
          type: "GET",
-         timeout: 5000,
+         timeout: 15000,
          url: url("data/name.php?wait=1"),
          error: function() {
                   ok( false, 'Check for local timeout failed' );
@@ -851,6 +953,68 @@ test("data option: evaluate function values (#2806)", function() {
        })
 });
 
+test("jQuery.ajax - If-Modified-Since support", function() {
+       expect( 3 );
+
+       stop();
+
+       var url = "data/if_modified_since.php?ts=" + new Date();
+
+       jQuery.ajax({
+               url: url,
+               ifModified: true,
+               success: function(data, status) { 
+                       equals(status, "success");
+                       
+                       jQuery.ajax({
+                               url: url,
+                               ifModified: true,
+                               success: function(data, status) { 
+                                       if ( data === "FAIL" ) {
+                                               ok(true, "Opera is incapable of doing .setRequestHeader('If-Modified-Since').");
+                                               ok(true, "Opera is incapable of doing .setRequestHeader('If-Modified-Since').");
+                                       } else {
+                                               equals(status, "notmodified");
+                                               ok(data == null, "response body should be empty")
+                                       }
+                                       start();
+                               }
+                       });
+               }
+       });
+});
+
+test("jQuery.ajax - Etag support", function() {
+       expect( 3 );
+
+       stop();
+
+       var url = "data/etag.php?ts=" + new Date();
+
+       jQuery.ajax({
+               url: url,
+               ifModified: true,
+               success: function(data, status) { 
+                       equals(status, "success");
+                       
+                       jQuery.ajax({
+                               url: url,
+                               ifModified: true,
+                               success: function(data, status) { 
+                                       if ( data === "FAIL" ) {
+                                               ok(true, "Opera is incapable of doing .setRequestHeader('If-None-Match').");
+                                               ok(true, "Opera is incapable of doing .setRequestHeader('If-None-Match').");
+                                       } else {
+                                               equals(status, "notmodified");
+                                               ok(data == null, "response body should be empty")
+                                       }
+                                       start();
+                               }
+                       });
+               }
+       });
+});
+
 }
 
 //}