Files
pnpm/pkg-manager/core/test/hoistedNodeLinker/uninstall.ts
Zoltan Kochan 5979bb7b0c test: replace sinon with built-in jest spying across the repo (#10849)
Replace all sinon.spy/match/withArgs usage with jest.fn, toHaveBeenCalledWith,
mockClear, and mock.calls filtering. Remove sinon and @types/sinon from all
package.json files and the workspace catalog.
2026-03-04 15:00:25 +01:00

111 lines
3.1 KiB
TypeScript

import {
type PackageManifestLog,
type StatsLog,
} from '@pnpm/core-loggers'
import { prepareEmpty } from '@pnpm/prepare'
import {
addDependenciesToPackage,
mutateModulesInSingleProject,
} from '@pnpm/core'
import { type ProjectRootDir } from '@pnpm/types'
import { jest } from '@jest/globals'
import { testDefaults } from './../utils/index.js'
test('uninstall package with no dependencies', async () => {
const project = prepareEmpty()
let { updatedManifest: manifest } = await addDependenciesToPackage(
{},
['is-negative@2.1.0'],
testDefaults({ save: true, nodeLinker: 'hoisted' })
)
const reporter = jest.fn()
manifest = (await mutateModulesInSingleProject({
dependencyNames: ['is-negative'],
manifest,
mutation: 'uninstallSome',
rootDir: process.cwd() as ProjectRootDir,
}, testDefaults({ nodeLinker: 'hoisted', save: true, reporter }))).updatedProject.manifest
expect(reporter).toHaveBeenCalledWith(expect.objectContaining({
initial: {
dependencies: {
'is-negative': '2.1.0',
},
},
level: 'debug',
name: 'pnpm:package-manifest',
prefix: process.cwd(),
} as PackageManifestLog))
expect(reporter).toHaveBeenCalledWith(expect.objectContaining({
level: 'debug',
name: 'pnpm:stats',
prefix: process.cwd(),
removed: 1,
} as StatsLog))
/* This should be fixed
expect(reporter).toHaveBeenCalledWith(expect.objectContaining({
level: 'debug',
name: 'pnpm:root',
removed: {
dependencyType: 'prod',
name: 'is-negative',
version: '2.1.0',
},
} as RootLog))
*/
expect(reporter).toHaveBeenCalledWith(expect.objectContaining({
level: 'debug',
name: 'pnpm:package-manifest',
updated: {
dependencies: {},
},
} as PackageManifestLog))
// uninstall does not remove packages from store
// even if they become unreferenced
project.storeHas('is-negative', '2.1.0')
project.hasNot('is-negative')
expect(manifest.dependencies).toStrictEqual({})
})
test('uninstall package with dependencies and do not touch other deps', async () => {
const project = prepareEmpty()
let { updatedManifest: manifest } = await addDependenciesToPackage(
{},
['is-negative@2.1.0', 'camelcase-keys@3.0.0'],
testDefaults({ nodeLinker: 'hoisted', save: true })
)
manifest = (await mutateModulesInSingleProject({
dependencyNames: ['camelcase-keys'],
manifest,
mutation: 'uninstallSome',
rootDir: process.cwd() as ProjectRootDir,
}, testDefaults({ nodeLinker: 'hoisted', pruneStore: true, save: true }))).updatedProject.manifest
project.storeHasNot('camelcase-keys', '3.0.0')
project.hasNot('camelcase-keys')
project.storeHasNot('camelcase', '3.0.0')
project.hasNot('camelcase')
project.storeHasNot('map-obj', '1.0.1')
project.hasNot('map-obj')
project.storeHas('is-negative', '2.1.0')
project.has('is-negative')
expect(manifest.dependencies).toStrictEqual({ 'is-negative': '2.1.0' })
const lockfile = project.readLockfile()
expect(lockfile.importers['.'].dependencies).toStrictEqual({
'is-negative': {
specifier: '2.1.0',
version: '2.1.0',
},
})
})