Public/Update-ModuleProject.Integration.Tests.ps1

describe 'Export-ModuleProject' {
    BeforeAll {
        . "$PSScriptRoot\..\Private\_TestEnvironment.ps1"
        
        <# ENVIRONMENT VARIABLES #>
        $BaseModuleName = "QuickModuleCLITests"
        $BaseFolder =  Get-SandboxBaseFolder
        $ModuleProjectsFolder = Get-SandboxNestedModulesFolder
        $FunctionsFolder = Get-SandboxFunctionsFolder
        $PrivateFunctionsFolder = Get-SandboxPrivateFunctionsFolder
        $PSProfileFolder = "$BaseFolder\PSProfileModules"

        . "$PSScriptRoot\..\Private\UI.ps1"
        . "$PSScriptRoot\..\Private\Environment.ps1"
        . "$PSScriptRoot\..\Private\ObjectTransformation.ps1"
        . "$PSScriptRoot\..\Private\ArgumentCompleters.ps1"
        . "$PSScriptRoot\..\Private\ArgumentTransformations.ps1"
        . "$PSScriptRoot\..\Private\Validators.ps1"
        
        . "$PSScriptRoot\Update-ModuleProject.ps1"

        $ViableModule = "Viable"
        $ParameterBindingException = 'System.Management.Automation.ParameterBindingException'
        Remove-Sandbox
    }
    BeforeEach {
        New-Sandbox
    }
    AfterEach {
        Remove-Sandbox
    }
    AfterAll {
        Remove-Sandbox
    }

    describe 'validations' {
        BeforeEach {
            Mock Copy-Item
        }
        it 'throws error if ModuleProject is null' {
            $err = {  Update-ModuleProject -ModuleProject '' } | Should -Throw -PassThru
    
            $err.Exception.GetType().BaseType | Should -Be $ParameterBindingException
            $err.Exception.Message -like '*Null or Empty*' | Should -BeTrue
        }

        it 'throws error if module does not exist' {
            $err = {  Update-ModuleProject -ModuleProject $ViableModule } | Should -Throw -PassThru
    
            $err.Exception.GetType().BaseType | Should -Be $ParameterBindingException
            $err.Exception.InnerException.InnerException.GetType().Name | Should -Be 'ModuleProjectDoesNotExistException'
        }
    }

    describe 'functionality' {
        BeforeAll {
            function Get-Psd1 {
                $ModuleProjects = Get-ValidModuleProjects
                $psd1Location = "$($ModuleProjects.FullName)\$($ModuleProjects.Name).psd1"
                $psd1Content = (Get-Content $psd1Location | Out-String)
                return (Invoke-Expression $psd1Content)
            }
        }

        BeforeEach {
            $expectedAuthor = New-Guid
            $expectedCompanyName = New-Guid
            $expectedCopyright = New-Guid
            $expectedModuleVersion = "$(Get-Random -Maximum 10 -Minimum 0).$(Get-Random -Maximum 10 -Minimum 0).$(Get-Random -Maximum 10 -Minimum 0)"
            $expectedDescription = New-Guid
            $expectedTags = New-Guid
            $expectedProjectUri = "http://$(New-Guid)/"
            $expectedLicenseUri = "http://$(New-Guid)/"
            $expectedIconUri = "http://$(New-Guid)/"
            $expectedReleaseNotes = New-Guid
            $expectedHelpInfoUri = "http://$(New-Guid)/"
        }
        it 'updates all input parameters' {
            Add-TestModule -Name $ViableModule -IncludeManifest -IncludeRoot -IncludeFunctions -IncludeAliases
            Add-TestFunction -ModuleName $ViableModule -FunctionName 'Get-Foo' -FunctionText "Write-Output 'Foo'"

            Update-ModuleProject -ModuleProject $ViableModule `
                -Author $expectedAuthor `
                -CompanyName $expectedCompanyName `
                -Copyright $expectedCopyright `
                -ModuleVersion $expectedModuleVersion `
                -Description $expectedDescription `
                -Tags $expectedTags `
                -ProjectUri $expectedProjectUri `
                -LicenseUri $expectedLicenseUri `
                -IconUri $expectedIconUri `
                -ReleaseNotes $expectedReleaseNotes `
                -HelpInfoUri $expectedHelpInfoUri 

            $psd1 = Get-Psd1

            $psd1.Author | Should -Be $expectedAuthor
            $psd1.CompanyName | Should -Be $expectedCompanyName
            $psd1.Copyright | Should -Be $expectedCopyright
            $psd1.ModuleVersion | Should -Be $expectedModuleVersion
            $psd1.Description | Should -Be $expectedDescription
            $psd1.PrivateData.PSData.Tags | Should -Be $expectedTags
            $psd1.PrivateData.PSData.ProjectUri | Should -Be $expectedProjectUri
            $psd1.PrivateData.PSData.LicenseUri | Should -Be $expectedLicenseUri
            $psd1.PrivateData.PSData.IconUri | Should -Be $expectedIconUri
            $psd1.PrivateData.PSData.ReleaseNotes | Should -Be $expectedReleaseNotes
            $psd1.HelpInfoUri | Should -Be $expectedHelpInfoUri
        }

        it 'is idempotent (long test)(does not overwrite any non-input parameters)' {
            Add-TestModule -Name $ViableModule -IncludeManifest -IncludeRoot -IncludeFunctions -IncludeAliases
            Add-TestFunction -ModuleName $ViableModule -FunctionName 'Get-Foo' -FunctionText "Write-Output 'Foo'"

            #Make sure all data is as expected
            $psd1 = Get-Psd1

            $psd1.Author | Should -Not -Be $expectedAuthor
            $psd1.CompanyName | Should -Not -Be $expectedCompanyName
            $psd1.Copyright | Should -Not -Be $expectedCopyright
            $psd1.ModuleVersion | Should -Not -Be $expectedModuleVersion
            $psd1.Description | Should -Not -Be $expectedDescription
            $psd1.PrivateData.PSData.Tags | Should -Not -Be $expectedTags
            $psd1.PrivateData.PSData.ProjectUri | Should -Not -Be $expectedProjectUri
            $psd1.PrivateData.PSData.LicenseUri | Should -Not -Be $expectedLicenseUri
            $psd1.PrivateData.PSData.IconUri | Should -Not -Be $expectedIconUri
            $psd1.PrivateData.PSData.ReleaseNotes | Should -Not -Be $expectedReleaseNotes
            $psd1.HelpInfoUri | Should -Not -Be $expectedHelpInfoUri

            Update-ModuleProject -ModuleProject $ViableModule `
                -Author $expectedAuthor 
            
            #Check to make sure only Author was updated
            $psd1 = Get-Psd1
            $psd1.Author | Should -Be $expectedAuthor
            $psd1.CompanyName | Should -Not -Be $expectedCompanyName
            $psd1.Copyright | Should -Not -Be $expectedCopyright
            $psd1.ModuleVersion | Should -Not -Be $expectedModuleVersion
            $psd1.Description | Should -Not -Be $expectedDescription
            $psd1.PrivateData.PSData.Tags | Should -Not -Be $expectedTags
            $psd1.PrivateData.PSData.ProjectUri | Should -Not -Be $expectedProjectUri
            $psd1.PrivateData.PSData.LicenseUri | Should -Not -Be $expectedLicenseUri
            $psd1.PrivateData.PSData.IconUri | Should -Not -Be $expectedIconUri
            $psd1.PrivateData.PSData.ReleaseNotes | Should -Not -Be $expectedReleaseNotes
            $psd1.HelpInfoUri | Should -Not -Be $expectedHelpInfoUri

            Update-ModuleProject -ModuleProject $ViableModule `
                -CompanyName $expectedCompanyName 

            #Check to make sure only CompanyName was updated
            $psd1 = Get-Psd1
            $psd1.Author | Should -Be $expectedAuthor
            $psd1.CompanyName | Should -Be $expectedCompanyName
            $psd1.Copyright | Should -Not -Be $expectedCopyright
            $psd1.ModuleVersion | Should -Not -Be $expectedModuleVersion
            $psd1.Description | Should -Not -Be $expectedDescription
            $psd1.PrivateData.PSData.Tags | Should -Not -Be $expectedTags
            $psd1.PrivateData.PSData.ProjectUri | Should -Not -Be $expectedProjectUri
            $psd1.PrivateData.PSData.LicenseUri | Should -Not -Be $expectedLicenseUri
            $psd1.PrivateData.PSData.IconUri | Should -Not -Be $expectedIconUri
            $psd1.PrivateData.PSData.ReleaseNotes | Should -Not -Be $expectedReleaseNotes
            $psd1.HelpInfoUri | Should -Not -Be $expectedHelpInfoUri

            Update-ModuleProject -ModuleProject $ViableModule `
                -Copyright $expectedCopyright 

            #Check to make sure only CopyRight was updated
            $psd1 = Get-Psd1
            $psd1.Author | Should -Be $expectedAuthor
            $psd1.CompanyName | Should -Be $expectedCompanyName
            $psd1.Copyright | Should -Be $expectedCopyright
            $psd1.ModuleVersion | Should -Not -Be $expectedModuleVersion
            $psd1.Description | Should -Not -Be $expectedDescription
            $psd1.PrivateData.PSData.Tags | Should -Not -Be $expectedTags
            $psd1.PrivateData.PSData.ProjectUri | Should -Not -Be $expectedProjectUri
            $psd1.PrivateData.PSData.LicenseUri | Should -Not -Be $expectedLicenseUri
            $psd1.PrivateData.PSData.IconUri | Should -Not -Be $expectedIconUri
            $psd1.PrivateData.PSData.ReleaseNotes | Should -Not -Be $expectedReleaseNotes
            $psd1.HelpInfoUri | Should -Not -Be $expectedHelpInfoUri

            Update-ModuleProject -ModuleProject $ViableModule `
                -ModuleVersion $expectedModuleVersion 

            #Check to make sure only ModuleVersion was updated
            $psd1 = Get-Psd1
            $psd1.Author | Should -Be $expectedAuthor
            $psd1.CompanyName | Should -Be $expectedCompanyName
            $psd1.Copyright | Should -Be $expectedCopyright
            $psd1.ModuleVersion | Should -Be $expectedModuleVersion
            $psd1.Description | Should -Not -Be $expectedDescription
            $psd1.PrivateData.PSData.Tags | Should -Not -Be $expectedTags
            $psd1.PrivateData.PSData.ProjectUri | Should -Not -Be $expectedProjectUri
            $psd1.PrivateData.PSData.LicenseUri | Should -Not -Be $expectedLicenseUri
            $psd1.PrivateData.PSData.IconUri | Should -Not -Be $expectedIconUri
            $psd1.PrivateData.PSData.ReleaseNotes | Should -Not -Be $expectedReleaseNotes
            $psd1.HelpInfoUri | Should -Not -Be $expectedHelpInfoUri

            Update-ModuleProject -ModuleProject $ViableModule `
                -Description $expectedDescription 

            #Check to make sure only Description was updated
            $psd1 = Get-Psd1
            $psd1.Author | Should -Be $expectedAuthor
            $psd1.CompanyName | Should -Be $expectedCompanyName
            $psd1.Copyright | Should -Be $expectedCopyright
            $psd1.ModuleVersion | Should -Be $expectedModuleVersion
            $psd1.Description | Should -Be $expectedDescription
            $psd1.PrivateData.PSData.Tags | Should -Not -Be $expectedTags
            $psd1.PrivateData.PSData.ProjectUri | Should -Not -Be $expectedProjectUri
            $psd1.PrivateData.PSData.LicenseUri | Should -Not -Be $expectedLicenseUri
            $psd1.PrivateData.PSData.IconUri | Should -Not -Be $expectedIconUri
            $psd1.PrivateData.PSData.ReleaseNotes | Should -Not -Be $expectedReleaseNotes
            $psd1.HelpInfoUri | Should -Not -Be $expectedHelpInfoUri


            Update-ModuleProject -ModuleProject $ViableModule `
                -Tags $expectedTags 

            #Check to make sure only Tags was updated
            $psd1 = Get-Psd1
            $psd1.Author | Should -Be $expectedAuthor
            $psd1.CompanyName | Should -Be $expectedCompanyName
            $psd1.Copyright | Should -Be $expectedCopyright
            $psd1.ModuleVersion | Should -Be $expectedModuleVersion
            $psd1.Description | Should -Be $expectedDescription
            $psd1.PrivateData.PSData.Tags | Should -Be $expectedTags
            $psd1.PrivateData.PSData.ProjectUri | Should -Not -Be $expectedProjectUri
            $psd1.PrivateData.PSData.LicenseUri | Should -Not -Be $expectedLicenseUri
            $psd1.PrivateData.PSData.IconUri | Should -Not -Be $expectedIconUri
            $psd1.PrivateData.PSData.ReleaseNotes | Should -Not -Be $expectedReleaseNotes
            $psd1.HelpInfoUri | Should -Not -Be $expectedHelpInfoUri

            Update-ModuleProject -ModuleProject $ViableModule `
                -ProjectUri $expectedProjectUri 

            #Check to make sure only ProjectUri was updated
            $psd1 = Get-Psd1
            $psd1.Author | Should -Be $expectedAuthor
            $psd1.CompanyName | Should -Be $expectedCompanyName
            $psd1.Copyright | Should -Be $expectedCopyright
            $psd1.ModuleVersion | Should -Be $expectedModuleVersion
            $psd1.Description | Should -Be $expectedDescription
            $psd1.PrivateData.PSData.Tags | Should -Be $expectedTags
            $psd1.PrivateData.PSData.ProjectUri | Should -Be $expectedProjectUri
            $psd1.PrivateData.PSData.LicenseUri | Should -Not -Be $expectedLicenseUri
            $psd1.PrivateData.PSData.IconUri | Should -Not -Be $expectedIconUri
            $psd1.PrivateData.PSData.ReleaseNotes | Should -Not -Be $expectedReleaseNotes
            $psd1.HelpInfoUri | Should -Not -Be $expectedHelpInfoUri

            Update-ModuleProject -ModuleProject $ViableModule `
                -LicenseUri $expectedLicenseUri 

            #Check to make sure only LicenseUri was updated
            $psd1 = Get-Psd1
            $psd1.Author | Should -Be $expectedAuthor
            $psd1.CompanyName | Should -Be $expectedCompanyName
            $psd1.Copyright | Should -Be $expectedCopyright
            $psd1.ModuleVersion | Should -Be $expectedModuleVersion
            $psd1.Description | Should -Be $expectedDescription
            $psd1.PrivateData.PSData.Tags | Should -Be $expectedTags
            $psd1.PrivateData.PSData.ProjectUri | Should -Be $expectedProjectUri
            $psd1.PrivateData.PSData.LicenseUri | Should -Be $expectedLicenseUri
            $psd1.PrivateData.PSData.IconUri | Should -Not -Be $expectedIconUri
            $psd1.PrivateData.PSData.ReleaseNotes | Should -Not -Be $expectedReleaseNotes
            $psd1.HelpInfoUri | Should -Not -Be $expectedHelpInfoUri

            Update-ModuleProject -ModuleProject $ViableModule `
                -IconUri $expectedIconUri 

            #Check to make sure only IconUri was updated
            $psd1 = Get-Psd1
            $psd1.Author | Should -Be $expectedAuthor
            $psd1.CompanyName | Should -Be $expectedCompanyName
            $psd1.Copyright | Should -Be $expectedCopyright
            $psd1.ModuleVersion | Should -Be $expectedModuleVersion
            $psd1.Description | Should -Be $expectedDescription
            $psd1.PrivateData.PSData.Tags | Should -Be $expectedTags
            $psd1.PrivateData.PSData.ProjectUri | Should -Be $expectedProjectUri
            $psd1.PrivateData.PSData.LicenseUri | Should -Be $expectedLicenseUri
            $psd1.PrivateData.PSData.IconUri | Should -Be $expectedIconUri
            $psd1.PrivateData.PSData.ReleaseNotes | Should -Not -Be $expectedReleaseNotes
            $psd1.HelpInfoUri | Should -Not -Be $expectedHelpInfoUri

            Update-ModuleProject -ModuleProject $ViableModule `
                -ReleaseNotes $expectedReleaseNotes 

            #Check to make sure only ReleaseNotes was updated
            $psd1 = Get-Psd1
            $psd1.Author | Should -Be $expectedAuthor
            $psd1.CompanyName | Should -Be $expectedCompanyName
            $psd1.Copyright | Should -Be $expectedCopyright
            $psd1.ModuleVersion | Should -Be $expectedModuleVersion
            $psd1.Description | Should -Be $expectedDescription
            $psd1.PrivateData.PSData.Tags | Should -Be $expectedTags
            $psd1.PrivateData.PSData.ProjectUri | Should -Be $expectedProjectUri
            $psd1.PrivateData.PSData.LicenseUri | Should -Be $expectedLicenseUri
            $psd1.PrivateData.PSData.IconUri | Should -Be $expectedIconUri
            $psd1.PrivateData.PSData.ReleaseNotes | Should -Be $expectedReleaseNotes
            $psd1.HelpInfoUri | Should -Not -Be $expectedHelpInfoUri

            Update-ModuleProject -ModuleProject $ViableModule `
                -HelpInfoUri $expectedHelpInfoUri 

            #Check to make sure only HelpInfoUri was updated
            $psd1 = Get-Psd1
            $psd1.Author | Should -Be $expectedAuthor
            $psd1.CompanyName | Should -Be $expectedCompanyName
            $psd1.Copyright | Should -Be $expectedCopyright
            $psd1.ModuleVersion | Should -Be $expectedModuleVersion
            $psd1.Description | Should -Be $expectedDescription
            $psd1.PrivateData.PSData.Tags | Should -Be $expectedTags
            $psd1.PrivateData.PSData.ProjectUri | Should -Be $expectedProjectUri
            $psd1.PrivateData.PSData.LicenseUri | Should -Be $expectedLicenseUri
            $psd1.PrivateData.PSData.IconUri | Should -Be $expectedIconUri
            $psd1.PrivateData.PSData.ReleaseNotes | Should -Be $expectedReleaseNotes
            $psd1.HelpInfoUri | Should -Be $expectedHelpInfoUri
        }
    }

    describe 'auto-completion for input' {
        it 'auto-suggests valid Module Arguments for Module' {
            Mock Get-ValidModuleProjectNames
            $Arguments = (Get-ArgumentCompleter -CommandName Update-ModuleProject -ParameterName ModuleProject)
            
            try {$Arguments.Definition.Invoke()} catch {}
    
            Assert-MockCalled Get-ValidModuleProjectNames -Times 1
        }
    }
}