Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: add lib/update.js tests #2275

Merged
merged 1 commit into from Dec 4, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 4 additions & 1 deletion 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')
Expand Down
162 changes: 162 additions & 0 deletions 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=<number>', 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
})
})