feat(presets): Restrict internal presets validation (#8382)

This commit is contained in:
Sergei Zharinov 2021-02-16 19:10:02 +04:00 committed by GitHub
parent 32440f26a4
commit 64f93ec2a7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 4 deletions

View file

@ -17,6 +17,7 @@ import * as gitlab from './gitlab';
import * as internal from './internal';
import * as local from './local';
import * as npm from './npm';
import { PRESET_DEP_NOT_FOUND } from './util';
const presetSources: Record<string, PresetApi> = {
github,
@ -151,6 +152,9 @@ export async function getPreset(
presetName,
baseConfig,
});
if (!presetConfig) {
throw new Error(PRESET_DEP_NOT_FOUND);
}
logger.trace({ presetConfig }, `Found preset ${preset}`);
if (params) {
const argMapping = {};
@ -227,7 +231,7 @@ export async function resolveConfigPresets(
throw err;
}
const error = new Error(CONFIG_VALIDATION);
if (err.message === 'dep not found') {
if (err.message === PRESET_DEP_NOT_FOUND) {
error.validationError = `Cannot find preset's package (${preset})`;
} else if (err.message === 'preset renovate-config not found') {
error.validationError = `Preset package is missing a renovate-config entry (${preset})`;

View file

@ -1,20 +1,46 @@
import { mocked } from '../../../../test/util';
import { CONFIG_VALIDATION } from '../../../constants/error-messages';
import { massageConfig } from '../../massage';
import { validateConfig } from '../../validation';
import { resolveConfigPresets } from '../index';
import * as _npm from '../npm';
import * as internal from '.';
jest.mock('./npm');
jest.mock('../../../datasource/npm');
const npm = mocked(_npm);
npm.getPreset = jest.fn((_) => null);
const ignoredPresets = ['default:group', 'default:timezone'];
describe('config/presets/internal', () => {
it('fails for undefined internal preset', async () => {
const preset = 'foo:bar';
const presetConfig = { extends: [preset] };
await expect(resolveConfigPresets(presetConfig)).rejects.toThrow(
CONFIG_VALIDATION
);
});
for (const [groupName, groupPresets] of Object.entries(internal.groups)) {
for (const [presetName, presetConfig] of Object.entries(groupPresets)) {
const preset = `${groupName}:${presetName}`;
if (presetName !== 'description' && !ignoredPresets.includes(preset)) {
it(`${preset} validates`, async () => {
const res = await validateConfig(massageConfig(presetConfig), true);
expect(res.errors).toHaveLength(0);
expect(res.warnings).toHaveLength(0);
try {
const config = await resolveConfigPresets(
massageConfig(presetConfig)
);
const res = await validateConfig(config, true);
expect(res.errors).toHaveLength(0);
expect(res.warnings).toHaveLength(0);
} catch (err) {
if (err.validationError) {
throw new Error(err.validationError);
}
throw err;
}
});
}
}