tests/Invoke-DBODeployment.Tests.ps1
Param ( [switch]$Batch ) if ($PSScriptRoot) { $commandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", ""); $here = $PSScriptRoot } else { $commandName = "_ManualExecution"; $here = (Get-Item . ).FullName } if (!$Batch) { # Is not a part of the global batch => import module #Explicitly import the module for testing Import-Module "$here\..\dbops.psd1" -Force; Get-DBOModuleFileList -Type internal | ForEach-Object { . $_.FullName } } else { # Is a part of a batch, output some eye-catching happiness Write-Host "Running $commandName tests" -ForegroundColor Cyan } . "$here\constants.ps1" $workFolder = Join-PSFPath -Normalize "$here\etc" "$commandName.Tests.dbops" $unpackedFolder = Join-Path $workFolder 'unpacked' $logTable = "testdeploymenthistory" $cleanupScript = Join-PSFPath -Normalize "$here\etc\sqlserver-tests\Cleanup.sql" $tranFailScripts = Join-PSFPath -Normalize "$here\etc\sqlserver-tests\transactional-failure" $v1scripts = Join-PSFPath -Normalize "$here\etc\sqlserver-tests\success\1.sql" $v2scripts = Join-PSFPath -Normalize "$here\etc\sqlserver-tests\success\2.sql" $v1files = Get-DbopsFile -Path $v1scripts -Absolute $true $v2files = Get-DbopsFile -Path $v2scripts -Absolute $true $verificationScript = Join-PSFPath -Normalize "$here\etc\sqlserver-tests\verification\select.sql" $packageFileName = Join-PSFPath -Normalize $workFolder "dbops.package.json" $cleanupPackageName = Join-PSFPath -Normalize "$here\etc\TempCleanup.zip" $outFile = Join-PSFPath -Normalize "$here\etc\outLog.txt" $newDbName = "_test_$commandName" $dropDatabaseScript = 'IF EXISTS (SELECT * FROM sys.databases WHERE name = ''{0}'') BEGIN ALTER DATABASE [{0}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE [{0}]; END' -f $newDbName $createDatabaseScript = 'IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = ''{0}'') BEGIN CREATE DATABASE [{0}]; END' -f $newDbName Describe "Invoke-DBODeployment integration tests" -Tag $commandName, IntegrationTests { BeforeAll { if ((Test-Path $workFolder) -and $workFolder -like '*.Tests.dbops') { Remove-Item $workFolder -Recurse } $null = New-Item $workFolder -ItemType Directory -Force $null = New-Item $unpackedFolder -ItemType Directory -Force $packageName = New-DBOPackage -Path (Join-Path $workFolder 'tmp.zip') -ScriptPath $tranFailScripts -Build 1.0 -Force $null = Expand-Archive -Path $packageName -DestinationPath $workFolder -Force $null = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database master -Query $dropDatabaseScript $null = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database master -Query $createDatabaseScript } BeforeEach { $deploymentConfig = @{ SqlInstance = $script:mssqlInstance Credential = $script:mssqlCredential Database = $newDbName SchemaVersionTable = $logTable Silent = $true DeploymentMethod = 'NoTransaction' } } AfterAll { if ((Test-Path $workFolder) -and $workFolder -like '*.Tests.dbops') { Remove-Item $workFolder -Recurse } $null = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database master -Query $dropDatabaseScript } Context "testing transactional deployment of extracted package" { BeforeEach { $null = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $cleanupScript } It "Should throw an error and not create any objects" { #Running package $deploymentConfig.DeploymentMethod = 'SingleTransaction' try { $null = Invoke-DBODeployment -PackageFile $packageFileName -Configuration $deploymentConfig } catch { $testResults = $_ } $testResults.Exception.Message | Should Be "There is already an object named 'a' in the database." #Verifying objects $testResults = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $verificationScript $logTable | Should Not BeIn $testResults.name 'a' | Should Not BeIn $testResults.name 'b' | Should Not BeIn $testResults.name 'c' | Should Not BeIn $testResults.name 'd' | Should Not BeIn $testResults.name } } Context "testing non transactional deployment of extracted package" { BeforeAll { $null = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $cleanupScript } It "Should throw an error and create one object" { #Running package try { $null = Invoke-DBODeployment -PackageFile $packageFileName -Configuration $deploymentConfig } catch { $testResults = $_ } $testResults.Exception.Message | Should Be "There is already an object named 'a' in the database." #Verifying objects $testResults = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $verificationScript $logTable | Should BeIn $testResults.name 'a' | Should BeIn $testResults.name 'b' | Should Not BeIn $testResults.name 'c' | Should Not BeIn $testResults.name 'd' | Should Not BeIn $testResults.name } } Context "testing script deployment" { BeforeAll { $null = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $cleanupScript } It "should deploy version 1.0" { $testResults = Invoke-DBODeployment -ScriptFile $v1files -Configuration $deploymentConfig $testResults.Successful | Should Be $true $testResults.Scripts.Name | Should Be (Resolve-Path $v1scripts).Path $testResults.SqlInstance | Should Be $script:mssqlInstance $testResults.Database | Should Be $newDbName $testResults.SourcePath | Should Be $v1scripts $testResults.ConnectionType | Should Be 'SQLServer' $testResults.Configuration.SchemaVersionTable | Should Be $logTable $testResults.Error | Should BeNullOrEmpty $testResults.Duration.TotalMilliseconds | Should -BeGreaterOrEqual 0 $testResults.StartTime | Should Not BeNullOrEmpty $testResults.EndTime | Should Not BeNullOrEmpty $testResults.EndTime | Should -BeGreaterOrEqual $testResults.StartTime 'Upgrade successful' | Should BeIn $testResults.DeploymentLog #Verifying objects $testResults = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $verificationScript $logTable | Should BeIn $testResults.name 'a' | Should BeIn $testResults.name 'b' | Should BeIn $testResults.name 'c' | Should Not BeIn $testResults.name 'd' | Should Not BeIn $testResults.name } It "should deploy version 2.0" { $testResults = Invoke-DBODeployment -ScriptFile $v2files -Configuration $deploymentConfig $testResults.Successful | Should Be $true $testResults.Scripts.Name | Should Be (Resolve-Path $v2scripts).Path $testResults.SqlInstance | Should Be $script:mssqlInstance $testResults.Database | Should Be $newDbName $testResults.SourcePath | Should Be $v2scripts $testResults.ConnectionType | Should Be 'SQLServer' $testResults.Configuration.SchemaVersionTable | Should Be $logTable $testResults.Error | Should BeNullOrEmpty $testResults.Duration.TotalMilliseconds | Should -BeGreaterOrEqual 0 $testResults.StartTime | Should Not BeNullOrEmpty $testResults.EndTime | Should Not BeNullOrEmpty $testResults.EndTime | Should -BeGreaterOrEqual $testResults.StartTime 'Upgrade successful' | Should BeIn $testResults.DeploymentLog #Verifying objects $testResults = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $verificationScript $logTable | Should BeIn $testResults.name 'a' | Should BeIn $testResults.name 'b' | Should BeIn $testResults.name 'c' | Should BeIn $testResults.name 'd' | Should BeIn $testResults.name } } Context "testing deployment order" { BeforeAll { $null = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $cleanupScript } It "should deploy 2.sql before 1.sql" { $testResults = Invoke-DBODeployment -ScriptFile $v2files, $v1files -Configuration $deploymentConfig $testResults.Successful | Should Be $true $testResults.Scripts.Name | Should Be (Resolve-Path $v2scripts, $v1scripts).Path $testResults.SqlInstance | Should Be $script:mssqlInstance $testResults.Database | Should Be $newDbName $testResults.SourcePath | Should Be @($v2scripts, $v1scripts) $testResults.ConnectionType | Should Be 'SQLServer' $testResults.Configuration.SchemaVersionTable | Should Be $logTable $testResults.Error | Should BeNullOrEmpty $testResults.Duration.TotalMilliseconds | Should -BeGreaterOrEqual 0 $testResults.StartTime | Should Not BeNullOrEmpty $testResults.EndTime | Should Not BeNullOrEmpty $testResults.EndTime | Should -BeGreaterOrEqual $testResults.StartTime 'Upgrade successful' | Should BeIn $testResults.DeploymentLog #Verifying objects $testResults = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $verificationScript $logTable | Should BeIn $testResults.name 'a' | Should BeIn $testResults.name 'b' | Should BeIn $testResults.name 'c' | Should BeIn $testResults.name 'd' | Should BeIn $testResults.name #Verifying order $r1 = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -Query "SELECT ScriptName FROM $logtable ORDER BY Id" $r1.ScriptName | Should Be (Get-Item $v2scripts, $v1scripts).FullName } } Context "testing timeouts" { BeforeAll { $file = "$workFolder\delay.sql" "WAITFOR DELAY '00:00:03'; PRINT ('Successful!')" | Out-File $file $delayScripts = Get-DbopsFile -Path "$workFolder\delay.sql" -Absolute $true } BeforeEach { $null = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $cleanupScript } It "should throw timeout error" { $deploymentConfig.ExecutionTimeout = 2 try { $null = Invoke-DBODeployment -ScriptFile $delayScripts -Configuration $deploymentConfig -OutputFile "$workFolder\log.txt" } catch { $testResults = $_ } $testResults | Should Not Be $null $testResults.Exception.Message | Should BeLike '*Timeout Expired.*' $output = Get-Content "$workFolder\log.txt" -Raw $output | Should BeLike '*Timeout Expired*' $output | Should Not BeLike '*Successful!*' } It "should successfully run within specified timeout" { $deploymentConfig.ExecutionTimeout = 6 $testResults = Invoke-DBODeployment -ScriptFile $delayScripts -Configuration $deploymentConfig -OutputFile "$workFolder\log.txt" $testResults.Successful | Should Be $true $testResults.Scripts.Name | Should Be (Join-PSFPath -Normalize "$workFolder\delay.sql") $testResults.SqlInstance | Should Be $script:mssqlInstance $testResults.Database | Should Be $newDbName $testResults.SourcePath | Should Be (Join-PSFPath -Normalize "$workFolder\delay.sql") $testResults.ConnectionType | Should Be 'SQLServer' $testResults.Configuration.SchemaVersionTable | Should Be $logTable $testResults.Error | Should BeNullOrEmpty $testResults.Duration.TotalMilliseconds | Should -BeGreaterThan 3000 $testResults.StartTime | Should Not BeNullOrEmpty $testResults.EndTime | Should Not BeNullOrEmpty $testResults.EndTime | Should -BeGreaterThan $testResults.StartTime $output = Get-Content "$workFolder\log.txt" -Raw $output | Should Not BeLike '*Timeout Expired*' $output | Should BeLike '*Successful!*' } It "should successfully run with infinite timeout" { $deploymentConfig.ExecutionTimeout = 0 $testResults = Invoke-DBODeployment -ScriptFile $delayScripts -Configuration $deploymentConfig -OutputFile "$workFolder\log.txt" $testResults.Successful | Should Be $true $testResults.Scripts.Name | Should Be (Join-PSFPath -Normalize "$workFolder\delay.sql") $testResults.SqlInstance | Should Be $script:mssqlInstance $testResults.Database | Should Be $newDbName $testResults.SourcePath | Should Be (Join-PSFPath -Normalize "$workFolder\delay.sql") $testResults.ConnectionType | Should Be 'SQLServer' $testResults.Configuration.SchemaVersionTable | Should Be $logTable $testResults.Error | Should BeNullOrEmpty $testResults.Duration.TotalMilliseconds | Should -BeGreaterOrEqual 0 $testResults.StartTime | Should Not BeNullOrEmpty $testResults.EndTime | Should Not BeNullOrEmpty $testResults.EndTime | Should -BeGreaterOrEqual $testResults.StartTime 'Upgrade successful' | Should BeIn $testResults.DeploymentLog $output = Get-Content "$workFolder\log.txt" -Raw $output | Should Not BeLike '*Timeout Expired*' $output | Should BeLike '*Successful!*' } } Context "$commandName whatif tests" { BeforeAll { $null = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $cleanupScript } AfterAll { } It "should deploy nothing" { $testResults = Invoke-DBODeployment -ScriptFile $v1files -Configuration $deploymentConfig -WhatIf $testResults.Successful | Should Be $true $testResults.Scripts.Name | Should Be $v1scripts $testResults.SqlInstance | Should Be $script:mssqlInstance $testResults.Database | Should Be $newDbName $testResults.SourcePath | Should Be $v1scripts $testResults.ConnectionType | Should Be 'SQLServer' $testResults.Configuration.SchemaVersionTable | Should Be $logTable $testResults.Error | Should BeNullOrEmpty $testResults.Duration.TotalMilliseconds | Should -BeGreaterOrEqual 0 $testResults.StartTime | Should Not BeNullOrEmpty $testResults.EndTime | Should Not BeNullOrEmpty $testResults.EndTime | Should -BeGreaterOrEqual $testResults.StartTime "No deployment performed - WhatIf mode." | Should BeIn $testResults.DeploymentLog "$v1scripts would have been executed - WhatIf mode." | Should BeIn $testResults.DeploymentLog #Verifying objects $testResults = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $verificationScript $logTable | Should Not BeIn $testResults.name 'a' | Should Not BeIn $testResults.name 'b' | Should Not BeIn $testResults.name 'c' | Should Not BeIn $testResults.name 'd' | Should Not BeIn $testResults.name } } Context "testing deployment without specifying SchemaVersion table" { BeforeAll { $null = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $cleanupScript } AfterAll { $null = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -Query "IF OBJECT_ID('SchemaVersions') IS NOT NULL DROP TABLE SchemaVersions" } It "should deploy version 1.0" { $deploymentConfig.Remove('SchemaVersionTable') $before = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $verificationScript $rowsBefore = ($before | Measure-Object).Count $testResults = Invoke-DBODeployment -ScriptFile $v1files -Configuration $deploymentConfig $testResults.Successful | Should Be $true $testResults.Scripts.Name | Should Be (Resolve-Path $v1scripts).Path $testResults.SqlInstance | Should Be $script:mssqlInstance $testResults.Database | Should Be $newDbName $testResults.SourcePath | Should Be $v1scripts $testResults.ConnectionType | Should Be 'SQLServer' $testResults.Configuration.SchemaVersionTable | Should Be 'SchemaVersions' $testResults.Error | Should BeNullOrEmpty $testResults.Duration.TotalMilliseconds | Should -BeGreaterOrEqual 0 $testResults.StartTime | Should Not BeNullOrEmpty $testResults.EndTime | Should Not BeNullOrEmpty $testResults.EndTime | Should -BeGreaterOrEqual $testResults.StartTime 'Upgrade successful' | Should BeIn $testResults.DeploymentLog #Verifying objects $testResults = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $verificationScript 'SchemaVersions' | Should BeIn $testResults.name 'a' | Should BeIn $testResults.name 'b' | Should BeIn $testResults.name 'c' | Should Not BeIn $testResults.name 'd' | Should Not BeIn $testResults.name ($testResults | Measure-Object).Count | Should Be ($rowsBefore + 3) } It "should deploy version 2.0" { $deploymentConfig.Remove('SchemaVersionTable') $before = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $verificationScript $rowsBefore = ($before | Measure-Object).Count $testResults = Invoke-DBODeployment -ScriptFile $v2files -Configuration $deploymentConfig $testResults.Successful | Should Be $true $testResults.Scripts.Name | Should Be (Resolve-Path $v2scripts).Path $testResults.SqlInstance | Should Be $script:mssqlInstance $testResults.Database | Should Be $newDbName $testResults.SourcePath | Should Be $v2scripts $testResults.ConnectionType | Should Be 'SQLServer' $testResults.Configuration.SchemaVersionTable | Should Be 'SchemaVersions' $testResults.Error | Should BeNullOrEmpty $testResults.Duration.TotalMilliseconds | Should -BeGreaterOrEqual 0 $testResults.StartTime | Should Not BeNullOrEmpty $testResults.EndTime | Should Not BeNullOrEmpty $testResults.EndTime | Should -BeGreaterOrEqual $testResults.StartTime 'Upgrade successful' | Should BeIn $testResults.DeploymentLog #Verifying objects $testResults = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $verificationScript 'SchemaVersions' | Should BeIn $testResults.name 'a' | Should BeIn $testResults.name 'b' | Should BeIn $testResults.name 'c' | Should BeIn $testResults.name 'd' | Should BeIn $testResults.name ($testResults | Measure-Object).Count | Should Be ($rowsBefore + 2) } } Context "testing deployment with no history`: SchemaVersion is null" { BeforeEach { $null = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $cleanupScript } AfterEach { $null = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -Query "IF OBJECT_ID('SchemaVersions') IS NOT NULL DROP TABLE SchemaVersions" } It "should deploy version 1.0 without creating SchemaVersions" { $deploymentConfig.SchemaVersionTable = $null $before = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $verificationScript $rowsBefore = ($before | Measure-Object).Count $testResults = Invoke-DBODeployment -ScriptFile $v1files -Configuration $deploymentConfig $testResults.Successful | Should Be $true $testResults.Scripts.Name | Should Be (Resolve-Path $v1scripts).Path $testResults.SqlInstance | Should Be $script:mssqlInstance $testResults.Database | Should Be $newDbName $testResults.SourcePath | Should Be $v1scripts $testResults.ConnectionType | Should Be 'SQLServer' $testResults.Configuration.SchemaVersionTable | Should BeNullOrEmpty $testResults.Error | Should BeNullOrEmpty $testResults.Duration.TotalMilliseconds | Should -BeGreaterOrEqual 0 $testResults.StartTime | Should Not BeNullOrEmpty $testResults.EndTime | Should Not BeNullOrEmpty $testResults.EndTime | Should -BeGreaterOrEqual $testResults.StartTime 'Upgrade successful' | Should BeIn $testResults.DeploymentLog 'Checking whether journal table exists..' | Should Not BeIn $testResults.DeploymentLog #Verifying objects $testResults = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $verificationScript 'SchemaVersions' | Should Not BeIn $testResults.name 'a' | Should BeIn $testResults.name 'b' | Should BeIn $testResults.name 'c' | Should Not BeIn $testResults.name 'd' | Should Not BeIn $testResults.name ($testResults | Measure-Object).Count | Should Be ($rowsBefore + 2) } } Context "testing registration of scripts" { BeforeAll { $null = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $cleanupScript } It "should register version 1.0 without creating any objects" { $before = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $verificationScript $rowsBefore = ($before | Measure-Object).Count $testResults = Invoke-DBODeployment -ScriptFile $v1files -Configuration $deploymentConfig -RegisterOnly $testResults.Successful | Should Be $true $testResults.Scripts.Name | Should Be (Resolve-Path $v1scripts).Path $testResults.SqlInstance | Should Be $script:mssqlInstance $testResults.Database | Should Be $newDbName $testResults.SourcePath | Should Be $v1scripts $testResults.ConnectionType | Should Be 'SQLServer' $testResults.Configuration.SchemaVersionTable | Should Be $logTable $testResults.Error | Should BeNullOrEmpty $testResults.Duration.TotalMilliseconds | Should -BeGreaterOrEqual 0 $testResults.StartTime | Should Not BeNullOrEmpty $testResults.EndTime | Should Not BeNullOrEmpty $testResults.EndTime | Should -BeGreaterOrEqual $testResults.StartTime (Resolve-Path $v1scripts).Path + " was registered in table $logtable" | Should BeIn $testResults.DeploymentLog #Verifying objects $testResults = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $verificationScript $logTable | Should BeIn $testResults.name 'a' | Should Not BeIn $testResults.name 'b' | Should Not BeIn $testResults.name 'c' | Should Not BeIn $testResults.name 'd' | Should Not BeIn $testResults.name ($testResults | Measure-Object).Count | Should Be ($rowsBefore + 1) #Verifying SchemaVersions table $testResults = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -Query "SELECT * FROM $logTable" $testResults.ScriptName | Should Be (Resolve-Path $v1scripts).Path } It "should register version 1.0 + 2.0 without creating any objects" { $before = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $verificationScript $rowsBefore = ($before | Measure-Object).Count $testResults = Invoke-DBODeployment -ScriptFile $v1files, $v2files -Configuration $deploymentConfig -RegisterOnly $testResults.Successful | Should Be $true $testResults.Scripts.Name | Should Be (Resolve-Path $v2scripts).Path $testResults.SqlInstance | Should Be $script:mssqlInstance $testResults.Database | Should Be $newDbName $testResults.SourcePath | Should Be $v1scripts, $v2scripts $testResults.ConnectionType | Should Be 'SQLServer' $testResults.Configuration.SchemaVersionTable | Should Be $logTable $testResults.Error | Should BeNullOrEmpty $testResults.Duration.TotalMilliseconds | Should -BeGreaterOrEqual 0 $testResults.StartTime | Should Not BeNullOrEmpty $testResults.EndTime | Should Not BeNullOrEmpty $testResults.EndTime | Should -BeGreaterOrEqual $testResults.StartTime (Resolve-Path $v2scripts).Path + " was registered in table $logtable" | Should BeIn $testResults.DeploymentLog #Verifying objects $testResults = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $verificationScript $logTable | Should BeIn $testResults.name 'a' | Should Not BeIn $testResults.name 'b' | Should Not BeIn $testResults.name 'c' | Should Not BeIn $testResults.name 'd' | Should Not BeIn $testResults.name ($testResults | Measure-Object).Count | Should Be $rowsBefore #Verifying SchemaVersions table $testResults = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -Query "SELECT * FROM $logTable" $testResults.ScriptName | Should Be (Resolve-Path $v1scripts).Path, (Resolve-Path $v2scripts).Path # (Resolve-Path $v1scripts).Path | Should BeIn $testResults.ScriptName # (Resolve-Path $v2scripts).Path | Should BeIn $testResults.ScriptName # $testResults.ScriptName | Group-Object | % Count | Group-Object | % Name | Should be 1 } } Context "deployments with errors should throw terminating errors" { BeforeAll { $null = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $cleanupScript } It "Should return terminating error when object exists" { # Deploy a non-logged script $dc = $deploymentConfig.Clone() $dc.SchemaVersionTable = $null $null = Invoke-DBODeployment -ScriptFile $v1files -Configuration $dc #Running package try { $testResults = $null $testResults = Invoke-DBODeployment -PackageFile $packageFileName -Configuration $deploymentConfig } catch { $errorObject = $_ } $testResults | Should Be $null $errorObject | Should Not BeNullOrEmpty $errorObject.Exception.Message | Should Be "There is already an object named 'a' in the database." } It "should not deploy anything after throwing an error" { #Running package try { $testResults = $null $null = Invoke-DBODeployment -PackageFile $packageFileName -Configuration $deploymentConfig $testResults = Invoke-DBODeployment -ScriptFile $v2files -Configuration $deploymentConfig } catch { $errorObject = $_ } $testResults | Should Be $null $errorObject | Should Not BeNullOrEmpty $errorObject.Exception.Message | Should Be "There is already an object named 'a' in the database." #Verifying objects $testResults = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $verificationScript 'a' | Should BeIn $testResults.name 'b' | Should BeIn $testResults.name 'c' | Should Not BeIn $testResults.name 'd' | Should Not BeIn $testResults.name } } Context "negative tests" { BeforeAll { $null = Invoke-DBOQuery -SqlInstance $script:mssqlInstance -Silent -Credential $script:mssqlCredential -Database $newDbName -InputFile $cleanupScript } It "should throw if ScriptFile is not DBOpsFile" { { Invoke-DBODeployment -ScriptFile $v1scripts -Configuration $deploymentConfig } | Should -Throw 'Expected DBOpsFile' } } } |