aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2017-04-14 18:28:16 +0200
committerAnna Henningsen <anna@addaleax.net>2017-05-09 15:01:41 +0200
commit99da8e8e02a874a0a044889f863c45700509d02c (patch)
tree138e884d4ee3b867b6a550efd69de9c6c910d379 /test
parent059f2960503eec1418c32226646f5a2af6ae85f0 (diff)
downloadandroid-node-v8-99da8e8e02a874a0a044889f863c45700509d02c.tar.gz
android-node-v8-99da8e8e02a874a0a044889f863c45700509d02c.tar.bz2
android-node-v8-99da8e8e02a874a0a044889f863c45700509d02c.zip
util: add util.promisify()
Add `util.promisify(function)` for creating promisified functions. Includes documentation and tests. Fixes: https://github.com/nodejs/CTC/issues/12 PR-URL: https://github.com/nodejs/node/pull/12442 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Myles Borins <myles.borins@gmail.com> Reviewed-By: Evan Lucas <evanlucas@me.com> Reviewed-By: William Kapke <william.kapke@gmail.com> Reviewed-By: Timothy Gu <timothygu99@gmail.com> Reviewed-By: Teddy Katz <teddy.katz@gmail.com>
Diffstat (limited to 'test')
-rw-r--r--test/parallel/test-util-promisify.js76
1 files changed, 76 insertions, 0 deletions
diff --git a/test/parallel/test-util-promisify.js b/test/parallel/test-util-promisify.js
new file mode 100644
index 0000000000..23b3d40037
--- /dev/null
+++ b/test/parallel/test-util-promisify.js
@@ -0,0 +1,76 @@
+'use strict';
+const common = require('../common');
+const assert = require('assert');
+const fs = require('fs');
+const vm = require('vm');
+const { promisify } = require('util');
+
+common.crashOnUnhandledRejection();
+
+const stat = promisify(fs.stat);
+
+{
+ const promise = stat(__filename);
+ assert(promise instanceof Promise);
+ promise.then(common.mustCall((value) => {
+ assert.deepStrictEqual(value, fs.statSync(__filename));
+ }));
+}
+
+{
+ const promise = stat('/dontexist');
+ promise.catch(common.mustCall((error) => {
+ assert(error.message.includes('ENOENT: no such file or directory, stat'));
+ }));
+}
+
+{
+ function fn() {}
+ function promisifedFn() {}
+ fn[promisify.custom] = promisifedFn;
+ assert.strictEqual(promisify(fn), promisifedFn);
+ assert.strictEqual(promisify(promisify(fn)), promisifedFn);
+}
+
+{
+ function fn() {}
+ fn[promisify.custom] = 42;
+ assert.throws(
+ () => promisify(fn),
+ (err) => err instanceof TypeError &&
+ err.message === 'The [util.promisify.custom] property must ' +
+ 'be a function');
+}
+
+{
+ const fn = vm.runInNewContext('(function() {})');
+ assert.notStrictEqual(Object.getPrototypeOf(promisify(fn)),
+ Function.prototype);
+}
+
+{
+ function fn(callback) {
+ callback(null, 'foo', 'bar');
+ }
+ promisify(fn)().then(common.mustCall((value) => {
+ assert.deepStrictEqual(value, 'foo');
+ }));
+}
+
+{
+ function fn(callback) {
+ callback(null);
+ }
+ promisify(fn)().then(common.mustCall((value) => {
+ assert.strictEqual(value, undefined);
+ }));
+}
+
+{
+ function fn(callback) {
+ callback();
+ }
+ promisify(fn)().then(common.mustCall((value) => {
+ assert.strictEqual(value, undefined);
+ }));
+}