From 54811a1329a6cac69716fca35f93b6e4287f4288 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Tue, 9 Jul 2013 23:38:36 +0200 Subject: [PATCH] Fix: Under certain circumstances multiple releases of a package are shown in list of available packages. --- .../AvailableAddInsViewModelTests.cs | 64 ++++++++++++++++++- .../AddInManager2.Tests/Fakes/FakePackage.cs | 5 ++ .../Src/ViewModel/AvailableAddInsViewModel.cs | 9 +-- .../Src/ViewModel/NuGetAddInsViewModelBase.cs | 2 +- 4 files changed, 71 insertions(+), 9 deletions(-) diff --git a/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/AvailableAddInsViewModelTests.cs b/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/AvailableAddInsViewModelTests.cs index 3604ef6a96..d2df883eff 100644 --- a/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/AvailableAddInsViewModelTests.cs +++ b/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/AvailableAddInsViewModelTests.cs @@ -272,6 +272,68 @@ namespace ICSharpCode.AddInManager2.Tests Assert.That(firstAddIn.Version, Is.EqualTo(_addIn2.Version), "Version of 1st AddIn"); } + [Test] + public void SearchInstallableAddInsWithMultipleReleasesAndDownloadCountSorting() + { + CreateAddIns(); + _addIn1.Enabled = true; + + // Package to be shown in repository + FakePackage fakePackage2 = new FakePackage() + { + Id = _addIn2.Manifest.PrimaryIdentity, + Version = new SemanticVersion(_addIn2.Version), + Tags = SharpDevelopAddInTag + }; + FakePackage fakePackage1 = new FakePackage() + { + Id = _addIn1.Manifest.PrimaryIdentity, + Version = new SemanticVersion(_addIn1.Version), + Tags = SharpDevelopAddInTag, + DownloadCount = 10 + }; + FakePackage fakePackage2_new = new FakePackage() + { + Id = _addIn2_new.Manifest.PrimaryIdentity, + Version = new SemanticVersion(_addIn2_new.Version), + Tags = SharpDevelopAddInTag, + DownloadCount = 20 + }; + + // List of NuGet repositories + List registeredPackageSources = new List(); + registeredPackageSources.Add(new PackageSource("", "Test Repository")); + _services.FakeRepositories.RegisteredPackageSources = registeredPackageSources; + + List registeredPackageRepositories = new List(); + FakeCorePackageRepository remoteRepository = new FakeCorePackageRepository(); + remoteRepository.Source = registeredPackageSources[0].Source; + remoteRepository.ReturnedPackages = (new IPackage[] { fakePackage2, fakePackage1, fakePackage2_new }).AsQueryable(); + _services.FakeRepositories.RegisteredPackageRepositories = registeredPackageRepositories; + + // PackageRepository service should return remoteRepository instance + _services.FakeRepositories.GetRepositoryFromSourceCallback = delegate(PackageSource packageSource) + { + return remoteRepository; + }; + + FakeCorePackageRepository localRepository = new FakeCorePackageRepository(); + _services.FakeNuGet.FakeCorePackageManager.LocalRepository = localRepository; + localRepository.ReturnedPackages = (new IPackage[] { }).AsQueryable(); + + var viewModel = new AvailableAddInsViewModel(_services); + viewModel.ReadPackagesAndWaitForUpdate(); + + // There must be only 2 packages in list, because user should see only latest releases + Assert.That(viewModel.AddInPackages.Count, Is.EqualTo(2), "AddIn list must contain 2 items."); + + // fakePackage2_new is the first one, because it has a greater download count + AddInPackageViewModelBase firstAddIn = viewModel.AddInPackages[0]; + Assert.That(firstAddIn.Id, Is.EqualTo(_addIn2_new.Manifest.PrimaryIdentity), "Primary identity of 1st AddIn"); + Assert.That(firstAddIn.Name, Is.EqualTo(_addIn2_new.Manifest.PrimaryIdentity), "Name of 1st AddIn"); + Assert.That(firstAddIn.Version, Is.EqualTo(_addIn2_new.Version), "Version of 1st AddIn"); + } + // [Test] // public void FilteringOutNonSharpDevelopPackages() // { @@ -335,7 +397,7 @@ namespace ICSharpCode.AddInManager2.Tests { fakePackages[i] = new FakePackage() { - Id = _addIn1.Manifest.PrimaryIdentity + i.ToString(), + Id = _addIn1.Manifest.PrimaryIdentity + i.ToString("00"), Version = new SemanticVersion(_addIn1.Version), Tags = SharpDevelopAddInTag }; diff --git a/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/Fakes/FakePackage.cs b/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/Fakes/FakePackage.cs index 5557c651d7..61490833d5 100644 --- a/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/Fakes/FakePackage.cs +++ b/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/Fakes/FakePackage.cs @@ -182,5 +182,10 @@ namespace ICSharpCode.AddInManager2.Tests.Fakes throw new NotImplementedException(); } } + + public override string ToString() + { + return string.Format("[FakePackage Id={0}, Version={1}]", Id, Version); + } } } diff --git a/src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/AvailableAddInsViewModel.cs b/src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/AvailableAddInsViewModel.cs index 9a371d20b5..ff0ce5c5ac 100644 --- a/src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/AvailableAddInsViewModel.cs +++ b/src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/AvailableAddInsViewModel.cs @@ -50,13 +50,8 @@ namespace ICSharpCode.AddInManager2.ViewModel protected override IEnumerable GetFilteredPackagesBeforePagingResults(IQueryable allPackages) { return base.GetFilteredPackagesBeforePagingResults(allPackages) - .Where(package => package.IsReleaseVersion()) - .DistinctLast(PackageEqualityComparer.Id); - } - - protected override IQueryable OrderPackages(IQueryable packages) - { - return packages.OrderByDescending(package => package.DownloadCount); + .OrderByDescending(package => package.DownloadCount) + .ThenBy(package => package.Id); } protected override void UpdatePrereleaseFilter() diff --git a/src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/NuGetAddInsViewModelBase.cs b/src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/NuGetAddInsViewModelBase.cs index 0682d62999..37d0d605ae 100644 --- a/src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/NuGetAddInsViewModelBase.cs +++ b/src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/NuGetAddInsViewModelBase.cs @@ -143,7 +143,7 @@ namespace ICSharpCode.AddInManager2.ViewModel return _allPackages; } - protected virtual IQueryable OrderPackages(IQueryable packages) + private IQueryable OrderPackages(IQueryable packages) { return packages .OrderBy(package => package.Id);