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 fakeBrowser = path.resolve(pkg, '_script.sh') 13var configfile = path.resolve(pkg, '_npmrc') 14var outfile = path.resolve(pkg, '_outfile') 15var ssoUri = common.registry + '/-/saml/foo' 16 17common.pendIfWindows('This is trickier to convert without opening new shells') 18 19function mocks (server) { 20 server.filteringRequestBody(function (r) { 21 if (r.match(/"_id":"org\.couchdb\.user:npm_saml_auth_dummy_user"/)) { 22 return 'auth' 23 } else { 24 return 'invalid' 25 } 26 }) 27 server.post('/-/v1/login', 'invalid').reply(404, 'not found') 28 server.put('/-/user/org.couchdb.user:npm_saml_auth_dummy_user', 'auth') 29 .reply(201, { token: 'foo', sso: ssoUri }) 30} 31 32test('setup', function (t) { 33 mkdirp.sync(pkg) 34 fs.writeFileSync(configfile, '') 35 var s = '#!/usr/bin/env bash\n' + 36 'echo "$@" > ' + outfile + '\n' 37 fs.writeFileSync(fakeBrowser, s, 'ascii') 38 fs.chmodSync(fakeBrowser, '0755') 39 t.pass('made script') 40 t.end() 41}) 42 43test('npm login', function (t) { 44 mr({ port: common.port, plugin: mocks }, function (er, s) { 45 s.get( 46 '/-/whoami', { authorization: 'Bearer foo' } 47 ).max(1).reply(401, {}) 48 common.npm( 49 [ 50 'login', 51 '--registry', common.registry, 52 '--auth-type=saml', 53 '--loglevel', 'silent', 54 '--userconfig', configfile, 55 '--browser', fakeBrowser 56 ], 57 opts, 58 function (err, code, stdout, stderr) { 59 t.ifError(err, 'npm ran without issue') 60 t.equal(code, 0, 'exited OK') 61 t.notOk(stderr, 'no error output') 62 stderr && t.comment('stderr - ', stderr) 63 t.matches(stdout, /Logged in as igotauthed/, 64 'successfully authenticated and output the given username') 65 s.close() 66 rimraf.sync(configfile) 67 rimraf.sync(outfile) 68 t.end() 69 } 70 ) 71 72 s.get( 73 '/-/whoami', { authorization: 'Bearer foo' } 74 ).reply(200, { username: 'igotauthed' }) 75 }) 76}) 77 78test('cleanup', function (t) { 79 rimraf.sync(pkg) 80 t.pass('cleaned up') 81 t.end() 82}) 83