tests/Initialize-DFEnvironment.Tests.ps1

BeforeAll {
    . "$PSScriptRoot/../Public/New-DFDirectory.ps1"
    . "$PSScriptRoot/../Private/Resolve-DFPackageManager.ps1"
    . "$PSScriptRoot/../Public/Initialize-DFEnvironment.ps1"
}

Describe 'Initialize-DFEnvironment' {
    BeforeEach {
        $script:DFPackageManagers = $null
        $script:Saved = @{
            Config = $Env:XDG_CONFIG_HOME
            Data   = $Env:XDG_DATA_HOME
            State  = $Env:XDG_STATE_HOME
            Cache  = $Env:XDG_CACHE_HOME
        }
        Remove-Item Env:\XDG_CONFIG_HOME -ErrorAction Ignore
        Remove-Item Env:\XDG_DATA_HOME   -ErrorAction Ignore
        Remove-Item Env:\XDG_STATE_HOME  -ErrorAction Ignore
        Remove-Item Env:\XDG_CACHE_HOME  -ErrorAction Ignore
    }
    AfterEach {
        $Env:XDG_CONFIG_HOME = $script:Saved.Config
        $Env:XDG_DATA_HOME   = $script:Saved.Data
        $Env:XDG_STATE_HOME  = $script:Saved.State
        $Env:XDG_CACHE_HOME  = $script:Saved.Cache
    }

    It 'sets XDG env vars when they are absent' {
        Mock Get-Command { $null }
        Initialize-DFEnvironment
        $Env:XDG_CONFIG_HOME | Should -Not -BeNullOrEmpty
        $Env:XDG_DATA_HOME   | Should -Not -BeNullOrEmpty
        $Env:XDG_STATE_HOME  | Should -Not -BeNullOrEmpty
        $Env:XDG_CACHE_HOME  | Should -Not -BeNullOrEmpty
    }

    It 'does not override XDG vars that are already set' {
        $Env:XDG_CONFIG_HOME = 'C:\custom\config'
        Mock Get-Command { $null }
        Initialize-DFEnvironment
        $Env:XDG_CONFIG_HOME | Should -Be 'C:\custom\config'
    }

    It 'creates the four XDG base directories' {
        $Env:XDG_CONFIG_HOME = Join-Path $TestDrive 'config'
        $Env:XDG_DATA_HOME   = Join-Path $TestDrive 'data'
        $Env:XDG_STATE_HOME  = Join-Path $TestDrive 'state'
        $Env:XDG_CACHE_HOME  = Join-Path $TestDrive 'cache'
        Mock Get-Command { $null }
        Initialize-DFEnvironment
        Test-Path $Env:XDG_CONFIG_HOME | Should -BeTrue
        Test-Path $Env:XDG_DATA_HOME   | Should -BeTrue
        Test-Path $Env:XDG_STATE_HOME  | Should -BeTrue
        Test-Path $Env:XDG_CACHE_HOME  | Should -BeTrue
    }

    It 'emits a warning when no package managers are found' {
        Mock Get-Command { $null }
        Initialize-DFEnvironment -WarningVariable warns 3>$null
        $warns | Should -Not -BeNullOrEmpty
    }

    It 'does not warn when at least one package manager is found' {
        Mock Get-Command { [PSCustomObject]@{ Name = 'scoop' } }
        Initialize-DFEnvironment -WarningVariable warns 3>$null
        $warns | Should -BeNullOrEmpty
    }

    It 'is idempotent — calling twice does not throw' {
        Mock Get-Command { $null }
        $Env:XDG_CONFIG_HOME = Join-Path $TestDrive 'config'
        $Env:XDG_DATA_HOME   = Join-Path $TestDrive 'data'
        $Env:XDG_STATE_HOME  = Join-Path $TestDrive 'state'
        $Env:XDG_CACHE_HOME  = Join-Path $TestDrive 'cache'
        { Initialize-DFEnvironment; Initialize-DFEnvironment } | Should -Not -Throw
    }
}