diff --git a/lib/config/validator.ts b/lib/config/validator.ts index 2f0dd041..23084361 100644 --- a/lib/config/validator.ts +++ b/lib/config/validator.ts @@ -54,6 +54,18 @@ export default function constructAndValidateConfiguration( // Required fields if (!repositories || !repositories.length) { errors.push(`Missing repositories.`); + } else { + const duplicateRepositories = repositories.filter( + (item, index, array) => array.indexOf(item) !== index + ); + + if (duplicateRepositories.length) { + errors.push( + `repositories contains duplicate entries: [${duplicateRepositories.join( + ', ' + )}]` + ); + } } if (!extensions || !extensions.length) { diff --git a/test/validator.test.ts b/test/validator.test.ts index c84955af..d75a6fc6 100644 --- a/test/validator.test.ts +++ b/test/validator.test.ts @@ -3,7 +3,7 @@ import validator from '@config/validator'; import { ConfigToValidate } from '@config/types'; const DEFAULT_CONFIGURATION: ConfigToValidate = { - repositories: ['test-repo'], + repositories: ['test-repo', 'test-repo-2'], extensions: ['.ts', '.tsx'], pathIgnorePattern: undefined, maxFileSizeBytes: undefined, @@ -17,6 +17,13 @@ const DEFAULT_CONFIGURATION: ConfigToValidate = { }; describe('Config validator', () => { + test('valid configuration is accepted', () => { + validator(DEFAULT_CONFIGURATION); + + const validationErrors = getConsoleLogCalls(); + expect(validationErrors.join(',')).toBeFalsy(); + }); + test('repositories are required', () => { const config = { ...DEFAULT_CONFIGURATION, repositories: undefined! }; validator(config); @@ -26,6 +33,25 @@ describe('Config validator', () => { expect(validationError).toMatch('- Missing repositories.'); }); + test('duplicate repositories are unsupported', () => { + const repositories = [ + 'duplicate-1', + 'valid', + 'duplicate-1', + 'duplicate-2', + 'valid-2', + 'duplicate-2', + ]; + const config = { ...DEFAULT_CONFIGURATION, repositories }; + validator(config); + + const [validationError] = getConsoleLogCalls(); + expect(validationError).toMatch('Configuration validation errors:'); + expect(validationError).toMatch( + '- repositories contains duplicate entries: [duplicate-1, duplicate-2]' + ); + }); + test('additional options are unsupported', () => { const key = 'someMistypedKey'; const config = { ...DEFAULT_CONFIGURATION, [key]: true };