UNPKG

@variantjs/core

Version:

VariantJS common functions and utilities

531 lines (468 loc) 11.9 kB
import { normalizeOptions } from '../index'; import { InputOptions, NormalizedOptions } from '../types'; describe('options as strings', () => { it('returns an empty array if no value', () => { expect(normalizeOptions()).toEqual([]); }); it('accepts the options as array of strings', () => { const options: InputOptions = ['Option A', 'Option B', 'Option C']; const expectedOptions: NormalizedOptions = [ { value: 'Option A', text: 'Option A', raw: 'Option A' }, { value: 'Option B', text: 'Option B', raw: 'Option B' }, { value: 'Option C', text: 'Option C', raw: 'Option C' }, ]; expect(normalizeOptions(options)).toEqual(expectedOptions); }); }); describe('options as numbers', () => { it('accepts the options as array of numbers', () => { const options: InputOptions = [1, 2, 5]; const expectedOptions: NormalizedOptions = [ { value: 1, text: 1, raw: 1 }, { value: 2, text: 2, raw: 2 }, { value: 5, text: 5, raw: 5 }, ]; expect(normalizeOptions(options)).toEqual(expectedOptions); }); }); describe('options as key => value pair', () => { it('accepts the options as key => value pair', () => { const options: InputOptions = { 1: 'Option 1', A: 'Option A', 'Option 3': 'Option 3', }; const expectedOptions: NormalizedOptions = [ { value: '1', text: 'Option 1' }, { value: 'A', text: 'Option A' }, { value: 'Option 3', text: 'Option 3' }, ]; expect(normalizeOptions(options)).toEqual(expectedOptions); }); }); describe('options as array of objects', () => { it('accepts the options on the default format', () => { const options: InputOptions = [ { value: 1, text: 'Option 1' }, { value: 'A', text: 'Option A' }, { value: 'Option 3', text: 'Option 3' }, ]; const expectedOptions: NormalizedOptions = [ { value: 1, text: 'Option 1', raw: { value: 1, text: 'Option 1' } }, { value: 'A', text: 'Option A', raw: { value: 'A', text: 'Option A' } }, { value: 'Option 3', text: 'Option 3', raw: { value: 'Option 3', text: 'Option 3' } }, ]; expect(normalizeOptions(options)).toEqual(expectedOptions); }); it('handles the disabled attribute', () => { const options: InputOptions = [ { value: '1', text: 'Option 1' }, { value: 'A', text: 'Option A', disabled: true }, { value: 'Option 3', text: 'Option 3', disabled: false }, ]; const expectedOptions: NormalizedOptions = [ { value: '1', text: 'Option 1', raw: { value: '1', text: 'Option 1' } }, { value: 'A', text: 'Option A', disabled: true, raw: { value: 'A', text: 'Option A', disabled: true }, }, { value: 'Option 3', text: 'Option 3', raw: { value: 'Option 3', text: 'Option 3', disabled: false }, }, ]; expect(normalizeOptions(options)).toEqual(expectedOptions); }); }); describe('options with children', () => { it('handles the children in default format', () => { const options = [ { value: 'A', text: 'Option A', children: [ { value: 1, text: 'Children 1' }, { value: 2, text: 'Children 2' }, ], }, ]; const expectedOptions: NormalizedOptions = [ { value: 'A', text: 'Option A', children: [ { value: 1, text: 'Children 1', raw: options[0].children[0] }, { value: 2, text: 'Children 2', raw: options[0].children[1] }, ], raw: options[0], }, ]; expect(normalizeOptions(options)).toEqual(expectedOptions); }); it('handles the children as arrays of strings', () => { const options = [ { value: 'A', text: 'Option A', children: ['Children 1', 'Children 2'], }, ]; const expectedOptions: NormalizedOptions = [ { value: 'A', text: 'Option A', children: [ { value: 'Children 1', text: 'Children 1', raw: options[0].children[0] }, { value: 'Children 2', text: 'Children 2', raw: options[0].children[1] }, ], raw: options[0], }, ]; expect(normalizeOptions(options)).toEqual(expectedOptions); }); it('handles the children as arrays of numbers', () => { const options = [ { value: 'A', text: 'Option A', children: [1, 2, 3], }, ]; const expectedOptions: NormalizedOptions = [ { value: 'A', text: 'Option A', children: [ { value: 1, text: 1, raw: options[0].children[0] }, { value: 2, text: 2, raw: options[0].children[1] }, { value: 3, text: 3, raw: options[0].children[2] }, ], raw: options[0], }, ]; expect(normalizeOptions(options)).toEqual(expectedOptions); }); it('handles the children as value => key pair', () => { const options = [ { value: 'A', text: 'Option A', children: { 1: 'Option 1', A: 'Option A', }, }, ]; const expectedOptions: NormalizedOptions = [ { value: 'A', text: 'Option A', children: [ { value: '1', text: 'Option 1' }, { value: 'A', text: 'Option A' }, ], raw: options[0], }, ]; expect(normalizeOptions(options)).toEqual(expectedOptions); }); }); describe('guess option and values', () => { it('get the text with the `textAttribute` param', () => { const options = [ { value: 'A', label: 'Option A', }, { value: 'B', label: 'Option B', }, ]; const expectedOptions: NormalizedOptions = [ { value: 'A', text: 'Option A', raw: options[0], }, { value: 'B', text: 'Option B', raw: options[1], }, ]; expect(normalizeOptions(options, 'label')).toEqual(expectedOptions); }); it('get the text with the `textAttribute` param using dot notation', () => { const options = [ { value: 'A', user: { name: 'Alfonso', role: { label: 'Admin', id: 1, }, }, }, { value: 'B', user: { name: 'Sauda', role: { label: 'User', id: 2, }, }, }, ]; const expectedOptions: NormalizedOptions = [ { value: 'A', text: 'Admin', raw: options[0], }, { value: 'B', text: 'User', raw: options[1], }, ]; const textAttribute = 'user.role.label'; expect(normalizeOptions(options, textAttribute)).toEqual(expectedOptions); }); it('returns an empty string if the `textAttribute` param doesnt exist', () => { const options = [ { value: 'A', user: { name: 'Alfonso', }, }, { value: 'B', user: { name: 'Sauda', }, }, ]; const expectedOptions: NormalizedOptions = [ { value: 'A', text: '', raw: options[0], }, { value: 'B', text: '', raw: options[1], }, ]; const textAttribute = 'user.role.label'; expect(normalizeOptions(options, textAttribute)).toEqual(expectedOptions); }); it('returns the text as an string if the text attribute is not `number` or `string`', () => { const options = [ { value: 'A', user: { name: 'Alfonso', role: { label: false, id: 1, }, }, }, { value: 'B', user: { name: 'Sauda', role: { label: { is: 'object' }, id: 2, }, }, }, ]; const expectedOptions: NormalizedOptions = [ { value: 'A', text: 'false', raw: options[0], }, { value: 'B', text: '[object Object]', raw: options[1], }, ]; const textAttribute = 'user.role.label'; expect(normalizeOptions(options, textAttribute)).toEqual(expectedOptions); }); it('get the value with the `valueAttribute` param', () => { const options = [ { id: 'A', text: 'Option A', }, { id: 'B', text: 'Option B', }, ]; const expectedOptions: NormalizedOptions = [ { value: 'A', text: 'Option A', raw: options[0], }, { value: 'B', text: 'Option B', raw: options[1], }, ]; expect(normalizeOptions(options, undefined, 'id')).toEqual(expectedOptions); }); it('get the value with the `valueAttribute` param using dot notation', () => { const options = [ { text: 'A', user: { name: 'Alfonso', role: { label: 'Admin', id: 1, }, }, }, { text: 'B', user: { name: 'Sauda', role: { label: 'User', id: 2, }, }, }, ]; const expectedOptions: NormalizedOptions = [ { value: 1, text: 'A', raw: options[0], }, { value: 2, text: 'B', raw: options[1], }, ]; const valueAttribute = 'user.role.id'; expect(normalizeOptions(options, undefined, valueAttribute)).toEqual(expectedOptions); }); it('returns an `undefined` if the `valueAttribute` param doesnt exist', () => { const options = [ { text: 'Alfonso', user: { role: 'admin', }, }, { text: 'Saida', user: { role: 'user', }, }, ]; const expectedOptions: NormalizedOptions = [ { value: undefined, text: 'Alfonso', raw: options[0], }, { value: undefined, text: 'Saida', raw: options[1], }, ]; const valueAttribute = 'user.role.id'; expect(normalizeOptions(options, undefined, valueAttribute)).toEqual(expectedOptions); }); it('returns `null` as value if the `valueAttribute` param is `null`', () => { const options = [ { text: 'Alfonso', user: { id: null, role: 'admin', }, }, { text: 'Saida', user: { id: null, role: 'user', }, }, ]; const expectedOptions: NormalizedOptions = [ { value: null, text: 'Alfonso', raw: options[0], }, { value: null, text: 'Saida', raw: options[1], }, ]; const valueAttribute = 'user.id'; expect(normalizeOptions(options, undefined, valueAttribute)).toEqual(expectedOptions); }); it('returns the value as an string if the value attribute is not `number` or `string`', () => { const options = [ { text: 'A', user: { name: 'Alfonso', role: { label: false, id: 1, }, }, }, { text: 'B', user: { name: 'Sauda', role: { label: { is: 'object' }, id: 2, }, }, }, ]; const expectedOptions: NormalizedOptions = [ { text: 'A', value: 'false', raw: options[0], }, { text: 'B', value: '[object Object]', raw: options[1], }, ]; const valueAttribute = 'user.role.label'; expect(normalizeOptions(options, undefined, valueAttribute)).toEqual(expectedOptions); }); });