• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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