nodejs/deps/npm/test/lib/commands/uninstall.js
npm CLI robot 063afa85fe
deps: upgrade npm to 10.8.1
PR-URL: https://github.com/nodejs/node/pull/53207
Reviewed-By: Richard Lau <rlau@redhat.com>
Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com>
Reviewed-By: Mohammed Keyvanzadeh <mohammadkeyvanzade94@gmail.com>
2024-05-30 11:21:05 +00:00

203 lines
4.4 KiB
JavaScript

const t = require('tap')
const fs = require('node:fs')
const { resolve } = require('node:path')
const _mockNpm = require('../../fixtures/mock-npm')
const mockNpm = async (t, opts = {}) => {
const res = await _mockNpm(t, {
...opts,
mocks: {
...opts.mocks,
'{LIB}/utils/reify-finish.js': async () => {},
},
})
return {
...res,
uninstall: (args) => res.npm.exec('uninstall', args),
}
}
t.test('remove single installed lib', async t => {
const { uninstall, prefix } = await mockNpm(t, {
prefixDir: {
'package.json': JSON.stringify({
name: 'test-rm-single-lib',
version: '1.0.0',
dependencies: {
a: '*',
b: '*',
},
}),
node_modules: {
a: {
'package.json': JSON.stringify({
name: 'a',
version: '1.0.0',
}),
},
b: {
'package.json': JSON.stringify({
name: 'b',
version: '1.0.0',
}),
},
},
'package-lock.json': JSON.stringify({
name: 'test-rm-single-lib',
version: '1.0.0',
lockfileVersion: 2,
requires: true,
packages: {
'': {
name: 'test-rm-single-lib',
version: '1.0.0',
dependencies: {
a: '*',
},
},
'node_modules/a': {
version: '1.0.0',
},
'node_modules/b': {
version: '1.0.0',
},
},
dependencies: {
a: {
version: '1.0.0',
},
b: {
version: '1.0.0',
},
},
}),
},
})
const b = resolve(prefix, 'node_modules/b')
t.ok(fs.statSync(b))
await uninstall(['b'])
t.throws(() => fs.statSync(b), 'should have removed package from npm')
})
t.test('remove multiple installed libs', async t => {
const { uninstall, prefix } = await mockNpm(t, {
prefixDir: {
node_modules: {
a: {
'package.json': JSON.stringify({
name: 'a',
version: '1.0.0',
}),
},
b: {
'package.json': JSON.stringify({
name: 'b',
version: '1.0.0',
}),
},
},
'package-lock.json': JSON.stringify({
name: 'test-rm-single-lib',
version: '1.0.0',
lockfileVersion: 2,
requires: true,
packages: {
'': {
name: 'test-rm-single-lib',
version: '1.0.0',
dependencies: {
a: '*',
},
},
'node_modules/a': {
version: '1.0.0',
},
'node_modules/b': {
version: '1.0.0',
},
},
dependencies: {
a: {
version: '1.0.0',
},
b: {
version: '1.0.0',
},
},
}),
},
})
const a = resolve(prefix, 'node_modules/a')
const b = resolve(prefix, 'node_modules/b')
t.ok(fs.statSync(a))
t.ok(fs.statSync(b))
await uninstall(['b'])
t.throws(() => fs.statSync(a), 'should have removed a package from nm')
t.throws(() => fs.statSync(b), 'should have removed b package from nm')
})
t.test('no args local', async t => {
const { uninstall } = await mockNpm(t)
await t.rejects(
uninstall([]),
/Must provide a package name to remove/,
'should throw package name required error'
)
})
t.test('no args global', async t => {
const { uninstall, npm } = await mockNpm(t, {
prefixDir: {
'package.json': JSON.stringify({
name: 'a',
version: '1.0.0',
}),
},
globalPrefixDir: {
node_modules: {
a: t.fixture('symlink', '../../prefix'),
},
},
config: { global: true },
})
const a = resolve(npm.globalDir, 'a')
t.ok(fs.statSync(a))
await uninstall([])
t.throws(() => fs.statSync(a), 'should have removed global nm symlink')
})
t.test('no args global but no package.json', async t => {
const { uninstall } = await mockNpm(t, {
config: { global: true },
})
await t.rejects(
uninstall([]),
/npm uninstall/
)
})
t.test('non ENOENT error reading from localPrefix package.json', async t => {
const { uninstall } = await mockNpm(t, {
config: { global: true },
prefixDir: { 'package.json': 'not[json]' },
})
await t.rejects(
uninstall([]),
{ code: 'EJSONPARSE' },
'should throw non ENOENT error'
)
})