var fs = require('fs') var path = require('path') var mkdirp = require('mkdirp') var rimraf = require('rimraf') var mr = require('npm-registry-mock') var test = require('tap').test var common = require('../common-tap.js') var pkg = path.resolve(__dirname, 'access') var server var scoped = { name: '@scoped/pkg', version: '1.1.1' } test('setup', function (t) { mkdirp(pkg, function (er) { t.ifError(er, pkg + ' made successfully') mr({port: common.port}, function (err, s) { t.ifError(err, 'registry mocked successfully') server = s fs.writeFile( path.join(pkg, 'package.json'), JSON.stringify(scoped), function (er) { t.ifError(er, 'wrote package.json') t.end() } ) }) }) }) test('npm access public on current package', function (t) { server.post('/-/package/%40scoped%2Fpkg/access', JSON.stringify({ access: 'public' })).reply(200, { accessChanged: true }) common.npm( [ 'access', 'public', '--registry', common.registry, '--loglevel', 'silent' ], { cwd: pkg }, function (er, code, stdout, stderr) { t.ifError(er, 'npm access') t.equal(code, 0, 'exited OK') t.equal(stderr, '', 'no error output') t.end() } ) }) test('npm access public when no package passed and no package.json', function (t) { // need to simulate a missing package.json var missing = path.join(__dirname, 'access-public-missing-guard') mkdirp.sync(path.join(missing, 'node_modules')) common.npm([ 'access', 'public', '--registry', common.registry ], { cwd: missing }, function (er, code, stdout, stderr) { t.ifError(er, 'npm access') t.match(stderr, /no package name passed to command and no package.json found/) rimraf.sync(missing) t.end() }) }) test('npm access public when no package passed and invalid package.json', function (t) { // need to simulate a missing package.json var invalid = path.join(__dirname, 'access-public-invalid-package') mkdirp.sync(path.join(invalid, 'node_modules')) // it's hard to force `read-package-json` to break w/o ENOENT, but this will do it fs.writeFileSync(path.join(invalid, 'package.json'), '{\n') common.npm([ 'access', 'public', '--registry', common.registry ], { cwd: invalid }, function (er, code, stdout, stderr) { t.ifError(er, 'npm access') t.match(stderr, /Failed to parse json/) rimraf.sync(invalid) t.end() }) }) test('npm access restricted on current package', function (t) { server.post('/-/package/%40scoped%2Fpkg/access', JSON.stringify({ access: 'restricted' })).reply(200, { accessChanged: true }) common.npm( [ 'access', 'restricted', '--registry', common.registry, '--loglevel', 'silent' ], { cwd: pkg }, function (er, code, stdout, stderr) { t.ifError(er, 'npm access') t.equal(code, 0, 'exited OK') t.equal(stderr, '', 'no error output') t.end() } ) }) test('npm access on named package', function (t) { server.post('/-/package/%40scoped%2Fanother/access', { access: 'public' }).reply(200, { accessChaged: true }) common.npm( [ 'access', 'public', '@scoped/another', '--registry', common.registry, '--loglevel', 'silent' ], { cwd: pkg }, function (er, code, stdout, stderr) { t.ifError(er, 'npm access') t.equal(code, 0, 'exited OK') t.equal(stderr, '', 'no error output') t.end() } ) }) test('npm change access on unscoped package', function (t) { common.npm( [ 'access', 'restricted', 'yargs', '--registry', common.registry ], { cwd: pkg }, function (er, code, stdout, stderr) { t.ok(code, 'exited with Error') t.matches( stderr, /access commands are only accessible for scoped packages/) t.end() } ) }) test('npm access grant read-only', function (t) { server.put('/-/team/myorg/myteam/package', { permissions: 'read-only', package: '@scoped/another' }).reply(201, { accessChaged: true }) common.npm( [ 'access', 'grant', 'read-only', 'myorg:myteam', '@scoped/another', '--registry', common.registry ], { cwd: pkg }, function (er, code, stdout, stderr) { t.ifError(er, 'npm access grant') t.equal(code, 0, 'exited with Error') t.end() } ) }) test('npm access grant read-write', function (t) { server.put('/-/team/myorg/myteam/package', { permissions: 'read-write', package: '@scoped/another' }).reply(201, { accessChaged: true }) common.npm( [ 'access', 'grant', 'read-write', 'myorg:myteam', '@scoped/another', '--registry', common.registry ], { cwd: pkg }, function (er, code, stdout, stderr) { t.ifError(er, 'npm access grant') t.equal(code, 0, 'exited with Error') t.end() } ) }) test('npm access grant others', function (t) { common.npm( [ 'access', 'grant', 'rerere', 'myorg:myteam', '@scoped/another', '--registry', common.registry ], { cwd: pkg }, function (er, code, stdout, stderr) { t.ok(code, 'exited with Error') t.matches(stderr, /read-only/) t.matches(stderr, /read-write/) t.end() } ) }) test('npm access revoke', function (t) { server.delete('/-/team/myorg/myteam/package', { package: '@scoped/another' }).reply(200, { accessChaged: true }) common.npm( [ 'access', 'revoke', 'myorg:myteam', '@scoped/another', '--registry', common.registry ], { cwd: pkg }, function (er, code, stdout, stderr) { t.ifError(er, 'npm access grant') t.equal(code, 0, 'exited with Error') t.end() } ) }) test('npm access ls-packages with no team', function (t) { var serverPackages = { '@foo/bar': 'write', '@foo/util': 'read' } var clientPackages = { '@foo/bar': 'read-write', '@foo/util': 'read-only' } server.get( '/-/org/username/package?format=cli' ).reply(200, serverPackages) common.npm( [ 'access', 'ls-packages', '--registry', common.registry ], { cwd: pkg }, function (er, code, stdout, stderr) { t.ifError(er, 'npm access ls-packages') t.same(JSON.parse(stdout), clientPackages) t.end() } ) }) test('npm access ls-packages on team', function (t) { var serverPackages = { '@foo/bar': 'write', '@foo/util': 'read' } var clientPackages = { '@foo/bar': 'read-write', '@foo/util': 'read-only' } server.get( '/-/team/myorg/myteam/package?format=cli' ).reply(200, serverPackages) common.npm( [ 'access', 'ls-packages', 'myorg:myteam', '--registry', common.registry ], { cwd: pkg }, function (er, code, stdout, stderr) { t.ifError(er, 'npm access ls-packages') t.same(JSON.parse(stdout), clientPackages) t.end() } ) }) test('npm access ls-packages on org', function (t) { var serverPackages = { '@foo/bar': 'write', '@foo/util': 'read' } var clientPackages = { '@foo/bar': 'read-write', '@foo/util': 'read-only' } server.get( '/-/org/myorg/package?format=cli' ).reply(200, serverPackages) common.npm( [ 'access', 'ls-packages', 'myorg', '--registry', common.registry ], { cwd: pkg }, function (er, code, stdout, stderr) { t.ifError(er, 'npm access ls-packages') t.same(JSON.parse(stdout), clientPackages) t.end() } ) }) test('npm access ls-packages on user', function (t) { var serverPackages = { '@foo/bar': 'write', '@foo/util': 'read' } var clientPackages = { '@foo/bar': 'read-write', '@foo/util': 'read-only' } server.get( '/-/org/myorg/package?format=cli' ).reply(404, {error: 'nope'}) server.get( '/-/user/myorg/package?format=cli' ).reply(200, serverPackages) common.npm( [ 'access', 'ls-packages', 'myorg', '--registry', common.registry ], { cwd: pkg }, function (er, code, stdout, stderr) { t.ifError(er, 'npm access ls-packages') t.same(JSON.parse(stdout), clientPackages) t.end() } ) }) test('npm access ls-packages with no package specified or package.json', function (t) { // need to simulate a missing package.json var missing = path.join(__dirname, 'access-missing-guard') mkdirp.sync(path.join(missing, 'node_modules')) var serverPackages = { '@foo/bar': 'write', '@foo/util': 'read' } var clientPackages = { '@foo/bar': 'read-write', '@foo/util': 'read-only' } server.get( '/-/org/myorg/package?format=cli' ).reply(404, {error: 'nope'}) server.get( '/-/user/myorg/package?format=cli' ).reply(200, serverPackages) common.npm( [ 'access', 'ls-packages', 'myorg', '--registry', common.registry ], { cwd: missing }, function (er, code, stdout, stderr) { t.ifError(er, 'npm access ls-packages') t.same(JSON.parse(stdout), clientPackages) rimraf.sync(missing) t.end() } ) }) test('npm access ls-collaborators on current', function (t) { var serverCollaborators = { 'myorg:myteam': 'write', 'myorg:anotherteam': 'read' } var clientCollaborators = { 'myorg:myteam': 'read-write', 'myorg:anotherteam': 'read-only' } server.get( '/-/package/%40scoped%2Fpkg/collaborators?format=cli' ).reply(200, serverCollaborators) common.npm( [ 'access', 'ls-collaborators', '--registry', common.registry ], { cwd: pkg }, function (er, code, stdout, stderr) { t.ifError(er, 'npm access ls-collaborators') t.same(JSON.parse(stdout), clientCollaborators) t.end() } ) }) test('npm access ls-collaborators on package', function (t) { var serverCollaborators = { 'myorg:myteam': 'write', 'myorg:anotherteam': 'read' } var clientCollaborators = { 'myorg:myteam': 'read-write', 'myorg:anotherteam': 'read-only' } server.get( '/-/package/%40scoped%2Fanother/collaborators?format=cli' ).reply(200, serverCollaborators) common.npm( [ 'access', 'ls-collaborators', '@scoped/another', '--registry', common.registry ], { cwd: pkg }, function (er, code, stdout, stderr) { t.ifError(er, 'npm access ls-collaborators') t.same(JSON.parse(stdout), clientCollaborators) t.end() } ) }) test('npm access ls-collaborators on current w/user filter', function (t) { var serverCollaborators = { 'myorg:myteam': 'write', 'myorg:anotherteam': 'read' } var clientCollaborators = { 'myorg:myteam': 'read-write', 'myorg:anotherteam': 'read-only' } server.get( '/-/package/%40scoped%2Fanother/collaborators?format=cli&user=zkat' ).reply(200, serverCollaborators) common.npm( [ 'access', 'ls-collaborators', '@scoped/another', 'zkat', '--registry', common.registry ], { cwd: pkg }, function (er, code, stdout, stderr) { t.ifError(er, 'npm access ls-collaborators') t.same(JSON.parse(stdout), clientCollaborators) t.end() } ) }) test('npm access edit', function (t) { common.npm( [ 'access', 'edit', '@scoped/another', '--registry', common.registry ], { cwd: pkg }, function (er, code, stdout, stderr) { t.ok(code, 'exited with Error') t.match(stderr, /edit subcommand is not implemented yet/) t.end() } ) }) test('npm access blerg', function (t) { common.npm( [ 'access', 'blerg', '@scoped/another', '--registry', common.registry ], { cwd: pkg }, function (er, code, stdout, stderr) { t.ok(code, 'exited with Error') t.matches(stderr, /Usage:/) t.end() } ) }) test('cleanup', function (t) { t.pass('cleaned up') rimraf.sync(pkg) server.done() server.close() t.end() })