Skip to content

Commit 7842b4d

Browse files
ruyadornonlf
authored andcommitted
fix: npm version usage
- 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
1 parent 5fc56b6 commit 7842b4d

File tree

2 files changed

+163
-1
lines changed

2 files changed

+163
-1
lines changed

lib/version.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
'use strict'
2+
13
const libversion = require('libnpmversion')
24
const npm = require('./npm.js')
35
const output = require('./utils/output.js')
@@ -42,7 +44,7 @@ const version = async args => {
4244
path: npm.prefix,
4345
}))
4446
default:
45-
throw version.usage
47+
throw usage
4648
}
4749
}
4850

test/lib/version.js

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
const t = require('tap')
2+
const requireInject = require('require-inject')
3+
4+
let result = []
5+
6+
const noop = () => null
7+
const npm = {
8+
flatOptions: {
9+
json: false,
10+
},
11+
prefix: '',
12+
version: '1.0.0',
13+
}
14+
const mocks = {
15+
libnpmversion: noop,
16+
'../../lib/npm.js': npm,
17+
'../../lib/utils/output.js': (...msg) => {
18+
for (const m of msg)
19+
result.push(m)
20+
},
21+
'../../lib/utils/usage.js': () => 'usage instructions',
22+
}
23+
24+
const version = requireInject('../../lib/version.js', mocks)
25+
26+
const _processVersions = process.versions
27+
t.afterEach(cb => {
28+
npm.flatOptions.json = false
29+
npm.prefix = ''
30+
process.versions = _processVersions
31+
result = []
32+
cb()
33+
})
34+
35+
t.test('no args', t => {
36+
const prefix = t.testdir({
37+
'package.json': JSON.stringify({
38+
name: 'test-version-no-args',
39+
version: '3.2.1',
40+
}),
41+
})
42+
npm.prefix = prefix
43+
Object.defineProperty(process, 'versions', { value: { node: '1.0.0' } })
44+
45+
version([], err => {
46+
if (err)
47+
throw err
48+
49+
t.deepEqual(
50+
result,
51+
[{
52+
'test-version-no-args': '3.2.1',
53+
node: '1.0.0',
54+
npm: '1.0.0',
55+
}],
56+
'should output expected values for various versions in npm'
57+
)
58+
59+
t.end()
60+
})
61+
})
62+
63+
t.test('too many args', t => {
64+
version(['foo', 'bar'], err => {
65+
t.match(
66+
err,
67+
'usage instructions',
68+
'should throw usage instructions error'
69+
)
70+
71+
t.end()
72+
})
73+
})
74+
75+
t.test('completion', t => {
76+
const { completion } = version
77+
78+
const testComp = (argv, expect) => {
79+
completion({ conf: { argv: { remain: argv } } }, (err, res) => {
80+
t.ifError(err)
81+
t.strictSame(res, expect, argv.join(' '))
82+
})
83+
}
84+
85+
testComp(['npm', 'version'], [
86+
'major',
87+
'minor',
88+
'patch',
89+
'premajor',
90+
'preminor',
91+
'prepatch',
92+
'prerelease',
93+
'from-git',
94+
])
95+
testComp(['npm', 'version', 'major'], [])
96+
97+
t.end()
98+
})
99+
100+
t.test('failure reading package.json', t => {
101+
const prefix = t.testdir({})
102+
npm.prefix = prefix
103+
104+
version([], err => {
105+
if (err)
106+
throw err
107+
108+
t.deepEqual(
109+
result,
110+
[{
111+
npm: '1.0.0',
112+
node: '1.0.0',
113+
}],
114+
'should not have package name on returning object'
115+
)
116+
117+
t.end()
118+
})
119+
})
120+
121+
t.test('--json option', t => {
122+
const prefix = t.testdir({})
123+
npm.flatOptions.json = true
124+
npm.prefix = prefix
125+
Object.defineProperty(process, 'versions', { value: {} })
126+
127+
version([], err => {
128+
if (err)
129+
throw err
130+
t.deepEqual(
131+
result,
132+
['{\n "npm": "1.0.0"\n}'],
133+
'should return json stringified result'
134+
)
135+
t.end()
136+
})
137+
})
138+
139+
t.test('with one arg', t => {
140+
const version = requireInject('../../lib/version.js', {
141+
...mocks,
142+
libnpmversion: (arg, opts) => {
143+
t.equal(arg, 'major', 'should forward expected value')
144+
t.deepEqual(
145+
opts,
146+
{
147+
json: false,
148+
path: '',
149+
},
150+
'should forward expected options'
151+
)
152+
t.end()
153+
},
154+
})
155+
156+
version(['major'], err => {
157+
if (err)
158+
throw err
159+
})
160+
})

0 commit comments

Comments
 (0)