import { describe, it, expect } from 'vitest'
import { validateConfig } from '../src/utils.js'
describe('validateConfig', () => {
it('should throw if required config is missing', () => {
expect(() => validateConfig({
foobar: {
type: 'string',
required: true
}
}, {})).toThrowError('Required option "foobar" is missing')
})
it('should not throw if required config is missing but default is defined', () => {
expect(validateConfig({
foobar: {
type: 'string',
required: true,
default: 'barfoo'
}
}, {})).toEqual({ foobar: 'barfoo' })
})
it('should check for types', () => {
expect(() => validateConfig({
foobar: {
type: 'string'
}
}, {
foobar: 123
})).toThrowError('Expected option "foobar" to be type of string but was number')
})
it('should check for types as function', () => {
const errorCheck = (type: any) => {
if (type instanceof Error) {
return
}
throw new Error('not an error')
}
expect(() => validateConfig({
foobar: { type: 'object', validate: errorCheck }
}, {
foobar: { message: 'foobar', stack: 'barfoo' }
})).toThrowError(/Type check for option "foobar" failed: not an error/)
expect(Object.prototype.hasOwnProperty.call(validateConfig({
foobar: { type: 'object', validate: errorCheck }
}, {
foobar: new Error('foobar')
}), 'foobar')).toBe(true)
})
it('should match something', () => {
expect(() => validateConfig({
logLevel: {
type: 'string',
default: 'trace',
match: /(trace|debug|info|warn|error|silent)/
}
}, {
logLevel: 'dontknow'
})).toThrowError(/doesn't match expected values/)
expect(Object.prototype.hasOwnProperty.call(validateConfig({
logLevel: {
type: 'string',
default: 'trace',
match: /(trace|debug|info|warn|error|silent)/
}
}, {
logLevel: 'info'
}), 'logLevel')).toBe(true)
})
it('should keep certain keys if desired', () => {
expect(validateConfig({
logLevel: {
type: 'string',
default: 'trace',
match: /(trace|debug|info|warn|error|silent)/
}
}, {
logLevel: 'info',
foo: 'bar',
bar: 'foo'
}, ['foo'])).toEqual({
logLevel: 'info',
foo: 'bar'
})
})
})