diff --git a/packages/core-data/src/selectors.ts b/packages/core-data/src/selectors.ts index 76eb3889e80cbc..48c25aaa81a3db 100644 --- a/packages/core-data/src/selectors.ts +++ b/packages/core-data/src/selectors.ts @@ -365,7 +365,7 @@ export const getEntityRecord = createSelector( } const context = query?.context ?? 'default'; - if ( query === undefined ) { + if ( ! query || ! query._fields ) { // If expecting a complete item, validate that completeness. if ( ! queriedState.itemIsComplete[ context ]?.[ key ] ) { return undefined; @@ -375,30 +375,29 @@ export const getEntityRecord = createSelector( } const item = queriedState.items[ context ]?.[ key ]; - if ( item && query._fields ) { - const filteredItem = {}; - const fields = getNormalizedCommaSeparable( query._fields ) ?? []; - for ( let f = 0; f < fields.length; f++ ) { - const field = fields[ f ].split( '.' ); - let value = item; - field.forEach( ( fieldName ) => { - value = value?.[ fieldName ]; - } ); - setNestedValue( filteredItem, field, value ); - } - return filteredItem as EntityRecord; + if ( ! item ) { + return item; } - return item; + const filteredItem = {}; + const fields = getNormalizedCommaSeparable( query._fields ) ?? []; + for ( let f = 0; f < fields.length; f++ ) { + const field = fields[ f ].split( '.' ); + let value = item; + field.forEach( ( fieldName ) => { + value = value?.[ fieldName ]; + } ); + setNestedValue( filteredItem, field, value ); + } + return filteredItem as EntityRecord; } ) as GetEntityRecord, ( state: State, kind, name, recordId, query ) => { const context = query?.context ?? 'default'; + const queriedState = + state.entities.records?.[ kind ]?.[ name ]?.queriedData; return [ - state.entities.records?.[ kind ]?.[ name ]?.queriedData?.items[ - context - ]?.[ recordId ], - state.entities.records?.[ kind ]?.[ name ]?.queriedData - ?.itemIsComplete[ context ]?.[ recordId ], + queriedState?.items[ context ]?.[ recordId ], + queriedState?.itemIsComplete[ context ]?.[ recordId ], ]; } ) as GetEntityRecord; diff --git a/packages/core-data/src/test/selectors.js b/packages/core-data/src/test/selectors.js index 2d9ddb9e657326..f601bc9888e6ba 100644 --- a/packages/core-data/src/test/selectors.js +++ b/packages/core-data/src/test/selectors.js @@ -8,7 +8,6 @@ import deepFreeze from 'deep-freeze'; */ import { getEntityRecord, - __experimentalGetEntityRecordNoResolver, hasEntityRecords, getEntityRecords, getRawEntityRecord, @@ -25,11 +24,7 @@ import { getRevision, } from '../selectors'; -// getEntityRecord and __experimentalGetEntityRecordNoResolver selectors share the same tests. -describe.each( [ - [ getEntityRecord ], - [ __experimentalGetEntityRecordNoResolver ], -] )( '%p', ( selector ) => { +describe( 'getEntityRecord', () => { describe( 'normalizing Post ID passed as recordKey', () => { it( 'normalizes any Post ID recordKey argument to a Number via `__unstableNormalizeArgs` method', async () => { const normalized = getEntityRecord.__unstableNormalizeArgs( [ @@ -70,7 +65,7 @@ describe.each( [ }, }, } ); - expect( selector( state, 'foo', 'bar', 'baz' ) ).toBeUndefined(); + expect( getEntityRecord( state, 'foo', 'bar', 'baz' ) ).toBeUndefined(); } ); it( 'should return undefined for unknown record’s key', () => { @@ -89,7 +84,9 @@ describe.each( [ }, }, } ); - expect( selector( state, 'root', 'postType', 'post' ) ).toBeUndefined(); + expect( + getEntityRecord( state, 'root', 'postType', 'post' ) + ).toBeUndefined(); } ); it( 'should return a record by key', () => { @@ -116,16 +113,98 @@ describe.each( [ }, }, } ); - expect( selector( state, 'root', 'postType', 'post' ) ).toEqual( { - slug: 'post', + expect( getEntityRecord( state, 'root', 'postType', 'post' ) ).toEqual( + { + slug: 'post', + } + ); + } ); + + it( 'should return undefined if no item received, filtered item requested', () => { + const state = deepFreeze( { + entities: { + records: { + root: { + postType: { + queriedData: { + items: {}, + itemIsComplete: {}, + queries: {}, + }, + }, + }, + }, + }, } ); + + expect( + getEntityRecord( state, 'root', 'postType', 'post', { + _fields: 'content', + } ) + ).toBeUndefined(); } ); - it( 'should return null if no item received, filtered item requested', () => {} ); + it( 'should return filtered item if incomplete item received, filtered item requested', () => { + const state = deepFreeze( { + entities: { + records: { + root: { + postType: { + queriedData: { + items: { + default: { + post: { + content: 'chicken', + author: 'bob', + }, + }, + }, + itemIsComplete: {}, + queries: {}, + }, + }, + }, + }, + }, + } ); - it( 'should return filtered item if incomplete item received, filtered item requested', () => {} ); + expect( + getEntityRecord( state, 'root', 'postType', 'post', { + _fields: 'content', + } ) + ).toEqual( { content: 'chicken' } ); + } ); - it( 'should return null if incomplete item received, complete item requested', () => {} ); + it( 'should return undefined if incomplete item received, complete item requested', () => { + const state = deepFreeze( { + entities: { + records: { + root: { + postType: { + queriedData: { + items: { + default: { + post: { + content: 'chicken', + author: 'bob', + }, + }, + }, + itemIsComplete: {}, + queries: {}, + }, + }, + }, + }, + }, + } ); + + expect( + getEntityRecord( state, 'root', 'postType', 'post', { + context: 'default', + } ) + ).toBeUndefined(); + } ); it( 'should return filtered item if complete item received, filtered item requested', () => { const state = deepFreeze( {