Tests/PSDataKit.Tests.ps1

$ModuleManifestName = 'PSDataKit.psd1'
$ModuleManifestPath = "$PSScriptRoot\..\$ModuleManifestName"
Remove-Module "PSDataKit" -Force -ErrorAction Ignore
Import-Module -Name $ModuleManifestPath -Force
Write-Host "Remove and Import PSDataKit module"

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

InModuleScope PSDataKit {
    Describe 'PSDataKit merging capabilities (Merge-Hashtables)' {

        Context "secondary parameter" {
            It 'Merge with $null secondary parameter ' {
                $primary = @{
                    foo = "foo"
                    bar = "bar"
                }
                $secondary = $null

                $result = Merge-Hashtables -primary $primary -secondary $secondary

                $result | Should -BeExactly $primary
            }
            It 'Merge with BeNullOrEmpty values inside secondary parameter ' {

                $primary = @{
                    nullValue      = "nullValue"
                    emptyValue     = "emptyValue"
                    emptyArray     = "emptyArray"
                    emptyHashtable = "emptyHashtable"
                }
                $secondary = @{
                    emptyValue     = ""
                    nullValue      = $null
                    emptyArray     = @()
                    emptyHashtable = @{ }
                }

                $result = Merge-Hashtables -primary $primary -secondary $secondary

                $result.nullValue | Should -Be $primary.nullValue
                $result.emptyValue | Should -Be $primary.emptyValue
                $result.emptyArray | Should -Be $primary.emptyArray
                $result.emptyHashtable | Should -Be $primary.emptyHashtable
                $result.Test | Should -Be $primary.Test
            }

            It 'Merge with BeNullOrEmpty values inside secondary parameter when primary is hashtable' {

                $primary = @{
                    foo = @{
                        bar = "bar"
                    }
                }
                $secondary = @{
                    foo = $null
                }

                $result = Merge-Hashtables -primary $primary -secondary $secondary
                $result.foo | Should -Be $primary.foo
            }

            It "Merge and does not alter the input parameters" {
                $primary = @{
                    Key1 = @{
                        test = "IsThere"
                    }
                    Key2 = @{
                        test = "IsThere"
                    }
                }
                $secondary = @{
                    Key1 = @{
                        test   = "Will be lost"
                        remain = "Will remain"
                    }
                    Key3 = "Will be added"
                }

                $primaryBefore = $primary.Clone()
                $secondaryBefore = $secondary.Clone()

                $expectedResults = @{
                    Key1 = @{
                        test   = "IsThere"
                        remain = "Will remain"
                    }
                    Key2 = @{
                        test = "IsThere"
                    }
                    Key3 = "Will be added"
                }

                $result = Merge-Hashtables -primary $primary -secondary $secondary
                ($result | ConvertTo-Json) | Should -Be ( $expectedResults | ConvertTo-Json)
                ($primary | ConvertTo-Json) | Should -Be ($primaryBefore | ConvertTo-Json)
                ($secondary | ConvertTo-Json) | Should -Be ($secondaryBefore | ConvertTo-Json )
            }
        }

    }
    Describe 'Get-OrElse' {

        $mockedEmptyArray = @()
        $mockedSampleArray = @(1, 2, 3, 2, 1)
        $mockedEmptyHashTable = @{ }
        $mockedSampleHashTable = @{a = 1; b = "2" }
        $mockedEmptyObject = New-Object -TypeName psobject
        $mockedSampleObject = New-Object -TypeName psobject
        $mockedSampleObject | Add-Member -MemberType NoteProperty -Name "UserName" -Value "SampleName"


        Context 'with pipelined value' {

            It 'returns default if value is null' {
                Get-OrElse $Null "default" | Should Be "default"
            }
            It 'returns default if value is empty' {
                Get-OrElse "" "default" | Should Be "default"
            }
            It 'returns value if value is neither null or empty' {
                Get-OrElse "a" "default" | Should Be "a"
                Get-OrElse 1   "default" | Should Be 1
                Get-OrElse " " "default" | Should Be " "
            }
        }
        Context 'with pipeline value' {
            It 'returns default if value is null' {
                $Null | Get-OrElse -Default "default" | Should Be "default"
            }
            It 'returns default if value is empty' {
                "" | Get-OrElse -Default "default" | Should Be "default"
            }
            It 'returns value if value is neither null or empty' {
                "a" | Get-OrElse -Default "default" | Should Be "a"
                1 | Get-OrElse -Default "default" | Should Be 1
                " " | Get-OrElse -Default "default" | Should Be " "
            }
        }
        Context 'with pipeline objects' {
            It 'should return default if array is empty' {
                $mockedEmptyArray | Get-OrElse -Default "default" | Should Be "default"
            }
            It 'should return default if hashtable is empty' {
                $mockedEmptyHashTable | Get-OrElse -Default "default" | Should Be "default"
            }
            It 'should return object if object not empty' {
                $mockedSampleObject | Get-OrElse -Default "default" | Should Be $mockedSampleObject
            }
            It 'should return object if new object PSObject initialized but without members' {
                $mockedEmptyObject | Get-OrElse -Default "default" | Should Be $mockedEmptyObject
            }
        }
        Context 'with parametrized value' {
            It 'should return provided hashmap' {
                Get-OrElse -Value $mockedSampleHashTable -Default "default" | Should Be $mockedSampleHashTable
            }
            It 'should return provided array' {
                Get-OrElse -Value $mockedSampleArray -Default "default" | Should Be $mockedSampleArray
            }
        }
    }
    Describe 'Get-MetadataObjectFromRelease' {
        $Env:AGENT_DISABLELOGPLUGIN_TESTFILEPUBLISHERPLUGIN = "AGENT_DISABLELOGPLUGIN_TESTFILEPUBLISHERPLUGIN"
        $Env:AGENT_DISABLELOGPLUGIN_TESTRESULTLOGPLUGIN = "AGENT_DISABLELOGPLUGIN_TESTRESULTLOGPLUGIN"
        $Env:AGENT_HOMEDIRECTORY = "AGENT_HOMEDIRECTORY"
        $Env:AGENT_ID = "AGENT_ID"
        $Env:AGENT_JOBNAME = "AGENT_JOBNAME"
        $Env:AGENT_JOBSTATUS = "AGENT_JOBSTATUS"
        $Env:AGENT_MACHINENAME = "AGENT_MACHINENAME"
        $Env:AGENT_NAME = "AGENT_NAME"
        $Env:AGENT_OS = "AGENT_OS"
        $Env:AGENT_OSARCHITECTURE = "AGENT_OSARCHITECTURE"
        $Env:AGENT_RELEASEDIRECTORY = "AGENT_RELEASEDIRECTORY"
        $Env:AGENT_RETAINDEFAULTENCODING = "AGENT_RETAINDEFAULTENCODING"
        $Env:AGENT_ROOTDIRECTORY = "AGENT_ROOTDIRECTORY"
        $Env:AGENT_SERVEROMDIRECTORY = "AGENT_SERVEROMDIRECTORY"
        $Env:AGENT_TEMPDIRECTORY = "AGENT_TEMPDIRECTORY"
        $Env:AGENT_TOOLSDIRECTORY = "AGENT_TOOLSDIRECTORY"
        $Env:AGENT_VERSION = "AGENT_VERSION"
        $Env:AGENT_WORKFOLDER = "AGENT_WORKFOLDER"
        $Env:BUILD_BUILDID = "BUILD_BUILDID"
        $Env:BUILD_BUILDNUMBER = "BUILD_BUILDNUMBER"
        $Env:BUILD_BUILDURI = "BUILD_BUILDURI"
        $Env:BUILD_DEFINITIONID = "BUILD_DEFINITIONID"
        $Env:BUILD_DEFINITIONNAME = "BUILD_DEFINITIONNAME"
        $Env:BUILD_PROJECTID = "BUILD_PROJECTID"
        $Env:BUILD_PROJECTNAME = "BUILD_PROJECTNAME"
        $Env:BUILD_REPOSITORY_PROVIDER = "BUILD_REPOSITORY_PROVIDER"
        $Env:BUILD_REQUESTEDFOR = "BUILD_REQUESTEDFOR"
        $Env:BUILD_REQUESTEDFORID = "BUILD_REQUESTEDFORID"
        $Env:BUILD_SOURCEBRANCH = "BUILD_SOURCEBRANCH"
        $Env:BUILD_SOURCEBRANCHNAME = "BUILD_SOURCEBRANCHNAME"
        $Env:BUILD_SOURCEVERSION = "BUILD_SOURCEVERSION"
        $Env:BUILD_TYPE = "BUILD_TYPE"
        $Env:RELEASE_ARTIFACTS_INFORMATIONMODEL_BUILDID = "RELEASE_ARTIFACTS_INFORMATIONMODEL_BUILDID"
        $Env:RELEASE_ARTIFACTS_INFORMATIONMODEL_BUILDNUMBER = "RELEASE_ARTIFACTS_INFORMATIONMODEL_BUILDNUMBER"
        $Env:RELEASE_ARTIFACTS_INFORMATIONMODEL_BUILDURI = "RELEASE_ARTIFACTS_INFORMATIONMODEL_BUILDURI"
        $Env:RELEASE_ARTIFACTS_INFORMATIONMODEL_DEFINITIONID = "RELEASE_ARTIFACTS_INFORMATIONMODEL_DEFINITIONID"
        $Env:RELEASE_ARTIFACTS_INFORMATIONMODEL_DEFINITIONNAME = "RELEASE_ARTIFACTS_INFORMATIONMODEL_DEFINITIONNAME"
        $Env:RELEASE_ARTIFACTS_INFORMATIONMODEL_PROJECTID = "RELEASE_ARTIFACTS_INFORMATIONMODEL_PROJECTID"
        $Env:RELEASE_ARTIFACTS_INFORMATIONMODEL_PROJECTNAME = "RELEASE_ARTIFACTS_INFORMATIONMODEL_PROJECTNAME"
        $Env:RELEASE_ARTIFACTS_INFORMATIONMODEL_REPOSITORY_ID = "RELEASE_ARTIFACTS_INFORMATIONMODEL_REPOSITORY_ID"
        $Env:RELEASE_ARTIFACTS_INFORMATIONMODEL_REPOSITORY_NAME = "RELEASE_ARTIFACTS_INFORMATIONMODEL_REPOSITORY_NAME"
        $Env:RELEASE_ARTIFACTS_INFORMATIONMODEL_REPOSITORY_PROVIDER = "RELEASE_ARTIFACTS_INFORMATIONMODEL_REPOSITORY_PROVIDER"
        $Env:RELEASE_ARTIFACTS_INFORMATIONMODEL_REQUESTEDFOR = "RELEASE_ARTIFACTS_INFORMATIONMODEL_REQUESTEDFOR"
        $Env:RELEASE_ARTIFACTS_INFORMATIONMODEL_REQUESTEDFORID = "RELEASE_ARTIFACTS_INFORMATIONMODEL_REQUESTEDFORID"
        $Env:RELEASE_ARTIFACTS_INFORMATIONMODEL_SOURCEBRANCH = "RELEASE_ARTIFACTS_INFORMATIONMODEL_SOURCEBRANCH"
        $Env:RELEASE_ARTIFACTS_INFORMATIONMODEL_SOURCEBRANCHNAME = "RELEASE_ARTIFACTS_INFORMATIONMODEL_SOURCEBRANCHNAME"
        $Env:RELEASE_ARTIFACTS_INFORMATIONMODEL_SOURCEVERSION = "RELEASE_ARTIFACTS_INFORMATIONMODEL_SOURCEVERSION"
        $Env:RELEASE_ARTIFACTS_INFORMATIONMODEL_TYPE = "RELEASE_ARTIFACTS_INFORMATIONMODEL_TYPE"
        $Env:RELEASE_ARTIFACTS_MT_PORTAL_BUILDID = "RELEASE_ARTIFACTS_MT_PORTAL_BUILDID"
        $Env:RELEASE_ARTIFACTS_MT_PORTAL_BUILDNUMBER = "RELEASE_ARTIFACTS_MT_PORTAL_BUILDNUMBER"
        $Env:RELEASE_ARTIFACTS_MT_PORTAL_BUILDURI = "RELEASE_ARTIFACTS_MT_PORTAL_BUILDURI"
        $Env:RELEASE_ARTIFACTS_MT_PORTAL_DEFINITIONID = "RELEASE_ARTIFACTS_MT_PORTAL_DEFINITIONID"
        $Env:RELEASE_ARTIFACTS_MT_PORTAL_DEFINITIONNAME = "RELEASE_ARTIFACTS_MT_PORTAL_DEFINITIONNAME"
        $Env:RELEASE_ARTIFACTS_MT_PORTAL_PROJECTID = "RELEASE_ARTIFACTS_MT_PORTAL_PROJECTID"
        $Env:RELEASE_ARTIFACTS_MT_PORTAL_PROJECTNAME = "RELEASE_ARTIFACTS_MT_PORTAL_PROJECTNAME"
        $Env:RELEASE_ARTIFACTS_MT_PORTAL_REPOSITORY_PROVIDER = "RELEASE_ARTIFACTS_MT_PORTAL_REPOSITORY_PROVIDER"
        $Env:RELEASE_ARTIFACTS_MT_PORTAL_REQUESTEDFOR = "RELEASE_ARTIFACTS_MT_PORTAL_REQUESTEDFOR"
        $Env:RELEASE_ARTIFACTS_MT_PORTAL_REQUESTEDFORID = "RELEASE_ARTIFACTS_MT_PORTAL_REQUESTEDFORID"
        $Env:RELEASE_ARTIFACTS_MT_PORTAL_SOURCEBRANCH = "RELEASE_ARTIFACTS_MT_PORTAL_SOURCEBRANCH"
        $Env:RELEASE_ARTIFACTS_MT_PORTAL_SOURCEBRANCHNAME = "RELEASE_ARTIFACTS_MT_PORTAL_SOURCEBRANCHNAME"
        $Env:RELEASE_ARTIFACTS_MT_PORTAL_SOURCEVERSION = "RELEASE_ARTIFACTS_MT_PORTAL_SOURCEVERSION"
        $Env:RELEASE_ARTIFACTS_MT_PORTAL_TYPE = "RELEASE_ARTIFACTS_MT_PORTAL_TYPE"
        $Env:RELEASE_ARTIFACTS_TYPEDEFREG_BUILDID = "RELEASE_ARTIFACTS_TYPEDEFREG_BUILDID"
        $Env:RELEASE_ARTIFACTS_TYPEDEFREG_BUILDNUMBER = "RELEASE_ARTIFACTS_TYPEDEFREG_BUILDNUMBER"
        $Env:RELEASE_ARTIFACTS_TYPEDEFREG_BUILDURI = "RELEASE_ARTIFACTS_TYPEDEFREG_BUILDURI"
        $Env:RELEASE_ARTIFACTS_TYPEDEFREG_DEFINITIONID = "RELEASE_ARTIFACTS_TYPEDEFREG_DEFINITIONID"
        $Env:RELEASE_ARTIFACTS_TYPEDEFREG_DEFINITIONNAME = "RELEASE_ARTIFACTS_TYPEDEFREG_DEFINITIONNAME"
        $Env:RELEASE_ARTIFACTS_TYPEDEFREG_PROJECTID = "RELEASE_ARTIFACTS_TYPEDEFREG_PROJECTID"
        $Env:RELEASE_ARTIFACTS_TYPEDEFREG_PROJECTNAME = "RELEASE_ARTIFACTS_TYPEDEFREG_PROJECTNAME"
        $Env:RELEASE_ARTIFACTS_TYPEDEFREG_REPOSITORY_ID = "RELEASE_ARTIFACTS_TYPEDEFREG_REPOSITORY_ID"
        $Env:RELEASE_ARTIFACTS_TYPEDEFREG_REPOSITORY_NAME = "RELEASE_ARTIFACTS_TYPEDEFREG_REPOSITORY_NAME"
        $Env:RELEASE_ARTIFACTS_TYPEDEFREG_REPOSITORY_PROVIDER = "RELEASE_ARTIFACTS_TYPEDEFREG_REPOSITORY_PROVIDER"
        $Env:RELEASE_ARTIFACTS_TYPEDEFREG_REQUESTEDFOR = "RELEASE_ARTIFACTS_TYPEDEFREG_REQUESTEDFOR"
        $Env:RELEASE_ARTIFACTS_TYPEDEFREG_REQUESTEDFORID = "RELEASE_ARTIFACTS_TYPEDEFREG_REQUESTEDFORID"
        $Env:RELEASE_ARTIFACTS_TYPEDEFREG_SOURCEBRANCH = "RELEASE_ARTIFACTS_TYPEDEFREG_SOURCEBRANCH"
        $Env:RELEASE_ARTIFACTS_TYPEDEFREG_SOURCEBRANCHNAME = "RELEASE_ARTIFACTS_TYPEDEFREG_SOURCEBRANCHNAME"
        $Env:RELEASE_ARTIFACTS_TYPEDEFREG_SOURCEVERSION = "RELEASE_ARTIFACTS_TYPEDEFREG_SOURCEVERSION"
        $Env:RELEASE_ARTIFACTS_TYPEDEFREG_TYPE = "RELEASE_ARTIFACTS_TYPEDEFREG_TYPE"
        $Env:RELEASE_ATTEMPTNUMBER = "RELEASE_ATTEMPTNUMBER"
        $Env:RELEASE_DEFINITIONENVIRONMENTID = "RELEASE_DEFINITIONENVIRONMENTID"
        $Env:RELEASE_DEFINITIONID = "RELEASE_DEFINITIONID"
        $Env:RELEASE_DEFINITIONNAME = "RELEASE_DEFINITIONNAME"
        $Env:RELEASE_DEPLOYMENT_REQUESTEDFOR = "RELEASE_DEPLOYMENT_REQUESTEDFOR"
        $Env:RELEASE_DEPLOYMENT_REQUESTEDFOREMAIL = "RELEASE_DEPLOYMENT_REQUESTEDFOREMAIL"
        $Env:RELEASE_DEPLOYMENT_REQUESTEDFORID = "RELEASE_DEPLOYMENT_REQUESTEDFORID"
        $Env:RELEASE_DEPLOYMENT_STARTTIME = "RELEASE_DEPLOYMENT_STARTTIME"
        $Env:RELEASE_DEPLOYMENTID = "RELEASE_DEPLOYMENTID"
        $Env:RELEASE_DEPLOYPHASEID = "RELEASE_DEPLOYPHASEID"
        $Env:RELEASE_ENVIRONMENTID = "RELEASE_ENVIRONMENTID"
        $Env:RELEASE_ENVIRONMENTNAME = "RELEASE_ENVIRONMENTNAME"
        $Env:RELEASE_ENVIRONMENTS_CREATERELEASEMETADATA_STATUS = "RELEASE_ENVIRONMENTS_CREATERELEASEMETADATA_STATUS"
        $Env:RELEASE_ENVIRONMENTURI = "RELEASE_ENVIRONMENTURI"
        $Env:RELEASE_PRIMARYARTIFACTSOURCEALIAS = "RELEASE_PRIMARYARTIFACTSOURCEALIAS"
        $Env:RELEASE_REASON = "RELEASE_REASON"
        $Env:RELEASE_RELEASEDESCRIPTION = "RELEASE_RELEASEDESCRIPTION"
        $Env:RELEASE_RELEASEID = "RELEASE_RELEASEID"
        $Env:RELEASE_RELEASENAME = "RELEASE_RELEASENAME"
        $Env:RELEASE_RELEASEURI = "RELEASE_RELEASEURI"
        $Env:RELEASE_RELEASEWEBURL = "RELEASE_RELEASEWEBURL"
        $Env:RELEASE_REQUESTEDFOR = "RELEASE_REQUESTEDFOR"
        $Env:RELEASE_REQUESTEDFOREMAIL = "RELEASE_REQUESTEDFOREMAIL"
        $Env:RELEASE_REQUESTEDFORID = "RELEASE_REQUESTEDFORID"
        $Env:RELEASE_SKIPARTIFACTSDOWNLOAD = "RELEASE_SKIPARTIFACTSDOWNLOAD"
        $Env:RELEASE_TRIGGERINGARTIFACT_ALIAS = "RELEASE_TRIGGERINGARTIFACT_ALIAS"
        $Env:SYSTEM_TEAMPROJECT = "TEAMPROJECT"
        $Env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI = "TEAMFOUNDATIONCOLLECTIONURI"

        Context 'Test generate artficat object' {

            New-Item -ItemType "directory" -Path "TestDrive:\Artifacts"
            New-Item -ItemType "directory" -Path "TestDrive:\Artifacts\InformationModel"
            New-Item -ItemType "directory" -Path "TestDrive:\Artifacts\TypeDefReg"
            New-Item -ItemType "directory" -Path "TestDrive:\Artifacts\MT_PORTAL"


            $metadataObject = Get-MetadataObjectFromRelease -ArtifactsDirectory "TestDrive:\Artifacts"


            $metadataObject.teamfoundationcollectionuri | Should Be $Env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI
            $metadataObject.resources.InformationModel.triggeredBy | Should Be $Env:RELEASE_ARTIFACTS_INFORMATIONMODEL_REQUESTEDFOR
            # Write-Host ($metadataObject | ConvertTo-Json)

        }


    }




}