From bc655b17e841eabc67a66c236dfb0aa9ca0317f1 Mon Sep 17 00:00:00 2001 From: Ruy Adorno Date: Tue, 1 Dec 2020 17:52:35 -0500 Subject: [PATCH] test: add lib/update.js tests Fixes: https://github.com/npm/statusboard/issues/181 PR-URL: https://github.com/npm/cli/pull/2275 Credit: @ruyadorno Close: #2275 Reviewed-by: @nlf --- lib/update.js | 5 +- test/lib/update.js | 162 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 test/lib/update.js diff --git a/lib/update.js b/lib/update.js index 0a786e30f312e..dd6b0d09ffa83 100644 --- a/lib/update.js +++ b/lib/update.js @@ -1,7 +1,10 @@ +'use strict' + const path = require('path') -const Arborist = require('@npmcli/arborist') +const Arborist = require('@npmcli/arborist') const log = require('npmlog') + const npm = require('./npm.js') const usageUtil = require('./utils/usage.js') const reifyFinish = require('./utils/reify-finish.js') diff --git a/test/lib/update.js b/test/lib/update.js new file mode 100644 index 0000000000000..993fbbab563c5 --- /dev/null +++ b/test/lib/update.js @@ -0,0 +1,162 @@ +const { resolve } = require('path') +const t = require('tap') +const requireInject = require('require-inject') + +const noop = () => null +const npm = { + globalDir: '', + flatOptions: { + depth: 0, + global: false, + }, + prefix: '', +} +const mocks = { + npmlog: { warn () {} }, + '@npmcli/arborist': class { + reify () {} + }, + '../../lib/npm.js': npm, + '../../lib/utils/reify-finish.js': noop, + '../../lib/utils/usage.js': () => 'usage instructions', +} + +t.afterEach(cb => { + npm.prefix = '' + npm.flatOptions.global = false + npm.globalDir = '' + cb() +}) + +t.test('no args', t => { + t.plan(3) + + npm.prefix = '/project/a' + + class Arborist { + constructor (args) { + t.deepEqual( + args, + { ...npm.flatOptions, path: npm.prefix }, + 'should call arborist contructor with expected args' + ) + } + + reify ({ update }) { + t.equal(update, true, 'should update all deps') + } + } + + const update = requireInject('../../lib/update.js', { + ...mocks, + '../../lib/utils/reify-finish.js': (arb) => { + t.isLike(arb, Arborist, 'should reify-finish with arborist instance') + }, + '@npmcli/arborist': Arborist, + }) + + update([], err => { + if (err) + throw err + }) +}) + +t.test('with args', t => { + t.plan(3) + + npm.prefix = '/project/a' + + class Arborist { + constructor (args) { + t.deepEqual( + args, + { ...npm.flatOptions, path: npm.prefix }, + 'should call arborist contructor with expected args' + ) + } + + reify ({ update }) { + t.deepEqual(update, ['ipt'], 'should update listed deps') + } + } + + const update = requireInject('../../lib/update.js', { + ...mocks, + '../../lib/utils/reify-finish.js': (arb) => { + t.isLike(arb, Arborist, 'should reify-finish with arborist instance') + }, + '@npmcli/arborist': Arborist, + }) + + update(['ipt'], err => { + if (err) + throw err + }) +}) + +t.test('update --depth=', t => { + t.plan(2) + + npm.prefix = '/project/a' + npm.flatOptions.depth = 1 + + const update = requireInject('../../lib/update.js', { + ...mocks, + npmlog: { + warn: (title, msg) => { + t.equal(title, 'update', 'should print expected title') + t.match( + msg, + /The --depth option no longer has any effect/, + 'should print expected warning message' + ) + }, + }, + }) + + update([], err => { + if (err) + throw err + }) +}) + +t.test('update --global', t => { + t.plan(2) + + const normalizePath = p => p.replace(/\\+/g, '/') + const redactCwd = (path) => normalizePath(path) + .replace(new RegExp(normalizePath(process.cwd()), 'g'), '{CWD}') + + npm.prefix = '/project/a' + npm.globalDir = resolve(process.cwd(), 'global/lib/node_modules') + npm.flatOptions.global = true + + class Arborist { + constructor (args) { + const { path, ...opts } = args + t.deepEqual( + opts, + npm.flatOptions, + 'should call arborist contructor with expected options' + ) + + t.equal( + redactCwd(path), + '{CWD}/global/lib', + 'should run with expected prefix' + ) + } + + reify () {} + } + + const update = requireInject('../../lib/update.js', { + ...mocks, + '@npmcli/arborist': Arborist, + }) + + update([], err => { + if (err) + throw err + }) +})