# HG changeset patch # User Alexander Borisov # Date 1577363742 -10800 # Node ID beb549bce15f020b14eb2b3f4a4031dd77cf45e7 # Parent 0ce1c95167647b880ffe7f71d50d9f77e0672a89 Tests: added njs Promise tests. diff --git a/js_promise.t b/js_promise.t new file mode 100644 --- /dev/null +++ b/js_promise.t @@ -0,0 +1,173 @@ +#!/usr/bin/perl + +# (C) Nginx, Inc. + +# Promise tests for http njs module. + +############################################################################### + +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; + +my $t = Test::Nginx->new()->has(qw/http/) + ->write_file_expand('nginx.conf', <<'EOF'); + +%%TEST_GLOBALS%% + +daemon off; + +events { +} + +http { + %%TEST_GLOBALS_HTTP%% + + js_include test.js; + + server { + listen 127.0.0.1:8080; + server_name localhost; + + location /promise { + js_content promise; + } + + location /promise_throw { + js_content promise_throw; + } + + location /timeout { + js_content timeout; + } + + location /sub_token { + js_content sub_token; + } + } +} + +EOF + +$t->write_file('test.js', < { + var data = JSON.parse(reply.responseBody); + + if (data['token'] !== "a") { + throw new Error('token is not "a"'); + } + + return data['token']; + }) + .then(token => { + promisified_subrequest(r, '/sub_token', 'code=200&token=b') + .then(reply => { + var data = JSON.parse(reply.responseBody); + + r.return(200, '{"token": "' + data['token'] + '"}'); + }) + .catch(() => { + throw new Error("failed promise() test"); + }); + }) + .catch(() => { + r.return(500); + }); + } + + function promise_throw(r) { + promisified_subrequest(r, '/sub_token', 'code=200&token=x') + .then(reply => { + var data = JSON.parse(reply.responseBody); + + if (data['token'] !== "a") { + throw data['token']; + } + + return data['token']; + }) + .then(() => { + r.return(500); + }) + .catch(token => { + r.return(200, '{"token": "' + token + '"}'); + }); + } + + function timeout(r) { + promisified_subrequest(r, '/sub_token', 'code=200&token=R') + .then(reply => JSON.parse(reply.responseBody)) + .then(data => { + setTimeout(timeout_cb, 50, r, '/sub_token', 'code=200&token=T'); + return data; + }) + .then(data => { + setTimeout(timeout_cb, 1, r, '/sub_token', 'code=200&token=' + + data['token']); + }) + .catch(() => { + r.return(500); + }); + } + + function timeout_cb(r, url, args) { + promisified_subrequest(r, url, args) + .then(reply => { + if (global_token == '') { + var data = JSON.parse(reply.responseBody); + + global_token = data['token']; + + r.return(200, '{"token": "' + data['token'] + '"}'); + } + }) + .catch(() => { + r.return(500); + }); + } + + function promisified_subrequest(r, uri, args) { + return new Promise((resolve, reject) => { + r.subrequest(uri, args, (reply) => { + if (reply.status < 400) { + resolve(reply); + } else { + reject(reply); + } + }); + }) + } + + function sub_token(r) { + var code = r.variables.arg_code; + var token = r.variables.arg_token; + + r.return(parseInt(code), '{"token": "'+ token +'"}'); + } + +EOF + +$t->try_run('no njs available')->plan(3); + +############################################################################### + +like(http_get('/promise'), qr/{"token": "b"}/, "Promise"); +like(http_get('/promise_throw'), qr/{"token": "x"}/, "Promise throw and catch"); +like(http_get('/timeout'), qr/{"token": "R"}/, "Promise with timeout"); + +###############################################################################