test/Publish-AdfV2FromJson-2.Tests.ps1

BeforeDiscovery {
    $ModuleRootPath = $PSScriptRoot | Split-Path -Parent
    $moduleManifestName = 'azure.datafactory.tools.psd1'
    $moduleManifestPath = Join-Path -Path $ModuleRootPath -ChildPath $moduleManifestName

    Import-Module -Name $moduleManifestPath -Force -Verbose:$false
}

InModuleScope azure.datafactory.tools {
    $testHelperPath = $PSScriptRoot | Join-Path -ChildPath 'TestHelper'
    Import-Module -Name $testHelperPath -Force

    # Variables for use in tests
    $script:t = Get-TargetEnv 'BigFactorySample2'
    $script:ResourceGroupName = $t.ResourceGroupName
    $script:DataFactoryOrigName = $t.DataFactoryOrigName
    $script:DataFactoryName = $t.DataFactoryName
    $script:Location = $t.Location
    $script:adfi = Get-AzDataFactoryV2 -ResourceGroupName "$ResourceGroupName" -Name "$DataFactoryName"
    #$script:RootFolder = Join-Path $PSScriptRoot "BigFactorySample2"

    $script:opt = New-AdfPublishOption
    $opt.IncrementalDeployment = $true
    $opt.Includes.Add("*.TR_RunEveryDay", "")
    $opt.Includes.Add("*.PL_wait5sec", "")
    $opt.Includes.Add("factory.*", "")

    $script:SrcFolder = "$PSScriptRoot\$($script:DataFactoryOrigName)"
    $script:TmpFolder = (New-TemporaryDirectory).FullName
    $script:RootFolder = Join-Path -Path $script:TmpFolder -ChildPath (Split-Path -Path $script:SrcFolder -Leaf)
    Copy-Item -Path "$SrcFolder" -Destination "$TmpFolder" -Filter "*.*" -Recurse:$true -Force 


    Describe 'Get-AzDFV2Credential' -Tag 'Unit' {
        It 'Should exist' {
            { Get-Command -Name Get-AzDFV2Credential -ErrorAction Stop } | Should -Not -Throw
        }
        It 'Should run successfully' {
            { Get-AzDFV2Credential -adfi $adfi | ToArray } | Should -Not -Throw
        }
    } 

    Describe 'Publish-AdfV2FromJson' {
        It 'BigFactorySample2 should deploy credential object successfully' {
            $o = New-AdfPublishOption
            $o.StopStartTriggers = $false
            $o.Includes.Add("cred*.*", "")
            $o.Includes.Add("linked*.ls_azurekeyvault", "")
            Publish-AdfV2FromJson -RootFolder $RootFolder -ResourceGroupName $script:ResourceGroupName `
                -Location $script:Location -DataFactoryName $script:DataFactoryName -Option $o
        }
        It 'must return credential object after deployment' {
            $crs = Get-AzDFV2Credential -adfi $adfi | ToArray
            $crs.Count | Should -Be 1
        }
    }

    Describe 'Publish-AdfV2FromJson' -Tag 'Integration', 'IncrementalDeployment' {

        It 'Should run successfully even when no Global Params are in target (new) ADF' {
            $opt.IncrementalDeployment = $true
            $opt.CreateNewInstance = $true
            $opt.StopStartTriggers = $false
            Publish-AdfV2FromJson -RootFolder "$RootFolder" `
                -ResourceGroupName "$ResourceGroupName" `
                -DataFactoryName "$DataFactoryName" `
                -Location "$Location" -Option $opt
        }
        # This is no longer valid as new version keep state in Storage, not in ADF
        # It 'New GP "adftools_deployment_state" should exist' {
        # $f = Get-AzDataFactoryV2 -ResourceGroupName $t.ResourceGroupName -DataFactoryName $t.DataFactoryName
        # $f.GlobalParameters.Keys.Contains("adftools_deployment_state") | Should -Be $true
        # }

        It 'Should run successfully even when no Global Params are in target (exists) ADF' {
            Publish-AdfV2FromJson -RootFolder "$RootFolder" `
                -ResourceGroupName "$ResourceGroupName" `
                -DataFactoryName "$DataFactoryName" `
                -Location "$Location" -Option $opt
        }
    }

    Describe 'Publish-AdfV2FromJson' -Tag 'Integration', 'IncrementalDeployment' {

        BeforeEach {
            $VerbosePreference = 'Continue'
            Mock Deploy-AdfObject {
                param ($obj)
                if ($obj.Type -eq 'factory') {
                    if ($obj.Body.properties.globalParameters | Get-Member -MemberType NoteProperty -Name 'adftools_deployment_state') {
                        $ds = (Get-Content -Path "test\misc\adftools_deployment_state.json" -Raw -Encoding 'utf8') | ConvertFrom-Json
                        for ($i = 1000; $i -lt 3001; $i++) {
                            Add-ObjectProperty -obj $ds -path "Deployed.pipeline$i" -value "00000000000000000000000000000000"
                        }
                        $obj.Body.properties.globalParameters.adftools_deployment_state.type = "object"
                        $obj.Body.properties.globalParameters.adftools_deployment_state.value = $ds
                        Save-AdfObjectAsFile -obj $obj
                    }
                    Deploy-AdfObjectOnly -obj $obj
                }
            }
        }
        It 'Should deploy successfully even big size of global parameters' { 
            $opt.StopStartTriggers = $false
            Publish-AdfV2FromJson -RootFolder "$RootFolder" `
                -ResourceGroupName "$ResourceGroupName" `
                -DataFactoryName "$DataFactoryName" `
                -Location "$Location" -Option $opt
        }

    }

    Describe 'Publish-AdfV2FromJson' -Tag 'Integration', 'IncrementalDeployment' {

        BeforeEach {
            Mock Stop-AzDataFactoryV2Trigger {
                param ($ResourceGroupName, $DataFactoryName, $Name)
            }
            Mock Remove-AzDataFactoryV2Trigger {
                param ($ResourceGroupName, $DataFactoryName, $Name)
            }
        }

        It 'Should have 1 trigger active' {
            Start-AzDataFactoryV2Trigger -ResourceGroupName $t.ResourceGroupName -DataFactoryName $t.DataFactoryName -Name 'TR_RunEveryDay' -Force
            $t = Get-AzDataFactoryV2Trigger -ResourceGroupName $t.ResourceGroupName -DataFactoryName $t.DataFactoryName -Name 'TR_RunEveryDay'
            $t.RuntimeState | Should -Be 'Started'
        }

        It 'Should disable and delete trigger when TriggerStartMethod = KeepPreviousState' {
            Remove-Item -Path "$RootFolder\trigger\*" -Filter "*.json" -Force
            $opt.DeleteNotInSource = $true
            $opt.StopStartTriggers = $true
            $opt.TriggerStopMethod = 'DeployableOnly'
            $opt.TriggerStartMethod = 'KeepPreviousState'
            Publish-AdfV2FromJson -RootFolder "$RootFolder" `
                -ResourceGroupName "$ResourceGroupName" `
                -DataFactoryName "$DataFactoryName" `
                -Location "$Location" -Option $opt
            Assert-MockCalled Stop-AzDataFactoryV2Trigger -Times 1
            Assert-MockCalled Remove-AzDataFactoryV2Trigger -Times 1
        }



    }


}