/*! * try-catch-core * * Copyright (c) 2016 Charlike Mike Reagent <@tunnckoCore> (http://www.tunnckocore.tk) * Released under the MIT license. */ 'use strict' var fs = require('fs') var test = require('mukla') var tryCatchCore = require('./index') var utils = require('./utils') test('should throw TypeError if `fn` (the 1st arg) not a function', function (done) { function fixture () { tryCatchCore(123) } test.throws(fixture, TypeError) test.throws(fixture, /try-catch-core: expect `fn` to be a function/) done() }) test('should throw TypeError if no function is passed to `thunk`', function (done) { var thunk = tryCatchCore(function () { return 'foobar' }) function fixture () { thunk(123) } test.throws(fixture, TypeError) test.throws(fixture, /try-catch-core: expect `cb` to be a function/) done() }) test('should return thunk if `cb` not a function', function (done) { var thunk = tryCatchCore(function (next) { next(null, 123) }) test.strictEqual(typeof thunk, 'function') test.strictEqual(utils.isAsync(thunk), true) thunk(function (err, num) { test.ifError(err) test.strictEqual(num, 123) done() }) }) test('should be able `fn` to return sync result and get it in `cb`', function (done) { tryCatchCore(function () { return 'foo bar' }, function cb (err, res) { test.ifError(err) test.strictEqual(res, 'foo bar') done() }) }) test('should pass error to `cb` if throws in `fn`', function (done) { tryCatchCore(function () { qux // eslint-disable-line no-undef, no-unused-expressions return 'foo bar' }, function cb (err, res) { test.ifError(!err) test.strictEqual(err.name, 'ReferenceError') test.strictEqual(err.message, 'qux is not defined') test.strictEqual(res, undefined) done() }) }) test('should pass error from `fs.readFile` to `cb`', function (done) { tryCatchCore(function (next) { fs.readFile('not-existing', next) }, function cb (err, res) { test.ifError(!err) test.strictEqual(err.name, 'Error') test.ok(/no such file or directory/.test(err.message)) test.strictEqual(res, undefined) done() }) }) test('should pass result from `fs.readFile` to the callback', function (done) { tryCatchCore(function (next) { fs.readFile('package.json', 'utf-8', next) }, function cb (err, str) { test.ifError(err) test.strictEqual(typeof str, 'string') test.strictEqual(JSON.parse(str).name, 'try-catch-core') test.strictEqual(JSON.parse(str).license, 'MIT') done() }) }) test('should get result of `fs.readFileSync`', function (done) { tryCatchCore(function () { return fs.readFileSync('./README.md', 'utf8') }, function (err, res) { test.strictEqual(err, null) test.strictEqual(res.indexOf('try-catch-core') !== -1, true) done() }) }) test('should be able to pass custom arguments through options', function (done) { tryCatchCore(function (foo, bar, next) { test.strictEqual(arguments.length, 3) test.strictEqual(foo, 1) test.strictEqual(bar, 2) next(null, foo) }, { args: [ 1, 2 ] }, function (err, res) { test.strictEqual(err, null) test.strictEqual(res, 1) done() }) }) test('should not pass a callback to `fn` if passCallback:false', function (done) { tryCatchCore(function () { test.strictEqual(arguments.length, 0) }, { passCallback: false }, function (err, res) { test.strictEqual(err, null) test.strictEqual(res, undefined) done() }) }) test('should pass custom context to `fn` through options', function (done) { tryCatchCore(function () { test.strictEqual(this.foo, 'bar') }, { context: { foo: 'bar' } }, done) })