changeset 1778:0979f22e3a5b

Tests: added extended request arguments tests.
author Dmitry Volyntsev <xeioex@nginx.com>
date Thu, 14 Jul 2022 20:05:07 -0700
parents 410072f42157
children 4b80f1ab7fdc
files js.t js_args.t
diffstat 2 files changed, 154 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/js.t
+++ b/js.t
@@ -41,8 +41,6 @@ http {
     js_set $test_version  test.version;
     js_set $test_addr     test.addr;
     js_set $test_uri      test.uri;
-    js_set $test_arg      test.arg;
-    js_set $test_iarg     test.iarg;
     js_set $test_var      test.variable;
     js_set $test_type     test.type;
     js_set $test_global   test.global_obj;
@@ -75,14 +73,6 @@ http {
             return 200 $test_uri;
         }
 
-        location /arg {
-            return 200 $test_arg;
-        }
-
-        location /iarg {
-            return 200 $test_iarg;
-        }
-
         location /var {
             return 200 $test_var;
         }
@@ -120,10 +110,6 @@ http {
             js_content test.return_method;
         }
 
-        location /arg_keys {
-            js_content test.arg_keys;
-        }
-
         location /type {
             js_content test.type;
         }
@@ -171,20 +157,6 @@ EOF
         return 'uri=' + r.uri;
     }
 
-    function arg(r) {
-        return 'arg=' + r.args.foo;
-    }
-
-    function iarg(r) {
-        var s = '', a;
-        for (a in r.args) {
-            if (a.substr(0, 3) == 'foo') {
-                s += r.args[a];
-            }
-        }
-        return s;
-    }
-
     function variable(r) {
         return 'variable=' + r.variables.remote_addr;
     }
@@ -232,10 +204,6 @@ EOF
         r.return(Number(r.args.c), r.args.t);
     }
 
