test/EnvVar.Tests.ps1

$ModuleManifestName = 'EnvVar.psd1'
$ModuleManifestPath = "$PSScriptRoot\..\$ModuleManifestName"

Describe 'Module Manifest Tests' {
    It 'Passes Test-ModuleManifest' {
        Test-ModuleManifest -Path $ModuleManifestPath | Should Not BeNullOrEmpty
        $? | Should Be $true
    }
}

Import-Module $ModuleManifestPath

Describe 'Tests for EnvVar' {
    Context "Tests for getter for current process" {
        It "gets an environment variable for current process" {
            $var = Get-EnvironmentVariable -Name USERPROFILE -Scope Process

            $var.Name | Should Be "USERPROFILE"
            $var.Value | Should Be $Env:USERPROFILE
            $var.ValueType | Should Be "String"
            $var.Scope | Should Be "Process"
            $var.BeforeExpansion | Should BeNullOrEmpty

            "$var" | Should Be $Env:USERPROFILE
        }
    }

    Context "Tests for setter for current process" {
        It "sets a basic environment variable for current process" {
            $params = @{
                Name      = "ENVVAR_TEST_SET_PROCESS"
                Value     = "basic_value"
                Scope     = "Process"
                ValueType = "String"
                Inherit   = "Auto"
            }
            $var = Set-EnvironmentVariable @params
            $var.Name | Should Be "ENVVAR_TEST_SET_PROCESS"
            $var.Value | Should Be "basic_value"
            $var.ValueType | Should Be "String"
            $var.Scope | Should Be "Process"
            $var.BeforeExpansion | Should BeNullOrEmpty

            $Env:ENVVAR_TEST_SET_PROCESS | Should Be "basic_value"
            "$var" | Should Be "basic_value"

            # clean up
            $Env:ENVVAR_TEST_SET_PROCESS = $null
        }
        It "sets an environment variable as ExpandString for current process" {
            $params = @{
                Name      = "ENVVAR_TEST_SET_PROCESS_EX"
                Value     = "USERNAME: %USERNAME%"
                Scope     = "Process"
                ValueType = "ExpandString"
                Inherit   = "Auto"
            }
            $var = Set-EnvironmentVariable @params
            $var.Name | Should Be "ENVVAR_TEST_SET_PROCESS_EX"
            $var.Value | Should Be "USERNAME: $Env:USERNAME"
            $var.ValueType | Should Be "String"
            $var.Scope | Should Be "Process"
            $var.BeforeExpansion | Should BeNullOrEmpty
            "$var" | Should Be "USERNAME: $Env:USERNAME"

            $Env:ENVVAR_TEST_SET_PROCESS_EX | Should Be "USERNAME: $Env:USERNAME"

            # clean up
            $Env:ENVVAR_TEST_SET_PROCESS_EX = $null
        }
    }
    Context "Tests for getter and setter for current user" {
        It "sets a basic environment variable for current user" {
            $params = @{
                Name      = "ENVVAR_TEST_SET_USER"
                Value     = "basic_value"
                Scope     = "User"
                ValueType = "String"
                Inherit   = "Auto"
            }
            $var = Set-EnvironmentVariable @params
            $var.Name | Should Be "ENVVAR_TEST_SET_USER"
            $var.Value | Should Be "basic_value"
            $var.ValueType | Should Be "String"
            $var.Scope | Should Be "User"
            $var.BeforeExpansion | Should BeNullOrEmpty
            "$var" | Should Be "basic_value"

            # manual check
            [System.Environment]::GetEnvironmentVariable(
                "ENVVAR_TEST_SET_USER",
                "User"
            ) | Should Be "basic_value"

            # auto inheritance
            $Env:ENVVAR_TEST_SET_USER | Should Be "basic_value"

            # clean up
            [System.Environment]::SetEnvironmentVariable(
                "ENVVAR_TEST_SET_USER",
                "",
                "User"
            )
            $Env:ENVVAR_TEST_SET_USER = $null
        }

        It "sets an environment variable as ExpandString for current user" {
            $params = @{
                Name      = "ENVVAR_TEST_SET_USER_EX"
                Value     = "OS: %OS%"
                Scope     = "User"
                ValueType = "ExpandString"
                Inherit   = "Auto"
            }
            $var = Set-EnvironmentVariable @params
            $var.Name | Should Be "ENVVAR_TEST_SET_USER_EX"
            $var.Value | Should Be "OS: $Env:OS"
            $var.ValueType | Should Be "ExpandString"
            $var.Scope | Should Be "User"
            $var.BeforeExpansion | Should Be "OS: %OS%"
            "$var" | Should Be "OS: $Env:OS"

            # manual check
            [System.Environment]::GetEnvironmentVariable(
                "ENVVAR_TEST_SET_USER_EX",
                "User"
            ) | Should Be "OS: $Env:OS"

            # auto inheritance
            $Env:ENVVAR_TEST_SET_USER_EX | Should Be "OS: $Env:OS"

            # clean up
            [System.Environment]::SetEnvironmentVariable(
                "ENVVAR_TEST_SET_USER_EX",
                "",
                "User"
            )
            $Env:ENVVAR_TEST_SET_USER_EX = $null
        }
    }
}