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.
 
 
 
 
 
 

160 lines
4.7 KiB

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
}