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);
+ }
}
}