/*! * find-callsite * * Copyright (c) Charlike Mike Reagent <@tunnckoCore> (https://i.am.charlike.online) * Released under the MIT license. */ /* jshint asi:true */ 'use strict' var test = require('mukla') var isCI = require('is-ci') var cleanStack = require('clean-stacktrace') var findCallsite = require('./index') var assertions = require('./fixtures/main/assertions') var nativeNested = require('./fixtures/main/native-errors') var nativeErrors = require('./fixtures/xyz/natives') var rimrafLike = require('./fixtures/main/rimraf-like') function factory (fn, str) { try { fn() } catch (err) { var callsiteLine = findCallsite(str ? err.stack : err) test.strictEqual(/at/.test(callsiteLine), true) test.strictEqual(/factory/.test(callsiteLine), true) test.strictEqual(/test\.js:24:5/.test(callsiteLine), true) test.strictEqual(/fixtures/.test(callsiteLine), false) } } test('should work for Assertion errors', function (done) { factory(assertions, true) done() }) test('should work for native errors', function (done) { factory(nativeErrors) done() }) test('should very nested thrown native errors', function (done) { factory(nativeNested()) done() }) test('should work for errors thrown like what rimraf.sync throws', function (done) { factory(rimrafLike) done() }) test('should throw TypeError if `error` not an object or string', function (done) { function fixture () { findCallsite(123) } test.throws(fixture, TypeError) test.throws(fixture, /expect `error` to be an object or string/) done() }) test('should throw TypeError if `error.stack` is not a string or empty string', function (done) { function fixture () { findCallsite({ stack: 123 }) } test.throws(fixture, TypeError) test.throws(fixture, /expect `error.stack` to be non empty string/) test.throws(function () { findCallsite({ stack: '' }) }, /expect `error.stack` to be non empty string/) done() }) test('should work for very short stack trace', function fooQuxieTest (done) { var callsite = findCallsite([ 'Error: foo quxie', ' at Fucntion.fooQuxieTest (/home/charlike/apps/stacktrace-start/test.js:16:20)' ].join('\n')) test.strictEqual(/at/.test(callsite), true) test.strictEqual(/Fucntion\.fooQuxieTest/.test(callsite), true) test.strictEqual(/test\.js:16:20/.test(callsite), true) done() }) test('allow making path relative through opts.cwd and opts.relativePaths', function (done) { var callsite = findCallsite([ 'Error: testing relative paths', ' at Function.zazz (/home/charlike/apps/find-callsite/test.js:77:14)' ].join('\n'), { relativePaths: true }) if (isCI) { test.strictEqual(/at Function\.zazz/.test(callsite), true) test.strictEqual(/\.\./.test(callsite), true) test.strictEqual(/test\.js:77:14/.test(callsite), true) } else { test.strictEqual(callsite, 'at Function.zazz (test.js:77:14)') } done() }) test('should work correctly if stack has filepath in first and last lines', function ensure (done) { var err = new Error('ensure correct') var stack = cleanStack(err.stack) var callsite = findCallsite(stack, { relativePaths: true }) // console.log(stack) // notice first and last in stack, first is correct // Error: ensure correct // at Object.ensure (/home/charlike/apps/find-callsite/test.js:107:13) // at Object.tryCatch (/home/charlike/apps/find-callsite/node_modules/try-catch-callback/index.js:73:14) // at Object.tryCatchCallback (/home/charlike/apps/find-callsite/node_modules/try-catch-callback/index.js:56:21) // at Object.tryCatch (/home/charlike/apps/find-callsite/node_modules/try-catch-core/index.js:82:26) // at Object.tryCatchCore (/home/charlike/apps/find-callsite/node_modules/try-catch-core/index.js:64:12) // at Object.alwaysDone (/home/charlike/apps/find-callsite/node_modules/always-done/index.js:61:24) // at mukla (/home/charlike/apps/find-callsite/node_modules/mukla/index.js:55:9) // at Object. (/home/charlike/apps/find-callsite/test.js:106:1) // ensure that it is not Object. // which is the last callsite in stack test.strictEqual(/at Object.ensure/.test(callsite), true) done() })