'use strict' const Bluebird = require('bluebird') const test = require('tap').test const requireInject = require('require-inject') const findPrefix = requireInject('../find-prefix.js', { fs: { readdir: mockReaddir } }) test('find-prefix', t => { const tests = { '/Users/example/code/test1/node_modules': '/Users/example/code/test1', '/Users/example/code/test1/node_modules/node_modules': '/Users/example/code/test1', '/Users/example/code/test1/sub1': '/Users/example/code/test1', '/Users/example/code/test1/sub1/sub1a': '/Users/example/code/test1', '/Users/example/code/test2': '/Users/example/code/test2', '/Users/example/code/test2/sub2': '/Users/example/code/test2', '/Users/example/code': '/Users/example/code', '/Users/example': '/Users/example', '/does/not/exist': '/does/not/exist' } t.plan(Object.keys(tests).length) return Bluebird.map(Object.keys(tests), dir => { return findPrefix(dir).then(pre => { t.is(pre, tests[dir], dir) }) }) }) test('fail-prefix', t => { return findPrefix('/Users/example/eperm').then(pre => { t.fail('no eperm') }).catch(err => { t.is(err.code, 'EPERM', 'got perm error') }) }) const fixture = { 'Users': { 'example': { 'code': { 'test1': { 'node_modules': { 'node_modules': {} }, 'sub1': { 'sub1a': {} } }, 'test2': { 'package.json': {}, 'sub2': {} } } } } } function mockReaddir (dir, cb) { if (/eperm/.test(dir)) { const err = new Error('Can not read: ' + dir) err.code = 'EPERM' return cb(err) } const parts = dir.split(/\//).slice(1) let cwd = fixture let part while (part = parts.shift()) { if (part in cwd) { cwd = cwd[part] } else { const err = new Error('Does not exist: ' + dir + ' * ' + part) err.code = 'ENOENT' return cb(err) } } return cb(null, Object.keys(cwd)) }