blob: 44b615b91519dde22ae485445e3e20aae6544f86 [file] [log] [blame]
var common = require('../common-tap.js')
var test = require('tap').test
var npm = require('../../lib/npm.js')
var mkdirp = require('mkdirp')
var rimraf = require('rimraf')
var path = require('path')
var mr = require('npm-registry-mock')
var osenv = require('osenv')
var requireInject = require('require-inject')
var PKG_DIR = path.resolve(__dirname, 'update-examples')
var CACHE_DIR = path.resolve(PKG_DIR, 'cache')
// ** constant templates for mocks **
var DEFAULT_PKG = {
'name': 'update-examples',
'version': '1.2.3',
'dependencies': {
'dep1': '*'
}
}
var DEP_PKG = {
name: 'dep1',
version: '1.1.1',
_from: '^1.1.1'
}
var INSTALLED = {
dependencies: {
'dep1': {
version: '1.1.1',
link: false
}
}
}
var DEP1_REGISTRY = { name: 'dep1',
'dist-tags': { latest: '1.2.2' },
versions: {
'1.2.2': { version: '1.2.2' },
'1.2.1': { version: '1.2.1' },
'1.2.0': { version: '1.2.0' },
'1.1.2': { version: '1.1.2' },
'1.1.1': { version: '1.1.1' },
'1.0.0': { version: '1.0.0' },
'0.4.1': { version: '0.4.1' },
'0.4.0': { version: '0.4.0' },
'0.2.0': { version: '0.2.0' }
}
}
var registryMocks = {
'get': {
'/dep1': [200, DEP1_REGISTRY]
}
}
// ** dynamic mocks, cloned from templates and modified **
var mockServer
var mockDepJson = clone(DEP_PKG)
var mockInstalled = clone(INSTALLED)
var mockParentJson = clone(DEFAULT_PKG)
// target
var installAskedFor
function clone (a) {
return extend({}, a)
}
function extend (a, b) {
for (var key in b) {
a[key] = b[key]
}
return a
}
function resetPackage (options) {
rimraf.sync(CACHE_DIR)
mkdirp.sync(CACHE_DIR)
installAskedFor = undefined
mockParentJson = clone(DEFAULT_PKG)
mockInstalled = clone(INSTALLED)
mockDepJson = clone(DEP_PKG)
if (options.wanted) {
mockParentJson.dependencies.dep1 = options.wanted
mockDepJson._from = options.wanted
}
if (options.installed) {
mockInstalled.dependencies.dep1.version = options.installed
mockDepJson.version = options.installed
}
}
function mockReadInstalled (dir, opts, cb) {
cb(null, mockInstalled)
}
function mockReadJson (file, cb) {
cb(null, file.match(/dep1/) ? mockDepJson : mockParentJson)
}
function mockCommand (npm, name, fn) {
delete npm.commands[name]
npm.commands[name] = fn
}
test('setup', function (t) {
process.chdir(osenv.tmpdir())
mkdirp.sync(PKG_DIR)
process.chdir(PKG_DIR)
resetPackage({})
mr({ port: common.port, mocks: registryMocks }, function (er, server) {
npm.load({ cache: CACHE_DIR,
registry: common.registry,
cwd: PKG_DIR }, function (err) {
t.ifError(err, 'started server')
mockServer = server
mockCommand(npm, 'install', function mockInstall (where, what, cb) {
installAskedFor = what
cb(null)
})
mockCommand(npm, 'outdated', requireInject('../../lib/outdated', {
'read-installed': mockReadInstalled,
'read-package-json': mockReadJson
}))
t.end()
})
})
})
test('update caret dependency to latest', function (t) {
resetPackage({ wanted: '^1.1.1' })
npm.commands.update([], function (err) {
t.ifError(err)
t.equal('dep1@1.2.2', installAskedFor, 'should want to install dep@1.2.2')
t.end()
})
})
test('update tilde dependency to latest', function (t) {
resetPackage({ wanted: '~1.1.1' })
npm.commands.update([], function (err) {
t.ifError(err)
t.equal('dep1@1.1.2', installAskedFor, 'should want to install dep@1.1.2')
t.end()
})
})
test('hold tilde dependency at wanted (#6441)', function (t) {
resetPackage({ wanted: '~1.1.2', installed: '1.1.2' })
npm.commands.update([], function (err) {
t.ifError(err)
t.notOk(installAskedFor, 'should not want to install anything')
t.end()
})
})
test('update old caret dependency with no newer', function (t) {
resetPackage({ wanted: '^0.2.0', installed: '^0.2.0' })
npm.commands.update([], function (err) {
t.ifError(err)
t.equal('dep1@0.2.0', installAskedFor, 'should want to install dep@0.2.0')
t.end()
})
})
test('update old caret dependency with newer', function (t) {
resetPackage({ wanted: '^0.4.0', installed: '^0.4.0' })
npm.commands.update([], function (err) {
t.ifError(err)
t.equal('dep1@0.4.1', installAskedFor, 'should want to install dep@0.4.1')
t.end()
})
})
test('cleanup', function (t) {
mockServer.close()
process.chdir(osenv.tmpdir())
rimraf.sync(PKG_DIR)
t.end()
})