1var fs = require('fs') 2var path = require('path') 3var mkdirp = require('mkdirp') 4var rimraf = require('rimraf') 5var mr = require('npm-registry-mock') 6 7var test = require('tap').test 8var common = require('../common-tap.js') 9 10var opts = { cwd: common.pkg } 11var pkg = common.pkg 12var outfile = path.resolve(pkg, '_npmrc') 13 14var contents = '_auth=' + Buffer.from('u:x').toString('base64') + '\n' + 15 'registry=https://nonexistent.lvh.me/registry\n' + 16 'email=u@p.me\n' 17 18var responses = { 19 'Username': 'u\n', 20 'Password': 'p\n', 21 'Email': 'u@p.me\n' 22} 23 24function mocks (server) { 25 server.filteringRequestBody(function (r) { 26 if (r.match(/"_id":"org\.couchdb\.user:u"/)) { 27 return 'auth' 28 } else { 29 return 'invalid' 30 } 31 }) 32 server.post('/-/v1/login', 'invalid').reply(404, 'not found') 33 server.put('/-/user/org.couchdb.user:u', 'auth') 34 .reply(409, { error: 'user exists' }) 35 server.get('/-/user/org.couchdb.user:u?write=true') 36 .reply(200, { _rev: '3-deadcafebabebeef' }) 37 server.put( 38 '/-/user/org.couchdb.user:u/-rev/3-deadcafebabebeef', 39 'auth', 40 { authorization: 'Basic dTpw' } 41 ).reply(201, { username: 'u', password: 'p', email: 'u@p.me' }) 42} 43 44test('setup', function (t) { 45 rimraf.sync(pkg) 46 mkdirp(pkg, function (er) { 47 t.ifError(er, pkg + ' made successfully') 48 49 fs.writeFile(outfile, contents, function (er) { 50 t.ifError(er, 'wrote legacy config') 51 52 t.end() 53 }) 54 }) 55}) 56 57test('npm login', function (t) { 58 mr({ port: common.port, plugin: mocks }, function (er, s) { 59 var runner = common.npm( 60 [ 61 'login', 62 '--registry', common.registry, 63 '--loglevel', 'error', 64 '--userconfig', outfile 65 ], 66 opts, 67 function (err, code, stdout, stderr) { 68 if (err) throw err 69 t.is(stderr, '', 'no error output') 70 t.is(code, 0, 'exited OK') 71 var config = fs.readFileSync(outfile, 'utf8') 72 t.like(config, /:always-auth=false/, 'always-auth is scoped and false (by default)') 73 s.close() 74 rimraf(outfile, function (err) { 75 t.ifError(err, 'removed config file OK') 76 t.end() 77 }) 78 } 79 ) 80 81 var remaining = Object.keys(responses).length 82 runner.stdout.on('data', function (chunk) { 83 if (remaining > 0) { 84 remaining-- 85 86 var label = chunk.toString('utf8').split(':')[0] 87 if (responses[label]) runner.stdin.write(responses[label]) 88 89 if (remaining === 0) runner.stdin.end() 90 } else { 91 var message = chunk.toString('utf8').trim() 92 t.equal(message, 'Logged in as u on ' + common.registry + '/.') 93 } 94 }) 95 }) 96}) 97 98test('cleanup', function (t) { 99 rimraf.sync(pkg) 100 t.pass('cleaned up') 101 t.end() 102}) 103