npmc
Version:
a package manager for JavaScript
175 lines (157 loc) • 4.5 kB
JavaScript
const BB = require('bluebird')
const common = require('../common-tap')
const fs = require('fs')
const mkdirp = require('mkdirp')
const mr = BB.promisify(require('npm-registry-mock'))
const path = require('path')
const rimraf = require('rimraf')
const test = require('tap').test
const testDir = path.join(__dirname, 'publish_test_package')
function setup () {
cleanup()
mkdirp.sync(path.join(testDir, 'cache'))
fs.writeFileSync(
path.join(testDir, 'package.json'),
JSON.stringify({
name: 'publish-organized',
version: '1.2.5'
}, null, 2),
'utf8'
)
fs.writeFileSync(
path.join(testDir, 'index.js'),
'hello',
'utf8'
)
}
let port = common.port
function withServer (cb) {
return mr({port: port++, throwOnUnmatched: true})
.tap(cb)
.then((server) => {
server.done()
return server.close()
})
}
test('basic npm publish', (t) => {
setup()
return withServer((server) => {
server.filteringRequestBody(verify)
.put('/publish-organized', true)
.reply(201, {ok: true})
return common.npm([
'publish',
'--no-color',
'--cache', path.join(testDir, 'cache'),
'--registry=' + common.registry.replace(common.port, server.port),
`--//localhost:${server.port}/:username=username`,
`--//localhost:${server.port}/:_password=` + Buffer.from('password').toString('base64'),
`--//localhost:${server.port}/:email=` + 'ogd@aoaioxxysz.net'
], {'cwd': testDir})
.spread((code, stdout, stderr) => {
t.comment(stdout)
t.comment(stderr)
t.is(code, 0, 'published without error')
})
function verify (body) {
t.doesNotThrow(() => {
const parsed = JSON.parse(body)
const current = parsed.versions['1.2.5']
t.equal(
current._npmVersion,
require(path.resolve(__dirname, '../../package.json')).version,
'npm version is correct'
)
t.equal(
current._nodeVersion,
process.versions.node,
'node version is correct'
)
}, 'converted body back into object')
return true
}
})
})
test('npm publish --dry-run', (t) => {
setup()
return common.npm([
'publish',
'--dry-run',
'--registry=https://example.registry/fake',
'--cache', path.join(testDir, 'cache'),
'--loglevel=notice',
'--no-color'
], {'cwd': testDir})
.spread((code, stdout, stderr) => {
t.comment(stdout)
t.comment(stderr)
t.is(code, 0, 'published without error')
t.match(stderr, /notice\s+\d+[a-z]+\s+package\.json/gi, 'mentions package.json')
t.match(stderr, /notice\s+\d+[a-z]+\s+index\.js/gi, 'mentions index.js')
})
})
test('npm publish --json', (t) => {
setup()
return withServer((server) => {
server.filteringRequestBody(() => true)
.put('/publish-organized', true)
.reply(201, {ok: true})
return common.npm([
'publish',
'--json',
'--registry', common.registry.replace(common.port, server.port),
'--cache', path.join(testDir, 'cache')
], {'cwd': testDir})
.spread((code, stdout, stderr) => {
t.comment(stdout)
t.comment(stderr)
t.is(code, 0, 'published without error')
t.similar(JSON.parse(stdout), {
name: 'publish-organized',
version: '1.2.5',
files: [
{path: 'package.json'},
{path: 'index.js'}
],
entryCount: 2
}, 'JSON output reflects package contents')
t.equal(stderr.trim(), '', 'nothing on stderr')
})
})
})
test('npm publish --dry-run --json', (t) => {
setup()
return common.npm([
'publish',
'--dry-run',
'--json',
'--registry=https://example.registry/fake',
'--cache', path.join(testDir, 'cache'),
'--loglevel=notice',
'--no-color'
], {'cwd': testDir})
.spread((code, stdout, stderr) => {
t.comment(stdout)
t.comment(stderr)
t.is(code, 0, 'published without error')
t.similar(JSON.parse(stdout), {
name: 'publish-organized',
version: '1.2.5',
files: [
{path: 'package.json'},
{path: 'index.js'}
],
entryCount: 2
}, 'JSON output reflects package contents')
t.equal(stderr.trim(), '', 'nothing on stderr')
})
})
test('cleanup', (t) => {
cleanup()
t.end()
})
function cleanup () {
process.chdir(__dirname)
rimraf.sync(testDir)
}