summaryrefslogtreecommitdiff
path: root/tests/node_compat/test/parallel/test-util-promisify.js
diff options
context:
space:
mode:
Diffstat (limited to 'tests/node_compat/test/parallel/test-util-promisify.js')
-rw-r--r--tests/node_compat/test/parallel/test-util-promisify.js218
1 files changed, 218 insertions, 0 deletions
diff --git a/tests/node_compat/test/parallel/test-util-promisify.js b/tests/node_compat/test/parallel/test-util-promisify.js
new file mode 100644
index 000000000..8046f6fb8
--- /dev/null
+++ b/tests/node_compat/test/parallel/test-util-promisify.js
@@ -0,0 +1,218 @@
+// deno-fmt-ignore-file
+// deno-lint-ignore-file
+
+// Copyright Joyent and Node contributors. All rights reserved. MIT license.
+// Taken from Node 16.13.0
+// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually
+
+'use strict';
+// Flags: --expose-internals
+const common = require('../common');
+const assert = require('assert');
+const fs = require('fs');
+const vm = require('vm');
+const { promisify } = require('util');
+const { customPromisifyArgs } = require('internal/util');
+
+const stat = promisify(fs.stat);
+
+// TODO(wafuwafu13): Fix
+// {
+// 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() {}
+
+ function promisifiedFn() {}
+
+ // util.promisify.custom is a shared symbol which can be accessed
+ // as `Symbol.for("nodejs.util.promisify.custom")`.
+ const kCustomPromisifiedSymbol = Symbol.for('nodejs.util.promisify.custom');
+ fn[kCustomPromisifiedSymbol] = promisifiedFn;
+
+ assert.strictEqual(kCustomPromisifiedSymbol, promisify.custom);
+ assert.strictEqual(promisify(fn), promisifiedFn);
+ assert.strictEqual(promisify(promisify(fn)), promisifiedFn);
+}
+
+{
+ function fn() {}
+ fn[promisify.custom] = 42;
+ assert.throws(
+ () => promisify(fn),
+ { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' }
+ );
+}
+
+// TODO(wafuwafu13): Fix
+// {
+// const firstValue = 5;
+// const secondValue = 17;
+
+// function fn(callback) {
+// callback(null, firstValue, secondValue);
+// }
+
+// fn[customPromisifyArgs] = ['first', 'second'];
+
+// promisify(fn)().then(common.mustCall((obj) => {
+// assert.deepStrictEqual(obj, { first: firstValue, second: secondValue });
+// }));
+// }
+
+{
+ 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);
+ }));
+}
+
+{
+ function fn(err, val, callback) {
+ callback(err, val);
+ }
+ promisify(fn)(null, 42).then(common.mustCall((value) => {
+ assert.strictEqual(value, 42);
+ }));
+}
+
+{
+ function fn(err, val, callback) {
+ callback(err, val);
+ }
+ promisify(fn)(new Error('oops'), null).catch(common.mustCall((err) => {
+ assert.strictEqual(err.message, 'oops');
+ }));
+}
+
+{
+ function fn(err, val, callback) {
+ callback(err, val);
+ }
+
+ (async () => {
+ const value = await promisify(fn)(null, 42);
+ assert.strictEqual(value, 42);
+ })().then(common.mustCall());
+}
+
+{
+ const o = {};
+ const fn = promisify(function(cb) {
+
+ cb(null, this === o);
+ });
+
+ o.fn = fn;
+
+ o.fn().then(common.mustCall((val) => assert(val)));
+}
+
+{
+ const err = new Error('Should not have called the callback with the error.');
+ const stack = err.stack;
+
+ const fn = promisify(function(cb) {
+ cb(null);
+ cb(err);
+ });
+
+ (async () => {
+ await fn();
+ await Promise.resolve();
+ return assert.strictEqual(stack, err.stack);
+ })().then(common.mustCall());
+}
+
+{
+ function c() { }
+ const a = promisify(function() { });
+ const b = promisify(a);
+ assert.notStrictEqual(c, a);
+ assert.strictEqual(a, b);
+}
+
+{
+ let errToThrow;
+ const thrower = promisify(function(a, b, c, cb) {
+ errToThrow = new Error();
+ throw errToThrow;
+ });
+ thrower(1, 2, 3)
+ .then(assert.fail)
+ .then(assert.fail, (e) => assert.strictEqual(e, errToThrow));
+}
+
+{
+ const err = new Error();
+
+ const a = promisify((cb) => cb(err))();
+ const b = promisify(() => { throw err; })();
+
+ Promise.all([
+ a.then(assert.fail, function(e) {
+ assert.strictEqual(err, e);
+ }),
+ b.then(assert.fail, function(e) {
+ assert.strictEqual(err, e);
+ }),
+ ]);
+}
+
+[undefined, null, true, 0, 'str', {}, [], Symbol()].forEach((input) => {
+ assert.throws(
+ () => promisify(input),
+ {
+ code: 'ERR_INVALID_ARG_TYPE',
+ name: 'TypeError',
+ message: 'The "original" argument must be of type function.' +
+ common.invalidArgTypeHelper(input)
+ });
+});