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