diff --git a/src/features/settings/utils/__tests__/settingsValidator.test.js b/src/features/settings/utils/__tests__/settingsValidator.test.js index 96400e8..c0b0e8b 100644 --- a/src/features/settings/utils/__tests__/settingsValidator.test.js +++ b/src/features/settings/utils/__tests__/settingsValidator.test.js @@ -557,6 +557,30 @@ describe('settingsValidator', () => { { name: 'maybe', i18n: 'selectSomething.options.maybe' } ] }], + [{ name: 'selectMultiple', type: 'selection', i18n: 'selectMultiple.title', default: ['1', '2', '3'], allowMultiple: true, options: [ + { name: '1', i18n: 'selectMultiple.options.1' }, + { name: '2', i18n: 'selectMultiple.options.2' }, + { name: '3', i18n: 'selectMultiple.options.3' } + ] }], + + [{ name: 'selectMultiple', type: 'selection', i18n: 'selectMultiple.title', default: ['2', '3'], allowMultiple: true, options: [ + { name: '1', i18n: 'selectMultiple.options.1' }, + { name: '2', i18n: 'selectMultiple.options.2' }, + { name: '3', i18n: 'selectMultiple.options.3' } + ] }], + + [{ name: 'selectMultiple', type: 'selection', i18n: 'selectMultiple.title', default: ['2'], allowMultiple: true, options: [ + { name: '1', i18n: 'selectMultiple.options.1' }, + { name: '2', i18n: 'selectMultiple.options.2' }, + { name: '3', i18n: 'selectMultiple.options.3' } + ] }], + + [{ name: 'selectMultiple', type: 'selection', i18n: 'selectMultiple.title', default: [], allowMultiple: true, options: [ + { name: '1', i18n: 'selectMultiple.options.1' }, + { name: '2', i18n: 'selectMultiple.options.2' }, + { name: '3', i18n: 'selectMultiple.options.3' } + ] }], + [{ name: 'aSection', type: 'section', i18n: 'sections.aSection.title', content: [] }], [{ name: 'aSection', type: 'section', i18n: 'sections.aSection.title', content: [ { name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: true } @@ -616,6 +640,34 @@ describe('settingsValidator', () => { [{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: 'a', options: true }], [{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: 'a', options: [] }], + [{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: ['a'], options: [ + { name: 'a', i18n: 'a' }, + { name: 'b', i18n: 'b' } + ] }], + [{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: ['a', 'b'], options: [ + { name: 'a', i18n: 'a' }, + { name: 'b', i18n: 'b' } + ] }], + [{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', allowMultiple: true, default: 'a', options: [ + { name: 'a', i18n: 'a' }, + { name: 'b', i18n: 'b' } + ] }], + [{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', allowMultiple: true, default: 'a', options: [ + { name: 'a', i18n: 'a' }, + { name: 'b', i18n: 'b' } + ] }], + [{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', allowMultiple: true, default: ['c'], options: [ + { name: 'a', i18n: 'a' }, + { name: 'b', i18n: 'b' } + ] }], + [{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', allowMultiple: true, default: [1], options: [ + { name: 'a', i18n: 'a' }, + { name: 'b', i18n: 'b' } + ] }], + [{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', allowMultiple: true, default: ['a', 1], options: [ + { name: 'a', i18n: 'a' }, + { name: 'b', i18n: 'b' } + ] }], [{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: 'c', options: [ { name: 'a', i18n: 'a' }, { name: 'b', i18n: 'b' } diff --git a/src/features/settings/utils/settingsValidator.js b/src/features/settings/utils/settingsValidator.js index 14c3910..a54daa7 100644 --- a/src/features/settings/utils/settingsValidator.js +++ b/src/features/settings/utils/settingsValidator.js @@ -73,12 +73,27 @@ export const validateEntry = function validateEntry (entry, path) { throw new Error(`[settings] "${path}.default" must be a string`); } if (entry.type === 'selection') { - if (typeof entry.default !== 'string') { - throw new Error(`[settings] "${path}.default" must be a string`); - }; - if (!entry.options.map((option) => option.name).includes(entry.default)) { - throw new Error(`[settings] option "${path}.default" does not exist`); - }; + if (entry.allowMultiple) { + if (!Array.isArray(entry.default)) { + throw new Error(`[settings] "${path}.default" must be an array`); + } + const allOptions = entry.options.map((option) => option.name); + entry.default.forEach((defaultValue, index) => { + if (typeof defaultValue !== 'string') { + throw new Error(`[settings] "${path}.default[${index}]" must be a string`); + } + if (!allOptions.includes(defaultValue)) { + throw new Error(`[settings] option "${path}.default[${index}]" does not exist`); + } + }); + } else { + if (typeof entry.default !== 'string') { + throw new Error(`[settings] "${path}.default" must be a string`); + }; + if (!entry.options.map((option) => option.name).includes(entry.default)) { + throw new Error(`[settings] option "${path}.default" does not exist`); + }; + } }; } }