diff --git a/js_object.t b/js_object.t
new file mode 100644
index 0000000..80259dc
--- /dev/null
+++ b/js_object.t
@@ -0,0 +1,149 @@
+#!/usr/bin/perl
+
+# (C) Dmitry Volyntsev
+# (C) Nginx, Inc.
+
+# Tests for http njs module, request object.
+
+###############################################################################
+
+use warnings;
+use strict;
+
+use Test::More;
+use Socket qw/ CRLF /;
+
+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 /njs {
+            js_content test_njs;
+        }
+
+        location /to_string {
+            js_content to_string;
+        }
+
+        location /define_prop {
+            js_content define_prop;
+        }
+
+        location /in_operator {
+            js_content in_operator;
+        }
+
+        location /redefine_bind {
+            js_content redefine_bind;
+        }
+
+        location /redefine_proxy {
+            js_content redefine_proxy;
+        }
+
+        location /redefine_proto {
+            js_content redefine_proto;
+        }
+
+        location /get_own_prop_descs {
+            js_content get_own_prop_descs;
+        }
+    }
+}
+
+EOF
+
+$t->write_file('test.js', <<EOF);
+    function test_njs(r) {
+        r.return(200, njs.version);
+    }
+
+    function to_string(r) {
+        r.return(200, r.toString());
+    }
+
+    function define_prop(r) {
+        Object.defineProperty(r.headersOut, 'Foo', {value:'bar'});
+        r.return(200);
+    }
+
+    function in_operator(r) {
+        r.return(200, ['Foo', 'Bar'].map(v=>v in r.headersIn)
+                      .toString() === 'true,false');
+    }
+
+    function redefine_bind(r) {
+        r.return = r.return.bind(r, 200);
+        r.return('redefine_bind');
+    }
+
+    function redefine_proxy(r) {
+        r.return_orig = r.return;
+        r.return = function (body) { this.return_orig(200, body);}
+        r.return('redefine_proxy');
+    }
+
+    function redefine_proto(r) {
+        r[0] = 'a';
+        r[1] = 'b';
+        r.length = 2;
+        Object.setPrototypeOf(r, Array.prototype);
+        r.return(200, r.join('|'));
+    }
+
+    function get_own_prop_descs(r) {
+        r.return(200,
+                 Object.getOwnPropertyDescriptors(r)['log'].value === r.log);
+    }
+
+EOF
+
+$t->try_run('no njs request object')->plan(7);
+
+###############################################################################
+
+TODO: {
+local $TODO = 'not yet'
+              unless http_get('/njs') =~ /^([.0-9]+)$/m && $1 ge '0.4.0';
+
+
+like(http_get('/to_string'), qr/\[object Request\]/, 'toString');
+like(http_get('/define_prop'), qr/Foo: bar/, 'define_prop');
+like(http(
+	'GET /in_operator HTTP/1.0' . CRLF
+	. 'Foo: foo' . CRLF
+	. 'Host: localhost' . CRLF . CRLF
+), qr/true/, 'in_operator');
+like(http_get('/redefine_bind'), qr/redefine_bind/, 'redefine_bind');
+like(http_get('/redefine_proxy'), qr/redefine_proxy/, 'redefine_proxy');
+like(http_get('/redefine_proto'), qr/a|b/, 'redefine_proto');
+like(http_get('/get_own_prop_descs'), qr/true/, 'get_own_prop_descs');
+
+}
+
+###############################################################################
diff --git a/stream_js_object.t b/stream_js_object.t
new file mode 100644
index 0000000..b3cb129
--- /dev/null
+++ b/stream_js_object.t
@@ -0,0 +1,119 @@
+#!/usr/bin/perl
+
+# (C) Dmitry Volyntsev
+# (C) Nginx, Inc.
+
+# Tests for stream njs module, stream session object.
+
+###############################################################################
+
+use warnings;
+use strict;
+
+use Test::More;
+
+BEGIN { use FindBin; chdir($FindBin::Bin); }
+
+use lib 'lib';
+use Test::Nginx;
+use Test::Nginx::Stream qw/ stream /;
+
+###############################################################################
+
+select STDERR; $| = 1;
+select STDOUT; $| = 1;
+
+my $t = Test::Nginx->new()->has(qw/http stream stream_return/)
+	->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 /njs {
+            js_content test_njs;
+        }
+    }
+}
+
+stream {
+    js_set $test     test;
+
+    js_include test.js;
+
+    server {
+        listen  127.0.0.1:8081;
+        return  $test$status;
+    }
+}
+
+EOF
+
+$t->write_file('test.js', <<EOF);
+    function test_njs(r) {
+        r.return(200, njs.version);
+    }
+
+    function to_string(s) {
+        return s.toString() === '[object Stream Session]';
+    }
+
+    function define_prop(s) {
+        Object.defineProperty(s.variables, 'status', {value:400});
+        return s.variables.status == 400;
+    }
+
+    function in_operator(s) {
+        return ['status', 'unknown']
+               .map(v=>v in s.variables)
+               .toString() === 'true,false';
+    }
+
+    function redefine_proto(s) {
+        s[0] = 'a';
+        s[1] = 'b';
+        s.length = 2;
+        Object.setPrototypeOf(s, Array.prototype);
+        return s.join('|') === 'a|b';
+    }
+
+    function get_own_prop_descs(s) {
+        return Object.getOwnPropertyDescriptors(s)['on'].value === s.on;
+    }
+
+    function test(s) {
+        return [ to_string,
+                 define_prop,
+                 in_operator,
+                 redefine_proto,
+                 get_own_prop_descs,
+               ].every(v=>v(s));
+    }
+
+EOF
+
+$t->try_run('no njs stream session object')->plan(1);
+
+###############################################################################
+
+TODO: {
+local $TODO = 'not yet'
+              unless http_get('/njs') =~ /^([.0-9]+)$/m && $1 ge '0.4.0';
+
+is(stream('127.0.0.1:' . port(8081))->read(), 'true400', 'var set');
+
+}
+
+###############################################################################