-    function arg_keys(r) {
-        r.return(200, Object.keys(r.args).sort());
-    }
-
     function type(r) {
         var p = r.args.path.split('.').reduce((a, v) => a[v], r);
 
@@ -260,14 +228,14 @@ EOF
     function content_empty(r) {
     }
 
-    export default {njs:test_njs, method, version, addr, uri, arg, iarg,
+    export default {njs:test_njs, method, version, addr, uri,
                     variable, global_obj, status, request_body,
-                    request_body_cache, send, return_method, arg_keys,
+                    request_body_cache, send, return_method,
                     type, log, except, content_except, content_empty};
 
 EOF
 
-$t->try_run('no njs available')->plan(33);
+$t->try_run('no njs available')->plan(27);
 
 ###############################################################################
 
@@ -275,14 +243,6 @@ like(http_get('/method'), qr/method=GET/
 like(http_get('/version'), qr/version=1.0/, 'r.httpVersion');
 like(http_get('/addr'), qr/addr=127.0.0.1/, 'r.remoteAddress');
 like(http_get('/uri'), qr/uri=\/uri/, 'r.uri');
-like(http_get('/arg?foo=12345'), qr/arg=12345/, 'r.args');
-like(http_get('/iarg?foo=12345&foo2=bar&nn=22&foo-3=z'), qr/12345barz/,
-	'r.args iteration');
-
-like(http_get('/iarg?foo=123&foo2=&foo3&foo4=456'), qr/123undefined456/,
-	'r.args iteration 2');
-like(http_get('/iarg?foo=123&foo2=&foo3'), qr/123/, 'r.args iteration 3');
-like(http_get('/iarg?foo=123&foo2='), qr/123/, 'r.args iteration 4');
 
 like(http_get('/status'), qr/204 No Content/, 'r.status');
 
@@ -304,8 +264,6 @@ like(http_get('/return_method?c=301&t=pa
 like(http_get('/return_method?c=404'), qr/404 Not.*html/s, 'return error page');
 like(http_get('/return_method?c=inv'), qr/ 500 /, 'return invalid');
 
-like(http_get('/arg_keys?b=1&c=2&a=5'), qr/a,b,c/m, 'r.args sorted keys');
-
 TODO: {
 local $TODO = 'not yet'
 	unless http_get('/njs') =~ /^([.0-9]+)$/m && $1 ge '0.5.0';
new file mode 100644
--- /dev/null
+++ b/js_args.t
@@ -0,0 +1,151 @@
+#!/usr/bin/perl
+
+# (C) Dmitry Volyntsev
+# (C) Nginx, Inc.
+
+# Tests for http njs module, arguments tests.
+
+###############################################################################
+
+use warnings;
+use strict;
+
+use Test::More;
+
+BEGIN { use FindBin; chdir($FindBin::Bin); }
+
+use lib 'lib';
+use Test::Nginx;
+
+###############################################################################
+
+select STDERR; $| = 1;
+select STDOUT; $| = 1;
+
+eval { require JSON::PP; };
+plan(skip_all => "JSON::PP not installed") if $@;
+
+my $t = Test::Nginx->new()->has(qw/http/)
+	->write_file_expand('nginx.conf', <<'EOF');
+
+%%TEST_GLOBALS%%
+
+daemon off;
+
+events {
+}
+
+http {
+    %%TEST_GLOBALS_HTTP%%
+
+    js_import test.js;
+
+    js_set $test_iter     test.iter;
+
+    server {
+        listen       127.0.0.1:8080;
+        server_name  localhost;
+
+        location /njs {
+            js_content test.njs;
+        }
+
+        location /iter {
+            return 200 $test_iter;
+        }
+
+        location /keys {
+            js_content test.keys;
+        }
+
+        location /object {
+            js_content test.object;
+        }
+    }
+}
+
+EOF
+
+$t->write_file('test.js', <<EOF);
+    function test_njs(r) {
+        r.return(200, njs.version);
+    }
+
+    function iter(r) {
+        var s = '', a;
+        for (a in r.args) {
+            if (a.substr(0, 3) == 'foo') {
+                s += r.args[a];
+            }
+        }
+
+        return s;
+    }
+
+    function keys(r) {
+        r.return(200, Object.keys(r.args).sort());
+    }
+
+    function object(r) {
+        r.return(200, JSON.stringify(r.args));
+    }
+
+    export default {njs: test_njs, iter, keys, object};
+
+EOF
+
+$t->try_run('no njs')->plan(15);
+
+###############################################################################
+
+sub recode {
+	my $json;
+	eval { $json = JSON::PP::decode_json(shift) };
+
+	if ($@) {
+		return "<failed to parse JSON>";
+	}
+
+	JSON::PP->new()->canonical()->encode($json);
+}
+
+sub get_json {
+	http_get(shift) =~ /\x0d\x0a?\x0d\x0a?(.*)/ms;
+	recode($1);
+}
+
+###############################################################################
+
+TODO: {
+local $TODO = 'not yet'
+    unless http_get('/njs') =~ /^([.0-9]+)$/m && $1 ge '0.7.6';
+
+like(http_get('/iter?foo=12345&foo2=bar&nn=22&foo-3=z'), qr/12345barz/,
+	'r.args iteration');
+like(http_get('/iter?foo=123&foo2=&foo3&foo4=456'), qr/123456/,
+	'r.args iteration 2');
+like(http_get('/iter?foo=123&foo2=&foo3'), qr/123/, 'r.args iteration 3');
+like(http_get('/iter?foo=123&foo2='), qr/123/, 'r.args iteration 4');
+like(http_get('/iter?foo=1&foo=2'), qr/1,2/m, 'r.args iteration 5');
+
+like(http_get('/keys?b=1&c=2&a=5'), qr/a,b,c/m, 'r.args sorted keys');
+like(http_get('/keys?b=1&b=2'), qr/b/m, 'r.args duplicate keys');
+like(http_get('/keys?b=1&a&c='), qr/a,b,c/m, 'r.args empty value');
+
+is(get_json('/object'), '{}', 'empty object');
+is(get_json('/object?a=1&b=2&c=3'), '{"a":"1","b":"2","c":"3"}',
+	'ordinary object');
+is(get_json('/object?a=1&A=2'), '{"A":"2","a":"1"}',
+	'case sensitive object');
+is(get_json('/object?a=1&A=2&a=3'), '{"A":"2","a":["1","3"]}',
+	'duplicate keys object');
+is(get_json('/object?%61=1&a=2'), '{"a":["1","2"]}',
+	'keys percent-encoded object');
+is(get_json('/object?a=%62%63&b=%63%64'), '{"a":"bc","b":"cd"}',
+	'values percent-encoded object');
+is(get_json('/object?a=%6&b=%&c=%%&d=%zz'),
+	'{"a":"%6","b":"%","c":"%%","d":"%zz"}',
+	'values percent-encoded broken object');
+}
+
+###############################################################################