mirror of https://github.com/nodejs/node.git
161 lines
4.7 KiB
JavaScript
161 lines
4.7 KiB
JavaScript
var common = require("../common-tap.js")
|
|
var test = require("tap").test
|
|
var npm = require("../../")
|
|
var mkdirp = require("mkdirp")
|
|
var rimraf = require("rimraf")
|
|
var fs = require('fs')
|
|
var path = require('path')
|
|
var mr = require("npm-registry-mock")
|
|
|
|
var PKG_DIR = path.resolve(__dirname, "update-save")
|
|
var PKG = path.resolve(PKG_DIR, "package.json")
|
|
var CACHE_DIR = path.resolve(PKG_DIR, "cache")
|
|
var MODULES_DIR = path.resolve(PKG_DIR, "node_modules")
|
|
|
|
var EXEC_OPTS = {
|
|
cwd: PKG_DIR,
|
|
stdio: 'ignore',
|
|
env: {
|
|
npm_config_registry: common.registry,
|
|
npm_config_loglevel: 'verbose'
|
|
}
|
|
}
|
|
|
|
var DEFAULT_PKG = {
|
|
"name": "update-save-example",
|
|
"version": "1.2.3",
|
|
"dependencies": {
|
|
"mkdirp": "~0.3.0"
|
|
},
|
|
"devDependencies": {
|
|
"underscore": "~1.3.1"
|
|
}
|
|
}
|
|
|
|
var s = undefined // mock server reference
|
|
|
|
test('setup', function (t) {
|
|
resetPackage()
|
|
|
|
mr(common.port, function (server) {
|
|
npm.load({cache: CACHE_DIR, registry: common.registry}, function (err) {
|
|
t.ifError(err)
|
|
s = server
|
|
t.end()
|
|
})
|
|
})
|
|
})
|
|
|
|
test("update regular dependencies only", function (t) {
|
|
resetPackage()
|
|
|
|
common.npm(['update', '--save'], EXEC_OPTS, function (err, code) {
|
|
t.ifError(err)
|
|
t.equal(code, 0)
|
|
|
|
var pkgdata = JSON.parse(fs.readFileSync(PKG, 'utf8'))
|
|
t.deepEqual(pkgdata.dependencies, {mkdirp: '^0.3.5'}, 'only dependencies updated')
|
|
t.deepEqual(pkgdata.devDependencies, DEFAULT_PKG.devDependencies, 'dev dependencies should be untouched')
|
|
t.deepEqual(pkgdata.optionalDependencies, DEFAULT_PKG.optionalDependencies, 'optional dependencies should be untouched')
|
|
t.end()
|
|
})
|
|
})
|
|
|
|
test("update devDependencies only", function (t) {
|
|
resetPackage()
|
|
|
|
common.npm(['update', '--save-dev'], EXEC_OPTS, function (err, code, stdout, stderr) {
|
|
t.ifError(err)
|
|
t.equal(code, 0)
|
|
|
|
var pkgdata = JSON.parse(fs.readFileSync(PKG, 'utf8'))
|
|
t.deepEqual(pkgdata.dependencies, DEFAULT_PKG.dependencies, 'dependencies should be untouched')
|
|
t.deepEqual(pkgdata.devDependencies, {underscore: '^1.3.3'}, 'dev dependencies should be updated')
|
|
t.deepEqual(pkgdata.optionalDependencies, DEFAULT_PKG.optionalDependencies, 'optional dependencies should be untouched')
|
|
t.end()
|
|
})
|
|
})
|
|
|
|
test("update optionalDependencies only", function (t) {
|
|
resetPackage({
|
|
"optionalDependencies": {
|
|
"underscore": "~1.3.1"
|
|
}
|
|
})
|
|
|
|
common.npm(['update', '--save-optional'], EXEC_OPTS, function (err, code) {
|
|
t.ifError(err)
|
|
t.equal(code, 0)
|
|
|
|
var pkgdata = JSON.parse(fs.readFileSync(PKG, 'utf8'))
|
|
t.deepEqual(pkgdata.dependencies, DEFAULT_PKG.dependencies, 'dependencies should be untouched')
|
|
t.deepEqual(pkgdata.devDependencies, DEFAULT_PKG.devDependencies, 'dev dependencies should be untouched')
|
|
t.deepEqual(pkgdata.optionalDependencies, {underscore: '^1.3.3'}, 'optional dependencies should be updated')
|
|
t.end()
|
|
})
|
|
})
|
|
|
|
test("optionalDependencies are merged into dependencies during --save", function (t) {
|
|
var pkg = resetPackage({
|
|
"optionalDependencies": {
|
|
"underscore": "~1.3.1"
|
|
}
|
|
})
|
|
|
|
common.npm(['update', '--save'], EXEC_OPTS, function (err, code) {
|
|
t.ifError(err)
|
|
t.equal(code, 0)
|
|
|
|
var pkgdata = JSON.parse(fs.readFileSync(PKG, 'utf8'))
|
|
t.deepEqual(pkgdata.dependencies, {mkdirp: '^0.3.5'}, 'dependencies should not include optional dependencies')
|
|
t.deepEqual(pkgdata.devDependencies, pkg.devDependencies, 'dev dependencies should be untouched')
|
|
t.deepEqual(pkgdata.optionalDependencies, pkg.optionalDependencies, 'optional dependencies should be untouched')
|
|
t.end()
|
|
})
|
|
})
|
|
|
|
test("semver prefix is replaced with configured save-prefix", function (t) {
|
|
resetPackage()
|
|
|
|
common.npm(['update', '--save', '--save-prefix', '~'], EXEC_OPTS, function (err, code) {
|
|
t.ifError(err)
|
|
t.equal(code, 0)
|
|
|
|
var pkgdata = JSON.parse(fs.readFileSync(PKG, 'utf8'))
|
|
t.deepEqual(pkgdata.dependencies, {
|
|
mkdirp: '~0.3.5'
|
|
}, 'dependencies should be updated')
|
|
t.deepEqual(pkgdata.devDependencies, DEFAULT_PKG.devDependencies, 'dev dependencies should be untouched')
|
|
t.deepEqual(pkgdata.optionalDependencies, DEFAULT_PKG.optionalDependencies, 'optional dependencies should be updated')
|
|
t.end()
|
|
})
|
|
})
|
|
|
|
function resetPackage(extendWith) {
|
|
rimraf.sync(CACHE_DIR)
|
|
rimraf.sync(MODULES_DIR)
|
|
mkdirp.sync(CACHE_DIR)
|
|
var pkg = clone(DEFAULT_PKG)
|
|
extend(pkg, extendWith)
|
|
for (key in extend) { pkg[key] = extend[key]}
|
|
fs.writeFileSync(PKG, JSON.stringify(pkg, null, 2), 'ascii')
|
|
return pkg
|
|
}
|
|
|
|
test("cleanup", function (t) {
|
|
s.close()
|
|
resetPackage() // restore package.json
|
|
rimraf.sync(CACHE_DIR)
|
|
rimraf.sync(MODULES_DIR)
|
|
t.end()
|
|
})
|
|
|
|
function clone(a) {
|
|
return extend({}, a)
|
|
}
|
|
|
|
function extend(a, b) {
|
|
for (key in b) { a[key] = b[key]}
|
|
return a
|
|
}
|