Skip to content

Commit

Permalink
tests and bugfixes for RegistryFetcher
Browse files Browse the repository at this point in the history
  • Loading branch information
isaacs committed Oct 29, 2019
1 parent 02138eb commit 7fa3c69
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 1 deletion.
6 changes: 5 additions & 1 deletion lib/registry.js
Expand Up @@ -19,6 +19,10 @@ const _headers = Symbol('_headers')
class RegistryFetcher extends Fetcher {
constructor (spec, opts) {
super(spec, opts)

// try to use corgis if available
this.fullMetadata = !!opts.fullMetadata

// handle case when npm-package-arg guesses wrong.
if (this.spec.type === 'tag' &&
this.spec.rawSpec === '' &&
Expand Down Expand Up @@ -59,7 +63,7 @@ class RegistryFetcher extends Fetcher {
'pacote-version': pacoteVersion,
'pacote-req-type': 'packument',
'pacote-pkg-id': `registry:${this.spec.name}`,
accept: this.opts.fullMetadata ? fullDoc : corgiDoc,
accept: this.fullMetadata ? fullDoc : corgiDoc,
}
}

Expand Down
115 changes: 115 additions & 0 deletions test/registry.js
@@ -1 +1,116 @@
const RegistryFetcher = require('../lib/registry.js')
const t = require('tap')
const mr = require('npm-registry-mock')
const port = 18000 + (+process.env.TAP_CHILD_ID || 0)
const mkdirp = require('mkdirp')
const rimraf = require('rimraf')
const {resolve, basename} = require('path')
const me = resolve(__dirname, basename(__filename, '.js'))
rimraf.sync(me)
mkdirp.sync(me)
t.teardown(() => rimraf.sync(me))

t.test('start mock registry', { bail: true }, t => {
mr({
port,
mocks: {
get: {
'/no-integrity/-/no-integrity-1.2.3.tgz': [
200,
`${__dirname}/fixtures/abbrev-1.1.1.tgz`
]
}
},

plugin (server) {
server.get('/thing-is-not-here').many().reply(404, { error: 'not found' })
server.get('/no-tarball').many().reply(200, {
name: 'no-tarball',
'dist-tags': { latest: '1.2.3' },
versions: {
'1.2.3': {
name: 'no-tarball',
version: '1.2.3',
},
},
})
server.get('/no-integrity').many().reply(200, {
name: 'no-integrity',
'dist-tags': { latest: '1.2.3' },
versions: {
'1.2.3': {
name: 'no-integrity',
version: '1.2.3',
dist: {
tarball: `${registry}no-integrity/-/no-integrity-1.2.3.tgz`
}
},
},
})
}
}, (er, s) => {
if (er)
throw er

t.parent.teardown(() => s.close())
t.end()
})
})

const registry = `http://localhost:${port}/`
const cache = me + '/cache'

t.test('underscore, no tag or version', t => {
const f = new RegistryFetcher('underscore', {registry, cache})

return f.resolve().then(r => t.equal(r, `${registry}underscore/-/underscore-1.5.1.tgz`))
.then(() => f.manifest()).then(m => t.match(m, { version: '1.5.1' }))
.then(() => f.extract(me + '/underscore'))
.then(result => t.deepEqual(result, {
resolved: `${registry}underscore/-/underscore-1.5.1.tgz`,
integrity: 'sha1-0r3oF9F2/63olKtxRY5oKhS4bck=',
}))
})

t.test('scoped, no tag or version', t => {
const f = new RegistryFetcher('@isaacs/namespace-test', {registry, cache})

return f.resolve().then(r => t.equal(r, `${registry}@isaacs/namespace-test/-/namespace-test-1.0.0.tgz`))
.then(() => f.manifest()).then(m => t.match(m, { version: '1.0.0' }))
.then(() => f.extract(me + '/namespace-test'))
.then(result => t.deepEqual(result, {
resolved: `${registry}@isaacs/namespace-test/-/namespace-test-1.0.0.tgz`,
integrity: 'sha512-5ZYe1LgwHIaag0p9loMwsf5N/wJ4XAuHVNhSO+qulQOXWnyJVuco6IZjo+5u4ZLF/GimdHJcX+QK892ONfOCqQ==',
}))
})

t.test('404 fails with E404', t => {
const f = new RegistryFetcher('thing-is-not-here', {registry, cache})
return t.rejects(f.resolve(), { code: 'E404' }).then(() =>
t.equal(f.fullMetadata, true, 'tried again with got full metadata'))
})

t.test('respect default tag', async t => {
const f = new RegistryFetcher('underscore', {registry, cache, tag: 'stable'})
t.equal(f.spec.raw, 'underscore@stable')
t.equal(await f.resolve(), `${registry}underscore/-/underscore-1.5.1.tgz`)
})

t.test('fail resolution if no dist.tarball', t => {
const f = new RegistryFetcher('no-tarball', {registry, cache})
return t.rejects(f.resolve(), {
message: 'Invalid package manifest: no `dist.tarball` field',
package: 'no-tarball',
})
})

t.test('a manifest that lacks integrity', t => {
const f = new RegistryFetcher('no-integrity', {registry, cache})
return f.manifest().then(mani => {
t.notOk(mani._integrity, 'should have no integrity')
return f.extract(me + '/no-integrity')
}).then(result => t.deepEqual(result, {
resolved: `${registry}no-integrity/-/no-integrity-1.2.3.tgz`,
integrity: 'sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=='
}, 'calculated integrity anyway'))
})

0 comments on commit 7fa3c69

Please sign in to comment.