From 3da6ae43e539ab0935d60578c691c52cae23de04 Mon Sep 17 00:00:00 2001 From: Arlo White Date: Thu, 20 Apr 2017 15:06:36 -0700 Subject: [PATCH] unit test deepValueGetter. fix #596 prop field name with dots. --- src/utils/column-prop-getters.spec.ts | 53 +++++++++++++++++++++++++++ src/utils/column-prop-getters.ts | 15 +++++--- 2 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 src/utils/column-prop-getters.spec.ts diff --git a/src/utils/column-prop-getters.spec.ts b/src/utils/column-prop-getters.spec.ts new file mode 100644 index 000000000..39741adff --- /dev/null +++ b/src/utils/column-prop-getters.spec.ts @@ -0,0 +1,53 @@ +import { deepValueGetter } from './column-prop-getters'; + +describe('deepValueGetter', () => { + + it('should get values one level deep', () => { + let data = { + a: { + value: 123 + } + }; + expect(deepValueGetter(data, 'a.value')).toEqual(123); + }); + + it('should get values two levels deep', () => { + let data = { + a: { + b: { + value: 'foo' + } + } + }; + expect(deepValueGetter(data, 'a.b.value')).toEqual('foo'); + }); + + it('should return empty string on missing nested field', () => { + let data = { + a: {} + }; + expect(deepValueGetter(data, 'a.x.value')).toEqual(''); + }); + + it('should return empty string on missing final field', () => { + let data = { + a: {} + }; + expect(deepValueGetter(data, 'a.value')).toEqual(''); + }); + + it('should return empty string on missing root field', () => { + let data = { + a: {} + }; + expect(deepValueGetter(data, 'x.value')).toEqual(''); + }); + + it('should check for root-level fields with dots in name', () => { + let data = { + "a.b.value": 5 + }; + expect(deepValueGetter(data, 'a.b.value')).toEqual(5); + }); + +}); diff --git a/src/utils/column-prop-getters.ts b/src/utils/column-prop-getters.ts index 030a23a8f..94a428fab 100644 --- a/src/utils/column-prop-getters.ts +++ b/src/utils/column-prop-getters.ts @@ -8,7 +8,7 @@ export type ValueGetter = (obj: any, prop: TableColumnProp) => any; * Always returns the empty string '' * @returns {string} */ -export function emptyStringGetter() { +export function emptyStringGetter(): string { return ''; } @@ -37,7 +37,7 @@ export function getterForProp(prop: TableColumnProp): ValueGetter { * @param index numeric index * @returns {any} or '' if invalid index */ -export function numericIndexGetter(row: any[], index: number) { +export function numericIndexGetter(row: any[], index: number): any { // mimic behavior of deepValueGetter if (!row || index == null) return row; @@ -53,7 +53,7 @@ export function numericIndexGetter(row: any[], index: number) { * @param fieldName field name string * @returns {any} */ -export function shallowValueGetter(obj: object, fieldName: string) { +export function shallowValueGetter(obj: object, fieldName: string): any { if(!obj || !fieldName) return obj; const value = obj[fieldName]; @@ -66,10 +66,15 @@ export function shallowValueGetter(obj: object, fieldName: string) { * @param {object} obj * @param {string} path */ -export function deepValueGetter(obj: object, path: string) { +export function deepValueGetter(obj: object, path: string): any { if(!obj || !path) return obj; - let current = obj; + // check if path matches a root-level field + // { "a.b.c": 123 } + let current = obj[path]; + if (current !== undefined) return current; + + current = obj; const split = path.split('.'); if(split.length) {