tests/Test-DbaDatabaseOwner.Tests.ps1

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

Describe "$CommandName Unit Tests" -Tag "UnitTests" {
    Context "Validate parameters" {
        <#
            The $paramCount is adjusted based on the parameters your command will have.
 
            The $defaultParamCount is adjusted based on what type of command you are writing the test for:
                - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11
                - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13
        #>

        $paramCount = 7
        $defaultParamCount = 11
        [object[]]$params = (Get-ChildItem function:\Test-DbaDatabaseOwner).Parameters.Keys
        $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'TargetLogin', 'EnableException', 'Detailed'
        It "Should contain our specific parameters" {
            ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount
        }
        It "Should only contain $paramCount parameters" {
            $params.Count - $defaultParamCount | Should Be $paramCount
        }
    }
    InModuleScope 'dbatools' {
        Context "Connects to SQL Server" {
            It -Skip "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 -Skip "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 -Skip "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 -Skip "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'
                $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 -Skip "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 -Skip "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 -Skip "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 -Skip "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'
                $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