File: DotnetProjectPublicApiTests.cs
Web Access
Project: src\tests\Aspire.Hosting.Dotnet.Tests\Aspire.Hosting.Dotnet.Tests.csproj (Aspire.Hosting.Dotnet.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#pragma warning disable ASPIREDOTNETPROJECT001
 
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using Aspire.Hosting.Utils;
 
namespace Aspire.Hosting.Dotnet.Tests;
 
public class DotnetProjectPublicApiTests
{
    // ---- Experimental tagging ------------------------------------------------------
 
    [Fact]
    public void DotnetProjectResourceIsTaggedWithExpectedExperimentalDiagnostic()
    {
        var attribute = Assert.Single(typeof(DotnetProjectResource).GetCustomAttributes<ExperimentalAttribute>());
 
        Assert.Equal("ASPIREDOTNETPROJECT001", attribute.DiagnosticId);
        Assert.Equal("https://aka.ms/aspire/diagnostics/{0}", attribute.UrlFormat);
    }
 
    [Fact]
    public void EveryPublicAddDotnetProjectOverloadIsTaggedWithExpectedExperimentalDiagnostic()
    {
        var overloads = typeof(DotnetProjectHostingExtensions)
            .GetMethods(BindingFlags.Public | BindingFlags.Static)
            .Where(m => m.Name == nameof(DotnetProjectHostingExtensions.AddDotnetProject))
            .ToList();
 
        // Guards against silently losing coverage if an overload is added or removed.
        Assert.Equal(2, overloads.Count);
 
        foreach (var method in overloads)
        {
            var attribute = Assert.Single(method.GetCustomAttributes<ExperimentalAttribute>());
 
            Assert.Equal("ASPIREDOTNETPROJECT001", attribute.DiagnosticId);
            Assert.Equal("https://aka.ms/aspire/diagnostics/{0}", attribute.UrlFormat);
        }
    }
 
    // ---- DotnetProjectResource constructor guards --------------------------------
 
    [Theory]
    [InlineData(true)]
    [InlineData(false)]
    public void CtorDotnetProjectResourceShouldThrowWhenNameIsNullOrEmpty(bool isNull)
    {
        var name = isNull ? null! : string.Empty;
        const string workingDirectory = "/src/app";
 
        var action = () => new DotnetProjectResource(name, workingDirectory);
 
        var exception = isNull
            ? Assert.Throws<ArgumentNullException>(action)
            : Assert.Throws<ArgumentException>(action);
        Assert.Equal(nameof(name), exception.ParamName);
    }
 
    [Fact]
    public void CtorDotnetProjectResourceShouldThrowWhenWorkingDirectoryIsNull()
    {
        const string name = "app";
 
        var action = () => new DotnetProjectResource(name, workingDirectory: null!);
 
        var exception = Assert.Throws<ArgumentNullException>(action);
        Assert.Equal("workingDirectory", exception.ParamName);
    }
 
    // ---- AddDotnetProject guards -------------------------------------------------
 
    [Fact]
    public void AddDotnetProjectShouldThrowWhenBuilderIsNull()
    {
        IDistributedApplicationBuilder builder = null!;
 
        var action = () => builder.AddDotnetProject("app", "app.csproj");
 
        var exception = Assert.Throws<ArgumentNullException>(action);
        Assert.Equal(nameof(builder), exception.ParamName);
    }
 
    [Fact]
    public void AddDotnetProjectShouldThrowWhenNameIsNull()
    {
        using var builder = TestDistributedApplicationBuilder.Create();
 
        var action = () => builder.AddDotnetProject(null!, "app.csproj");
 
        var exception = Assert.Throws<ArgumentNullException>(action);
        Assert.Equal("name", exception.ParamName);
    }
 
    [Fact]
    public void AddDotnetProjectShouldThrowWhenPathIsNull()
    {
        using var builder = TestDistributedApplicationBuilder.Create();
 
        var action = () => builder.AddDotnetProject("app", null!);
 
        var exception = Assert.Throws<ArgumentNullException>(action);
        Assert.Equal("path", exception.ParamName);
    }
 
    [Fact]
    public void AddDotnetProjectWithConfigureShouldThrowWhenConfigureIsNull()
    {
        using var builder = TestDistributedApplicationBuilder.Create();
 
        var action = () => builder.AddDotnetProject("app", "app.csproj", configure: null!);
 
        var exception = Assert.Throws<ArgumentNullException>(action);
        Assert.Equal("configure", exception.ParamName);
    }
}