From fea0da7cf5952d6c10871c3f3f1fe5c595c8d044 Mon Sep 17 00:00:00 2001 From: Ivo Petrov <48355182+ivaylo-matov@users.noreply.github.com> Date: Mon, 25 Mar 2024 21:18:24 +0000 Subject: [PATCH] Dyn 6551 package manager not preserving sort order after search (#15054) * Package manager not preserving sort order after search fixed * with unit test bug fix + unit test --- .../PackageManagerSearchViewModel.cs | 12 +- ...ckageManagerSearchElementViewModelTests.cs | 105 +++++++++++++++++- 2 files changed, 108 insertions(+), 9 deletions(-) diff --git a/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerSearchViewModel.cs b/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerSearchViewModel.cs index fd57ae6fd81..84776f6f74f 100644 --- a/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerSearchViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerSearchViewModel.cs @@ -272,7 +272,7 @@ public string SearchBoxPrompt } /// - /// Determines whether the the search text box should be displayed. + /// Determines whether the search text box should be displayed. /// /// Returns false if the search state is syncing, /// @@ -639,7 +639,7 @@ private void PopulateMyPackages() List myPackages = new List(); - // We need the user to be logged in, otherwise there is no point in runnig this routine + // We need the user to be logged in, otherwise there is no point in running this routine if (PackageManagerClientViewModel.LoginState != Greg.AuthProviders.LoginState.LoggedIn) { SearchMyResults = new ObservableCollection(myPackages); @@ -708,7 +708,7 @@ public void Sort() /// private void Sort(object searchQuery = null) { - if (searchQuery == null) + if (searchQuery == null || searchQuery as string == "") { this.Sort(); } @@ -763,7 +763,7 @@ private List InitializeNonHostFilter() } /// - /// Toggles `dependecy` and `no dependecy` filters so that both cannot be 'ON' at the same time. + /// Toggles `dependency` and `no dependency` filters so that both cannot be 'ON' at the same time. /// We need both filters to function individually in their 'OFF' states (it's not a simple toggle state switch) /// /// @@ -903,7 +903,7 @@ public bool CanSetSortingDirection(object par) } /// - /// Sets all current filetrs to false + /// Sets all current filters to false /// /// private void ClearAllFilters(object obj) @@ -1351,7 +1351,7 @@ internal IEnumerable GetAllPackages() var isEnabledForInstall = !(Preferences as IDisablePackageLoadingPreferences).DisableCustomPackageLocations; // Filter based on user preference - // A package has depndencies if the number of direct_dependency_ids is more than 1 + // A package has dependencies if the number of direct_dependency_ids is more than 1 var initialResults = LastSync?.Select(x => new PackageManagerSearchElementViewModel(x, PackageManagerClientViewModel.AuthenticationManager.HasAuthProvider, CanInstallPackage(x.Name), isEnabledForInstall)); diff --git a/test/DynamoCoreWpfTests/PackageManager/PackageManagerSearchElementViewModelTests.cs b/test/DynamoCoreWpfTests/PackageManager/PackageManagerSearchElementViewModelTests.cs index 66af5ed181d..8ae630e8e3c 100644 --- a/test/DynamoCoreWpfTests/PackageManager/PackageManagerSearchElementViewModelTests.cs +++ b/test/DynamoCoreWpfTests/PackageManager/PackageManagerSearchElementViewModelTests.cs @@ -264,7 +264,7 @@ public void PackageSearchDialogSearchIntersectAgainstHostFilters() /// /// This unit test will validate the correctness of the Status filter, where /// `New` and `Updated` filters are mutually exclusive - /// `Deprecated` resutls are excluded, unless the filter is turned on + /// `Deprecated` results are excluded, unless the filter is turned on /// [Test] public void PackageSearchDialogSearchTestStatusFilters() @@ -430,7 +430,7 @@ public void PackageSearchDialogSearchTestDependencyFilters() //Dependency Packages List dependencyPackagesName = new List { "DynamoIronPython2.7", "dynamo", "Celery for Dynamo 2.5" }; - //No deoendency Packages + //No dependency Packages List noDependencyPackagesName = new List { "DynamoIronPython2.7", "dynamo", "mise en barre", "Test-PackageDependencyFilter" }; var mockGreg = new Mock(); @@ -538,7 +538,7 @@ public void PackageSearchDialogSearchTestDependencyFilters() Assert.IsFalse(packageManagerSearchViewModel.NonHostFilter[4].OnChecked); } - /// + /// /// This unit test will validate that we can search packages in different languages and they will be found. /// [Test] @@ -602,5 +602,104 @@ public void PackageSearchDialogSearchDifferentLanguage() Assert.That(resultingNodesRussian.Count(), Is.EqualTo(1), "There was no results"); Assert.That(resultingNodesSpanish.Count(), Is.EqualTo(1), "There was no results"); } + + /// + /// This unit test will validate that the search order will not reset on search text clear. + /// + [Test] + public void PackageSearchOrderAfterTextReset() + { + //Arrange + string packageId = "c5ecd20a-d41c-4e0c-8e11-8ddfb953d77f"; + string packageVersionNumber = "1.0.0.0"; + string packageCreatedDateString = "2016 - 12 - 02T13:13:20.135000 + 00:00"; + string formItFilterName = "FormIt"; + + //Packages list + List packageNames = new List { "package 1", "package 2", "package 3", "package 4" }; + List packagesDownloads = new List { 100, 400, 300, 200 }; + List packagesVotes = new List { 50, 60, 90, 40 }; + + var mockGreg = new Mock(); + var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty); + var pmCVM = new Mock(ViewModel, clientmock.Object) { CallBase = true }; + var packageManagerSearchVM = new PackageManagerSearchViewModel(pmCVM.Object); + packageManagerSearchVM.RegisterTransientHandlers(); + + //Add packages + for (int i = 0; i < packageNames.Count; i++) + { + var tmpPackageVersion = new PackageVersion + { + version = packageVersionNumber, + host_dependencies = new List { formItFilterName }, + created = packageCreatedDateString + }; + var tmpPackage = new PackageManagerSearchElementViewModel(new PackageManagerSearchElement(new PackageHeader() + { + _id = packageId, + name = packageNames[i], + versions = new List { tmpPackageVersion }, + votes = packagesVotes[i], + downloads = packagesDownloads[i] + }), false); + packageManagerSearchVM.AddToSearchResults(tmpPackage); + } + + //We need to add the PackageManagerSearchElementViewModel because otherwise the search will crash + packageManagerSearchVM.LastSync = new List(); + foreach (var result in packageManagerSearchVM.SearchResults) + { + packageManagerSearchVM.LastSync.Add(result.SearchElementModel); + } + + //Act - Sort packages by Downloads in descending order + packageManagerSearchVM.SortingKey = PackageSortingKey.Downloads; + packageManagerSearchVM.SortingDirection = PackageSortingDirection.Descending; + packageManagerSearchVM.Sort(); + + //Set search text to a value and then reset + packageManagerSearchVM.SearchText = "package"; + packageManagerSearchVM.SearchAndUpdateResults(); + packageManagerSearchVM.SearchText = string.Empty; + packageManagerSearchVM.SearchAndUpdateResults(); + + bool isOrderedByDownloads = true; + + for (int i = 0; i < packageManagerSearchVM.SearchResults.Count - 1; i++) + { + if (packageManagerSearchVM.SearchResults[i].Downloads < packageManagerSearchVM.SearchResults[i + 1].Downloads) + { + isOrderedByDownloads = false; break; + } + } + + //Assert - validate order by Downloads + Assert.IsTrue(isOrderedByDownloads && packageManagerSearchVM.SearchResults.Count != 0); + + //Act - Sort packages by Votes in ascending order + packageManagerSearchVM.SortingKey = PackageSortingKey.Votes; + packageManagerSearchVM.SortingDirection = PackageSortingDirection.Ascending; + packageManagerSearchVM.Sort(); + + //Set search text to a value and then reset + packageManagerSearchVM.SearchText = "package"; + packageManagerSearchVM.SearchAndUpdateResults(); + packageManagerSearchVM.SearchText = string.Empty; + packageManagerSearchVM.SearchAndUpdateResults(); + + bool isOrderedByVotes = true; + + for (int i = 0; i < packageManagerSearchVM.SearchResults.Count - 1; i++) + { + if (packageManagerSearchVM.SearchResults[i].Votes > packageManagerSearchVM.SearchResults[i + 1].Votes) + { + isOrderedByVotes = false; break; + } + } + + //Assert - validate order by Votes + Assert.IsTrue(isOrderedByVotes && packageManagerSearchVM.SearchResults.Count != 0); + } } }