File: Telemetry\CIEnvironmentDetectorTests.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.Telemetry;
using Microsoft.Extensions.Configuration;
 
namespace Aspire.Cli.Tests.Telemetry;
 
public class CIEnvironmentDetectorTests
{
    [Fact]
    public void IsCIEnvironment_ReturnsFalse_WhenNoVariablesSet()
    {
        var config = new ConfigurationBuilder().Build();
        var detector = new CIEnvironmentDetector(config);
 
        Assert.False(detector.IsCIEnvironment());
    }
 
    [Theory]
    [InlineData("TF_BUILD", "true")]
    [InlineData("TF_BUILD", "True")]
    [InlineData("TF_BUILD", "TRUE")]
    [InlineData("TF_BUILD", "1")]
    [InlineData("GITHUB_ACTIONS", "true")]
    [InlineData("GITHUB_ACTIONS", "1")]
    [InlineData("APPVEYOR", "true")]
    [InlineData("APPVEYOR", "1")]
    [InlineData("CI", "true")]
    [InlineData("CI", "1")]
    [InlineData("TRAVIS", "true")]
    [InlineData("TRAVIS", "1")]
    [InlineData("CIRCLECI", "true")]
    [InlineData("CIRCLECI", "1")]
    public void IsCIEnvironment_ReturnsTrue_ForBooleanVariables(string varName, string value)
    {
        var config = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string?> { [varName] = value })
            .Build();
        var detector = new CIEnvironmentDetector(config);
 
        Assert.True(detector.IsCIEnvironment());
    }
 
    [Theory]
    [InlineData("TF_BUILD", "false")]
    [InlineData("TF_BUILD", "0")]
    [InlineData("TF_BUILD", "")]
    [InlineData("GITHUB_ACTIONS", "false")]
    [InlineData("CI", "no")]
    public void IsCIEnvironment_ReturnsFalse_ForBooleanVariablesWithNonTrueValues(string varName, string value)
    {
        var config = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string?> { [varName] = value })
            .Build();
        var detector = new CIEnvironmentDetector(config);
 
        Assert.False(detector.IsCIEnvironment());
    }
 
    [Fact]
    public void IsCIEnvironment_ReturnsTrue_ForAwsCodeBuild()
    {
        var config = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string?>
            {
                ["CODEBUILD_BUILD_ID"] = "build-123",
                ["AWS_REGION"] = "us-east-1"
            })
            .Build();
        var detector = new CIEnvironmentDetector(config);
 
        Assert.True(detector.IsCIEnvironment());
    }
 
    [Fact]
    public void IsCIEnvironment_ReturnsFalse_ForAwsCodeBuild_WhenOnlyBuildIdSet()
    {
        var config = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string?>
            {
                ["CODEBUILD_BUILD_ID"] = "build-123"
            })
            .Build();
        var detector = new CIEnvironmentDetector(config);
 
        Assert.False(detector.IsCIEnvironment());
    }
 
    [Fact]
    public void IsCIEnvironment_ReturnsFalse_ForAwsCodeBuild_WhenOnlyRegionSet()
    {
        var config = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string?>
            {
                ["AWS_REGION"] = "us-east-1"
            })
            .Build();
        var detector = new CIEnvironmentDetector(config);
 
        Assert.False(detector.IsCIEnvironment());
    }
 
    [Fact]
    public void IsCIEnvironment_ReturnsTrue_ForJenkins()
    {
        var config = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string?>
            {
                ["BUILD_ID"] = "42",
                ["BUILD_URL"] = "http://jenkins/job/42"
            })
            .Build();
        var detector = new CIEnvironmentDetector(config);
 
        Assert.True(detector.IsCIEnvironment());
    }
 
    [Fact]
    public void IsCIEnvironment_ReturnsFalse_ForJenkins_WhenOnlyBuildIdSet()
    {
        var config = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string?>
            {
                ["BUILD_ID"] = "42"
            })
            .Build();
        var detector = new CIEnvironmentDetector(config);
 
        Assert.False(detector.IsCIEnvironment());
    }
 
    [Fact]
    public void IsCIEnvironment_ReturnsTrue_ForGoogleCloudBuild()
    {
        var config = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string?>
            {
                ["BUILD_ID"] = "build-456",
                ["PROJECT_ID"] = "my-project"
            })
            .Build();
        var detector = new CIEnvironmentDetector(config);
 
        Assert.True(detector.IsCIEnvironment());
    }
 
    [Fact]
    public void IsCIEnvironment_ReturnsFalse_ForGoogleCloudBuild_WhenOnlyProjectIdSet()
    {
        var config = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string?>
            {
                ["PROJECT_ID"] = "my-project"
            })
            .Build();
        var detector = new CIEnvironmentDetector(config);
 
        Assert.False(detector.IsCIEnvironment());
    }
 
    [Theory]
    [InlineData("TEAMCITY_VERSION", "2023.1")]
    [InlineData("TEAMCITY_VERSION", "any-value")]
    [InlineData("JB_SPACE_API_URL", "https://space.example.com")]
    public void IsCIEnvironment_ReturnsTrue_ForPresenceOnlyVariables(string varName, string value)
    {
        var config = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string?> { [varName] = value })
            .Build();
        var detector = new CIEnvironmentDetector(config);
 
        Assert.True(detector.IsCIEnvironment());
    }
 
    [Theory]
    [InlineData("TEAMCITY_VERSION", "")]
    [InlineData("JB_SPACE_API_URL", "")]
    public void IsCIEnvironment_ReturnsFalse_ForPresenceOnlyVariables_WhenEmpty(string varName, string value)
    {
        var config = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string?> { [varName] = value })
            .Build();
        var detector = new CIEnvironmentDetector(config);
 
        Assert.False(detector.IsCIEnvironment());
    }
 
    [Fact]
    public void IsCIEnvironment_ReturnsTrue_WhenMultipleCIVariablesSet()
    {
        var config = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string?>
            {
                ["CI"] = "true",
                ["GITHUB_ACTIONS"] = "true"
            })
            .Build();
        var detector = new CIEnvironmentDetector(config);
 
        Assert.True(detector.IsCIEnvironment());
    }
}