You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

155 lines
3.9 KiB

var test = require('tap').test
var rpt = require('../rpt.js')
var path = require('path')
var fs = require('fs')
var archy = require('archy')
var fixtures = path.resolve(__dirname, 'fixtures')
var roots = [ 'root', 'other', 'selflink', 'noname' ]
var cwd = path.resolve(__dirname, '..')
var symlinks = {
'selflink/node_modules/@scope/z/node_modules/glob':
'../../../foo/node_modules/glob',
'other/node_modules/glob':
'../../root/node_modules/@scope/x/node_modules/glob',
'linkedroot':
'root',
'deep/root':
'../root',
'deeproot':
'deep'
}
function cleanup () {
Object.keys(symlinks).forEach(function (s) {
var p = path.resolve(cwd, 'test/fixtures', s)
try {
fs.unlinkSync(p)
} catch (er) {}
})
}
test('setup symlinks', function (t) {
cleanup()
Object.keys(symlinks).forEach(function (s) {
var p = path.resolve(cwd, 'test/fixtures', s)
fs.symlinkSync(symlinks [ s ], p, 'dir')
})
t.end()
})
roots.forEach(function (root) {
var dir = path.resolve(fixtures, root)
var expectedtxt = path.resolve(dir, 'archy.txt')
var expectedre = path.resolve(dir, 'archy.re')
test(root, function (t) {
rpt(dir, function (er, d) {
if (er && er.code !== 'ENOENT') throw er
var actual = archy(archyize(d)).trim()
// console . log ('----', dir)
console.log(actual)
// console . log (require ('util') . inspect (d, {
// depth: Infinity
// }))
try {
var expect = fs.readFileSync(expectedtxt, 'utf8').trim()
t.equal(actual, expect, root + ' tree')
} catch (e) {
var expect = new RegExp(fs.readFileSync(expectedre, 'utf8').trim())
t.like(actual, expect, root + ' tree')
}
t.end()
})
})
})
test('linkedroot', function (t) {
var dir = path.resolve(fixtures, 'linkedroot')
var out = dir + '-archy.txt'
rpt(dir, function (er, d) {
if (er && er.code !== 'ENOENT') throw er
var actual = archy(archyize(d)).trim()
console.log(actual)
var expect = fs.readFileSync(out, 'utf8').trim()
t.equal(actual, expect, 'linkedroot tree')
t.end()
})
})
test('deeproot', function (t) {
var dir = path.resolve(fixtures, 'deeproot/root')
var out = path.resolve(fixtures, 'deep') + '-archy.txt'
rpt(dir, function (er, d) {
if (er && er.code !== 'ENOENT') throw er
var actual = archy(archyize(d)).trim()
console.log(actual)
var expect = fs.readFileSync(out, 'utf8').trim()
t.equal(actual, expect, 'deeproot tree')
t.end()
})
})
test('broken json', function (t) {
rpt(path.resolve(fixtures, 'bad'), function (er, d) {
t.ok(d.error, 'Got an error object')
t.equal(d.error && d.error.code, 'EJSONPARSE')
t.ok(d, 'Got a tree')
t.end()
})
})
test('missing json does not obscure deeper errors', function (t) {
rpt(path.resolve(fixtures, 'empty'), function (er, d) {
var error = d.error
t.ok(error, 'Error reading json of top level')
t.equal(error && error.code, 'ENOENT')
var childError = d.children.length===1 && d.children[0].error
t.ok(childError, 'Error parsing JSON of child node')
t.equal(childError && childError.code, 'EJSONPARSE')
t.end()
})
})
test('missing folder', function (t) {
rpt(path.resolve(fixtures, 'does-not-exist'), function (er, d) {
t.ok(er, 'Got an error object')
t.equal(er && er.code, 'ENOENT')
t.ok(!d, 'No tree on top level error')
t.end()
})
})
function archyize (d, seen) {
seen = seen || {}
var path = d.path
if (d.target) {
path = d.target.path
}
var label = d.package._id ? d.package._id + ' ' :
d.package.name ? d.package.name + (d.package.version ? '@' + d.package.version : '') + ' ' :
''
label += path.substr(cwd.length + 1)
if (d . target) {
return { label: label + ' (symlink)', nodes: [] }
}
return {
label: label,
nodes: d.children.map(function (kid) {
return archyize(kid, seen)
})
}
}
test('cleanup', function (t) {
cleanup()
t.end()
})