-
Notifications
You must be signed in to change notification settings - Fork 3.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Fix `npm version` unexpected arg count usage - Add tests for lib/version.js Fixes: npm/statusboard#182 PR-URL: #2205 Credit: @ruyadorno Close: #2205 Reviewed-by: @nlf
- Loading branch information
Showing
2 changed files
with
163 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,160 @@ | ||
const t = require('tap') | ||
const requireInject = require('require-inject') | ||
|
||
let result = [] | ||
|
||
const noop = () => null | ||
const npm = { | ||
flatOptions: { | ||
json: false, | ||
}, | ||
prefix: '', | ||
version: '1.0.0', | ||
} | ||
const mocks = { | ||
libnpmversion: noop, | ||
'../../lib/npm.js': npm, | ||
'../../lib/utils/output.js': (...msg) => { | ||
for (const m of msg) | ||
result.push(m) | ||
}, | ||
'../../lib/utils/usage.js': () => 'usage instructions', | ||
} | ||
|
||
const version = requireInject('../../lib/version.js', mocks) | ||
|
||
const _processVersions = process.versions | ||
t.afterEach(cb => { | ||
npm.flatOptions.json = false | ||
npm.prefix = '' | ||
process.versions = _processVersions | ||
result = [] | ||
cb() | ||
}) | ||
|
||
t.test('no args', t => { | ||
const prefix = t.testdir({ | ||
'package.json': JSON.stringify({ | ||
name: 'test-version-no-args', | ||
version: '3.2.1', | ||
}), | ||
}) | ||
npm.prefix = prefix | ||
Object.defineProperty(process, 'versions', { value: { node: '1.0.0' } }) | ||
|
||
version([], err => { | ||
if (err) | ||
throw err | ||
|
||
t.deepEqual( | ||
result, | ||
[{ | ||
'test-version-no-args': '3.2.1', | ||
node: '1.0.0', | ||
npm: '1.0.0', | ||
}], | ||
'should output expected values for various versions in npm' | ||
) | ||
|
||
t.end() | ||
}) | ||
}) | ||
|
||
t.test('too many args', t => { | ||
version(['foo', 'bar'], err => { | ||
t.match( | ||
err, | ||
'usage instructions', | ||
'should throw usage instructions error' | ||
) | ||
|
||
t.end() | ||
}) | ||
}) | ||
|
||
t.test('completion', t => { | ||
const { completion } = version | ||
|
||
const testComp = (argv, expect) => { | ||
completion({ conf: { argv: { remain: argv } } }, (err, res) => { | ||
t.ifError(err) | ||
t.strictSame(res, expect, argv.join(' ')) | ||
}) | ||
} | ||
|
||
testComp(['npm', 'version'], [ | ||
'major', | ||
'minor', | ||
'patch', | ||
'premajor', | ||
'preminor', | ||
'prepatch', | ||
'prerelease', | ||
'from-git', | ||
]) | ||
testComp(['npm', 'version', 'major'], []) | ||
|
||
t.end() | ||
}) | ||
|
||
t.test('failure reading package.json', t => { | ||
const prefix = t.testdir({}) | ||
npm.prefix = prefix | ||
|
||
version([], err => { | ||
if (err) | ||
throw err | ||
|
||
t.deepEqual( | ||
result, | ||
[{ | ||
npm: '1.0.0', | ||
node: '1.0.0', | ||
}], | ||
'should not have package name on returning object' | ||
) | ||
|
||
t.end() | ||
}) | ||
}) | ||
|
||
t.test('--json option', t => { | ||
const prefix = t.testdir({}) | ||
npm.flatOptions.json = true | ||
npm.prefix = prefix | ||
Object.defineProperty(process, 'versions', { value: {} }) | ||
|
||
version([], err => { | ||
if (err) | ||
throw err | ||
t.deepEqual( | ||
result, | ||
['{\n "npm": "1.0.0"\n}'], | ||
'should return json stringified result' | ||
) | ||
t.end() | ||
}) | ||
}) | ||
|
||
t.test('with one arg', t => { | ||
const version = requireInject('../../lib/version.js', { | ||
...mocks, | ||
libnpmversion: (arg, opts) => { | ||
t.equal(arg, 'major', 'should forward expected value') | ||
t.deepEqual( | ||
opts, | ||
{ | ||
json: false, | ||
path: '', | ||
}, | ||
'should forward expected options' | ||
) | ||
t.end() | ||
}, | ||
}) | ||
|
||
version(['major'], err => { | ||
if (err) | ||
throw err | ||
}) | ||
}) |