1 var common = require('../common-tap.js')
2 var test = require('tap').test
3 var npm = require('../../lib/npm.js')
4 var mkdirp = require('mkdirp')
5 var rimraf = require('rimraf')
6 var path = require('path')
7 var mr = require('npm-registry-mock')
9 var osenv = require('osenv')
11 var requireInject = require('require-inject')
13 var PKG_DIR = path.resolve(__dirname, 'update-examples')
14 var CACHE_DIR = path.resolve(PKG_DIR, 'cache')
16 // ** constant templates for mocks **
18 'name': 'update-examples',
40 var DEP1_REGISTRY = { name: 'dep1',
41 'dist-tags': { latest: '1.2.2' },
43 '1.2.2': { version: '1.2.2' },
44 '1.2.1': { version: '1.2.1' },
45 '1.2.0': { version: '1.2.0' },
46 '1.1.2': { version: '1.1.2' },
47 '1.1.1': { version: '1.1.1' },
48 '1.0.0': { version: '1.0.0' },
49 '0.4.1': { version: '0.4.1' },
50 '0.4.0': { version: '0.4.0' },
51 '0.2.0': { version: '0.2.0' }
57 '/dep1': [200, DEP1_REGISTRY]
61 // ** dynamic mocks, cloned from templates and modified **
63 var mockDepJson = clone(DEP_PKG)
64 var mockInstalled = clone(INSTALLED)
65 var mockParentJson = clone(DEFAULT_PKG)
74 function extend (a, b) {
81 function resetPackage (options) {
82 rimraf.sync(CACHE_DIR)
83 mkdirp.sync(CACHE_DIR)
85 installAskedFor = undefined
87 mockParentJson = clone(DEFAULT_PKG)
88 mockInstalled = clone(INSTALLED)
89 mockDepJson = clone(DEP_PKG)
92 mockParentJson.dependencies.dep1 = options.wanted
93 mockDepJson._from = options.wanted
96 if (options.installed) {
97 mockInstalled.dependencies.dep1.version = options.installed
98 mockDepJson.version = options.installed
102 function mockReadInstalled (dir, opts, cb) {
103 cb(null, mockInstalled)
106 function mockReadJson (file, cb) {
107 cb(null, file.match(/dep1/) ? mockDepJson : mockParentJson)
110 function mockCommand (npm, name, fn) {
111 delete npm.commands[name]
112 npm.commands[name] = fn
115 test('setup', function (t) {
116 process.chdir(osenv.tmpdir())
118 process.chdir(PKG_DIR)
122 mr({ port: common.port, mocks: registryMocks }, function (er, server) {
123 npm.load({ cache: CACHE_DIR,
124 registry: common.registry,
125 cwd: PKG_DIR }, function (err) {
126 t.ifError(err, 'started server')
129 mockCommand(npm, 'install', function mockInstall (where, what, cb) {
130 installAskedFor = what
134 mockCommand(npm, 'outdated', requireInject('../../lib/outdated', {
135 'read-installed': mockReadInstalled,
136 'read-package-json': mockReadJson
144 test('update caret dependency to latest', function (t) {
145 resetPackage({ wanted: '^1.1.1' })
147 npm.commands.update([], function (err) {
149 t.equal('dep1@1.2.2', installAskedFor, 'should want to install dep@1.2.2')
154 test('update tilde dependency to latest', function (t) {
155 resetPackage({ wanted: '~1.1.1' })
157 npm.commands.update([], function (err) {
159 t.equal('dep1@1.1.2', installAskedFor, 'should want to install dep@1.1.2')
164 test('hold tilde dependency at wanted (#6441)', function (t) {
165 resetPackage({ wanted: '~1.1.2', installed: '1.1.2' })
167 npm.commands.update([], function (err) {
169 t.notOk(installAskedFor, 'should not want to install anything')
174 test('update old caret dependency with no newer', function (t) {
175 resetPackage({ wanted: '^0.2.0', installed: '^0.2.0' })
177 npm.commands.update([], function (err) {
179 t.equal('dep1@0.2.0', installAskedFor, 'should want to install dep@0.2.0')
184 test('update old caret dependency with newer', function (t) {
185 resetPackage({ wanted: '^0.4.0', installed: '^0.4.0' })
187 npm.commands.update([], function (err) {
189 t.equal('dep1@0.4.1', installAskedFor, 'should want to install dep@0.4.1')
194 test('cleanup', function (t) {
197 process.chdir(osenv.tmpdir())