Skip to content

Commit 732c082

Browse files
authored
fix(navigation): ensure fragment fields on leaf nodes in magento (#4621)
1 parent b042df7 commit 732c082

2 files changed

Lines changed: 82 additions & 2 deletions

File tree

libs/navigation/driver/magento/src/queries/fragments/category-node/category-node.spec.ts

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ import { CategoryNode } from '@daffodil/navigation/driver/magento';
1717

1818
import { getCategoryNodeFragment } from './category-node';
1919

20+
type CategoryNodeWithExtraField = CategoryNode & {
21+
extra_field: string;
22+
children?: Array<CategoryNode & {
23+
extra_field: string;
24+
}>;
25+
};
26+
2027
const 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', () => {

libs/navigation/driver/magento/src/queries/fragments/category-node/category-node.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,18 @@ const categoryNodeFragment = `
3333
*/
3434
//todo: use nested fragments when this bug is fixed: https://github.com/magento/magento2/issues/31086
3535
export function getCategoryNodeFragment(depth: number = 3, extraFragments: Array<DocumentNode> = []): DocumentNode {
36+
const extraFragmentSpread = daffBuildFragmentNameSpread(...extraFragments);
3637
const fragmentBody = new Array(depth).fill(null).reduce(acc => `
3738
${categoryNodeFragment}
3839
children_count
3940
children {
4041
${acc}
4142
}
42-
${daffBuildFragmentNameSpread(...extraFragments)}
43-
`, categoryNodeFragment);
43+
${extraFragmentSpread}
44+
`, `
45+
${categoryNodeFragment}
46+
${extraFragmentSpread}
47+
`);
4448

4549
return gql`
4650
fragment recursiveCategoryNode on CategoryTree {

0 commit comments

Comments
 (0)