-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathindex.test.ts
161 lines (123 loc) · 4.51 KB
/
index.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
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
import { defaultEnvExtensions, defaultExtensions, loadUnvalidatedConfig } from '@app-config/main';
import { isWindows } from '@app-config/utils';
import { withTempFiles } from '@app-config/test-utils';
import { FileSource } from '@app-config/node';
import execParsingExtension from '.';
const defaultOptions = {
environmentExtensions: defaultEnvExtensions().concat(execParsingExtension()),
parsingExtensions: defaultExtensions().concat(execParsingExtension()),
};
describe('execParsingExtension', () => {
it('reads from command as root level string', async () => {
process.env.APP_CONFIG = JSON.stringify({
$exec: 'echo test123',
});
const { fullConfig } = await loadUnvalidatedConfig(defaultOptions);
expect(fullConfig).toEqual('test123');
});
it('reads from command within nested object options', async () => {
process.env.APP_CONFIG = JSON.stringify({
$exec: { command: 'echo test123' },
});
const { fullConfig } = await loadUnvalidatedConfig(defaultOptions);
expect(fullConfig).toEqual('test123');
});
// FIXME: tests don't work on windows
if (!isWindows) {
it('reads JSON as string by default', async () => {
process.env.APP_CONFIG = JSON.stringify({
$exec: { command: `echo '{"test": true}'` },
});
const { fullConfig } = await loadUnvalidatedConfig(defaultOptions);
expect(fullConfig).toBe('{"test": true}');
});
it('parses JSON if parseOutput true', async () => {
process.env.APP_CONFIG = JSON.stringify({
$exec: { command: `echo '{"test": true}'`, parseOutput: true },
});
const { fullConfig } = await loadUnvalidatedConfig(defaultOptions);
expect(fullConfig).toMatchObject({ test: true });
});
it('trims whitespace by default', async () => {
process.env.APP_CONFIG = JSON.stringify({
$exec: { command: `echo ' test123\n'` },
});
const { fullConfig } = await loadUnvalidatedConfig(defaultOptions);
expect(fullConfig).toBe('test123');
});
it('reads raw output if trimWhitespace false', async () => {
process.env.APP_CONFIG = JSON.stringify({
$exec: { command: `echo ' test123'`, trimWhitespace: false },
});
const { fullConfig } = await loadUnvalidatedConfig(defaultOptions);
expect(fullConfig).toBe(' test123\n');
});
it('does not fail on stderr by default', async () => {
process.env.APP_CONFIG = JSON.stringify({
$exec: {
command: `node -e 'process.stdout.write("stdout"); process.stderr.write("stderr");'`,
},
});
const { fullConfig } = await loadUnvalidatedConfig(defaultOptions);
expect(fullConfig).toEqual('stdout');
});
}
it('fails on stderr when failOnStderr true', async () => {
process.env.APP_CONFIG = JSON.stringify({
$exec: {
command: `node -e 'process.stdout.write("stdout"); process.stderr.write("stderr");'`,
failOnStderr: true,
},
});
const action = async () => {
await loadUnvalidatedConfig(defaultOptions);
};
await expect(action()).rejects.toThrow();
});
it('fails if options is not a string or object', async () => {
process.env.APP_CONFIG = JSON.stringify({
$exec: 12345,
});
const action = async () => {
await loadUnvalidatedConfig(defaultOptions);
};
await expect(action()).rejects.toThrow();
});
it('fails if options dont include command', async () => {
process.env.APP_CONFIG = JSON.stringify({
$exec: {},
});
await expect(loadUnvalidatedConfig(defaultOptions)).rejects.toThrow();
});
it('invalid command fails', async () => {
process.env.APP_CONFIG = JSON.stringify({
$exec: { command: 'non-existing-command' },
});
const action = async () => {
await loadUnvalidatedConfig(defaultOptions);
};
await expect(action()).rejects.toThrow();
});
it('reads from command as root level string', async () => {
process.env.APP_CONFIG = JSON.stringify({
$exec: 'echo test123',
});
const { fullConfig } = await loadUnvalidatedConfig(defaultOptions);
expect(fullConfig).toEqual('test123');
});
it('loads file relative to app-config', () =>
withTempFiles(
{
'config.yml': `
$exec: node ./foo.js
`,
'foo.js': `
console.log("foo bar");
`,
},
async (inDir) => {
const source = new FileSource(inDir('config.yml'));
expect(await source.readToJSON([execParsingExtension()])).toEqual('foo bar');
},
));
});