functions/tests/Invoke-ScaleSqlPaasDatabase.Tests.ps1

param(

)

$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "")
$ModuleBase = (Get-Item $PsScriptRoot).Parent.Parent.FullName


Remove-Module ScaleSqlPaaS -ErrorAction SilentlyContinue
Import-Module "$ModuleBase\ScaleSqlPaaS.psm1" 


InModuleScope ScaleSqlPaaS {

    Describe 'ScaleDBs' {

        BeforeAll{

            function Set-AzSqlDatabase {

            
            }

            
            $TagsDefault = @{'ScaleUpSize'='S5';'ScaleDownSize'='S0'}
            $TagsDifferent = @{'ScaleUpSizeFoo'='S10';'ScaleDownSizeFoo'='S1'}

            $S5PaaSDB = @{
                'ResourceGroupName'='RGName'
                'ServerName'='svr1'
                'DatabaseName'='db1'
                'ResourceId'='/subscriptions/212b7f1a-0ffb-4514-a1ce-e53c7e6bdb95/resourceGroups/rgname/providers/Microsoft.Sql/servers/svr1/databases/db1'
                'Location'='northeurope'
                'Tags'=$TagsDefault
                'CurrentServiceObjectiveName'='S5'
            }
            
            $S0PaaSDB = @{
                'ResourceGroupName'='RGName'
                'ServerName'='svr1'
                'DatabaseName'='db1'
                'ResourceId'='/subscriptions/212b7f1a-0ffb-4514-a1ce-e53c7e6bdb95/resourceGroups/rgname/providers/Microsoft.Sql/servers/svr1/databases/db1'
                'Location'='northeurope'
                'Tags'=$TagsDefault
                'CurrentServiceObjectiveName'='S0'
            }

            $S5PaaSDBDiff = @{
                'ResourceGroupName'='RGName'
                'ServerName'='svr1'
                'DatabaseName'='db1'
                'ResourceId'='/subscriptions/212b7f1a-0ffb-4514-a1ce-e53c7e6bdb95/resourceGroups/rgname/providers/Microsoft.Sql/servers/svr1/databases/db1'
                'Location'='northeurope'
                'Tags'=$TagsDifferent
                'CurrentServiceObjectiveName'='S5'
            }

            $S10PaaSDBDiff = @{
                'ResourceGroupName'='RGName'
                'ServerName'='svr1'
                'DatabaseName'='db1'
                'ResourceId'='/subscriptions/212b7f1a-0ffb-4514-a1ce-e53c7e6bdb95/resourceGroups/rgname/providers/Microsoft.Sql/servers/svr1/databases/db1'
                'Location'='northeurope'
                'Tags'=$TagsDifferent
                'CurrentServiceObjectiveName'='S10'
            }
            
            $S1PaaSDBDiff = @{
                'ResourceGroupName'='RGName'
                'ServerName'='svr1'
                'DatabaseName'='db1'
                'ResourceId'='/subscriptions/212b7f1a-0ffb-4514-a1ce-e53c7e6bdb95/resourceGroups/rgname/providers/Microsoft.Sql/servers/svr1/databases/db1'
                'Location'='northeurope'
                'Tags'=$TagsDifferent
                'CurrentServiceObjectiveName'='S1'
            }            

        }
       

        Context 'DB should scale using default tags' {

            It 'Scale down from S5' {
                Mock -CommandName Set-AzSqlDatabase -MockWith { $S0PaaSDB }

                $Result = Invoke-ScaleSqlPaasDatabase -PaasSqlDatabase $S5PaaSDB -ScaleAction Down

                Assert-MockCalled -CommandName Set-AzSqlDatabase -Times 1 -Scope It
                $Result.CurrentServiceObjectiveName | Should Be 'S0'
            }

            It 'Scale up to S5' {
                Mock -CommandName Set-AzSqlDatabase -MockWith { $S5PaaSDB }

                $Result = Invoke-ScaleSqlPaasDatabase -PaasSqlDatabase $S0PaaSDB -ScaleAction Up

                Assert-MockCalled -CommandName Set-AzSqlDatabase -Times 1 -Scope It
                $Result.CurrentServiceObjectiveName | Should Be 'S5'
            }  

            It 'Do not scale up' {
                Mock -CommandName Set-AzSqlDatabase -MockWith { $S5PaaSDB }

                $Result = Invoke-ScaleSqlPaasDatabase -PaasSqlDatabase $S5PaaSDB -ScaleAction Up

                Assert-MockCalled -CommandName Set-AzSqlDatabase -Times 0 -Scope It
                $Result | Should Be $Null
            }  

            It 'Do not scale down' {
                Mock -CommandName Set-AzSqlDatabase -MockWith { $S0PaaSDB }

                $Result = Invoke-ScaleSqlPaasDatabase -PaasSqlDatabase $S0PaaSDB -ScaleAction Down

                Assert-MockCalled -CommandName Set-AzSqlDatabase -Times 0 -Scope It
                $Result | Should Be $Null
            }  

        }

        Context 'DB should scale using explicit tags' {

            It 'Scale down from S5' {
                Mock -CommandName Set-AzSqlDatabase -MockWith { $S1PaaSDBDiff }

                $Result = Invoke-ScaleSqlPaasDatabase -PaasSqlDatabase $S5PaaSDBDiff -ScaleAction Down -ScaleDownSizeTagName 'ScaleDownSizeFoo'

                Assert-MockCalled -CommandName Set-AzSqlDatabase -Times 1 -Scope It
                $Result.CurrentServiceObjectiveName | Should Be 'S1'
            }

            It 'Scale up to S10' {
                Mock -CommandName Set-AzSqlDatabase -MockWith { $S10PaaSDBDiff }

                $Result = Invoke-ScaleSqlPaasDatabase -PaasSqlDatabase $S1PaaSDBDiff -ScaleAction Up -ScaleUpSizeTagName 'ScaleUpSizeFoo'

                Assert-MockCalled -CommandName Set-AzSqlDatabase -Times 1 -Scope It
                $Result.CurrentServiceObjectiveName | Should Be 'S10'
            }

            It 'Do Not scale up' {
                Mock -CommandName Set-AzSqlDatabase -MockWith { $S10PaaSDBDiff }

                $Result = Invoke-ScaleSqlPaasDatabase -PaasSqlDatabase $S10PaaSDBDiff -ScaleAction Up -ScaleUpSizeTagName 'ScaleUpSizeFoo'

                Assert-MockCalled -CommandName Set-AzSqlDatabase -Times 0 -Scope It
                $Result | Should Be $Null
            }            
            
            It 'Do Not scale down' {
                Mock -CommandName Set-AzSqlDatabase -MockWith { $S1PaaSDBDiff }

                $Result = Invoke-ScaleSqlPaasDatabase -PaasSqlDatabase $S1PaaSDBDiff -ScaleAction Down -ScaleDownSizeTagName 'ScaleDownSizeFoo'

                Assert-MockCalled -CommandName Set-AzSqlDatabase -Times 0 -Scope It
                $Result | Should Be $Null
            }                        
            
        }

        Context 'DB should scale using explicit value' {

            It 'Scale to S0' {
                Mock -CommandName Set-AzSqlDatabase -MockWith { $S0PaaSDB }

                $Result = Invoke-ScaleSqlPaasDatabase -PaasSqlDatabase $S5PaaSDB -ServiceObjectiveName 'S0'

                Assert-MockCalled -CommandName Set-AzSqlDatabase -Times 1 -Scope It
                $Result.CurrentServiceObjectiveName | Should Be 'S0'
            }

            It 'Scale to S10' {
                Mock -CommandName Set-AzSqlDatabase -MockWith { $S10PaaSDBDiff }

                $Result = Invoke-ScaleSqlPaasDatabase -PaasSqlDatabase $S1PaaSDBDiff -ServiceObjectiveName 'S10'

                Assert-MockCalled -CommandName Set-AzSqlDatabase -Times 1 -Scope It
                $Result.CurrentServiceObjectiveName | Should Be 'S10'
            }


            It 'Do not Scale' {
                Mock -CommandName Set-AzSqlDatabase -MockWith { $S0PaaSDB }

                $Result = Invoke-ScaleSqlPaasDatabase -PaasSqlDatabase $S0PaaSDB -ServiceObjectiveName 'S0'

                Assert-MockCalled -CommandName Set-AzSqlDatabase -Times 0 -Scope It
                $Result | Should Be $Null
            }
            
        }        


        Context 'Missing Tags' {

            It 'Missing scale down tag' {
                Mock -CommandName Set-AzSqlDatabase -MockWith { $S1PaaSDBDiff }

                {Invoke-ScaleSqlPaasDatabase -PaasSqlDatabase $S1PaaSDBDiff -ScaleAction Down -ScaleDownSizeTagName 'NotExists'} |
                    Should -Throw  "No tag with name 'NotExists'"                
                
            }

            It 'Missing scale up tag' {
                Mock -CommandName Set-AzSqlDatabase -MockWith { $S1PaaSDBDiff }

                {Invoke-ScaleSqlPaasDatabase -PaasSqlDatabase $S1PaaSDBDiff -ScaleAction Up -ScaleUpSizeTagName 'NotExists'} |
                    Should -Throw  "No tag with name 'NotExists'"                
                
            }            
        }
    }
}