# HG changeset patch # User Dmitry Volyntsev # Date 1657854307 25200 # Node ID 0979f22e3a5bc8fcd5e48ba97e46740a19f86129 # Parent 410072f4215798ffd66dbb723f442a139d1c91ff Tests: added extended request arguments tests. diff --git a/js.t b/js.t --- 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'; diff --git a/js_args.t b/js_args.t 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', <try_run('no njs')->plan(15); + +############################################################################### + +sub recode { + my $json; + eval { $json = JSON::PP::decode_json(shift) }; + + if ($@) { + return ""; + } + + 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'); +} + +###############################################################################