-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathnvm.test.js
More file actions
119 lines (97 loc) · 3.38 KB
/
nvm.test.js
File metadata and controls
119 lines (97 loc) · 3.38 KB
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import { execFile } from 'node:child_process'
import { createWriteStream } from 'node:fs'
import { readFile, unlink, writeFile } from 'node:fs/promises'
import { dirname, join } from 'node:path'
import { env, version as processVersion } from 'node:process'
import { pipeline } from 'node:stream/promises'
import { fileURLToPath } from 'node:url'
import { promisify } from 'node:util'
import test from 'ava'
import { got } from 'got'
import nodeVersionAlias from 'node-version-alias'
// eslint-disable-next-line import/max-dependencies
import { FULL_VERSION, UNKNOWN_ALIAS } from './helpers/versions.test.js'
const pExecFile = promisify(execFile)
const NVM_URL = 'https://raw.githubusercontent.com/nvm-sh/nvm/master/nvm.sh'
const NVM_DIR = dirname(fileURLToPath(import.meta.url))
const NVM_DIST = join(NVM_DIR, 'nvm.sh')
// eslint-disable-next-line fp/no-mutation
env.NVM_DIR = NVM_DIR
// We test `nvm` by downloading it locally. It is a Bash script and is not on
// `npm` so we need to download it.
const downloadNvm = async () => {
const response = await got.stream(NVM_URL)
const stream = createWriteStream(NVM_DIST)
await pipeline(response, stream)
await commentLine()
}
// `nvm.sh` last line executes `nvm use`. We need to comment it for tests.
const commentLine = async () => {
const content = await readFile(NVM_DIST, 'utf8')
const contentA = content.replace(COMMENTED_LINE, '# BODY')
await writeFile(NVM_DIST, contentA)
}
const COMMENTED_LINE = 'nvm_process_parameters "$@"'
const cleanupNvm = async () => {
await unlink(NVM_DIST)
}
test.before(downloadNvm)
test.after(cleanupNvm)
// Run `nvm` command in tests
const runNvmCommand = async (command) => {
const { stdout } = await pExecFile('bash', [
'-c',
`source "${NVM_DIST}" && ${command}`,
])
return stdout.trim()
}
test('Can use "system" alias', async (t) => {
const version = await nodeVersionAlias('system')
t.is(`v${version}`, processVersion)
})
test('Can use nvm custom aliases', async (t) => {
await runNvmCommand(`nvm alias a ${FULL_VERSION}`)
try {
const version = await nodeVersionAlias('a')
t.is(version, FULL_VERSION)
} finally {
await runNvmCommand('nvm unalias a')
}
})
test('Can use nvm custom aliases recursively', async (t) => {
await runNvmCommand(`nvm alias b ${FULL_VERSION} && nvm alias c b`)
try {
const version = await nodeVersionAlias('c')
t.is(version, FULL_VERSION)
} finally {
await runNvmCommand('nvm unalias c && nvm unalias b')
}
})
test('Validates unknown nvm custom alias', async (t) => {
await t.throwsAsync(nodeVersionAlias(UNKNOWN_ALIAS))
})
// Modifies environment variable so must be serial
test.serial('Require nvm to look for custom aliases', async (t) => {
await runNvmCommand(`nvm alias a ${FULL_VERSION}`)
// eslint-disable-next-line fp/no-delete
delete env.NVM_DIR
try {
await t.throwsAsync(nodeVersionAlias('a'))
} finally {
// eslint-disable-next-line require-atomic-updates, fp/no-mutation
env.NVM_DIR = NVM_DIR
await runNvmCommand('nvm unalias a')
}
})
test.serial('Handles non-existing NVM_DIR', async (t) => {
await runNvmCommand(`nvm alias a ${FULL_VERSION}`)
// eslint-disable-next-line fp/no-mutation
env.NVM_DIR = '/doesNotExist'
try {
await t.throwsAsync(nodeVersionAlias('a'))
} finally {
// eslint-disable-next-line fp/no-mutation
env.NVM_DIR = NVM_DIR
await runNvmCommand('nvm unalias a')
}
})