diff options
author | nlf <quitlahok@gmail.com> | 2020-11-04 22:33:14 +0300 |
---|---|---|
committer | isaacs <i@izs.me> | 2020-11-06 22:46:26 +0300 |
commit | 7046fe10c5035ac57246a31ca8a6b09e3f5562bf (patch) | |
tree | 4cb9ef59d3f89ec0c88e47412f5a09703d65ac18 /test/lib/cache.js | |
parent | f0efe96c3bd8a025473de3f5d2cd3c237cf4198c (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.js | 232 |
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() +}) |