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.
 
 
 
 
 
 

139 lines
3.1 KiB

'use strict'
var path = require('path')
var test = require('tap').test
var fs = require('graceful-fs')
var mkdirp = require('mkdirp')
var rimraf = require('rimraf')
var base = path.join(__dirname, path.basename(__filename, '.js'))
var common = require('../common-tap.js')
function fixturepath () {
return path.join(base, path.join.apply(path, arguments))
}
function File (contents) {
return {
type: 'file',
contents: typeof contents === 'object'
? JSON.stringify(contents)
: contents
}
}
function Dir (contents) {
return {
type: 'dir',
contents: contents || {}
}
}
function createFixtures (filename, fixture) {
if (fixture.type === 'dir') {
mkdirp.sync(filename)
Object.keys(fixture.contents).forEach(function (content) {
createFixtures(path.resolve(filename, content), fixture.contents[content])
})
} else if (fixture.type === 'file') {
fs.writeFileSync(filename, fixture.contents)
} else {
throw new Error('Unknown fixture type: ' + fixture.type)
}
}
var fixtures = Dir({
// The fixture modules
'moda@1.0.1': Dir({
'package.json': File({
name: 'moda',
version: '1.0.1'
})
}),
'modb@1.0.0': Dir({
'package.json': File({
name: 'modb',
version: '1.0.0',
bundleDependencies: ['modc'],
dependencies: {
modc: fixturepath('modc@1.0.0')
}
})
}),
'modc@1.0.0': Dir({
'package.json': File({
name: 'modc',
version: '1.0.0'
})
}),
// The local config
'package.json': File({
dependencies: {
moda: fixturepath('moda@1.0.1'),
modb: fixturepath('modb@1.0.0')
}
}),
'node_modules': Dir({
'moda': Dir({
'package.json': File({
name: 'moda',
version: '1.0.0',
_requested: { rawSpec: fixturepath('moda@1.0.0') },
dependencies: {
modb: fixturepath('modb@1.0.0')
},
bundleDependencies: [ 'modb' ]
})
})
})
})
function setup () {
cleanup()
createFixtures(base, fixtures)
}
function cleanup () {
rimraf.sync(base)
}
function exists (t, filepath, msg) {
try {
fs.statSync(filepath)
t.pass(msg)
return true
} catch (ex) {
t.fail(msg, {found: null, wanted: 'exists', compare: 'fs.stat(' + filepath + ')'})
return false
}
}
test('setup', function (t) {
setup()
common.npm('install', {cwd: fixturepath('modb@1.0.0')}, function (err, code, stdout, stderr) {
if (err) throw err
t.is(code, 0, 'modb')
common.npm('install', {
cwd: fixturepath('node_modules', 'moda')
}, function (err, code, stdout, stderr) {
if (err) throw err
t.is(code, 0, 'installed moda')
t.done()
})
})
})
test('no-clobber', function (t) {
common.npm('install', {cwd: base}, function (err, code, stdout, stderr) {
if (err) throw err
t.is(code, 0, 'installed ok')
exists(t, fixturepath('node_modules', 'moda'), 'moda')
exists(t, fixturepath('node_modules', 'modb'), 'modb')
exists(t, fixturepath('node_modules', 'modb', 'node_modules', 'modc'), 'modc')
t.done()
})
})
test('cleanup', function (t) {
cleanup()
t.pass()
t.done()
})