@bigfishtv/cockpit
Version:
513 lines (451 loc) • 15.4 kB
JavaScript
import Immutable from 'immutable'
import {
getChildByIdImmutable,
getParentByChildIdImmutable,
collectValuesImmutable,
pruneTreeImmutable,
getChildByKeyValue,
getParentByChildId,
pruneTree,
collectValues,
flatten,
inflate,
sortByKey,
} from './treeUtils.js'
const dummyData = [
{
id: 2,
parent_id: null,
title: 'About Us',
children: [
{
id: 3,
parent_id: 2,
title: 'Arc Board',
children: [],
},
{
id: 4,
parent_id: 2,
title: 'Elections & Rules',
children: [],
},
{
id: 5,
parent_id: 2,
title: 'Jobs & Opportunities',
children: [],
},
{
id: 6,
parent_id: 2,
title: 'Workplace Gender Equality',
children: [],
},
{
id: 7,
parent_id: 2,
title: 'Sponsorship & Advertising',
children: [
{
id: 8,
parent_id: 7,
title: 'Opportunities',
children: [],
},
],
},
{
id: 9,
parent_id: 2,
title: 'Arc FAQ',
children: [],
},
{
id: 10,
parent_id: 2,
title: 'Arc & SSAF',
children: [],
},
{
id: 11,
parent_id: 2,
title: 'Contact Us',
children: [],
},
],
},
]
const dummyDataImmutable = Immutable.fromJS(dummyData)
const flatDummyData = flatten(dummyData, 'children')
// getChildByIdImmutable(id, Branch, iteratorKey = 'children')
describe('returns immutable child from immutable tree', () => {
const id = 5
const iteratorKey = 'children'
it('should return immutable child if valid key value and immutable tree is provided', () => {
const expected = dummyDataImmutable.getIn([0, 'children', 2]).toJS()
expect(getChildByIdImmutable(id, dummyDataImmutable, iteratorKey).toJS()).toEqual(expected)
})
it('should return false if non-immutable object provided', () => {
const expected = false
expect(getChildByIdImmutable(id, dummyData, iteratorKey)).toEqual(expected)
})
it('should return false if id is not number', () => {
const _id = '5'
expect(getChildByIdImmutable(_id, dummyDataImmutable, iteratorKey)).toEqual(false)
})
it('should return false if optional iteratorKey argument is not string', () => {
const _iteratorKey = 1234
expect(getChildByIdImmutable(id, dummyDataImmutable, _iteratorKey)).toEqual(false)
})
})
// getParentByChildIdImmutable(id, Branch, iteratorKey = 'children')
describe('returns parent from immutable tree by one of its child ids', () => {
const id = 8
const iteratorKey = 'children'
it('should return immutable parent if valid key value and immutable tree is provided', () => {
const expected = dummyDataImmutable.getIn([0, 'children', 4]).toJS()
expect(getParentByChildIdImmutable(id, dummyDataImmutable, iteratorKey).toJS()).toEqual(expected)
})
it('should return false if tree is not an immutable list', () => {
expect(getParentByChildIdImmutable(id, dummyData, iteratorKey)).toEqual(false)
})
it('should return false if id is not number', () => {
const _id = '5'
expect(getParentByChildIdImmutable(_id, dummyDataImmutable, iteratorKey)).toEqual(false)
})
it('should return false if optional iteratorKey argument is not string', () => {
const _iteratorKey = 1234
expect(getParentByChildIdImmutable(id, dummyDataImmutable, _iteratorKey)).toEqual(false)
})
})
//collectValuesImmutable(tree, key, checker, iteratorKey = 'children')
describe('returns array of values from immutable tree by recursing through children checking key with provided function', () => {
const key = 'title'
const checker = () => {
return true
}
const iteratorKey = 'children'
it('should return list of values if valid key and checker function is provided', () => {
const expected = [
'About Us',
'Arc Board',
'Elections & Rules',
'Jobs & Opportunities',
'Workplace Gender Equality',
'Sponsorship & Advertising',
'Opportunities',
'Arc FAQ',
'Arc & SSAF',
'Contact Us',
]
expect(collectValuesImmutable(dummyDataImmutable, key, checker, iteratorKey)).toEqual(expected)
})
it('should return false if tree is not an immutable list', () => {
expect(collectValuesImmutable(dummyData, key, checker, iteratorKey)).toEqual(false)
})
it('should return empty array if search key does not exist', () => {
const _key = 'fake_key'
const expected = []
expect(collectValuesImmutable(dummyDataImmutable, _key, checker, iteratorKey)).toEqual(expected)
})
it('should not break recusrion if iteratorKey points nowhere', () => {
const _iteratorKey = 'children1234'
const expected = ['About Us']
expect(collectValuesImmutable(dummyDataImmutable, key, checker, _iteratorKey)).toEqual(expected)
})
it('should return empty array if checker function never approves', () => {
const _checker = item => {
return false
}
const expected = []
expect(collectValuesImmutable(dummyDataImmutable, key, _checker, iteratorKey)).toEqual(expected)
})
})
//pruneTreeImmutable(tree, key, values, iteratorKey = 'children')
describe('returns immutable tree (branch) by cutting off children whose key matches provided value(s)', () => {
const key = 'parent_id'
const values = [2]
const iteratorKey = 'children'
it('should return immutable tree if valid key value and immutable tree is provided', () => {
const expected = dummyDataImmutable.getIn([0, 'title'])
expect(pruneTreeImmutable(dummyDataImmutable, key, values, iteratorKey).getIn([0, 'title'])).toEqual(expected)
})
it('should return immutable tree even if values are not array', () => {
const _values = 2
const expected = dummyDataImmutable.getIn([0, 'title'])
expect(pruneTreeImmutable(dummyDataImmutable, key, _values, iteratorKey).getIn([0, 'title'])).toEqual(expected)
})
it('should return same immutable tree if key is invalid', () => {
const _key = 'parent_id1234'
const expected = dummyDataImmutable.toJS()
expect(pruneTreeImmutable(dummyDataImmutable, _key, values, iteratorKey).toJS()).toEqual(expected)
})
it('should return same immutable tree if iteratorKey is invalid', () => {
const _iteratorKey = 'children1234'
const expected = dummyDataImmutable.toJS()
expect(pruneTreeImmutable(dummyDataImmutable, key, values, _iteratorKey).toJS()).toEqual(expected)
})
it('should return expected immutable tree even if value is undefined or null etc.', () => {
const _values = undefined
const expected = dummyDataImmutable.toJS()
expect(pruneTreeImmutable(dummyDataImmutable, key, _values, iteratorKey).toJS()).toEqual(expected)
})
it('should return false if iteratorKey is not string', () => {
const _iteratorKey = 44
expect(pruneTreeImmutable(dummyDataImmutable, key, values, _iteratorKey)).toEqual(false)
})
it('should return false if tree is not immutable list', () => {
expect(pruneTreeImmutable(dummyData, key, values, iteratorKey)).toEqual(false)
})
})
//getChildByKeyValue(_tree, key, value, iteratorKey = 'children')
describe('returns child by recursing through tree and checking key with value', () => {
const key = 'id'
const value = 8
const iteratorKey = 'children'
it('should return parent object if valid key value and tree is provided', () => {
const expected = dummyData[0]['children'][4]['children'][0]
expect(getChildByKeyValue(dummyData, key, value, iteratorKey)).toEqual(expected)
})
it('should return false if tree is not an array', () => {
expect(getChildByKeyValue(dummyData[0], key, value, iteratorKey)).toEqual(false)
})
it('should return false if key is not a string', () => {
const _key = 44
expect(getChildByKeyValue(dummyData, _key, value, iteratorKey)).toEqual(false)
})
it('should return false if optional iteratorKey argument is not string', () => {
const _iteratorKey = 1234
expect(getParentByChildId(dummyData, key, value, _iteratorKey)).toEqual(false)
})
})
// getParentByChildId(id, Branch, iteratorKey = 'children')
describe('returns parent from tree array/object by one of its child ids', () => {
const id = 8
const iteratorKey = 'children'
it('should return parent object if valid key value and tree is provided', () => {
const expected = dummyData[0]['children'][4]
expect(getParentByChildId(id, dummyData, iteratorKey)).toEqual(expected)
})
it('should return false if tree is not an array', () => {
expect(getParentByChildId(id, dummyData[0], iteratorKey)).toEqual(false)
})
it('should return false if id is not number', () => {
const _id = '8'
expect(getParentByChildId(_id, dummyData, iteratorKey)).toEqual(false)
})
it('should return false if optional iteratorKey argument is not string', () => {
const _iteratorKey = 1234
expect(getParentByChildId(id, dummyData, _iteratorKey)).toEqual(false)
})
})
// collectValuesImmutable(tree, key, checker, iteratorKey = 'children')
describe('returns array of values from tree array/object by recursing through children checking key with provided function', () => {
const key = 'title'
const checker = item => {
return true
}
const iteratorKey = 'children'
it('should return list of values if valid key and checker function is provided', () => {
const expected = [
'About Us',
'Arc Board',
'Elections & Rules',
'Jobs & Opportunities',
'Workplace Gender Equality',
'Sponsorship & Advertising',
'Opportunities',
'Arc FAQ',
'Arc & SSAF',
'Contact Us',
]
expect(collectValues(dummyData, key, checker, iteratorKey)).toEqual(expected)
})
it('should return false if tree is not an immutable list', () => {
expect(collectValues(dummyData[0], key, checker)).toEqual(false)
})
it('should return empty array if search key does not exist', () => {
const _key = 'fake_key'
const expected = []
expect(collectValues(dummyData, _key, checker)).toEqual(expected)
})
it('should not break recusrion if iteratorKey points nowhere', () => {
const _iteratorKey = 'children1234'
const expected = ['About Us']
expect(collectValues(dummyData, key, checker, _iteratorKey)).toEqual(expected)
})
it('should return empty array if checker function never approves', () => {
const _checker = item => {
return false
}
const expected = []
expect(collectValues(dummyData, key, _checker)).toEqual(expected)
})
})
//pruneTreeImmutable(tree, key, values, iteratorKey = 'children')
describe('returns new tree (branch) by cutting off children whose key matches provided value(s)', () => {
const iteratorKey = 'children'
const key = 'parent_id'
const values = [2]
it('should return tree array/object if valid key value and tree array/object is provided', () => {
const expected = dummyData[0]['title']
expect(pruneTree(dummyData, key, values, iteratorKey)[0]['title']).toEqual(expected)
})
it('should return tree array/object even if values are not array', () => {
const _values = 2
const expected = dummyData[0]['title']
expect(pruneTree(dummyData, key, _values, iteratorKey)[0]['title']).toEqual(expected)
})
it('should return same tree array/object if key is invalid', () => {
const _key = 'parent_id1234'
const expected = dummyData
expect(pruneTree(dummyData, _key, values, iteratorKey)).toEqual(expected)
})
it('should return same tree array/object if iteratorKey is invalid', () => {
const _iteratorKey = 'children1234'
const expected = dummyData
expect(pruneTree(dummyData, key, values, _iteratorKey)).toEqual(expected)
})
it('should return expected tree array/object even if value is undefined or null etc.', () => {
const _values = undefined
const expected = dummyData
expect(pruneTree(dummyData, key, _values, iteratorKey)).toEqual(expected)
})
it('should return false if iteratorKey is not string', () => {
const _iteratorKey = 42
expect(pruneTree(dummyData, key, values, _iteratorKey)).toEqual(false)
})
it('should return false if tree is not immutable list', () => {
expect(pruneTree(dummyData[0], key, values, iteratorKey)).toEqual(false)
})
})
//flatten(tree, iteratorKey = 'children')
describe('returns flattened array of children from tree array/object', () => {
it('should return flat array if provided with valid tree array/object and iteratorKey', () => {
const input1 = dummyData
const input2 = 'children'
const expected = dummyData[0]['children'][7]['title']
expect(flatten(input1, input2)[9]['title']).toEqual(expected)
})
it('should return false if tree is not array', () => {
const input1 = dummyData[0]
const input2 = 'children'
const expected = false
expect(flatten(input1, input2)).toEqual(expected)
})
it('should return false if iteratorKey is not string', () => {
const input1 = dummyData
const input2 = 44
const expected = false
expect(flatten(input1, input2)).toEqual(expected)
})
})
//inflate(FlatTree, idTag = 'id', parentTag = 'parent_id', childrenTag = 'children')
describe('returns flattened array of children from tree array/object', () => {
it('should return flat array if provided with valid tree array/object and iteratorKey', () => {
expect(inflate(flatDummyData, 'id', 'parent_id', 'children')).toEqual(dummyData)
})
it('should return false if tree is not array', () => {
const input1 = flatDummyData[0]
expect(inflate(input1, 'id', 'parent_id', 'children')).toEqual(false)
})
it('should return false if idTag is not string', () => {
expect(inflate(flatDummyData, 42, 'parent_id', 'children')).toEqual(false)
expect(inflate(flatDummyData, true, 'parent_id', 'children')).toEqual(false)
expect(inflate(flatDummyData, null, 'parent_id', 'children')).toEqual(false)
expect(inflate(flatDummyData, {}, 'parent_id', 'children')).toEqual(false)
expect(inflate(flatDummyData, function() {}, 'parent_id', 'children')).toEqual(false)
})
it('should return false if parentTag is not string', () => {
expect(inflate(flatDummyData, 'id', 42, 'children')).toEqual(false)
expect(inflate(flatDummyData, 'id', true, 'children')).toEqual(false)
expect(inflate(flatDummyData, 'id', null, 'children')).toEqual(false)
expect(inflate(flatDummyData, 'id', {}, 'children')).toEqual(false)
expect(inflate(flatDummyData, 'id', function() {}, 'children')).toEqual(false)
})
it('should return false if childrenTag is not string', () => {
expect(inflate(flatDummyData, 'id', 'parent_id', 42)).toEqual(false)
expect(inflate(flatDummyData, 'id', 'parent_id', true)).toEqual(false)
expect(inflate(flatDummyData, 'id', 'parent_id', null)).toEqual(false)
expect(inflate(flatDummyData, 'id', 'parent_id', {})).toEqual(false)
expect(inflate(flatDummyData, 'id', 'parent_id', function() {})).toEqual(false)
})
})
const tree = [
{
title: 'a',
children: [
{
title: 'a.a',
},
{
title: 'a.b',
},
{
title: 'a.c',
},
],
},
{
title: 'c',
},
{
title: 'b',
children: [
{
title: 'b.c',
},
{
title: 'b.b',
},
{
title: 'b.a',
},
],
},
]
describe('sortByKey', () => {
it('should sort deeply', () => {
const expected = [
{
title: 'a',
children: [
{
title: 'a.a',
},
{
title: 'a.b',
},
{
title: 'a.c',
},
],
},
{
title: 'b',
children: [
{
title: 'b.a',
},
{
title: 'b.b',
},
{
title: 'b.c',
},
],
},
{
title: 'c',
},
]
expect(sortByKey(tree, 'title')).toEqual(expected)
})
it('is immutable', () => {
const input = JSON.stringify(tree)
sortByKey(tree, 'title')
const expected = JSON.stringify(tree)
expect(input).toEqual(expected)
})
})