UNPKG

@bigfishtv/cockpit

Version:

513 lines (451 loc) 15.4 kB
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) }) })