Skip to content

Commit 9821300

Browse files
Update the validation admin to consider symbol packages. (#6393)
Update the validation admin to consider symbol packages
1 parent 6c94791 commit 9821300

6 files changed

Lines changed: 114 additions & 17 deletions

File tree

src/NuGetGallery/Areas/Admin/Controllers/ValidationController.cs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Collections.Generic;
66
using System.Linq;
77
using System.Web.Mvc;
8+
using NuGet.Services.Validation;
89
using NuGet.Versioning;
910
using NuGetGallery.Areas.Admin.Services;
1011
using NuGetGallery.Areas.Admin.ViewModels;
@@ -30,17 +31,24 @@ public virtual ActionResult Index()
3031
public virtual ActionResult Search(string q)
3132
{
3233
var packageValidationSets = _validationAdminService.Search(q ?? string.Empty);
34+
var validatedPackages = new List<ValidatedPackageViewModel>();
35+
AppendValidatedPackages(validatedPackages, packageValidationSets, ValidatingType.Package);
36+
AppendValidatedPackages(validatedPackages, packageValidationSets, ValidatingType.SymbolPackage);
3337

34-
// Sort by lexigraphically package ID then put newer stuff on top.
35-
var groups = packageValidationSets
38+
return View(nameof(Index), new ValidationPageViewModel(q, validatedPackages));
39+
}
40+
41+
private void AppendValidatedPackages(List<ValidatedPackageViewModel> validatedPackages, IEnumerable<PackageValidationSet> validationSets, ValidatingType validatingType)
42+
{
43+
var groups = validationSets
44+
.Where(x => x.ValidatingType == validatingType)
3645
.OrderBy(x => x.PackageId)
3746
.ThenByDescending(x => NuGetVersion.Parse(x.PackageNormalizedVersion))
3847
.ThenByDescending(x => x.PackageKey)
3948
.ThenByDescending(x => x.Created)
4049
.ThenByDescending(x => x.Key)
4150
.GroupBy(x => x.PackageKey);
4251

43-
var validatedPackages = new List<ValidatedPackageViewModel>();
4452
foreach (var group in groups)
4553
{
4654
foreach (var set in group)
@@ -51,13 +59,10 @@ public virtual ActionResult Search(string q)
5159
.ThenByDescending(x => x.ValidationStatusTimestamp)
5260
.ToList();
5361
}
54-
55-
var deletedStatus = _validationAdminService.GetPackageDeletedStatus(group.Key);
56-
var validatedPackage = new ValidatedPackageViewModel(group.ToList(), deletedStatus);
62+
var deletedStatus = _validationAdminService.GetDeletedStatus(group.Key, validatingType);
63+
var validatedPackage = new ValidatedPackageViewModel(group.ToList(), deletedStatus, validatingType);
5764
validatedPackages.Add(validatedPackage);
5865
}
59-
60-
return View(nameof(Index), new ValidationPageViewModel(q, validatedPackages));
6166
}
6267
}
6368
}

src/NuGetGallery/Areas/Admin/Services/ValidationAdminService.cs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,18 @@ public class ValidationAdminService
1616
private readonly IEntityRepository<PackageValidationSet> _validationSets;
1717
private readonly IEntityRepository<PackageValidation> _validations;
1818
private readonly IEntityRepository<Package> _packages;
19+
private readonly IEntityRepository<SymbolPackage> _symbolPackages;
1920

2021
public ValidationAdminService(
2122
IEntityRepository<PackageValidationSet> validationSets,
2223
IEntityRepository<PackageValidation> validations,
23-
IEntityRepository<Package> packages)
24+
IEntityRepository<Package> packages,
25+
IEntityRepository<SymbolPackage> symbolPackages)
2426
{
2527
_validationSets = validationSets ?? throw new ArgumentNullException(nameof(validationSets));
2628
_validations = validations ?? throw new ArgumentNullException(nameof(validations));
2729
_packages = packages ?? throw new ArgumentNullException(nameof(packages));
30+
_symbolPackages = symbolPackages ?? throw new ArgumentNullException(nameof(symbolPackages));
2831
}
2932

3033
/// <summary>
@@ -52,6 +55,19 @@ public IReadOnlyList<PackageValidationSet> Search(string query)
5255
.ToList();
5356
}
5457

