bootstrap-vue
Version:
With more than 85 components, over 45 available plugins, several directives, and 1000+ icons, BootstrapVue provides one of the most comprehensive implementations of the Bootstrap v4 component and grid system available for Vue.js v2.6, complete with extens
110 lines (99 loc) • 3.52 kB
JavaScript
import { get } from './get'
describe('get', () => {
it('handles invalid values gracefully', async () => {
expect(get(null, '')).toBe(null)
expect(get({}, null)).toBe(null)
expect(get({}, '')).toBe(null)
expect(get({}, 'a')).toBe(null)
expect(get({}, [])).toBe(null)
expect(get({ a: 'b' }, 'b')).toBe(null)
expect(get({ a: { c: 'd' } }, 'a.d')).toBe(null)
})
it('returns expected default value', async () => {
expect(get(null, '')).toBe(null)
expect(get({}, null, undefined)).toBe(null)
expect(get({}, '', true)).toBe(true)
expect(get({}, 'a', '')).toBe('')
expect(get({}, [], 0)).toBe(0)
expect(get({ a: 'b' }, 'b', {})).toEqual({})
expect(get({ a: { c: 'd' } }, 'a.d', [])).toEqual([])
expect(get({ a: { c: undefined } }, 'a.c')).toBe(null)
expect(get({ a: 0, b: false }, 'c')).toBe(null)
})
it('returns expected value', async () => {
const obj1 = { a: 'b' }
const obj2 = { a: { b: { c: { d: 'e' } } } }
const obj3 = { a: [{ b: 'c' }] }
const obj4 = { a: [[{ b: 'c' }], [{ d: { e: ['f'] } }]] }
const obj5 = { a: { b: 0, c: '', d: false } }
const obj6 = { a: 0, b: false }
expect(get(obj1, 'a')).toBe('b')
expect(get(obj1, ['a'])).toBe('b')
expect(get(obj2, 'a.b.c.d')).toBe('e')
expect(get(obj2, ['a', 'b', 'c', 'd'])).toBe('e')
expect(get(obj3, 'a[0].b')).toBe('c')
expect(get(obj3, ['a', 0, 'b'])).toBe('c')
expect(get(obj4, 'a[1][0].d.e[0]')).toBe('f')
expect(get(obj4, ['a', 1, 0, 'd', 'e', 0])).toBe('f')
expect(get(obj4, ['a[1]', 0, 'd', 'e[0]'])).toBe('f')
expect(get(obj5, 'a.b')).toBe(0)
expect(get(obj5, 'a.c')).toBe('')
expect(get(obj5, 'a.d')).toBe(false)
expect(get(obj6, 'a')).toBe(0)
expect(get(obj6, 'b')).toBe(false)
})
it('handles when field name has dot', async () => {
// https://github.com/bootstrap-vue/bootstrap-vue/issues/2762
const obj1 = {
'a.b': 'foo',
a: { b: 'fiz' },
c: 'bar',
d: { e: 'baz' },
f: { 'g.h': 'faz' },
'i.j.k': 'fuz'
}
const obj2 = {
a: { b: 'fiz' },
c: 'bar',
d: { e: 'baz' }
}
expect(get(obj1, 'a.b')).toBe('foo')
expect(get(obj1, 'c')).toBe('bar')
expect(get(obj1, 'd.e')).toBe('baz')
expect(get(obj1, 'f.g.h', 'zzz')).toBe('zzz')
expect(get(obj1, 'f.g.h')).toBe(null)
expect(get(obj1, 'f.g', 'zzz')).toBe('zzz')
expect(get(obj1, 'f.g')).toBe(null)
expect(get(obj1, 'i.j.k')).toBe('fuz')
expect(get(obj1, 'i.j', 'zzz')).toBe('zzz')
expect(get(obj1, 'i.j')).toBe(null)
expect(get({ a: 'b' }, '...', true)).toBe(true)
expect(get({ a: 'b' }, '...')).toBe(null)
expect(get(obj2, 'a.b')).toBe('fiz')
expect(get(obj2, 'c')).toBe('bar')
expect(get(obj2, 'd.e')).toBe('baz')
})
it('handles when field value is not array or object', async () => {
// https://github.com/bootstrap-vue/bootstrap-vue/issues/2807
const obj1 = {
a: { b: 'c' },
b: [{ c: 'd' }],
c: { d: { e: 'f' } },
d: [{ e: [{ f: 'g' }] }]
}
const obj2 = {
a: null,
b: undefined,
c: 0,
d: [null]
}
expect(get(obj1, 'a.b')).toBe('c')
expect(get(obj2, 'a.b')).toBe(null)
expect(get(obj1, 'b[0].c')).toBe('d')
expect(get(obj2, 'b[0].c')).toBe(null)
expect(get(obj1, 'c.d.e')).toBe('f')
expect(get(obj2, 'c.d.e')).toBe(null)
expect(get(obj1, 'd[0].e[0].f')).toBe('g')
expect(get(obj2, 'd[0].e[0].f')).toBe(null)
})
})