blob: 41d2c93607ea5fa77c282b8c7ff70a2922cc76f3 [file] [log] [blame]
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()
})