• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1var common = require('../common-tap.js')
2const t = require('tap')
3var test = t.test
4var osenv = require('osenv')
5var path = require('path')
6var fs = require('fs')
7var rimraf = require('rimraf')
8var mkdirp = require('mkdirp')
9
10// this test has to use a tmpdir so that it's outside of
11// the current package context of npm.
12var tmp = osenv.tmpdir()
13var t1dir = path.resolve(tmp, 'view-local-no-pkg')
14var t2dir = path.resolve(tmp, 'view-local-notmine')
15var t3dir = path.resolve(tmp, 'view-local-mine')
16var mr = require('npm-registry-mock')
17
18var server
19
20t.teardown(() => {
21  rimraf.sync(t1dir)
22  rimraf.sync(t2dir)
23  rimraf.sync(t3dir)
24  if (server) {
25    server.close()
26  }
27})
28
29test('setup', function (t) {
30  mkdirp.sync(t1dir)
31  mkdirp.sync(t2dir)
32  mkdirp.sync(t3dir)
33
34  fs.writeFileSync(t2dir + '/package.json', JSON.stringify({
35    author: 'Evan Lucas',
36    name: 'test-repo-url-https',
37    version: '0.0.1'
38  }), 'utf8')
39
40  fs.writeFileSync(t3dir + '/package.json', JSON.stringify({
41    author: 'Evan Lucas',
42    name: 'biscuits',
43    version: '0.0.1'
44  }), 'utf8')
45
46  t.pass('created fixtures')
47
48  mr({ port: common.port, plugin: plugin }, function (er, s) {
49    server = s
50    t.end()
51  })
52})
53
54function plugin (server) {
55  server
56    .get('/biscuits')
57    .many()
58    .reply(404, {'error': 'version not found'})
59}
60
61test('npm view . in global mode', function (t) {
62  common.npm([
63    'view',
64    '.',
65    '--registry=' + common.registry,
66    '--global'
67  ], { cwd: t1dir }, function (err, code, stdout, stderr) {
68    t.ifError(err, 'view command finished successfully')
69    t.equal(code, 1, 'exit not ok')
70    t.similar(stderr, /Cannot use view command in global mode./m)
71    t.end()
72  })
73})
74
75test('npm view --global', function (t) {
76  common.npm([
77    'view',
78    '--registry=' + common.registry,
79    '--global'
80  ], { cwd: t1dir }, function (err, code, stdout, stderr) {
81    t.ifError(err, 'view command finished successfully')
82    t.equal(code, 1, 'exit not ok')
83    t.similar(stderr, /Cannot use view command in global mode./m)
84    t.end()
85  })
86})
87
88test('npm view . with no package.json', function (t) {
89  common.npm([
90    'view',
91    '.',
92    '--registry=' + common.registry
93  ], { cwd: t1dir }, function (err, code, stdout, stderr) {
94    t.ifError(err, 'view command finished successfully')
95    t.equal(code, 1, 'exit not ok')
96    t.similar(stderr, /Invalid package.json/m)
97    t.end()
98  })
99})
100
101test('npm view . with no published package', function (t) {
102  common.npm([
103    'view',
104    '.',
105    '--registry=' + common.registry
106  ], { cwd: t3dir }, function (err, code, stdout, stderr) {
107    t.ifError(err, 'view command finished successfully')
108    t.equal(code, 1, 'exit not ok')
109    t.similar(stderr, /not in the npm registry/m)
110    t.end()
111  })
112})
113
114test('npm view .', function (t) {
115  common.npm([
116    'view',
117    '.',
118    '--registry=' + common.registry
119  ], { cwd: t2dir }, function (err, code, stdout) {
120    t.ifError(err, 'view command finished successfully')
121    t.equal(code, 0, 'exit ok')
122    t.matches(stdout, /test-repo-url-https/, 'has the right package')
123    t.end()
124  })
125})
126
127test('npm view . select fields', function (t) {
128  common.npm([
129    'view',
130    '.',
131    'main',
132    '--registry=' + common.registry
133  ], { cwd: t2dir }, function (err, code, stdout) {
134    t.ifError(err, 'view command finished successfully')
135    t.equal(code, 0, 'exit ok')
136    t.equal(stdout.trim(), 'index.js', 'should print `index.js`')
137    t.end()
138  })
139})
140
141test('npm view .@<version>', function (t) {
142  common.npm([
143    'view',
144    '.@0.0.0',
145    'version',
146    '--registry=' + common.registry
147  ], { cwd: t2dir }, function (err, code, stdout) {
148    t.ifError(err, 'view command finished successfully')
149    t.equal(code, 0, 'exit ok')
150    t.equal(stdout.trim(), '0.0.0', 'should print `0.0.0`')
151    t.end()
152  })
153})
154
155test('npm view .@<version> version --json', function (t) {
156  common.npm([
157    'view',
158    '.@0.0.0',
159    'version',
160    '--json',
161    '--registry=' + common.registry
162  ], { cwd: t2dir }, function (err, code, stdout) {
163    t.ifError(err, 'view command finished successfully')
164    t.equal(code, 0, 'exit ok')
165    t.equal(stdout.trim(), '"0.0.0"', 'should print `"0.0.0"`')
166    t.end()
167  })
168})
169
170test('npm view . --json author name version', function (t) {
171  common.npm([
172    'view',
173    '.',
174    'author',
175    'name',
176    'version',
177    '--json',
178    '--registry=' + common.registry
179  ], { cwd: t2dir }, function (err, code, stdout) {
180    var expected = JSON.stringify({
181      author: 'Evan Lucas <evanlucas@me.com>',
182      name: 'test-repo-url-https',
183      version: '0.0.1'
184    }, null, 2)
185    t.ifError(err, 'view command finished successfully')
186    t.equal(code, 0, 'exit ok')
187    t.equal(stdout.trim(), expected, 'should print ' + expected)
188    t.end()
189  })
190})
191
192test('npm view .@<version> --json author name version', function (t) {
193  common.npm([
194    'view',
195    '.@0.0.0',
196    'author',
197    'name',
198    'version',
199    '--json',
200    '--registry=' + common.registry
201  ], { cwd: t2dir }, function (err, code, stdout) {
202    var expected = JSON.stringify({
203      author: 'Evan Lucas <evanlucas@me.com>',
204      name: 'test-repo-url-https',
205      version: '0.0.0'
206    }, null, 2)
207    t.ifError(err, 'view command finished successfully')
208    t.equal(code, 0, 'exit ok')
209    t.equal(stdout.trim(), expected, 'should print ' + expected)
210    t.end()
211  })
212})
213
214test('npm view <package name>', function (t) {
215  common.npm([
216    'view',
217    'underscore',
218    '--registry=' + common.registry
219  ], { cwd: t2dir }, function (err, code, stdout) {
220    t.ifError(err, 'view command finished successfully')
221    t.equal(code, 0, 'exit ok')
222    t.matches(stdout, /underscore/, 'should have name `underscore`')
223    t.end()
224  })
225})
226
227test('npm view <package name> --global', function (t) {
228  common.npm([
229    'view',
230    'underscore',
231    '--global',
232    '--registry=' + common.registry
233  ], { cwd: t2dir }, function (err, code, stdout) {
234    t.ifError(err, 'view command finished successfully')
235    t.equal(code, 0, 'exit ok')
236    t.matches(stdout, /underscore/, 'should have name `underscore`')
237    t.end()
238  })
239})
240
241test('npm view <package name>@<semver range> versions', function (t) {
242  common.npm([
243    'view',
244    'underscore@^1.5.0',
245    'versions',
246    '--registry=' + common.registry
247  ], { cwd: t2dir }, function (err, code, stdout) {
248    t.ifError(err, 'view command finished successfully')
249    t.equal(code, 0, 'exit ok')
250    var re = new RegExp('1.5.0')
251    t.similar(stdout, re, 'should have version `1.5.0`')
252    t.end()
253  })
254})
255
256test('npm view <package name>@<semver range> version --json', function (t) {
257  common.npm([
258    'view',
259    'underscore@~1.5.0',
260    'version',
261    '--json',
262    '--registry=' + common.registry
263  ], { cwd: t2dir }, function (err, code, stdout) {
264    t.ifError(err, 'view command finished successfully')
265    t.equal(code, 0, 'exit ok')
266    t.equal(stdout.trim(), JSON.stringify([
267      '1.5.0',
268      '1.5.1'
269    ], null, 2), 'should have three versions')
270    t.end()
271  })
272})
273
274test('npm view <package name> --json', function (t) {
275  t.plan(3)
276  common.npm([
277    'view',
278    'underscore',
279    '--json',
280    '--registry=' + common.registry
281  ], { cwd: t2dir }, function (err, code, stdout) {
282    t.ifError(err, 'view command finished successfully')
283    t.equal(code, 0, 'exit ok')
284    try {
285      var out = JSON.parse(stdout.trim())
286      t.similar(out, {
287        maintainers: ['jashkenas <jashkenas@gmail.com>']
288      }, 'should have the same maintainer')
289    } catch (er) {
290      t.fail('Unable to parse JSON')
291    }
292  })
293})
294
295test('npm view <package name>@<invalid version>', function (t) {
296  common.npm([
297    'view',
298    'underscore@12345',
299    '--registry=' + common.registry
300  ], { cwd: t2dir }, function (err, code, stdout) {
301    t.ifError(err, 'view command finished successfully')
302    t.equal(code, 0, 'exit ok')
303    t.equal(stdout.trim(), '', 'should return empty')
304    t.end()
305  })
306})
307
308test('npm view <package name>@<invalid version> --json', function (t) {
309  common.npm([
310    'view',
311    'underscore@12345',
312    '--json',
313    '--registry=' + common.registry
314  ], { cwd: t2dir }, function (err, code, stdout) {
315    t.ifError(err, 'view command finished successfully')
316    t.equal(code, 0, 'exit ok')
317    t.equal(stdout.trim(), '', 'should return empty')
318    t.end()
319  })
320})
321
322test('npm view <package name> <field>', function (t) {
323  common.npm([
324    'view',
325    'underscore',
326    'homepage',
327    '--registry=' + common.registry
328  ], { cwd: t2dir }, function (err, code, stdout) {
329    t.ifError(err, 'view command finished successfully')
330    t.equal(code, 0, 'exit ok')
331    t.equal(stdout.trim(), 'http://underscorejs.org',
332      'homepage should equal `http://underscorejs.org`')
333    t.end()
334  })
335})
336
337test('npm view with invalid package name', function (t) {
338  var invalidName = 'InvalidPackage'
339
340  server.get('/' + invalidName).reply('404', {'error': 'not found'})
341  common.npm([
342    'view',
343    invalidName,
344    '--registry=' + common.registry
345  ], {}, function (err, code, stdout, stderr) {
346    t.ifError(err, 'view command finished successfully')
347    t.equal(code, 1, 'exit not ok')
348
349    t.similar(stderr, new RegExp('is not in the npm registry'),
350      'Package should NOT be found')
351
352    t.dissimilar(stderr, new RegExp('use the name yourself!'),
353      'Suggestion should not be there')
354
355    t.similar(stderr, new RegExp('name can no longer contain capital letters'),
356      'Suggestion about Capital letter should be there')
357
358    t.end()
359  })
360})
361
362test('npm view with valid but non existent package name', function (t) {
363  server.get('/valid-but-non-existent-package').reply(404, {'error': 'not found'})
364  common.npm([
365    'view',
366    'valid-but-non-existent-package',
367    '--registry=' + common.registry
368  ], {}, function (err, code, stdout, stderr) {
369    t.ifError(err, 'view command finished successfully')
370    t.equal(code, 1, 'exit not ok')
371
372    t.similar(stderr,
373      new RegExp("'valid-but-non-existent-package' is not in the npm registry\\."),
374      'Package should NOT be found')
375
376    t.similar(stderr, new RegExp('use the name yourself!'),
377      'Suggestion should be there')
378
379    t.end()
380  })
381})
382