Skip to content

Commit a083d24

Browse files
authored
Ensure the registration index is sorted by version (loic-sharma#535)
The registration index is ordered by version as expected by the UI. Fixes loic-sharma#534
1 parent 63d7633 commit a083d24

File tree

2 files changed

+70
-4
lines changed

2 files changed

+70
-4
lines changed

src/BaGet.Core/Metadata/RegistrationBuilder.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public RegistrationBuilder(IUrlGenerator url)
1616

1717
public virtual BaGetRegistrationIndexResponse BuildIndex(PackageRegistration registration)
1818
{
19-
var versions = registration.Packages.Select(p => p.Version).ToList();
19+
var sortedPackages = registration.Packages.OrderBy(p => p.Version).ToList();
2020

2121
// TODO: Paging of registration items.
2222
// "Un-paged" example: https://api.nuget.org/v3/registration3/newtonsoft.json/index.json
@@ -33,9 +33,9 @@ public virtual BaGetRegistrationIndexResponse BuildIndex(PackageRegistration reg
3333
{
3434
RegistrationPageUrl = _url.GetRegistrationIndexUrl(registration.PackageId),
3535
Count = registration.Packages.Count(),
36-
Lower = versions.Min().ToNormalizedString().ToLowerInvariant(),
37-
Upper = versions.Max().ToNormalizedString().ToLowerInvariant(),
38-
ItemsOrNull = registration.Packages.Select(ToRegistrationIndexPageItem).ToList(),
36+
Lower = sortedPackages.First().Version.ToNormalizedString().ToLowerInvariant(),
37+
Upper = sortedPackages.Last().Version.ToNormalizedString().ToLowerInvariant(),
38+
ItemsOrNull = sortedPackages.Select(ToRegistrationIndexPageItem).ToList(),
3939
}
4040
}
4141
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Moq;
4+
using NuGet.Versioning;
5+
using Xunit;
6+
7+
namespace BaGet.Core.Tests.Metadata
8+
{
9+
public class RegistrationBuilderTests
10+
{
11+
private readonly Mock<IUrlGenerator> _urlGenerator;
12+
13+
public RegistrationBuilderTests()
14+
{
15+
_urlGenerator = new Mock<IUrlGenerator>();
16+
}
17+
18+
[Fact]
19+
public void TheRegistrationIndexResponseIsSortedByVersion()
20+
{
21+
// Arrange
22+
var packageId = "BaGet.Test";
23+
var authors = new string[] { "test" };
24+
25+
var packages = new List<Package>
26+
{
27+
GetTestPackage(packageId, "3.1.0"),
28+
GetTestPackage(packageId, "10.0.5"),
29+
GetTestPackage(packageId, "3.2.0"),
30+
GetTestPackage(packageId, "3.1.0-pre"),
31+
GetTestPackage(packageId, "1.0.0-beta1"),
32+
GetTestPackage(packageId, "1.0.0"),
33+
};
34+
35+
var registration = new PackageRegistration(packageId, packages);
36+
37+
var registrationBuilder = new RegistrationBuilder(_urlGenerator.Object);
38+
39+
// Act
40+
var response = registrationBuilder.BuildIndex(registration);
41+
42+
// Assert
43+
Assert.Equal(packages.Count, response.Pages[0].ItemsOrNull.Count);
44+
var index = 0;
45+
foreach (var package in packages.OrderBy(p => p.Version))
46+
{
47+
Assert.Equal(package.Version.ToFullString(), response.Pages[0].ItemsOrNull[index++].PackageMetadata.Version);
48+
}
49+
}
50+
51+
/// <summary>
52+
/// Create a fake <see cref="Package"></see> with the minimum metadata needed by the <see cref="RegistrationBuilder"></see>.
53+
/// </summary>
54+
private Package GetTestPackage(string packageId, string version)
55+
{
56+
return new Package
57+
{
58+
Id = packageId,
59+
Authors = new string[] { "test" },
60+
PackageTypes = new List<PackageType> { new PackageType { Name = "test" } },
61+
Dependencies = new List<PackageDependency> { },
62+
Version = new NuGetVersion(version),
63+
};
64+
}
65+
}
66+
}

0 commit comments

Comments
 (0)