Skip to content

Commit 5ae2360

Browse files
loic-sharmatomzo
authored andcommitted
Add package deletion service tests
upstream cherry-pick 896f145
1 parent 2443f76 commit 5ae2360

File tree

1 file changed

+115
-0
lines changed

1 file changed

+115
-0
lines changed
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
using System.Threading.Tasks;
2+
using BaGet.Core.Configuration;
3+
using BaGet.Core.Services;
4+
using Microsoft.Extensions.Logging;
5+
using Microsoft.Extensions.Options;
6+
using Moq;
7+
using NuGet.Packaging.Core;
8+
using NuGet.Versioning;
9+
using Xunit;
10+
11+
namespace BaGet.Core.Tests.Services
12+
{
13+
public class PackageDeletionServiceTests
14+
{
15+
private static readonly string PackageId = "Package";
16+
private static readonly NuGetVersion PackageVersion = new NuGetVersion("1.0.0");
17+
18+
private readonly Mock<IPackageService> _packages;
19+
private readonly Mock<IPackageStorageService> _storage;
20+
21+
private readonly BaGetOptions _options;
22+
private readonly PackageDeletionService _target;
23+
24+
public PackageDeletionServiceTests()
25+
{
26+
_packages = new Mock<IPackageService>();
27+
_storage = new Mock<IPackageStorageService>();
28+
_options = new BaGetOptions();
29+
30+
var optionsSnapshot = new Mock<IOptionsSnapshot<BaGetOptions>>();
31+
optionsSnapshot.Setup(o => o.Value).Returns(_options);
32+
33+
_target = new PackageDeletionService(
34+
_packages.Object,
35+
_storage.Object,
36+
optionsSnapshot.Object,
37+
Mock.Of<ILogger<PackageDeletionService>>());
38+
}
39+
40+
[Theory]
41+
[InlineData(false)]
42+
[InlineData(true)]
43+
public async Task WhenUnlist_ReturnsTrueOnlyIfPackageExists(bool packageExists)
44+
{
45+
// Arrange
46+
_options.PackageDeletionBehavior = PackageDeletionBehavior.Unlist;
47+
48+
_packages
49+
.Setup(p => p.UnlistPackageAsync(new PackageIdentity(PackageId, PackageVersion)))
50+
.ReturnsAsync(packageExists);
51+
52+
// Act
53+
var result = await _target.TryDeletePackageAsync(new PackageIdentity(PackageId, PackageVersion));
54+
55+
// Assert
56+
Assert.Equal(packageExists, result);
57+
58+
_packages.Verify(
59+
p => p.UnlistPackageAsync(new PackageIdentity(PackageId, PackageVersion)),
60+
Times.Once);
61+
62+
_packages.Verify(
63+
p => p.HardDeletePackageAsync(It.IsAny<PackageIdentity>()),
64+
Times.Never);
65+
_storage.Verify(
66+
s => s.DeleteAsync(It.IsAny<PackageIdentity>()),
67+
Times.Never);
68+
}
69+
70+
[Theory]
71+
[InlineData(false)]
72+
[InlineData(true)]
73+
74+
public async Task WhenHardDelete_ReturnsTrueOnlyIfPackageExists(bool packageExists)
75+
{
76+
// Arrange
77+
_options.PackageDeletionBehavior = PackageDeletionBehavior.HardDelete;
78+
79+
var step = 0;
80+
var databaseStep = -1;
81+
var storageStep = -1;
82+
83+
_packages
84+
.Setup(p => p.HardDeletePackageAsync(new PackageIdentity(PackageId, PackageVersion)))
85+
.Callback(() => databaseStep = step++)
86+
.ReturnsAsync(packageExists);
87+
88+
_storage
89+
.Setup(s => s.DeleteAsync(new PackageIdentity(PackageId, PackageVersion)))
90+
.Callback(() => storageStep = step++)
91+
.Returns(Task.CompletedTask);
92+
93+
// Act
94+
var result = await _target.TryDeletePackageAsync(new PackageIdentity(PackageId, PackageVersion));
95+
96+
// Assert - The database step MUST happen before the storage step.
97+
Assert.Equal(packageExists, result);
98+
Assert.Equal(0, databaseStep);
99+
Assert.Equal(1, storageStep);
100+
101+
// The storage deletion should happen even if the package couldn't
102+
// be found in the database. This ensures consistency.
103+
_packages.Verify(
104+
p => p.HardDeletePackageAsync(new PackageIdentity(PackageId, PackageVersion)),
105+
Times.Once);
106+
_storage.Verify(
107+
s => s.DeleteAsync(new PackageIdentity(PackageId, PackageVersion)),
108+
Times.Once);
109+
110+
_packages.Verify(
111+
p => p.UnlistPackageAsync(It.IsAny<PackageIdentity>()),
112+
Times.Never);
113+
}
114+
}
115+
}

0 commit comments

Comments
 (0)