@@ -17,6 +17,13 @@ import { CategoryNode } from '@daffodil/navigation/driver/magento';
1717
1818import { getCategoryNodeFragment } from './category-node' ;
1919
20+ type CategoryNodeWithExtraField = CategoryNode & {
21+ extra_field : string ;
22+ children ?: Array < CategoryNode & {
23+ extra_field : string ;
24+ } > ;
25+ } ;
26+
2027const generateMagentoCategoryTree = ( id : CategoryNode [ 'uid' ] ) : CategoryNode => ( {
2128 __typename : 'CategoryTree' ,
2229 uid : id ,
@@ -196,6 +203,75 @@ describe('Navigation | Driver | Magento | getCategoryNodeFragment', () => {
196203 } ) ;
197204 } ) ;
198205
206+ describe ( 'when extra fragments are provided' , ( ) => {
207+ const extraFragment = gql `
208+ fragment extraFragment on CategoryTree {
209+ extra_field
210+ }
211+ ` ;
212+
213+ let query : DocumentNode ;
214+ let response : Observable < Apollo . QueryResult < { categoryList : CategoryNodeWithExtraField } > > ;
215+ let extraFieldNavigationTree : CategoryNodeWithExtraField ;
216+
217+ beforeEach ( ( ) => {
218+ const fragment = getCategoryNodeFragment ( 1 , [ extraFragment ] ) ;
219+
220+ query = gql `
221+ query TestQuery {
222+ categoryList {
223+ ...recursiveCategoryNode
224+ }
225+ }
226+ ${ fragment }
227+ ` ;
228+
229+ extraFieldNavigationTree = {
230+ ...generateMagentoCategoryTree ( '2' ) ,
231+ extra_field : 'root value' ,
232+ children_count : 1 ,
233+ children : [ {
234+ ...childlessNavigationTree ,
235+ extra_field : 'child value' ,
236+ } ] ,
237+ } ;
238+
239+ response = apollo . query ( { query } ) ;
240+ } ) ;
241+
242+ it ( 'should spread the extra fragments into every level of the tree, including the deepest' , ( ) => {
243+ const depth = 3 ;
244+ const fragment = getCategoryNodeFragment ( depth , [ extraFragment ] ) ;
245+
246+ let selectionSet = ( < any > fragment . definitions [ 0 ] ) . selectionSet ;
247+ let levels = 0 ;
248+
249+ while ( selectionSet ) {
250+ expect ( selectionSet . selections . some ( selection =>
251+ selection . kind === 'FragmentSpread' && selection . name . value === 'extraFragment' ,
252+ ) ) . toBeTrue ( ) ;
253+ levels ++ ;
254+ selectionSet = selectionSet . selections . find ( selection =>
255+ selection . kind === 'Field' && selection . name . value === 'children' ,
256+ ) ?. selectionSet ;
257+ }
258+
259+ expect ( levels ) . toEqual ( depth + 1 ) ;
260+ } ) ;
261+
262+ it ( 'should query extra fragment fields on the deepest nodes of the tree' , done => {
263+ response . subscribe ( resp => {
264+ expect ( resp . data . categoryList . extra_field ) . toEqual ( 'root value' ) ;
265+ expect ( resp . data . categoryList . children [ 0 ] . extra_field ) . toEqual ( 'child value' ) ;
266+ done ( ) ;
267+ } ) ;
268+
269+ const op = controller . expectOne ( 'TestQuery' ) ;
270+
271+ op . flushData ( { categoryList : extraFieldNavigationTree } ) ;
272+ } ) ;
273+ } ) ;
274+
199275 //todo: remove this test when this bug is fixed: https://github.com/magento/magento2/issues/31086
200276 //This test only exists to test the workaround.
201277 it ( 'should not use nested fragments' , ( ) => {
0 commit comments