From a469a0d911eed8408b415656f4b1e930833dfccf Mon Sep 17 00:00:00 2001 From: Bruno Lemos Date: Thu, 16 Mar 2017 12:54:40 -0300 Subject: [PATCH] Fixed map subtraction function + Added test on it --- package.json | 5 ++- src/store/middlewares/firebase/helpers.js | 23 +++++----- .../middlewares/firebase/helpers.test.js | 43 +++++++++++++++++++ 3 files changed, 59 insertions(+), 12 deletions(-) create mode 100644 src/store/middlewares/firebase/helpers.test.js diff --git a/package.json b/package.json index e4a889d0..f334defd 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,9 @@ "whatwg-fetch": "^2.0.3" }, "jest": { - "preset": "jest-react-native" + "preset": "jest-react-native", + "moduleFileExtensions": ["js"], + "moduleDirectories": ["node_modules", "web/node_modules"], + "testRegex": "/(web/src|src)/.*\\.test\\.js$" } } diff --git a/src/store/middlewares/firebase/helpers.js b/src/store/middlewares/firebase/helpers.js index 29bc7e46..744509c3 100644 --- a/src/store/middlewares/firebase/helpers.js +++ b/src/store/middlewares/firebase/helpers.js @@ -159,31 +159,32 @@ export function getObjectFilteredByMap(object, map) { } export function getMapSubtractedByMap(mapA, mapB) { - if (mapB === true) return mapA === undefined ? false : mapA; - if (mapB === false) return mapA === undefined ? true : mapA; + if (mapA === undefined) return null; + if (mapB === undefined) return mapA; + if (mapB === true || mapB === false) return mapA === mapB ? null : mapA; if (!isObjectOrMap(mapA) || !isObjectOrMap(mapB)) return null; if (sizeOf(mapB) === 0) { return null; } - // avoid conflicts, e.g. both mapA and mapB has false items - // this way we avoid end up with both true and false values - if (sizeOf(mapA) > 0 && sizeOf(mapB) > 0) { - return mapA; - } - let newMap = mapA; + let removeAnyField = false; - forEach(mapB, (_value, field) => { - const value = getMapSubtractedByMap(get(mapA, field), get(mapB, field)); - if (value === null || (isObjectOrMap(value) && sizeOf(value) === 0)) { + forEach(mapB, (mapBValue, field) => { + const value = getMapSubtractedByMap(get(mapA, field), mapBValue); + if (value === null || value === undefined) { newMap = remove(newMap, field); + removeAnyField = true; } else { newMap = set(newMap, field, value); } }); + if (removeAnyField && sizeOf(newMap) === 0) { + return null; + } + return newMap; } diff --git a/src/store/middlewares/firebase/helpers.test.js b/src/store/middlewares/firebase/helpers.test.js new file mode 100644 index 00000000..65ee2989 --- /dev/null +++ b/src/store/middlewares/firebase/helpers.test.js @@ -0,0 +1,43 @@ +import { getMapSubtractedByMap } from './helpers'; + +const mapA = { + a: {}, + b: {}, + c: undefined, + d: { d: false }, + e: { e: false }, + f: { f: true }, + g: { g: true }, + h: { h: true, hh: true }, + i: { + i1: {}, + i2: { '*': { a: false, b: false } }, + }, +}; + +const mapB = { + a: {}, + b: undefined, + c: {}, + d: { d: false }, + e: { e: true }, + f: { f: false }, + g: { g: true }, + h: { h: true }, + i: { + i1: {}, + i2: { '*': { c: false, d: false } }, + }, +}; + +test('It subtracts a map from another map', () => { + expect(getMapSubtractedByMap(mapA, mapB)).toEqual({ + b: {}, + e: { e: false }, + f: { f: true }, + h: { hh: true }, + i: { + i2: { '*': { a: false, b: false } }, + }, + }); +});