/*! * relike-value * * Copyright (c) 2016 Charlike Mike Reagent <@tunnckoCore> (http://www.tunnckocore.tk) * Released under the MIT license. */ /* jshint asi:true */ 'use strict' var fs = require('fs') var test = require('assertit') var isArray = require('isarray') var isBuffer = require('is-buffer') var semver = require('semver') var relikeValue = require('./index') function noop () {} function notSkipOne (one, two, cb) { cb(null, one, two, noop) } function notSkipTwo (one, two, cb) { cb(null, one, two, fs.readFileSync) } function multipleArgs (one, two, three, cb) { cb(null, one, two, three) } test('should not throw TypeError if falsey value given', function (done) { relikeValue(false).then(function (bool) { test.strictEqual(bool, false) return relikeValue(null).then(function (empty) { test.strictEqual(empty, null) done() }) }, done) }) test('should promisify a given string (only one argument)', function (done) { var promise = relikeValue('foo bar baz') promise.then(function (str) { test.strictEqual(str, 'foo bar baz') done() }, done) }) test('should flatten multiple arguments given if first not a function', function (done) { var promise = relikeValue('foo', 123, [1, 2], {a: 'b'}) promise.then(function (arr) { test.deepEqual(arr, ['foo', 123, [1, 2], {a: 'b'}]) done() }, done) }) test('should promisify with native Promise or Bluebird', function (done) { var promise = relikeValue(fs.readFile, './package.json', 'utf-8') promise.then(function (res) { test.ok(res.indexOf('"license": "MIT"') !== -1) if (semver.lt(process.version, '0.11.13')) { test.strictEqual(promise.___bluebirdPromise, true) test.strictEqual(promise.Prome.___bluebirdPromise, true) } done() }, done) }) test('should promisify with promise module (pinkie) given in `relikeValue.promise`', function (done) { relikeValue.promise = require('pinkie') var promise = relikeValue(fs.readFile, 'package.json') promise.then(function (res) { test.strictEqual(isBuffer(res), true) if (semver.lt(process.version, '0.11.13')) { test.strictEqual(promise.___customPromise, true) test.strictEqual(promise.Prome.___customPromise, true) } done() }, done) }) test('should flatten multiple arguments to array by default', function (done) { relikeValue(multipleArgs, 11, 22, 33).then(function (res) { test.strictEqual(isArray(res), true) test.deepEqual(res, [11, 22, 33]) done() }, done) }) test('should skip last argument only if it is `fn(foo, bar, cb)` (async fn)', function (done) { relikeValue(notSkipOne, 111, 222).then(function (res) { test.strictEqual(isArray(res), true) test.deepEqual(res, [111, 222, noop]) done() }) }) test('should not skip last argument and work core api (fs.readFileSync)', function (done) { relikeValue(notSkipTwo, 333, 5555).then(function (res) { test.strictEqual(isArray(res), true) test.deepEqual(res, [333, 5555, fs.readFileSync]) done() }) }) test('should not skip if pass callback fn, e.g. fn(err, res) as last argument', function (done) { function foo (_err, res) {} relikeValue(function (one, fn, cb) { cb(null, one, fn) }, 123, foo).then(function (res) { test.strictEqual(isArray(res), true) test.deepEqual(res, [123, foo]) done() }) }) test('should promisify sync function `fs.readFileSync` and handle utf8 result', function (done) { var promise = relikeValue(fs.readFileSync, 'package.json', 'utf8') promise .then(JSON.parse) .then(function (res) { test.strictEqual(res.name, 'relike-value') done() }, done) }) test('should promisify `fs.readFileSync` and handle buffer result', function (done) { relikeValue(fs.readFileSync, 'package.json').then(function (buf) { test.strictEqual(isBuffer(buf), true) done() }, done) }) test('should catch errors from failing sync function', function (done) { var promise = relikeValue(fs.readFileSync, 'foobar.json', 'utf8') promise.catch(function (err) { test.strictEqual(err.code, 'ENOENT') test.strictEqual(/no such file or directory/.test(err.message), true) done() }) })