Merge pull request #2264 from taras/tm/failing-test-for-port

Failing tests for coercion of numeric strings to numbers
This commit is contained in:
Patrik Oldsberg
2020-09-03 17:05:36 +02:00
committed by GitHub
3 changed files with 39 additions and 3 deletions
@@ -30,6 +30,14 @@ jest.mock('fs-extra', () => {
sessionKey: development-key
`,
'/root/secrets/session-key.txt': 'abc123',
'/secret-port/app-config.yaml': `
backend:
listen:
port:
$secret:
file: secrets/port.txt
`,
'/secret-port/secrets/port.txt': '12345',
};
return {
+14 -1
View File
@@ -88,7 +88,7 @@ function expectInvalidValues(config: ConfigReader) {
"Invalid type in config for key 'string' in 'ctx', got string, wanted boolean",
);
expect(() => config.getNumber('string')).toThrow(
"Invalid type in config for key 'string' in 'ctx', got string, wanted number",
"Unable to convert config value for key 'string' in 'ctx' to a number",
);
expect(() => config.getString('one')).toThrow(
"Invalid type in config for key 'one' in 'ctx', got number, wanted string",
@@ -580,4 +580,17 @@ describe('ConfigReader.get()', () => {
},
});
});
it('coerces number strings to numbers', () => {
const config = ConfigReader.fromConfigs([
{
data: {
port: '123',
},
context: '1',
},
]);
expect(config.getNumber('port')).toEqual(123);
});
});
+17 -2
View File
@@ -49,6 +49,9 @@ const errors = {
missing(key: string) {
return `Missing required config value at '${key}'`;
},
convert(key: string, context: string, expected: string) {
return `Unable to convert config value for key '${key}' in '${context}' to a ${expected}`;
},
};
export class ConfigReader implements Config {
@@ -183,10 +186,22 @@ export class ConfigReader implements Config {
}
getOptionalNumber(key: string): number | undefined {
return this.readConfigValue(
const value = this.readConfigValue<string | number>(
key,
value => typeof value === 'number' || { expected: 'number' },
val =>
typeof val === 'number' ||
typeof val === 'string' || { expected: 'number' },
);
if (typeof value === 'number' || value === undefined) {
return value;
}
const number = Number(value);
if (!Number.isFinite(number)) {
throw new Error(
errors.convert(this.fullKey(key), this.context, 'number'),
);
}
return number;
}
getBoolean(key: string): boolean {