1
|
|
|
/* eslint-env es6, node */ |
2
|
|
|
/* eslint complexity: ['error', { max: 10 }] */ // set maximum cyclomatic complexity to 10; ref: <https://eslint.org/docs/rules/complexity> |
3
|
|
|
// # spell-checker:ignore AllUsersProfile HomeDrive HomePath LocalAppData SystemDrive SystemRoot UserProfile cyclomatic windir |
4
|
|
|
'use strict'; |
5
|
|
|
|
6
|
|
|
const os = require('os'); |
7
|
|
|
const path = require('path'); |
8
|
|
|
|
9
|
|
|
const test = require('ava'); |
10
|
|
|
|
11
|
|
|
const osPaths = require('../build/cjs+tests'); |
12
|
|
|
|
13
|
|
|
const isWinOS = /^win/i.test(process.platform); |
14
|
|
|
|
15
|
|
|
const env = { |
16
|
|
|
defaults: process.env, |
17
|
|
|
signals: { |
18
|
|
|
ALLUSERSPROFILE: 'allusersprofile', |
19
|
|
|
HOME: 'home', |
20
|
|
|
HOMEDRIVE: 'homedrive', |
21
|
|
|
HOMEPATH: 'homepath', |
22
|
|
|
LOCALAPPDATA: 'localappdata', |
23
|
|
|
SystemRoot: 'systemroot', |
24
|
|
|
SystemDrive: 'systemdrive', |
25
|
|
|
TEMP: 'temp', |
26
|
|
|
TMPDIR: 'tmpdir', |
27
|
|
|
TMP: 'tmp', |
28
|
|
|
USERPROFILE: 'userprofile', |
29
|
|
|
windir: 'windir', |
30
|
|
|
}, |
31
|
|
|
}; |
32
|
|
|
|
33
|
|
|
function setupProcessEnv(values) { |
34
|
|
|
// eslint-disable-next-line functional/immutable-data , security/detect-object-injection |
35
|
|
|
Object.keys(values).forEach((key) => (process.env[key] = env.defaults[key])); |
36
|
|
|
} |
37
|
|
|
|
38
|
|
|
// * reset environment prior to each test |
39
|
|
|
test.beforeEach((_) => { |
40
|
|
|
setupProcessEnv(env.defaults); |
41
|
|
|
}); |
42
|
|
|
|
43
|
|
|
/* eslint-disable no-undefined , functional/immutable-data */ |
44
|
|
|
|
45
|
|
|
test('default', (t) => { |
46
|
|
|
const paths = osPaths; |
47
|
|
|
|
48
|
|
|
process.env.HOME = process.env.USERPROFILE = 'home'; |
49
|
|
|
process.env.TEMP = process.env.TMP = process.env.TMPDIR = 'temp'; |
50
|
|
|
|
51
|
|
|
t.is(paths.home(), 'home'); |
52
|
|
|
t.is(paths.temp(), 'temp'); |
53
|
|
|
}); |
54
|
|
|
|
55
|
|
|
test('alternate construction (via function)', (t) => { |
56
|
|
|
const paths = osPaths(); |
57
|
|
|
|
58
|
|
|
process.env.HOME = process.env.USERPROFILE = 'home'; |
59
|
|
|
process.env.TEMP = process.env.TMP = process.env.TMPDIR = 'temp'; |
60
|
|
|
|
61
|
|
|
t.is(paths.home(), 'home'); |
62
|
|
|
t.is(paths.temp(), 'temp'); |
63
|
|
|
}); |
64
|
|
|
|
65
|
|
|
test('no os.homedir/os.tmpdir', (t) => { |
66
|
|
|
os.homedir = os.tmpdir = null; |
67
|
|
|
|
68
|
|
|
const paths = osPaths; |
69
|
|
|
|
70
|
|
|
process.env.HOME = process.env.USERPROFILE = 'home'; |
71
|
|
|
process.env.TEMP = process.env.TMP = process.env.TMPDIR = 'temp'; |
72
|
|
|
|
73
|
|
|
t.is(paths.home(), 'home'); |
74
|
|
|
t.is(paths.temp(), 'temp'); |
75
|
|
|
}); |
76
|
|
|
|
77
|
|
|
test('no os.homedir/os.tmpdir and trailing slash in environment source', (t) => { |
78
|
|
|
os.homedir = os.tmpdir = null; |
79
|
|
|
|
80
|
|
|
const paths = osPaths; |
81
|
|
|
|
82
|
|
|
process.env.HOME = process.env.USERPROFILE = 'home/'; |
83
|
|
|
process.env.TEMP = process.env.TMP = process.env.TMPDIR = 'temp/'; |
84
|
|
|
|
85
|
|
|
t.is(paths.home(), 'home'); |
86
|
|
|
t.is(paths.temp(), 'temp'); |
87
|
|
|
}); |
88
|
|
|
|
89
|
|
|
test('no os.homedir or environment', (t) => { |
90
|
|
|
os.homedir = null; |
91
|
|
|
|
92
|
|
|
const paths = osPaths; |
93
|
|
|
|
94
|
|
|
delete process.env.HOME; |
95
|
|
|
delete process.env.HOMEDRIVE; |
96
|
|
|
delete process.env.HOMEPATH; |
97
|
|
|
delete process.env.USERPROFILE; |
98
|
|
|
t.is(paths.home(), undefined); |
99
|
|
|
|
100
|
|
|
process.env.HOME = process.env.HOMEDRIVE = process.env.HOMEPATH = process.env.USERPROFILE = ''; |
101
|
|
|
t.is(paths.home(), undefined); |
102
|
|
|
}); |
103
|
|
|
|
104
|
|
|
test('os.homedir/os.tmpdir return `null`', (t) => { |
105
|
|
|
os.homedir = os.tmpdir = () => null; |
106
|
|
|
|
107
|
|
|
const paths = osPaths; |
108
|
|
|
|
109
|
|
|
process.env.HOME = process.env.USERPROFILE = 'home'; |
110
|
|
|
process.env.TEMP = process.env.TMP = process.env.TMPDIR = 'temp'; |
111
|
|
|
|
112
|
|
|
t.is(paths.home(), 'home'); |
113
|
|
|
t.is(paths.temp(), 'temp'); |
114
|
|
|
}); |
115
|
|
|
|
116
|
|
|
test('no os.homedir and runtime variations', (t) => { |
117
|
|
|
const paths = osPaths; |
118
|
|
|
|
119
|
|
|
process.env.HOME = process.env.HOMEDRIVE = process.env.HOMEPATH = process.env.USERPROFILE = ''; |
120
|
|
|
|
121
|
|
|
process.env.HOMEDRIVE = 'homedrive'; |
122
|
|
|
t.is(paths.home(), isWinOS ? 'homedrive' : undefined); |
123
|
|
|
|
124
|
|
|
process.env.HOMEDRIVE = ''; |
125
|
|
|
process.env.HOMEPATH = 'homepath'; |
126
|
|
|
t.is(paths.home(), isWinOS ? 'homepath' : undefined); |
127
|
|
|
process.env.HOMEDRIVE = 'homedrive'; |
128
|
|
|
t.is(paths.home(), isWinOS ? path.join('homedrive', 'homepath') : undefined); |
129
|
|
|
|
130
|
|
|
process.env.HOME = 'home'; |
131
|
|
|
t.is(paths.home(), 'home'); |
132
|
|
|
|
133
|
|
|
process.env.USERPROFILE = 'userprofile'; |
134
|
|
|
t.is(paths.home(), isWinOS ? 'userprofile' : 'home'); |
135
|
|
|
}); |
136
|
|
|
|
137
|
|
|
test('no os.tmpdir and runtime variations', (t) => { |
138
|
|
|
const paths = osPaths; |
139
|
|
|
|
140
|
|
|
const posixFallback = '/tmp'; |
141
|
|
|
const windowsFallback = 'C:\\Temp'; |
142
|
|
|
|
143
|
|
|
process.env.TEMP = process.env.TMPDIR = process.env.TMP = ''; |
144
|
|
|
|
145
|
|
|
t.is(paths.temp(), isWinOS ? path.join(process.env.LOCALAPPDATA, 'Temp') : posixFallback); |
146
|
|
|
process.env.LOCALAPPDATA = ''; |
147
|
|
|
t.is( |
148
|
|
|
paths.temp(), |
149
|
|
|
isWinOS ? path.join(paths.home() || '', 'AppData', 'Local', 'Temp') : posixFallback |
150
|
|
|
); |
151
|
|
|
process.env.HOME = process.env.HOMEDRIVE = process.env.HOMEPATH = process.env.USERPROFILE = ''; |
152
|
|
|
t.is(paths.temp(), isWinOS ? path.join(process.env.ALLUSERSPROFILE, 'Temp') : posixFallback); |
153
|
|
|
delete process.env.ALLUSERSPROFILE; |
154
|
|
|
t.is(paths.temp(), isWinOS ? path.join(process.env.SystemRoot, 'Temp') : posixFallback); |
155
|
|
|
process.env.SystemRoot = ''; |
156
|
|
|
t.is(paths.temp(), isWinOS ? path.join(process.env.windir, 'Temp') : posixFallback); |
157
|
|
|
delete process.env.windir; |
158
|
|
|
t.is(paths.temp(), isWinOS ? path.join(process.env.SystemDrive + '\\', 'Temp') : posixFallback); |
159
|
|
|
process.env.SystemDrive = ''; |
160
|
|
|
t.is(paths.temp(), isWinOS ? windowsFallback : posixFallback); |
161
|
|
|
|
162
|
|
|
process.env.TMP = 'tmp'; |
163
|
|
|
t.is(paths.temp(), 'tmp'); |
164
|
|
|
process.env.TEMP = 'temp'; |
165
|
|
|
t.is(paths.temp(), 'temp'); |
166
|
|
|
process.env.TMPDIR = 'tmpdir'; |
167
|
|
|
t.is(paths.temp(), isWinOS ? 'temp' : 'tmpdir'); // TMPDIR is not used for Windows platforms |
168
|
|
|
}); |
169
|
|
|
|
170
|
|
|
/* eslint-enable no-undefined , functional/immutable-data */ |
171
|
|
|
|