diff --git a/apps/web/src/app/vault/utils/collection-utils.spec.ts b/apps/web/src/app/vault/utils/collection-utils.spec.ts new file mode 100644 index 00000000000..17c213e151e --- /dev/null +++ b/apps/web/src/app/vault/utils/collection-utils.spec.ts @@ -0,0 +1,28 @@ +import { CollectionView } from "@bitwarden/common/admin-console/models/view/collection.view"; + +import { getNestedCollectionTree } from "./collection-utils"; + +describe("CollectionUtils Service", () => { + describe("getNestedCollectionTree", () => { + it("should return collections properly sorted if provided out of order", () => { + // Arrange + const collections: CollectionView[] = []; + + const parentCollection = new CollectionView(); + parentCollection.name = "Parent"; + + const childCollection = new CollectionView(); + childCollection.name = "Parent/Child"; + + collections.push(childCollection); + collections.push(parentCollection); + + // Act + const result = getNestedCollectionTree(collections); + + // Assert + expect(result[0].node.name).toBe("Parent"); + expect(result[0].children[0].node.name).toBe("Child"); + }); + }); +}); diff --git a/apps/web/src/app/vault/utils/collection-utils.ts b/apps/web/src/app/vault/utils/collection-utils.ts index 8e839398977..bf018b52fc4 100644 --- a/apps/web/src/app/vault/utils/collection-utils.ts +++ b/apps/web/src/app/vault/utils/collection-utils.ts @@ -17,7 +17,9 @@ export function getNestedCollectionTree( // Collections need to be cloned because ServiceUtils.nestedTraverse actively // modifies the names of collections. // These changes risk affecting collections store in StateService. - const clonedCollections = collections.map(cloneCollection); + const clonedCollections = collections + .sort((a, b) => a.name.localeCompare(b.name)) + .map(cloneCollection); const nodes: TreeNode[] = []; clonedCollections.forEach((collection) => {