File: Utils\FirstTimeUseNoticeSentinelTests.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.
 
using Aspire.Cli.Utils;
 
namespace Aspire.Cli.Tests.Utils;
 
public class FirstTimeUseNoticeSentinelTests(ITestOutputHelper outputHelper)
{
    [Fact]
    public void Exists_WhenSentinelFileDoesNotExist_ReturnsFalse()
    {
        // Arrange
        using var workspace = TemporaryWorkspace.Create(outputHelper);
        var sentinel = new FirstTimeUseNoticeSentinel(workspace.WorkspaceRoot.FullName);
 
        // Act
        var exists = sentinel.Exists();
 
        // Assert
        Assert.False(exists);
    }
 
    [Fact]
    public void Exists_WhenSentinelFileExists_ReturnsTrue()
    {
        // Arrange
        using var workspace = TemporaryWorkspace.Create(outputHelper);
        var cliDir = Path.Combine(workspace.WorkspaceRoot.FullName, "cli");
        Directory.CreateDirectory(cliDir);
        var sentinelFilePath = Path.Combine(cliDir, "cli.firstUseSentinel");
        File.WriteAllText(sentinelFilePath, string.Empty);
        var sentinel = new FirstTimeUseNoticeSentinel(workspace.WorkspaceRoot.FullName);
 
        // Act
        var exists = sentinel.Exists();
 
        // Assert
        Assert.True(exists);
    }
 
    [Fact]
    public void CreateIfNotExists_WhenSentinelFileDoesNotExist_CreatesFile()
    {
        // Arrange
        using var workspace = TemporaryWorkspace.Create(outputHelper);
        var sentinel = new FirstTimeUseNoticeSentinel(workspace.WorkspaceRoot.FullName);
 
        // Act
        sentinel.CreateIfNotExists();
 
        // Assert
        var sentinelFilePath = Path.Combine(workspace.WorkspaceRoot.FullName, "cli", "cli.firstUseSentinel");
        Assert.True(File.Exists(sentinelFilePath));
    }
 
    [Fact]
    public void CreateIfNotExists_WhenSentinelFileAlreadyExists_DoesNotThrow()
    {
        // Arrange
        using var workspace = TemporaryWorkspace.Create(outputHelper);
        var cliDir = Path.Combine(workspace.WorkspaceRoot.FullName, "cli");
        Directory.CreateDirectory(cliDir);
        var sentinelFilePath = Path.Combine(cliDir, "cli.firstUseSentinel");
        File.WriteAllText(sentinelFilePath, "existing content");
        var sentinel = new FirstTimeUseNoticeSentinel(workspace.WorkspaceRoot.FullName);
 
        // Act
        var exception = Record.Exception(sentinel.CreateIfNotExists);
 
        // Assert
        Assert.Null(exception);
        Assert.True(File.Exists(sentinelFilePath));
    }
 
    [Fact]
    public void CreateIfNotExists_WhenDirectoryDoesNotExist_CreatesDirectoryAndFile()
    {
        // Arrange
        using var workspace = TemporaryWorkspace.Create(outputHelper);
        var nonExistentDirectory = Path.Combine(workspace.WorkspaceRoot.FullName, "non-existent-dir");
        var sentinel = new FirstTimeUseNoticeSentinel(nonExistentDirectory);
 
        // Act
        sentinel.CreateIfNotExists();
 
        // Assert
        var cliDir = Path.Combine(nonExistentDirectory, "cli");
        var sentinelFilePath = Path.Combine(cliDir, "cli.firstUseSentinel");
        Assert.True(Directory.Exists(cliDir));
        Assert.True(File.Exists(sentinelFilePath));
    }
 
    [Theory]
    [InlineData(null)]
    [InlineData("")]
    [InlineData("   ")]
    public void Constructor_WithNullOrWhitespaceDirectory_ThrowsArgumentException(string? directory)
    {
        // Act & Assert
        Assert.ThrowsAny<ArgumentException>(() => new FirstTimeUseNoticeSentinel(directory!));
    }
}