Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornlf <quitlahok@gmail.com>2020-11-04 22:33:14 +0300
committerisaacs <i@izs.me>2020-11-06 22:46:26 +0300
commit7046fe10c5035ac57246a31ca8a6b09e3f5562bf (patch)
tree4cb9ef59d3f89ec0c88e47412f5a09703d65ac18 /test/lib/cache.js
parentf0efe96c3bd8a025473de3f5d2cd3c237cf4198c (diff)
tests for `npm cache` command, and 2 tiny bugfixes
* Attach EUSAGE code to usage errors * add verify to completions PR-URL: https://github.com/npm/cli/pull/2122 Credit: @nlf Close: #2122 Reviewed-by: @isaacs
Diffstat (limited to 'test/lib/cache.js')
-rw-r--r--test/lib/cache.js232
1 files changed, 232 insertions, 0 deletions
diff --git a/test/lib/cache.js b/test/lib/cache.js
new file mode 100644
index 000000000..9c27386ed
--- /dev/null
+++ b/test/lib/cache.js
@@ -0,0 +1,232 @@
+const t = require('tap')
+const requireInject = require('require-inject')
+const path = require('path')
+
+const usageUtil = () => 'usage instructions'
+
+const flatOptions = {
+ force: false
+}
+
+const npm = {
+ flatOptions,
+ cache: '/fake/path'
+}
+
+let rimrafPath = ''
+const rimraf = (path, cb) => {
+ rimrafPath = path
+ return cb()
+}
+
+let logOutput = []
+const npmlog = {
+ silly: (...args) => {
+ logOutput.push(['silly', ...args])
+ }
+}
+
+let tarballStreamSpec = ''
+let tarballStreamOpts = {}
+const pacote = {
+ tarball: {
+ stream: (spec, cb, opts) => {
+ tarballStreamSpec = spec
+ tarballStreamOpts = opts
+ return cb({
+ resume: () => {},
+ promise: () => Promise.resolve()
+ })
+ }
+ }
+}
+
+let outputOutput = []
+const output = (msg) => {
+ outputOutput.push(msg)
+}
+
+let cacacheVerifyPath = ''
+const cacacheVerifyStats = {
+ keptSize: 100,
+ verifiedContent: 1,
+ totalEntries: 1,
+ runTime: { total: 2000 }
+}
+const cacache = {
+ verify: (path) => {
+ cacacheVerifyPath = path
+ return cacacheVerifyStats
+ }
+}
+
+const mocks = {
+ cacache,
+ npmlog,
+ pacote,
+ rimraf,
+ '../../lib/npm.js': npm,
+ '../../lib/utils/output.js': output,
+ '../../lib/utils/usage.js': usageUtil
+}
+
+const cache = requireInject('../../lib/cache.js', mocks)
+
+t.test('cache no args', t => {
+ cache([], err => {
+ t.equal(err.message, 'usage instructions', 'should throw usage instructions')
+ t.end()
+ })
+})
+
+t.test('cache clean', t => {
+ cache(['clean'], err => {
+ t.match(err.message, 'the npm cache self-heals', 'should throw warning')
+ t.end()
+ })
+})
+
+t.test('cache clean (force)', t => {
+ flatOptions.force = true
+ t.teardown(() => {
+ rimrafPath = ''
+ flatOptions.force = false
+ })
+
+ cache(['clear'], err => {
+ t.ifError(err)
+ t.equal(rimrafPath, path.join(npm.cache, '_cacache'))
+ t.end()
+ })
+})
+
+t.test('cache clean with arg', t => {
+ cache(['rm', 'pkg'], err => {
+ t.match(err.message, 'does not accept arguments', 'should throw error')
+ t.end()
+ })
+})
+
+t.test('cache add no arg', t => {
+ t.teardown(() => {
+ logOutput = []
+ })
+
+ cache(['add'], err => {
+ t.strictSame(logOutput, [
+ ['silly', 'cache add', 'args', []],
+ ], 'logs correctly')
+ t.equal(err.code, 'EUSAGE', 'throws usage error')
+ t.end()
+ })
+})
+
+t.test('cache add pkg only', t => {
+ t.teardown(() => {
+ logOutput = []
+ tarballStreamSpec = ''
+ tarballStreamOpts = {}
+ })
+
+ cache(['add', 'mypkg'], err => {
+ t.ifError(err)
+ t.strictSame(logOutput, [
+ ['silly', 'cache add', 'args', ['mypkg']],
+ ['silly', 'cache add', 'spec', 'mypkg']
+ ], 'logs correctly')
+ t.equal(tarballStreamSpec, 'mypkg', 'passes the correct spec to pacote')
+ t.same(tarballStreamOpts, flatOptions, 'passes the correct options to pacote')
+ t.end()
+ })
+})
+
+t.test('cache add pkg w/ spec modifier', t => {
+ t.teardown(() => {
+ logOutput = []
+ tarballStreamSpec = ''
+ tarballStreamOpts = {}
+ })
+
+ cache(['add', 'mypkg', 'latest'], err => {
+ t.ifError(err)
+ t.strictSame(logOutput, [
+ ['silly', 'cache add', 'args', ['mypkg', 'latest']],
+ ['silly', 'cache add', 'spec', 'mypkg@latest']
+ ], 'logs correctly')
+ t.equal(tarballStreamSpec, 'mypkg@latest', 'passes the correct spec to pacote')
+ t.same(tarballStreamOpts, flatOptions, 'passes the correct options to pacote')
+ t.end()
+ })
+})
+
+t.test('cache verify', t => {
+ t.teardown(() => {
+ outputOutput = []
+ cacacheVerifyPath = ''
+ })
+
+ cache(['verify'], err => {
+ t.ifError(err)
+ t.match(outputOutput, [
+ `Cache verified and compressed (${path.join(npm.cache, '_cacache')})`,
+ 'Content verified: 1 (100 bytes)',
+ 'Index entries: 1',
+ 'Finished in 2s'
+ ], 'prints correct output')
+ t.end()
+ })
+})
+
+t.test('cache verify w/ extra output', t => {
+ npm.cache = `${process.env.HOME}/fake/path`
+ cacacheVerifyStats.badContentCount = 1
+ cacacheVerifyStats.reclaimedCount = 2
+ cacacheVerifyStats.reclaimedSize = 200
+ cacacheVerifyStats.missingContent = 3
+ t.teardown(() => {
+ npm.cache = '/fake/path'
+ outputOutput = []
+ cacacheVerifyPath = ''
+ delete cacacheVerifyStats.badContentCount
+ delete cacacheVerifyStats.reclaimedCount
+ delete cacacheVerifyStats.reclaimedSize
+ delete cacacheVerifyStats.missingContent
+ })
+
+ cache(['check'], err => {
+ t.ifError(err)
+ t.match(outputOutput, [
+ `Cache verified and compressed (~${path.join('/fake/path', '_cacache')})`,
+ 'Content verified: 1 (100 bytes)',
+ 'Corrupted content removed: 1',
+ 'Content garbage-collected: 2 (200 bytes)',
+ 'Missing content: 3',
+ 'Index entries: 1',
+ 'Finished in 2s'
+ ], 'prints correct output')
+ t.end()
+ })
+})
+
+t.test('cache completion', t => {
+ const { completion } = cache
+
+ const testComp = (argv, expect) => {
+ completion({ conf: { argv: { remain: argv } } }, (err, res) => {
+ t.ifError(err)
+ t.strictSame(res, expect, argv.join(' '))
+ })
+ }
+
+ testComp(['npm', 'cache'], [
+ 'add',
+ 'clean',
+ 'verify'
+ ])
+
+ testComp(['npm', 'cache', 'add'], [])
+ testComp(['npm', 'cache', 'clean'], [])
+ testComp(['npm', 'cache', 'verify'], [])
+
+ t.end()
+})