58+
public PackageDeletedStatus GetDeletedStatus(int key, ValidatingType validatingType)
59+
{
60+
switch (validatingType)
61+
{
62+
case ValidatingType.Package:
63+
return GetPackageDeletedStatus(key);
64+
case ValidatingType.SymbolPackage:
65+
return GetSymbolPackageDeletedStatus(key);
66+
default:
67+
return PackageDeletedStatus.Unknown;
68+
}
69+
}
70+
5571
/// <summary>
5672
/// Determines if deleted status of the provided package key. This method is unable to differentiate between
5773
/// a hard deleted package and a package that never existed in the first place. Therefore,
@@ -76,6 +92,25 @@ public PackageDeletedStatus GetPackageDeletedStatus(int packageKey)
7692
return PackageDeletedStatus.NotDeleted;
7793
}
7894

95+
public PackageDeletedStatus GetSymbolPackageDeletedStatus(int symbolPackageKey)
96+
{
97+
var symbolPackage = _symbolPackages
98+
.GetAll()
99+
.Where(x => x.Key == symbolPackageKey)
100+
.FirstOrDefault();
101+
102+
if (symbolPackage == null)
103+
{
104+
return PackageDeletedStatus.Unknown;
105+
}
106+
else if (symbolPackage.StatusKey == PackageStatus.Deleted)
107+
{
108+
return PackageDeletedStatus.SoftDeleted;
109+
}
110+
111+
return PackageDeletedStatus.NotDeleted;
112+
}
113+
79114
private void SearchByValidationSetTrackingId(Dictionary<long, PackageValidationSet> validationSets, string line)
80115
{
81116
if (Guid.TryParse(line, out Guid guid))

src/NuGetGallery/Areas/Admin/ViewModels/PackageValidationViewModel.cs renamed to src/NuGetGallery/Areas/Admin/ViewModels/ValidatedPackageViewModel.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,23 @@ namespace NuGetGallery.Areas.Admin.ViewModels
1010
{
1111
public class ValidatedPackageViewModel
1212
{
13-
public ValidatedPackageViewModel(IReadOnlyList<PackageValidationSet> validationSets, PackageDeletedStatus deletedStatus)
13+
public ValidatedPackageViewModel(IReadOnlyList<PackageValidationSet> validationSets, PackageDeletedStatus deletedStatus, ValidatingType validatingType)
1414
{
1515
var first = validationSets.First();
1616
PackageKey = first.PackageKey;
1717
Id = first.PackageId;
1818
NormalizedVersion = first.PackageNormalizedVersion;
1919
DeletedStatus = deletedStatus;
2020
ValidationSets = validationSets;
21+
ValidatingType = validatingType;
2122
}
2223

2324
public int PackageKey { get; }
2425
public string Id { get; }
2526
public string NormalizedVersion { get; }
2627
public PackageDeletedStatus DeletedStatus { get; }
2728
public IReadOnlyList<PackageValidationSet> ValidationSets { get; }
29+
30+
public ValidatingType ValidatingType { get; }
2831
}
2932
}

src/NuGetGallery/Areas/Admin/Views/Validation/Index.cshtml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,19 +52,19 @@
5252
@switch (package.DeletedStatus)
5353
{
5454
case PackageDeletedStatus.Unknown:
55-
<i>This package was hard deleted.</i><br />
55+
<i>This @package.ValidatingType.ToString().ToLower() was hard deleted.</i><br />
5656
break;
5757
case PackageDeletedStatus.SoftDeleted:
58-
<i>This package was soft deleted.</i><br />
58+
<i>This @package.ValidatingType.ToString().ToLower() was soft deleted.</i><br />
5959
break;
6060
}
6161

62-
<b>Package Key:</b> @package.PackageKey<br />
63-
@if (package.DeletedStatus == PackageDeletedStatus.NotDeleted)
62+
<b>@package.ValidatingType Key:</b> @package.PackageKey<br />
63+
@if (package.DeletedStatus == PackageDeletedStatus.NotDeleted && package.ValidatingType == ValidatingType.Package )
6464
{
6565
<a href="@Url.RevalidatePackage(package.Id, package.NormalizedVersion)">Revalidate</a><br />
6666
}
67-
67+
6868
@if (package.DeletedStatus != PackageDeletedStatus.Unknown)
6969
{
7070
<a href="@Url.Package(package.Id, package.NormalizedVersion)">Package Details</a>

src/NuGetGallery/NuGetGallery.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@
192192
<Compile Include="Areas\Admin\ViewModels\HardDeleteReflowBulkRequest.cs" />
193193
<Compile Include="Areas\Admin\ViewModels\HardDeleteReflowRequest.cs" />
194194
<Compile Include="Areas\Admin\ViewModels\LockPackageViewModel.cs" />
195-
<Compile Include="Areas\Admin\ViewModels\PackageValidationViewModel.cs" />
195+
<Compile Include="Areas\Admin\ViewModels\ValidatedPackageViewModel.cs" />
196196
<Compile Include="Areas\Admin\ViewModels\RevalidationPageViewModel.cs" />
197197
<Compile Include="Areas\Admin\ViewModels\ValidationPageViewModel.cs" />
198198
<Compile Include="Areas\Admin\Services\ISupportRequestService.cs" />

tests/NuGetGallery.Facts/Areas/Admin/Services/ValidationAdminServiceFacts.cs

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,56 @@ public void ReturnsSoftDeletedForDeletedPackage()
7373
}
7474
}
7575

