From 5d0e32bcf93c5422398a429bbac81db8f18e2ced Mon Sep 17 00:00:00 2001 From: Vesa Luusua Date: Thu, 9 Mar 2017 17:01:56 +0200 Subject: [PATCH] fix: empty array as relationship broke denormalization --- src/util/data.js | 18 ++++++++++++------ src/util/data.test.js | 21 +++++++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/util/data.js b/src/util/data.js index c8177263..9b000659 100644 --- a/src/util/data.js +++ b/src/util/data.js @@ -85,13 +85,19 @@ export const denormalisedEntities = (entities, type, ids) => { // an array of objects. We want to keep that form in the final // result. const hasMultipleRefs = Array.isArray(relRef.data); - const refs = hasMultipleRefs ? relRef.data : [relRef.data]; - const relIds = refs.map(ref => ref.id); - const relType = refs[0].type; - const rels = denormalisedEntities(entities, relType, relIds); + const multipleRefsEmpty = hasMultipleRefs && relRef.data.length === 0; + if (!relRef.data || multipleRefsEmpty) { + // eslint-disable-next-line no-param-reassign + ent[relName] = hasMultipleRefs ? [] : null; + } else { + const refs = hasMultipleRefs ? relRef.data : [relRef.data]; + const relIds = refs.map(ref => ref.id); + const relType = refs[0].type; + const rels = denormalisedEntities(entities, relType, relIds); - // eslint-disable-next-line no-param-reassign - ent[relName] = hasMultipleRefs ? rels : rels[0]; + // eslint-disable-next-line no-param-reassign + ent[relName] = hasMultipleRefs ? rels : rels[0]; + } return ent; }, entityData, diff --git a/src/util/data.test.js b/src/util/data.test.js index 34ab4dbb..e5a3e50b 100644 --- a/src/util/data.test.js +++ b/src/util/data.test.js @@ -272,5 +272,26 @@ describe('data utils', () => { listing2, ]); }); + it('denormalises multiple relationships when relationship data is empty', () => { + const user1 = createUser('user1'); + const listing1 = createListing('listing1'); + const listing1Relationships = { + author: { data: null }, + images: { data: [] }, + }; + const listing1WithRelationships = { ...listing1, relationships: listing1Relationships }; + const listing2 = createListing('listing2'); + const listing3 = createListing('listing3'); + const entities = { + listing: { listing1: listing1WithRelationships, listing2, listing3 }, + user: { user1 }, + }; + const ids = [listing1.id, listing2.id]; + + expect(denormalisedEntities(entities, 'listing', ids)).toEqual([ + { ...listing1, author: null, images: [] }, + listing2, + ]); + }); }); });