tests/Test-DbaDatabaseOwner.Tests.ps1

$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1","")
Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan
. "$PSScriptRoot\constants.ps1"

Describe "$Name Tests"{
    InModuleScope 'dbatools' {
        Context "Connects to SQL Server" {
            It "Should not throw" {
                Mock Connect-SQLInstance -MockWith {
                    [object]@{
                        Name = 'SQLServerName';
                        Databases = [object]@(
                            @{
                                Name = 'db1';
                                Status = 'Normal';
                                Owner = 'sa'
                            }
                        ); #databases
                        Logins = [object]@(
                            @{
                                ID = 1;
                                Name = 'sa';
                            }
                        ) #logins
                    } #object
                } #mock connect-sqlserver

                { Test-DbaDatabaseOwner -SqlInstance 'SQLServerName' } | Should Not throw
            } #It
            It "Should not return if no wrong owner for default" {
                Mock Connect-SQLInstance -MockWith {
                    [object]@{
                        Name = 'SQLServerName';
                        Databases = [object]@(
                            @{
                                Name = 'db1';
                                Status = 'Normal';
                                Owner = 'sa'
                            }
                        ); #databases
                        Logins = [object]@(
                            @{
                                ID = 1;
                                Name = 'sa';
                            }
                        ) #logins
                    } #object
                } #mock connect-sqlserver

                { Test-DbaDatabaseOwner -SqlInstance 'SQLServerName' } | Should Not throw
            } #It
            It "Should return wrong owner information for one database with no owner specified" {
                Mock Connect-SQLInstance -MockWith {
                    [object]@{
                        DomainInstanceName = 'SQLServerName';
                        Databases = [object]@(
                            @{
                                Name = 'db1';
                                Status = 'Normal';
                                Owner = 'WrongOWner'
                            }
                        ); #databases
                        Logins = [object]@(
                            @{
                                ID = 1;
                                Name = 'sa';
                            }
                        ) #logins
                    } #object
                } #mock connect-sqlserver

                $Result = Test-DbaDatabaseOwner -SqlInstance 'SQLServerName'
                $Result[0].SqlInstance | Should Be 'SQLServerName'
                $Result[0].Database | Should Be 'db1';
                $Result[0].DBState | Should Be 'Normal';
                $Result[0].CurrentOwner | Should Be 'WrongOWner';
                $Result[0].TargetOwner | Should Be 'sa';
                $Result[0].OwnerMatch | Should Be $False
            } # it
            It "Should return information for one database with correct owner with detail parameter" {
                Mock Connect-SQLInstance -MockWith {
                    [object]@{
                        DomainInstanceName = 'SQLServerName';
                        Databases = [object]@(
                            @{
                                Name = 'db1';
                                Status = 'Normal';
                                Owner = 'sa'
                            }
                        ); #databases
                        Logins = [object]@(
                            @{
                                ID = 1;
                                Name = 'sa';
                            }
                        ) #logins
                    } #object
                } #mock connect-sqlserver

                $Result = Test-DbaDatabaseOwner -SqlInstance 'SQLServerName' -Detailed
                $Result.SqlInstance | Should Be 'SQLServerName'
                $Result.Database | Should Be 'db1';
                $Result.DBState | Should Be 'Normal';
                $Result.CurrentOwner | Should Be 'sa';
                $Result.TargetOwner | Should Be 'sa';
                $Result.OwnerMatch | Should Be $True
            } # it
            It "Should return wrong owner information for one database with no owner specified and multiple databases" {
                Mock Connect-SQLInstance -MockWith {
                    [object]@{
                        DomainInstanceName = 'SQLServerName';
                        Databases = [object]@(
                            @{
                                Name = 'db1';
                                Status = 'Normal';
                                Owner = 'WrongOWner'
                            }
                            @{
                                Name = 'db2';
                                Status = 'Normal';
                                Owner = 'sa'
                            }
                        ); #databases
                        Logins = [object]@(
                            @{
                                ID = 1;
                                Name = 'sa';
                            }
                        ) #logins
                    } #object
                } #mock connect-sqlserver

                $Result = Test-DbaDatabaseOwner -SqlInstance 'SQLServerName'
                $Result[0].SqlInstance | Should Be 'SQLServerName'
                $Result[0].Database | Should Be 'db1';
                $Result[0].DBState | Should Be 'Normal';
                $Result[0].CurrentOwner | Should Be 'WrongOWner';
                $Result[0].TargetOwner | Should Be 'sa';
                $Result[0].OwnerMatch | Should Be $False
            } # it
            It "Should return wrong owner information for two databases with no owner specified and multiple databases" {
                Mock Connect-SQLInstance -MockWith {
                    [object]@{
                        DomainInstanceName = 'SQLServerName';
                        Databases = [object]@(
                            @{
                                Name = 'db1';
                                Status = 'Normal';
                                Owner = 'WrongOWner'
                            }
                            @{
                                Name = 'db2';
                                Status = 'Normal';
                                Owner = 'WrongOWner'
                            }
                        ); #databases
                        Logins = [object]@(
                            @{
                                ID = 1;
                                Name = 'sa';
                            }
                        ) #logins
                    } #object
                } #mock connect-sqlserver

                $Result = Test-DbaDatabaseOwner -SqlInstance 'SQLServerName'
                $Result[0].SqlInstance | Should Be 'SQLServerName'
                $Result[1].SqlInstance | Should Be 'SQLServerName'
                $Result[0].Database | Should Be 'db1';
                $Result[1].Database | Should Be 'db2';
                $Result[0].DBState | Should Be 'Normal';
                $Result[1].DBState | Should Be 'Normal';
                $Result[0].CurrentOwner | Should Be 'WrongOWner';
                $Result[1].CurrentOwner | Should Be 'WrongOWner';
                $Result[0].TargetOwner | Should Be 'sa';
                $Result[1].TargetOwner | Should Be 'sa';
                $Result[0].OwnerMatch | Should Be $False
                $Result[1].OwnerMatch | Should Be $False
            } # it

            It "Should call Stop-Function one time if Target Login does not exist on Server" {
                Mock Connect-SQLInstance -MockWith {
                    [object]@{
                        DomainInstanceName = 'SQLServerName';
                        Databases = [object]@(
                            @{
                                Name = 'db1';
                                Status = 'Normal';
                                Owner = 'WrongOwner'
                            }
                            @{
                                Name = 'db2';
                                Status = 'Normal';
                                Owner = 'WrongOwner'
                            }
                        ); #databases
                        Logins = [object]@(
                            @{
                                ID = 1;
                                Name = 'sa';
                            }
                        ) #logins
                    } #object
                } #mock connect-sqlserver
                Mock Stop-Function {}

                $null = Test-DbaDatabaseOwner -SqlInstance 'SQLServerName' -TargetLogin 'WrongLogin'
                $assertMockParams = @{
                    'CommandName' = 'Stop-Function'
                    'Times' = 1
                    'Exactly' = $true
                }
                Assert-MockCalled @assertMockParams
            } # it
            It "Returns all information with detailed for correct and incorrect owner" {
                Mock Connect-SQLInstance -MockWith {
                    [object]@{
                        DomainInstanceName = 'SQLServerName';
                        Databases = [object]@(
                            @{
                                Name = 'db1';
                                Status = 'Normal';
                                Owner = 'WrongOWner'
                            }
                            @{
                                Name = 'db2';
                                Status = 'Normal';
                                Owner = 'sa'
                            }
                        ); #databases
                        Logins = [object]@(
                            @{
                                ID = 1;
                                Name = 'sa';
                            }
                        ) #logins
                    } #object
                } #mock connect-sqlserver

                $Result = Test-DbaDatabaseOwner -SqlInstance 'SQLServerName' -Detailed
                $Result[0].SqlInstance | Should Be 'SQLServerName'
                $Result[1].SqlInstance | Should Be 'SQLServerName'
                $Result[0].Database | Should Be 'db1'
                $Result[1].Database | Should Be 'db2'
                $Result[0].DBState | Should Be 'Normal'
                $Result[1].DBState | Should Be 'Normal'
                $Result[0].CurrentOwner | Should Be 'WrongOWner'
                $Result[1].CurrentOwner | Should Be 'sa'
                $Result[0].TargetOwner | Should Be 'sa'
                $Result[1].TargetOwner | Should Be 'sa'
                $Result[0].OwnerMatch | Should Be $False
                $Result[1].OwnerMatch | Should Be $true
            } # it
        } # Context
    } #modulescope
} #describe