Tests/Add-PsmDependency.Tests.ps1

$moduleRoot = Resolve-Path "$PSScriptRoot\.."
$moduleName = Split-Path $moduleRoot -Leaf
Import-Module "$moduleRoot\PSModuleBuilder.psm1"

Describe "Add-PsmDependency" -Tag "Unit" {
    
    Context 'When in an initialized module folder' {   
        BeforeAll { 
            Write-Host -for DarkGreen "In Describe BeforeAll" 
            
            Write-Verbose "Creating new directory PsmDependency"
            Remove-ItemIfExists "$PSScriptRoot\TestPester\PsmDependency" | Out-Null
            New-Item "$PSScriptRoot\TestPester\PsmDependency" -ItemType Directory -Force
            
            Write-Verbose "Changing location to PsmDependency"
            Set-Location "$PSScriptRoot\TestPester\PsmDependency"
            
            Initialize-Psm -y
            Get-ChildItem "$PSScriptRoot\TestPester\PsmDependency"
        }

        Context "When module exists" {
            InModuleScope PSModuleBuilder {
                $someModule = @{ Name = "SomeModule"; Version = "2.0.0" }
                Mock Get-Module -MockWith { $someModule } -Verifiable
                Add-PsmDependency "SomeModule"
                It "should use mocked functionality -- Verified" {
                    Assert-VerifiableMock
                }
                It "should use mocked functionality -- Times Called" {
                    Assert-MockCalled Get-Module -Times 1
                }
                it "should have a package xml file" {
                    Test-Path "$PSScriptRoot\TestPester\PsmDependency\module-psd1.xml" | Should -be $true
                }
                it "should add a module to packagexml.RequiredModules -- Null Check" {
                    (Import-Clixml "module-psd1.xml").RequiredModules | Should -Not -BeNullOrEmpty
                }
                it "should add a module to packagexml.RequiredModules -- > 0 Check" {
                    (Import-Clixml "module-psd1.xml").RequiredModules.Count -gt 0 | Should -Be $true
                }
                it "should add a module to packagexml.RequiredModules -- Name Check" {
                    ((Import-Clixml "module-psd1.xml").RequiredModules).Name -eq $someModule.Name | Should -Be $true
                }
                it "should add a module to packagexml.RequiredModules -- Version Check" {
                    ((Import-Clixml "module-psd1.xml").RequiredModules).Version -eq $someModule.Version | Should -Be $true
                }
            }
        }
        
        Context "When module does not exist" {
            InModuleScope PSModuleBuilder {
                Mock Get-Module -MockWith {  }
                
                it "should have a package xml file" {
                    { Add-PsmDependency "SomeModule" } | Should -Throw
                }
            }
        }
    }

    Context 'When in a non-initialized module folder' {   
        BeforeAll { 
            Write-Host -for DarkGreen "In Describe BeforeAll" 
            Set-Location "$PSScriptRoot\TestPester"
        }
        
        InModuleScope PSModuleBuilder {  
            it "should throw due to missing folders #1" {
                { Add-PsmDependency "some-file.txt" "some text data..." } | Should -Throw
            }
            it "should throw due to missing folders #2" {
                Mock Confirm-IsInitializedModulePath { return }  
                { Add-PsmDependency "some-file.txt" "some text data..." } | Should -Throw
            }
            it "should throw due to data folder" {
                Mock Confirm-IsInitializedModulePath { }  
                Mock Import-CliXml -MockWith { @{ RootModule = "SomeModule" } }  
                { Add-PsmDependency "some-file.txt" "some text data..." } | Should -Throw
            }
        }
    }

    AfterAll {
        Write-Host "Changing back to moduleRoot: $PSScriptRoot"
        Set-Location $PSScriptRoot
    }
}