76+
public class TheGetSymbolsPackageDeletedStatusMethod : FactsBase
77+
{
78+
[Fact]
79+
public void ReturnsUnknownForMissingPackage()
80+
{
81+
// Arrange
82+
_symbolPackages
83+
.Setup(x => x.GetAll())
84+
.Returns(() => Enumerable.Empty < SymbolPackage>().AsQueryable());
85+
86+
// Act
87+
var status = _target.GetSymbolPackageDeletedStatus(_symbolPackageKey);
88+
89+
// Assert
90+
Assert.Equal(PackageDeletedStatus.Unknown, status);
91+
}
92+
93+
[Fact]
94+
public void ReturnsNotDeletedForNonDeletedPackage()
95+
{
96+
// Arrange
97+
_symbolPackage.StatusKey = PackageStatus.Available;
98+
99+
// Act
100+
var status = _target.GetSymbolPackageDeletedStatus(_symbolPackageKey);
101+
102+
// Assert
103+
Assert.Equal(PackageDeletedStatus.NotDeleted, status);
104+
}
105+
106+
[Fact]
107+
public void ReturnsSoftDeletedForDeletedPackage()
108+
{
109+
// Arrange
110+
_symbolPackage.StatusKey = PackageStatus.Deleted;
111+
112+
// Act
113+
var status = _target.GetSymbolPackageDeletedStatus(_symbolPackageKey);
114+
115+
// Assert
116+
Assert.Equal(PackageDeletedStatus.SoftDeleted, status);
117+
}
118+
}
119+
76120
public abstract class FactsBase
77121
{
78122
protected readonly int _packageKey;
79123
protected readonly Package _package;
124+
protected readonly int _symbolPackageKey;
125+
protected readonly SymbolPackage _symbolPackage;
80126
protected readonly Guid _validationKey;
81127
protected readonly PackageValidation _validation;
82128
protected readonly int _validationSetKey;
@@ -85,12 +131,15 @@ public abstract class FactsBase
85131
protected readonly Mock<IEntityRepository<PackageValidationSet>> _validationSets;
86132
protected readonly Mock<IEntityRepository<PackageValidation>> _validations;
87133
protected readonly Mock<IEntityRepository<Package>> _packages;
134+
protected readonly Mock<IEntityRepository<SymbolPackage>> _symbolPackages;
88135
protected readonly ValidationAdminService _target;
89136

90137
public FactsBase()
91138
{
92139
_packageKey = 42;
140+
_symbolPackageKey = 420;
93141
_package = new Package { Key = _packageKey };
142+
_symbolPackage = new SymbolPackage() { Key = _symbolPackageKey };
94143
_validationKey = new Guid("ae05c5f9-eb2a-415b-ae42-92829bf201a7");
95144
_validation = new PackageValidation
96145
{
@@ -109,10 +158,14 @@ public FactsBase()
109158
_validationSets = new Mock<IEntityRepository<PackageValidationSet>>();
110159
_validations = new Mock<IEntityRepository<PackageValidation>>();
111160
_packages = new Mock<IEntityRepository<Package>>();
161+
_symbolPackages = new Mock<IEntityRepository<SymbolPackage>>();
112162

113163
_packages
114164
.Setup(x => x.GetAll())
115165
.Returns(() => new[] { _package }.AsQueryable());
166+
_symbolPackages
167+
.Setup(x => x.GetAll())
168+
.Returns(() => new[] { _symbolPackage }.AsQueryable());
116169
_validations
117170
.Setup(x => x.GetAll())
118171
.Returns(() => new[] { _validation }.AsQueryable());
@@ -123,7 +176,8 @@ public FactsBase()
123176
_target = new ValidationAdminService(
124177
_validationSets.Object,
125178
_validations.Object,
126-
_packages.Object);
179+
_packages.Object,
180+
_symbolPackages.Object);
127181
}
128182
}
129183
}

0 commit comments

Comments
 (0)