Skip to content

Commit 3a94836

Browse files
committed
move func tests
1 parent 6fddff4 commit 3a94836

File tree

3 files changed

+315
-297
lines changed

3 files changed

+315
-297
lines changed

test/NuGet.Core.FuncTests/NuGet.XPlat.FuncTest/NuGet.XPlat.FuncTest.csproj

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@
1414
</ItemGroup>
1515

1616
<ItemGroup>
17-
<None Include="..\..\..\src\NuGet.Core\NuGet.Build.Tasks\NuGet.targets"
18-
CopyToOutputDirectory="PreserveNewest" />
17+
<None Include="..\..\..\src\NuGet.Core\NuGet.Build.Tasks\NuGet.targets" CopyToOutputDirectory="PreserveNewest" />
1918
</ItemGroup>
2019

2120
<ItemGroup>
Lines changed: 314 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,314 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
namespace NuGet.CommandLine.Xplat.Tests;
5+
6+
using System;
7+
using System.IO;
8+
using System.Linq;
9+
using System.Threading;
10+
using System.Threading.Tasks;
11+
using FluentAssertions;
12+
using Moq;
13+
using NuGet.CommandLine.XPlat;
14+
using NuGet.CommandLine.XPlat.Commands.Package;
15+
using NuGet.CommandLine.XPlat.Commands.Package.PackageDownload;
16+
using NuGet.Common;
17+
using NuGet.Configuration;
18+
using NuGet.Test.Utility;
19+
using NuGet.Versioning;
20+
using Xunit;
21+
22+
public class PackageDownloadRunnerTests
23+
{
24+
[Fact]
25+
public async Task RunAsync_ExplicitVersionFromLocalFolderSource_SucceedsAsync()
26+
{
27+
// Arrange
28+
using var context = new SimpleTestPathContext();
29+
var sourceDir = Path.Combine(context.WorkingDirectory, "src");
30+
var outputDir = Path.Combine(context.WorkingDirectory, "packages");
31+
Directory.CreateDirectory(sourceDir);
32+
Directory.CreateDirectory(outputDir);
33+
34+
var id = "Contoso.Lib";
35+
var version = "1.2.3";
36+
await SimpleTestPackageUtility.CreateFullPackageAsync(sourceDir, id, version);
37+
38+
var logger = new Mock<ILoggerWithColor>(MockBehavior.Loose);
39+
var settings = new Mock<ISettings>(MockBehavior.Loose);
40+
41+
var args = new PackageDownloadArgs()
42+
{
43+
Packages = [new PackageWithNuGetVersion { Id = id, NuGetVersion = NuGetVersion.Parse(version) }],
44+
OutputDirectory = outputDir,
45+
};
46+
47+
48+
// Act
49+
var result = await PackageDownloadRunner.RunAsync(
50+
args,
51+
logger.Object,
52+
[new(sourceDir)],
53+
settings.Object,
54+
CancellationToken.None);
55+
56+
// Assert
57+
result.Should().Be(PackageDownloadRunner.ExitCodeSuccess);
58+
var installDir = Path.Combine(outputDir, id.ToLowerInvariant(), version);
59+
Directory.Exists(installDir).Should().BeTrue();
60+
Directory.EnumerateFiles(installDir, "*.nupkg").Any().Should().BeTrue();
61+
File.Exists(Path.Combine(installDir, $"{id.ToLowerInvariant()}.{version}.nupkg")).Should().BeTrue();
62+
}
63+
64+
[Fact]
65+
public async Task RunAsync_NoVersionWhenPrereleaseNotIncluded_PicksLatestStable()
66+
{
67+
// Arrange
68+
using var context = new SimpleTestPathContext();
69+
var sourceDir = Path.Combine(context.WorkingDirectory, "src");
70+
var outputDir = Path.Combine(context.WorkingDirectory, "packages");
71+
Directory.CreateDirectory(sourceDir);
72+
Directory.CreateDirectory(outputDir);
73+
74+
var id = "Contoso.Core";
75+
await SimpleTestPackageUtility.CreateFullPackageAsync(sourceDir, id, "1.0.0");
76+
await SimpleTestPackageUtility.CreateFullPackageAsync(sourceDir, id, "1.1.0");
77+
await SimpleTestPackageUtility.CreateFullPackageAsync(sourceDir, id, "2.0.0-beta");
78+
79+
var logger = new Mock<ILoggerWithColor>(MockBehavior.Loose);
80+
var settings = new Mock<ISettings>(MockBehavior.Loose);
81+
82+
var args = new PackageDownloadArgs()
83+
{
84+
Packages = [new PackageWithNuGetVersion { Id = id, NuGetVersion = null }],
85+
OutputDirectory = outputDir,
86+
};
87+
88+
// Act
89+
var result = await PackageDownloadRunner.RunAsync(
90+
args,
91+
logger.Object,
92+
[new PackageSource(sourceDir)],
93+
settings.Object,
94+
CancellationToken.None);
95+
96+
// Assert
97+
result.Should().Be(PackageDownloadRunner.ExitCodeSuccess);
98+
99+
var chosen = Path.Combine(outputDir, id.ToLowerInvariant(), "1.1.0");
100+
var notChosen = Path.Combine(outputDir, id.ToLowerInvariant(), "2.0.0-beta");
101+
Directory.Exists(chosen).Should().BeTrue("latest stable (1.1.0) should be chosen");
102+
Directory.Exists(notChosen).Should().BeFalse("prerelease (2.0.0-beta) should not be chosen");
103+
File.Exists(Path.Combine(chosen, $"{id.ToLowerInvariant()}.1.1.0.nupkg")).Should().BeTrue();
104+
}
105+
106+
[Fact]
107+
public async Task RunAsync_NoVersionWithPrereleaseTrue_PicksHighestIncludingPrerelease()
108+
{
109+
// Arrange
110+
using var context = new SimpleTestPathContext();
111+
var sourceDir = Path.Combine(context.WorkingDirectory, "src");
112+
var outputDir = Path.Combine(context.WorkingDirectory, "packages");
113+
Directory.CreateDirectory(sourceDir);
114+
Directory.CreateDirectory(outputDir);
115+
116+
var id = "Contoso.Preview";
117+
await SimpleTestPackageUtility.CreateFullPackageAsync(sourceDir, id, "1.3.0");
118+
await SimpleTestPackageUtility.CreateFullPackageAsync(sourceDir, id, "2.0.0-beta.2");
119+
120+
var logger = new Mock<ILoggerWithColor>(MockBehavior.Loose);
121+
var settings = new Mock<ISettings>(MockBehavior.Loose);
122+
123+
var args = new PackageDownloadArgs()
124+
{
125+
Packages = [new PackageWithNuGetVersion { Id = id, NuGetVersion = null }],
126+
OutputDirectory = outputDir,
127+
IncludePrerelease = true
128+
};
129+
130+
// Act
131+
var result = await PackageDownloadRunner.RunAsync(
132+
args,
133+
logger.Object,
134+
[new PackageSource(sourceDir)],
135+
settings.Object,
136+
CancellationToken.None);
137+
138+
// Assert
139+
result.Should().Be(PackageDownloadRunner.ExitCodeSuccess);
140+
141+
var chosen = Path.Combine(outputDir, id.ToLowerInvariant(), "2.0.0-beta.2");
142+
Directory.Exists(chosen).Should().BeTrue("IncludePrerelease should allow picking 2.0.0-beta.2");
143+
File.Exists(Path.Combine(chosen, $"{id.ToLowerInvariant()}.2.0.0-beta.2.nupkg")).Should().BeTrue();
144+
}
145+
146+
[Fact]
147+
public async Task RunAsync_NoVersion_PicksHighestAcrossMultipleSources()
148+
{
149+
// Arrange
150+
using var context = new SimpleTestPathContext();
151+
var srcA = Path.Combine(context.WorkingDirectory, "srcA");
152+
var srcB = Path.Combine(context.WorkingDirectory, "srcB");
153+
var outputDir = Path.Combine(context.WorkingDirectory, "packages");
154+
Directory.CreateDirectory(srcA);
155+
Directory.CreateDirectory(srcB);
156+
Directory.CreateDirectory(outputDir);
157+
158+
var id = "Contoso.Toolkit";
159+
await SimpleTestPackageUtility.CreateFullPackageAsync(srcA, id, "1.1.0");
160+
await SimpleTestPackageUtility.CreateFullPackageAsync(srcB, id, "1.2.0");
161+
162+
var logger = new Mock<ILoggerWithColor>(MockBehavior.Loose);
163+
var settings = new Mock<ISettings>(MockBehavior.Loose);
164+
165+
var args = new PackageDownloadArgs()
166+
{
167+
Packages = [new PackageWithNuGetVersion { Id = id, NuGetVersion = null }],
168+
OutputDirectory = outputDir,
169+
};
170+
171+
// Act
172+
var result = await PackageDownloadRunner.RunAsync(
173+
args,
174+
logger.Object,
175+
[new PackageSource(srcA), new PackageSource(srcB)],
176+
settings.Object,
177+
CancellationToken.None);
178+
179+
// Assert
180+
result.Should().Be(PackageDownloadRunner.ExitCodeSuccess);
181+
182+
var chosen = Path.Combine(outputDir, id.ToLowerInvariant(), "1.2.0");
183+
Directory.Exists(chosen).Should().BeTrue("should choose the highest version found across all sources");
184+
File.Exists(Path.Combine(chosen, $"{id.ToLowerInvariant()}.1.2.0.nupkg")).Should().BeTrue();
185+
}
186+
187+
[Fact]
188+
public async Task RunAsync_ExplicitVersionAlreadyInstalled_ShortCircuitsAndSucceeds()
189+
{
190+
// Arrange
191+
using var context = new SimpleTestPathContext();
192+
var sourceDir = Path.Combine(context.WorkingDirectory, "src");
193+
var outputDir = Path.Combine(context.WorkingDirectory, "packages");
194+
Directory.CreateDirectory(sourceDir);
195+
Directory.CreateDirectory(outputDir);
196+
197+
var id = "Contoso.Utils";
198+
var v = "3.4.5";
199+
await SimpleTestPackageUtility.CreateFullPackageAsync(sourceDir, id, v);
200+
201+
var logger = new Mock<ILoggerWithColor>(MockBehavior.Loose);
202+
var settings = new Mock<ISettings>(MockBehavior.Loose);
203+
204+
// First run: install explicit version
205+
var args1 = new PackageDownloadArgs()
206+
{
207+
Packages = [new PackageWithNuGetVersion { Id = id, NuGetVersion = NuGetVersion.Parse(v) }],
208+
LogLevel = LogLevel.Verbose,
209+
OutputDirectory = outputDir,
210+
};
211+
212+
var first = await PackageDownloadRunner.RunAsync(
213+
args1,
214+
logger.Object,
215+
[new PackageSource(sourceDir)],
216+
settings.Object,
217+
CancellationToken.None);
218+
first.Should().Be(ExitCodes.Success);
219+
220+
// Second run: should short-circuit because already installed
221+
var args2 = new PackageDownloadArgs()
222+
{
223+
Packages = [new PackageWithNuGetVersion { Id = id, NuGetVersion = NuGetVersion.Parse(v) }],
224+
OutputDirectory = outputDir,
225+
};
226+
227+
// Act
228+
var second = await PackageDownloadRunner.RunAsync(
229+
args2,
230+
logger.Object,
231+
[new PackageSource(sourceDir)],
232+
settings.Object,
233+
CancellationToken.None);
234+
235+
// Assert
236+
second.Should().Be(PackageDownloadRunner.ExitCodeSuccess);
237+
var installDir = Path.Combine(outputDir, id.ToLowerInvariant(), v);
238+
Directory.Exists(installDir).Should().BeTrue();
239+
File.Exists(Path.Combine(installDir, $"{id.ToLowerInvariant()}.{v}.nupkg")).Should().BeTrue();
240+
logger.Verify(l => l.LogMinimal(It.Is<string>(s => s.Contains("Skipping", StringComparison.OrdinalIgnoreCase))), Times.AtLeastOnce);
241+
}
242+
243+
[Fact]
244+
public async Task RunAsync_WhenAllowInsecureConnectionsFalse_RejectsHttpSource()
245+
{
246+
// Arrange
247+
using var context = new SimpleTestPathContext();
248+
249+
var outputDir = Path.Combine(context.WorkingDirectory, "packages");
250+
Directory.CreateDirectory(outputDir);
251+
252+
var httpSource = "http://contoso/v3/index.json";
253+
var logger = new Mock<ILoggerWithColor>(MockBehavior.Loose);
254+
var settings = new Mock<ISettings>(MockBehavior.Loose);
255+
256+
var args = new PackageDownloadArgs()
257+
{
258+
Packages = [new PackageWithNuGetVersion { Id = "Contoso.Lib", NuGetVersion = null }],
259+
OutputDirectory = outputDir,
260+
};
261+
262+
// Act
263+
var result = await PackageDownloadRunner.RunAsync(
264+
args,
265+
logger.Object,
266+
[new PackageSource(httpSource)],
267+
settings.Object,
268+
CancellationToken.None);
269+
270+
// Assert
271+
result.Should().Be(PackageDownloadRunner.ExitCodeError);
272+
logger.Verify(l => l.LogError(It.Is<string>(s => s.Contains(httpSource, StringComparison.OrdinalIgnoreCase))), Times.AtLeastOnce);
273+
}
274+
275+
[Fact]
276+
public async Task RunAsync_PackageDoesNotExist_ReturnsError()
277+
{
278+
// Arrange
279+
using var context = new SimpleTestPathContext();
280+
var srcA = Path.Combine(context.WorkingDirectory, "emptyA");
281+
var srcB = Path.Combine(context.WorkingDirectory, "emptyB");
282+
var outputDir = Path.Combine(context.WorkingDirectory, "packages");
283+
Directory.CreateDirectory(srcA);
284+
Directory.CreateDirectory(srcB);
285+
Directory.CreateDirectory(outputDir);
286+
287+
var id = "Missing.Package";
288+
var v = "9.9.9";
289+
290+
var logger = new Mock<ILoggerWithColor>(MockBehavior.Loose);
291+
var settings = new Mock<ISettings>(MockBehavior.Loose);
292+
293+
var args = new PackageDownloadArgs()
294+
{
295+
Packages = [new PackageWithNuGetVersion { Id = id, NuGetVersion = NuGetVersion.Parse(v) }],
296+
OutputDirectory = outputDir,
297+
};
298+
299+
// Act
300+
var result = await PackageDownloadRunner.RunAsync(
301+
args,
302+
logger.Object,
303+
[new PackageSource(srcA), new PackageSource(srcB)],
304+
settings.Object,
305+
CancellationToken.None);
306+
307+
// Assert
308+
result.Should().Be(PackageDownloadRunner.ExitCodeError);
309+
logger.Verify(l => l.LogError(It.IsAny<string>()), Times.AtLeastOnce);
310+
311+
File.Exists(Path.Combine(outputDir, $"{id.ToLowerInvariant()}.{v}.nupkg"))
312+
.Should().BeFalse("Package does not exist in sources");
313+
}
314+
}

0 commit comments

Comments
 (0)