-
Notifications
You must be signed in to change notification settings - Fork 28k
/
Copy pathrecursive-copy.test.ts
94 lines (78 loc) · 2.91 KB
/
recursive-copy.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/* eslint-env jest */
import { recursiveCopy } from 'next/dist/lib/recursive-copy'
import { join } from 'path'
import fs from 'fs-extra'
import { readFileSync } from 'fs'
const testDir = join(__dirname, 'recursive-folder-test')
const srcDir = join(testDir, 'src')
const destDir = join(testDir, 'dest')
const setupTestDir = async (numFiles = 100) => {
const paths = [
'.hidden',
'file',
'folder1/file1',
'folder1/file2',
'link',
'linkfolder',
]
await fs.ensureDir(testDir)
// create src directory structure
await fs.ensureDir(srcDir)
await fs.outputFile(join(srcDir, '.hidden'), 'hidden')
await fs.outputFile(join(srcDir, 'file'), 'file')
await fs.outputFile(join(srcDir, 'folder1', 'file1'), 'file1')
await fs.outputFile(join(srcDir, 'folder1', 'file2'), 'file2')
await fs.ensureSymlink(join(srcDir, 'file'), join(srcDir, 'link'))
await fs.ensureSymlink(join(srcDir, 'folder1'), join(srcDir, 'linkfolder'))
for (let i = 0; i < numFiles - 6; i++) {
const path = join(`folder-${i}`, `file-${i}`)
await fs.outputFile(join(srcDir, path), `file-${i}`)
paths.push(path)
}
return paths
}
describe('recursiveCopy', () => {
if (process.platform === 'win32') {
it('should skip on windows to avoid symlink issues', () => {})
return
}
afterAll(() => fs.remove(testDir))
it('should work', async () => {
await fs.remove(testDir)
await setupTestDir(6)
await recursiveCopy(srcDir, destDir, {
filter(path) {
return path !== '/folder1/file1'
},
})
expect(await fs.pathExists(join(destDir, '.hidden'))).toBe(true)
expect(await fs.pathExists(join(destDir, 'file'))).toBe(true)
expect(await fs.pathExists(join(destDir, 'link'))).toBe(true)
expect(await fs.pathExists(join(destDir, 'folder1', 'file1'))).toBe(false)
expect(await fs.pathExists(join(destDir, 'folder1', 'file2'))).toBe(true)
expect(await fs.pathExists(join(destDir, 'linkfolder', 'file1'))).toBe(true)
expect(await fs.pathExists(join(destDir, 'linkfolder', 'file2'))).toBe(true)
expect(readFileSync(join(destDir, 'file'), 'utf8')).toBe('file')
expect(readFileSync(join(destDir, 'link'), 'utf8')).toBe('file')
expect(readFileSync(join(destDir, 'linkfolder', 'file1'), 'utf8')).toBe(
'file1'
)
})
it('should work with content existing in dest', async () => {
await fs.remove(testDir)
const paths = await setupTestDir(25)
await recursiveCopy(srcDir, destDir)
await recursiveCopy(srcDir, destDir, { overwrite: true })
for (const path of paths) {
expect(await fs.pathExists(join(destDir, path))).toBe(true)
}
})
it('should handle more files than concurrency', async () => {
await fs.remove(testDir)
const paths = await setupTestDir(100)
await recursiveCopy(srcDir, destDir, { concurrency: 50 })
for (const path of paths) {
expect(await fs.pathExists(join(destDir, path))).toBe(true)
}
})
})