diff --git a/src/features/application-menu/main/menu-items/get-composite/get-composite.test.ts b/src/features/application-menu/main/menu-items/get-composite/get-composite.test.ts index b35a9ac4d2..02cadedc33 100644 --- a/src/features/application-menu/main/menu-items/get-composite/get-composite.test.ts +++ b/src/features/application-menu/main/menu-items/get-composite/get-composite.test.ts @@ -235,6 +235,26 @@ Available parent ids are: }); }); + it("given items with same id and parent id, throws", () => { + const someItem = { + id: "some-id", + parentId: "some-id", + }; + + const someRoot = { + id: "root", + someParentId: undefined, + }; + + const items = [someItem, someRoot]; + + expect(() => { + getComposite({ + source: items, + }); + }).toThrow('Tried to get a composite, but found items with self as parent: "some-id"'); + }); + it("given undefined ids, throws", () => { const root = { someParentId: undefined, diff --git a/src/features/application-menu/main/menu-items/get-composite/get-composite.ts b/src/features/application-menu/main/menu-items/get-composite/get-composite.ts index e24e7656ec..87f5951411 100644 --- a/src/features/application-menu/main/menu-items/get-composite/get-composite.ts +++ b/src/features/application-menu/main/menu-items/get-composite/get-composite.ts @@ -44,12 +44,26 @@ export default ({ filter((x) => getId(x) === undefined), ); - if(undefinedIds.length) { + if (undefinedIds.length) { throw new Error( `Tried to get a composite but encountered ${undefinedIds.length} undefined ids`, ); } + const selfReferencingIds = pipeline( + source, + filter((x) => getId(x) === getParentId(x)), + map(getId), + ); + + if (selfReferencingIds.length) { + throw new Error( + `Tried to get a composite, but found items with self as parent: "${selfReferencingIds.join( + '", ', + )}"`, + ); + } + const duplicateIds = pipeline( source, countBy(getId),