File: TemplateManifest\TemplateManifestNuGetTests.cs
Web Access
Project: src\tests\Infrastructure.Tests\Infrastructure.Tests.csproj (Infrastructure.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Text.Json;
using Aspire.TestUtilities;
using GenerateTemplateManifest;
using VerifyXunit;
using Xunit;
 
namespace Infrastructure.Tests.TemplateManifest;
 
public sealed class TemplateManifestNuGetTests(ITestOutputHelper output)
{
    [Fact]
    [RequiresTools(["pwsh"])]
    public async Task RegistersDownloadedPackagesThatAreAbsentFromLibraries()
    {
        using var workspace = TemporaryWorkspace.Create(output);
        var environment = new TemplateManifestTestEnvironment(workspace, output);
        TemplateManifestTestEnvironment.CreatePackage(environment.BuiltFeed, "Local.DownloadFixture", "1.0.0");
        TemplateManifestTestEnvironment.CreatePackage(environment.ExternalFeed, "External.DownloadFixture", "1.0.0");
        TemplateManifestTestEnvironment.CreatePackage(environment.ExternalFeed, "External.DownloadFixture", "2.0.0");
        File.WriteAllText(Path.Combine(environment.TemplateDirectory, "App.csproj"), """
            <Project Sdk="Microsoft.NET.Sdk">
              <PropertyGroup><TargetFramework>net11.0</TargetFramework></PropertyGroup>
              <ItemGroup>
                <PackageDownload Include="Local.DownloadFixture" Version="[1.0.0]" />
                <PackageDownload Include="External.DownloadFixture" Version="[1.0.0];[2.0.0]" />
              </ItemGroup>
            </Project>
            """);
        using var command = environment.CreateCommand();
 
        (await command.ExecuteAsync()).EnsureSuccessful();
 
        using var assets = JsonDocument.Parse(File.ReadAllText(Path.Combine(environment.RestoreDirectory, "Graph000", "obj", "project.assets.json")));
        Assert.Empty(assets.RootElement.GetProperty("libraries").EnumerateObject());
        Assert.Equal(2, assets.RootElement.GetProperty("project").GetProperty("frameworks").GetProperty("net11.0")
            .GetProperty("downloadDependencies").GetArrayLength());
        await Verifier.Verify(File.ReadAllText(environment.ManifestPath), "json").UseDirectory("Snapshots");
    }
 
    [Theory]
    [InlineData("1.0.0")]
    [InlineData("[1.0.0,)")]
    [InlineData("[1.0.0,2.0.0]")]
    [InlineData("(1.0.0,1.0.0]")]
    [InlineData("1.*")]
    [InlineData("not-a-version")]
    public void RejectsDownloadsWithoutAnExactVersion(string version)
    {
        using var assets = JsonDocument.Parse($$"""
            {
              "libraries": {},
              "project": {
                "frameworks": {
                  "net11.0": {
                    "downloadDependencies": [{"name": "Example", "version": "{{version}}"}]
                  }
                }
              }
            }
            """);
        var manifest = new ComponentManifest(new HashSet<string>());
 
        var exception = Assert.Throws<InvalidDataException>(() => manifest.RegisterNuGetAssets(assets.RootElement, "fixture.assets.json"));
 
        Assert.Contains("an exact version is required", exception.Message);
        Assert.Equal(0, manifest.Count);
    }
}