Tests/Environment/Add-EnvironmentVariable.Tests.ps1

BeforeAll {

    Set-StrictMode -Version "Latest"

    . "$PSScriptRoot\..\..\Source\Environment\Get-EnvironmentVariable.ps1"
    . "$PSScriptRoot\..\..\Source\Environment\Set-EnvironmentVariable.ps1"
    . "$PSScriptRoot\..\..\Source\Environment\Add-EnvironmentVariable.ps1"

}

Describe "Add-EnvironmentVariable" {

    AfterEach {

        [Environment]::SetEnvironmentVariable("ToolboxTestVariable", $null, "Process")

    }

    It "Adds the value when the variable is unset" {

        Add-EnvironmentVariable -Name "ToolboxTestVariable" -Value "C:\First" -Scope "Process"

        [Environment]::GetEnvironmentVariable("ToolboxTestVariable", "Process") | Should -Be "C:\First"

    }

    It "Appends the value when the variable already has other entries" {

        [Environment]::SetEnvironmentVariable("ToolboxTestVariable", "C:\First", "Process")

        Add-EnvironmentVariable -Name "ToolboxTestVariable" -Value "C:\Second" -Scope "Process"

        [Environment]::GetEnvironmentVariable("ToolboxTestVariable", "Process") | Should -Be "C:\First,C:\Second"

    }

    It "Does not duplicate a value that is already present" {

        [Environment]::SetEnvironmentVariable("ToolboxTestVariable", "C:\First,C:\Second", "Process")

        Add-EnvironmentVariable -Name "ToolboxTestVariable" -Value "C:\First" -Scope "Process"

        [Environment]::GetEnvironmentVariable("ToolboxTestVariable", "Process") | Should -Be "C:\First,C:\Second"

    }

    It "Does nothing under -WhatIf" {

        [Environment]::SetEnvironmentVariable("ToolboxTestVariable", "C:\First", "Process")

        Add-EnvironmentVariable -Name "ToolboxTestVariable" -Value "C:\Second" -Scope "Process" -WhatIf

        [Environment]::GetEnvironmentVariable("ToolboxTestVariable", "Process") | Should -Be "C:\First"

    }

    It "Uses a custom separator when specified" {

        [Environment]::SetEnvironmentVariable("ToolboxTestVariable", "C:\First", "Process")

        Add-EnvironmentVariable -Name "ToolboxTestVariable" -Value "C:\Second" -Scope "Process" -Separator ";"

        [Environment]::GetEnvironmentVariable("ToolboxTestVariable", "Process") | Should -Be "C:\First;C:\Second"

    }

    It "Does not duplicate a value that is already present with a custom separator" {

        [Environment]::SetEnvironmentVariable("ToolboxTestVariable", "C:\First;C:\Second", "Process")

        Add-EnvironmentVariable -Name "ToolboxTestVariable" -Value "C:\First" -Scope "Process" -Separator ";"

        [Environment]::GetEnvironmentVariable("ToolboxTestVariable", "Process") | Should -Be "C:\First;C:\Second"

    }

    It "Accepts multiple values from the pipeline for the same variable" {

        "C:\First", "C:\Second" | Add-EnvironmentVariable -Name "ToolboxTestVariable" -Scope "Process"

        [Environment]::GetEnvironmentVariable("ToolboxTestVariable", "Process") | Should -Be "C:\First,C:\Second"

    }

    It "Ignores pipeline values that are already present" {

        [Environment]::SetEnvironmentVariable("ToolboxTestVariable", "C:\First", "Process")

        "C:\First", "C:\Second" | Add-EnvironmentVariable -Name "ToolboxTestVariable" -Scope "Process"

        [Environment]::GetEnvironmentVariable("ToolboxTestVariable", "Process") | Should -Be "C:\First,C:\Second"

    }

    It "Does not write when every pipeline value is already present" {

        [Environment]::SetEnvironmentVariable("ToolboxTestVariable", "C:\First", "Process")

        Mock -CommandName "Set-EnvironmentVariable" -MockWith {}

        "C:\First" | Add-EnvironmentVariable -Name "ToolboxTestVariable" -Scope "Process"

        Should -Invoke -CommandName "Set-EnvironmentVariable" -Times 0

    }

    It "Accepts Name and Value by property name from the pipeline, grouping writes per name" {

        [pscustomobject]@{ Name = "ToolboxTestVariable"; Value = "C:\First" }, [pscustomobject]@{ Name = "ToolboxTestVariable"; Value = "C:\Second" } | Add-EnvironmentVariable -Scope "Process"

        [Environment]::GetEnvironmentVariable("ToolboxTestVariable", "Process") | Should -Be "C:\First,C:\Second"

    }

}