File: Utils\AspireRepositoryDetectorTests.cs
Web Access
Project: src\tests\Aspire.Cli.Tests\Aspire.Cli.Tests.csproj (Aspire.Cli.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#if DEBUG
 
using Aspire.Cli.Utils;
 
namespace Aspire.Cli.Tests.Utils;
 
public class AspireRepositoryDetectorTests : IDisposable
{
    private const string RepoRootEnvironmentVariableName = "ASPIRE_REPO_ROOT";
    private readonly List<string> _directoriesToDelete = [];
    private readonly string? _originalRepoRoot = Environment.GetEnvironmentVariable(RepoRootEnvironmentVariableName);
 
    public AspireRepositoryDetectorTests()
    {
        AspireRepositoryDetector.ResetCache();
    }
 
    public void Dispose()
    {
        Environment.SetEnvironmentVariable(RepoRootEnvironmentVariableName, _originalRepoRoot);
        AspireRepositoryDetector.ResetCache();
 
        foreach (var directory in _directoriesToDelete)
        {
            if (Directory.Exists(directory))
            {
                Directory.Delete(directory, recursive: true);
            }
        }
    }
 
    [Fact]
    public void DetectRepositoryRoot_ReturnsDirectoryContainingAspireSolution()
    {
        var repoRoot = CreateTempDirectory();
        File.WriteAllText(Path.Combine(repoRoot, "Aspire.slnx"), string.Empty);
 
        var nestedDirectory = Directory.CreateDirectory(Path.Combine(repoRoot, "src", "Project")).FullName;
 
        var detectedRoot = AspireRepositoryDetector.DetectRepositoryRoot(nestedDirectory);
 
        Assert.Equal(repoRoot, detectedRoot);
    }
 
    [Fact]
    public void DetectRepositoryRoot_UsesEnvironmentVariable_WhenNoSolutionFound()
    {
        var repoRoot = CreateTempDirectory();
        var workingDirectory = CreateTempDirectory();
 
        Environment.SetEnvironmentVariable(RepoRootEnvironmentVariableName, repoRoot);
 
        var detectedRoot = AspireRepositoryDetector.DetectRepositoryRoot(workingDirectory);
 
        Assert.Equal(repoRoot, detectedRoot);
    }
 
    [Fact]
    public void DetectRepositoryRoot_PrefersSolutionSearchOverEnvironmentVariable()
    {
        var repoRoot = CreateTempDirectory();
        File.WriteAllText(Path.Combine(repoRoot, "Aspire.slnx"), string.Empty);
 
        var envRoot = CreateTempDirectory();
        Environment.SetEnvironmentVariable(RepoRootEnvironmentVariableName, envRoot);
 
        var nestedDirectory = Directory.CreateDirectory(Path.Combine(repoRoot, "playground", "polyglot")).FullName;
 
        var detectedRoot = AspireRepositoryDetector.DetectRepositoryRoot(nestedDirectory);
 
        Assert.Equal(repoRoot, detectedRoot);
    }
 
    private string CreateTempDirectory()
    {
        var directory = Directory.CreateTempSubdirectory("aspire-repo-detector-tests-").FullName;
        _directoriesToDelete.Add(directory);
        return directory;
    }
}
 
#endif