/* Copyright 2026 Seekra Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ import { describe, test, expect } from 'vitest'; import { validateSettingsConfig, validateEntry, validateSelectionOptions, assertType, assertString } from '../settingsValidator'; describe('validateSettingsConfig', () => { test.for([ { raw: false, expected: false }, { raw: true, expected: false }, { raw: 0, expected: false }, { raw: 42, expected: false }, { raw: '', expected: false }, { raw: ' ', expected: false }, { raw: 'a', expected: false }, { raw: {}, expected: false }, { raw: { contents: [] }, expected: true }, { raw: { contents: [ { type: 'section', name: 'general', i18n: 'settings.settings.general', content: [ { type: 'bool', name: 'Enable feature 42', i18n: 'settings.settings.general.enableFeature42' } ] } ] }, expected: true }, { raw: { contents: [ { type: 'section', name: 'general', i18n: 'settings.settings.general', content: [ { type: 'bool', name: 'Enable feature 42', i18n: 'settings.settings.general.enableFeature42' } ] }, { type: 'section', name: 'copyOfGeneral', i18n: 'settings.settings.copyOfGeneral', content: [ { type: 'bool', name: 'Enable feature 42', i18n: 'settings.settings.general.enableFeature42' } ] }, ] }, expected: true }, { raw: { contents: [ { type: 'section', name: 'general', i18n: 'settings.settings.general', content: [ { type: 'bool', name: 'Enable feature 42', i18n: 'settings.settings.general.enableFeature42' } ] }, { type: 'section', name: 'copyOfGeneral', i18n: 'settings.settings.copyOfGeneral', content: [ { type: 'bool', name: 'Enable feature 42', default: false, i18n: 'settings.settings.general.enableFeature42' } ] }, { type: 'section', name: 'aSection', i18n: 'settings.settings.aSection', content: [ { type: 'bool', name: 'Enable feature 43', i18n: 'settings.settings.aSection.enableFeature43' }, { type: 'selection', name: 'language', i18n: 'settings.settings.aSection.language.label', default: 'en', options: [ { name: 'en', i18n: 'settings.settings.aSection.language.options.en' }, { name: 'de', i18n: 'settings.settings.aSection.language.options.de' }, ] }, { type: 'section', name: 'section2', i18n: 'settings.settings.aSection.section2.label', content: [ { type: 'string', name: 'string', i18n: 'settings.settings.aSection.sections.string', default: 'str' } ] }, ] }, ] }, expected: true }, { raw: { contents: [ { type: 'section', name: 'general', i18n: 'settings.settings.general', content: [ { type: 'bool', name: 'Enable feature 42', i18n: 'settings.settings.general.enableFeature42' } ] }, { type: 'section', name: 'copyOfGeneral', i18n: 'settings.settings.copyOfGeneral', content: [ { type: 'bool', name: 'Enable feature 42', default: false, i18n: 'settings.settings.general.enableFeature42' } ] }, { type: 'section', name: 'aSection', i18n: 'settings.settings.aSection', content: [ { type: 'bool', name: 'Enable feature 43', i18n: 'settings.settings.aSection.enableFeature43' }, { type: 'selection', name: 'language', i18n: 'settings.settings.aSection.language.label', default: 'en', allowMultiple: false, options: [ { name: 'en', i18n: 'settings.settings.aSection.language.options.en' }, { name: 'de', i18n: 'settings.settings.aSection.language.options.de' }, ] }, { type: 'section', name: 'section2', i18n: 'settings.settings.aSection.section2.label', content: [ { type: 'string', name: 'string', i18n: 'settings.settings.aSection.sections.string', default: 'str' } ] }, ] }, ] }, expected: true }, { raw: { contents: [ { type: 'section', name: 'general', i18n: 'settings.settings.general', content: [ { type: 'bool', name: 'Enable feature 42', i18n: 'settings.settings.general.enableFeature42' } ] }, { type: 'section', name: 'copyOfGeneral', i18n: 'settings.settings.copyOfGeneral', content: [ { type: 'bool', name: 'Enable feature 42', default: false, i18n: 'settings.settings.general.enableFeature42' } ] }, { type: 'section', name: 'aSection', i18n: 'settings.settings.aSection', content: [ { type: 'bool', name: 'Enable feature 43', i18n: 'settings.settings.aSection.enableFeature43', default: 'true' }, { type: 'selection', name: 'language', i18n: 'settings.settings.aSection.language.label', default: 'en', options: [ { name: 'en', i18n: 'settings.settings.aSection.language.options.en' }, { name: 'de', i18n: 'settings.settings.aSection.language.options.de' }, ] }, { type: 'section', name: 'section2', i18n: 'settings.settings.aSection.section2.label', content: [ { type: 'string', name: 'string', i18n: 'settings.settings.aSection.sections.string', default: 42 } ] }, ] }, ] }, expected: false }, { raw: { content: [ { type: 'section', name: 'general', i18n: 'settings.settings.general', content: [ { type: 'bool', name: 'Enable feature 42', i18n: 'settings.settings.general.enableFeature42' } ] }, { type: 'section', name: 'copyOfGeneral', i18n: 'settings.settings.copyOfGeneral', content: [ { type: 'bool', name: 'Enable feature 42', default: false, i18n: 'settings.settings.general.enableFeature42' } ] }, { type: 'section', name: 'aSection', i18n: 'settings.settings.aSection', content: [ { type: 'bool', name: 'Enable feature 43', i18n: 'settings.settings.aSection.enableFeature43' }, { type: 'selection', name: 'language', i18n: 'settings.settings.aSection.language.label', default: 'en', options: [ { name: 'en', i18n: 'settings.settings.aSection.language.options.en' }, { name: 'de', i18n: 'settings.settings.aSection.language.options.de' }, ] }, { type: 'section', name: 'section2', i18n: 'settings.settings.aSection.section2.label', content: [ { type: 'string', name: 'string', i18n: 'settings.settings.aSection.sections.string', default: 'str' } ] }, ] }, ] }, expected: false }, { raw: { content: [ { type: 'sectio', name: 'general', i18n: 'settings.settings.general', content: [ { type: 'bool', name: 'Enable feature 42', i18n: 'settings.settings.general.enableFeature42' } ] }, { type: 'section', name: 'copyOfGeneral', i18n: 'settings.settings.copyOfGeneral', content: [ { type: 'bool', name: 'Enable feature 42', default: false, i18n: 'settings.settings.general.enableFeature42' } ] }, { type: 'section', name: 'aSection', i18n: 'settings.settings.aSection', content: [ { type: 'bool', name: 'Enable feature 43', i18n: 'settings.settings.aSection.enableFeature43' }, { type: 'selection', name: 'language', i18n: 'settings.settings.aSection.language.label', default: 'en', options: [ { name: 'en', i18n: 'settings.settings.aSection.language.options.en' }, { name: 'de', i18n: 'settings.settings.aSection.language.options.de' }, ] }, { type: 'section', name: 'section2', i18n: 'settings.settings.aSection.section2.label', content: [ { type: 'string', name: 'string', i18n: 'settings.settings.aSection.sections.string', default: 'str' } ] }, ] }, ] }, expected: false }, { raw: { content: [ { type: 'sectio', name: 'general', i18n: 'settings.settings.general', content: [ { type: 'bool', name: 'Enable feature 42', i18n: 'settings.settings.general.enableFeature42' } ] }, { type: 'section', name: 'copyOfGeneral', i18n: 'settings.settings.copyOfGeneral', content: [ { type: 'bool', name: 'Enable feature 42', default: false, i18n: 'settings.settings.general.enableFeature42' } ] }, { type: 'section', name: 'aSection', i18n: 'settings.settings.aSection', content: [ { type: 'bool', name: 'Enable feature 43', i18n: 'settings.settings.aSection.enableFeature43' }, { type: 'selection', name: 'language', i18n: 'settings.settings.aSection.language.label', default: 'en', allowMultiple: 'false', options: [ { name: 'en', i18n: 'settings.settings.aSection.language.options.en' }, { name: 'de', i18n: 'settings.settings.aSection.language.options.de' }, ] }, { type: 'section', name: 'section2', i18n: 'settings.settings.aSection.section2.label', content: [ { type: 'string', name: 'string', i18n: 'settings.settings.aSection.sections.string', default: 'str' } ] }, ] }, ] }, expected: false } ])('returns valid: $expected', ({ raw, expected }) => { const result = validateSettingsConfig(raw); if (!result.valid) { console.error('Error message:', result.error); }; expect(result.valid).toBe(expected); }); }); describe('validateEntry', () => { test.for([ [{ name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable' }], [{ name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: true }], [{ name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: false }], [{ name: 'aNumber', type: 'number', i18n: 'aNumber.label' }], [{ name: 'aNumber', type: 'number', i18n: 'aNumber.label', default: 42 }], [{ name: 'aNumber', type: 'number', i18n: 'aNumber.label', default: 0 }], [{ name: 'aNumber', type: 'number', i18n: 'aNumber.label', default: -42.7 }], [{ name: 'aString', type: 'string', i18n: 'aString.label' }], [{ name: 'aString', type: 'string', i18n: 'aString.label', default: '' }], [{ name: 'aString', type: 'string', i18n: 'aString.label', default: 'Seekra is great!' }], [{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', options: [ { name: 'yes', i18n: 'selectSomething.options.yes' }, { name: 'no', i18n: 'selectSomething.options.no' }, { name: 'maybe', i18n: 'selectSomething.options.maybe' } ] }], [{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: 'no', options: [ { name: 'yes', i18n: 'selectSomething.options.yes' }, { name: 'no', i18n: 'selectSomething.options.no' }, { name: 'maybe', i18n: 'selectSomething.options.maybe' } ] }], [{ 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 } ] }], [{ name: 'aSection', type: 'section', i18n: 'sections.aSection.title', content: [ { name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: true }, { name: 'enableFeature43', type: 'bool', i18n: 'feature.43.enable', default: true } ] }], [{ name: 'aSection', type: 'section', i18n: 'sections.aSection.title', content: [ { name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: true }, { name: 'enableFeature43', type: 'bool', i18n: 'feature.43.enable', default: true }, { name: 'aSecondSection', type: 'section', i18n: 'sections.aSecondSection.title', content: [ { name: 'enableFeature44', type: 'bool', i18n: 'feature.44.enable', default: true }, ] } ] }] ])('throws no error for the entry %s', ([ entry ]) => { expect(() => validateEntry(entry)).not.throws(Error); }); test.for([ [{ name: 'enableFeature42', type: 'bool', i18n: '' }], [{ name: 'enableFeature42', type: 'thisTypeDoesNotExistAndHasAVeryLongName', i18n: 'feature.42.enable' }], [{ name: '', type: 'thisTypeDoesNotExistAndHasAVeryLongName', i18n: 'feature.42.enable' }], [{ name: '', type: 'thisTypeDoesNotExistAndHasAVeryLongName', i18n: '' }], [{ name: '', type: 'bool', i18n: '' }], [{ name: '', type: 'bool', i18n: '' }], [{ name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: 42 }], [{ name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: '42' }], [{ name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: 'Seekra' }], [{ name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: 'true' }], [{ name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: 'false' }], [{ name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: 'undefined' }], [{ name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: 'null' }], [{ name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: [] }], [{ name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: {} }], [{ name: 'enableFeature42', type: '', i18n: 'feature.42.enable', default: {} }], [{ name: '', type: 'number', i18n: 'aNumber.label' }], [{ name: 'aNumber', type: 'number', i18n: 'aNumber.label', default: '42' }], [{ name: 'aNumber', type: 'number', i18n: 'aNumber.label', default: 'zero' }], [{ name: 'aNumber', type: 'number', i18n: 'aNumber.label', default: 'undefined' }], [{ name: 'aNumber', type: 'number', i18n: 'aNumber.label', default: 'false' }], [{ name: 'aNumber', type: 'number', i18n: 'aNumber.label', default: true }], [{ name: 'aNumber', type: 'number', i18n: 'aNumber.label', default: false }], [{ name: 'aNumber', type: 'number', i18n: 'aNumber.label', default: [] }], [{ name: 'aNumber', type: 'number', i18n: 'aNumber.label', default: {} }], [{ name: 'aNumber', type: '', i18n: 'aNumber.label', default: {} }], [{ name: 'aNumber', type: '', i18n: 'aNumber.label', default: 42 }], [{ name: 'aString', type: 'string', i18n: '' }], [{ name: 'aString', type: 'string', i18n: 'aString.label', default: 42 }], [{ name: 'aString', type: 'string', i18n: 'aString.label', default: true }], [{ name: 'aString', type: 'string', i18n: 'aString.label', default: false }], [{ name: 'aString', type: 'string', i18n: 'aString.label', default: [] }], [{ name: 'aString', type: 'string', i18n: 'aString.label', default: {} }], [{ name: 'aString', type: 'string', i18n: '', default: {} }], [{ 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: 'c', options: [ { name: 'a', i18n: 'a' }, { name: 'b', i18n: 'b' } ] }], [{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: 'a', options: [ { name: 'a', i18n: 'a' }, { name: 'b', i18n: '' }, { name: 'c' } ] }], [{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: 'a', allowMultiple: 'false', options: [ { name: 'a', i18n: 'a' }, { name: 'b', i18n: '' }, { name: 'c' } ] }], [{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: 'no', options: [ { name: 'yes', i18n: '' }, { name: '', i18n: 'selectSomething.options.no' }, { name: 'maybe', i18n: 'selectSomething.options.maybe' }, { name: '', i18n: '' }, { name: 42, i18n: 43 }, { name: '' }, { i18n: '' }, {} ] }], [{ name: 'aSection', type: 'section', i18n: '', content: [] }], [{ name: 'aSection', type: 'section', i18n: 'sections.aSection.title', content: '' }], [{ name: 'aSection', type: 'section', i18n: 'sections.aSection.title', content: '[]' }], [{ name: 'aSection', type: 'section', i18n: 'sections.aSection.title', content: 'a' }], [{ name: 'aSection', type: 'section', i18n: 'sections.aSection.title', content: [ { name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: true }, { name: 'enableFeature43', type: 'bool', i18n: 'feature.42.enable', default: 0 }, { name: 'enableFeature44', type: 'bool' } ] }], [{ name: 'aSection', type: 'section', i18n: 'sections.aSection.title', content: [ { name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: true }, { name: 'enableFeature43', type: 'bool', i18n: 'feature.43.enable', default: true }, { name: 'aSecondSection', type: 'section', i18n: 'sections.aSecondSection.title', content: 'Hello' }, { name: 'aSecondSection', type: 'section', i18n: '', content: [] }, { name: 'aSecondSection', type: 'section', i18n: 'i18n', content: [] }, { name: 'aSecondSection', type: 'section', content: [] } ] }] ])('throws an error for the entry %s', ([ entry ]) => { expect(() => validateEntry(entry)).throws(Error); }); }); describe('validateSelectionOptions', () => { test.for([ [[{ name: 'test', i18n: 'test.label' }]], [[{ name: 'test', i18n: 'test.label' }, { name: 'test2', i18n: 'test2.label' }]], [[{ name: 'test', i18n: 'test.label' }, { name: 'test', i18n: 'test2.label' }, { name: 'test3', i18n: 'test.label' }]] ])('throws no error for the options %s', ([ options ]) => { expect(() => validateSelectionOptions(options)).not.throws(Error); }); test.for([ [[{}]], [[{ i18n: '' }]], [[{ i18n: 'a' }]], [[{ name: 'a' }]], [[{ name: '' }]], [[{ name: '', i18n: 'test.label' }]], [[{ name: 'test', i18n: '' }]], [[{ name: '', i18n: '' }]], [[{ name: '', i18n: 'test.label' }, { name: 'test2', i18n: '' }]], [[{ name: 'test', i18n: '' }, { name: '', i18n: 'test2.label' }, { name: '', i18n: ' ' }, { name: '42', i18n: '42.i18n' }]], [[]] ])('throws an error for the options %s', ([ options ]) => { expect(() => validateSelectionOptions(options)).throws(Error); }); }); describe('assertType', () => { test.for([ ['bool'], ['number'], ['string'], ['selection'], ['section'] ])('throws no error for the value %s', ([ value ]) => { expect(() => assertType(value)).not.throw(Error); }); test.for([ [''], [' '], [' '], [' '], ['42'], ['0'], ['-42'], ['-42.0'], ['-0.0'], ['a'], ['ab'], ['SeekraIsGreat!'], ['Seekra is great!'], [undefined], [null] ])('throws an error for the value %s', ([ value ]) => { expect(() => assertType(value)).throw(Error); }); }); describe('assertString', () => { test.for([ ['a'], ['b'], ['ab'], ['0'], ['42'], ['null'], ['undefined'], ['()&%())'] ])('throws no error for the value %s', ([ value ]) => { expect(() => assertString(value)).not.throw(Error); }); test.for([ [0], [1], [42], [-1], [-42], [''], [' '], [' '], [' '] ])('throws an error for the value %s', ([ value ]) => { expect(() => assertString(value)).throws(Error); }); });