Files
pnpm/workspace/injected-deps-syncer/test/extendFilesMap.test.ts
Zoltan Kochan 5d5818e44f style: enforce node: protocol for builtin imports (#10951)
Add n/prefer-node-protocol rule and autofix all bare builtin imports
to use the node: prefix. Simplify the simple-import-sort builtins
pattern to just ^node: since all imports now use the prefix.
2026-03-13 07:59:51 +01:00

103 lines
2.6 KiB
TypeScript

import fs from 'node:fs'
import path from 'node:path'
import { jest } from '@jest/globals'
import { prepareEmpty } from '@pnpm/prepare'
import { DIR, extendFilesMap, type ExtendFilesMapStats, type InodeMap } from '../src/DirPatcher.js'
const originalStat = fs.promises.stat
function mockFsPromiseStat (): jest.Mock {
const mockedMethod = jest.fn(fs.promises.stat)
fs.promises.stat = mockedMethod as typeof fs.promises.stat
return mockedMethod as jest.Mock
}
afterEach(() => {
jest.restoreAllMocks()
fs.promises.stat = originalStat
})
test('without provided stats', async () => {
prepareEmpty()
const filePaths = [
'deep/a/b/c/d/e/f.txt',
'foo/foo.txt',
'foo/bar.txt',
'foo_bar.txt',
]
const filesMap = new Map<string, string>()
for (const filePath of filePaths) {
filesMap.set(filePath, path.resolve(filePath))
fs.mkdirSync(path.dirname(filePath), { recursive: true })
fs.writeFileSync(filePath, '')
}
const statMethod = mockFsPromiseStat()
expect(await extendFilesMap({ filesMap })).toStrictEqual({
'.': DIR,
deep: DIR,
'deep/a': DIR,
'deep/a/b': DIR,
'deep/a/b/c': DIR,
'deep/a/b/c/d': DIR,
'deep/a/b/c/d/e': DIR,
'deep/a/b/c/d/e/f.txt': fs.statSync('deep/a/b/c/d/e/f.txt').ino,
foo: DIR,
'foo/foo.txt': fs.statSync('foo/foo.txt').ino,
'foo/bar.txt': fs.statSync('foo/bar.txt').ino,
'foo_bar.txt': fs.statSync('foo_bar.txt').ino,
} as InodeMap)
for (const filePath of filePaths) {
expect(statMethod).toHaveBeenCalledWith(filesMap.get(filePath))
}
})
test('with provided stats', async () => {
prepareEmpty()
const startingIno = 7000
const inoIncrement = 100
const filePaths = [
'deep/a/b/c/d/e/f.txt',
'foo/foo.txt',
'foo/bar.txt',
'foo_bar.txt',
]
const filesMap = new Map<string, string>()
const filesStats: Record<string, ExtendFilesMapStats> = {}
let ino = startingIno
for (const filePath of filePaths) {
filesMap.set(filePath, path.resolve(filePath))
filesStats[filePath] = {
ino,
isDirectory: () => false,
isFile: () => true,
}
ino += inoIncrement
}
const statMethod = mockFsPromiseStat()
expect(await extendFilesMap({ filesMap, filesStats })).toStrictEqual({
'.': DIR,
deep: DIR,
'deep/a': DIR,
'deep/a/b': DIR,
'deep/a/b/c': DIR,
'deep/a/b/c/d': DIR,
'deep/a/b/c/d/e': DIR,
'deep/a/b/c/d/e/f.txt': startingIno,
foo: DIR,
'foo/foo.txt': startingIno + inoIncrement,
'foo/bar.txt': startingIno + 2 * inoIncrement,
'foo_bar.txt': startingIno + 3 * inoIncrement,
} as InodeMap)
expect(statMethod).not.toHaveBeenCalled()
})