tests/Get-DbaDatabase.Tests.ps1

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

Describe "$commandname Integration Tests" -Tags "IntegrationTests" {
    
    Context "Count system databases on localhost" {
        $results = Get-DbaDatabase -SqlInstance $script:instance1 -ExcludeAllUserDb
        It "reports the right number of databases" {
            $results.Count | Should Be 4
        }
    }
    
    Context "Check that temppb database is in Simple recovery mode" {
        $results = Get-DbaDatabase -SqlInstance $script:instance1 -Database tempdb
        It "tempdb's recovery mode is Simple" {
            $results.RecoveryModel | Should Be "Simple"
        }
    }
    
    Context "Check that master database is accessible" {
        $results = Get-DbaDatabase -SqlInstance $script:instance1 -Database master
        It "master is accessible" {
            $results.IsAccessible | Should Be $true
        }
    }
}

Describe "$commandname Unit Tests" -Tags "UnitTests", Get-DBADatabase {
    BeforeAll {
        ## Ensure it is the module that is being coded that is in the session when running just this Pester test
        # Remove-Module dbatools -Force -ErrorAction SilentlyContinue
        # $Base = Split-Path -parent $PSCommandPath
        # Import-Module $Base\..\dbatools.psd1
    }
    Context "Input validation" {
        BeforeAll {
            Mock Stop-Function { } -ModuleName dbatools
            Mock Test-FunctionInterrupt { } -ModuleName dbatools
        }
        It "Should Call Stop-Function if NoUserDbs and NoSystemDbs are specified" {
            Get-DbaDatabase -SqlInstance Dummy -ExcludeAllSystemDb -ExcludeAllUserDb -ErrorAction SilentlyContinue | Should Be
        }
        It "Validates that Stop Function Mock has been called" {
            ## Nope I have no idea why it's two either - RMS
            $assertMockParams = @{
                'CommandName'  = 'Stop-Function'
                'Times'           = 2
                'Exactly'       = $true
                'Module'       = 'dbatools'
            }
            Assert-MockCalled @assertMockParams
        }
        It "Validates that Test-FunctionInterrupt Mock has been called" {
            $assertMockParams = @{
                'CommandName'  = 'Test-FunctionInterrupt'
                'Times'           = 1
                'Exactly'       = $true
                'Module'       = 'dbatools'
            }
            Assert-MockCalled @assertMockParams
        }
    }
    Context "Output" {
        It "Should have Last Read and Last Write Property when IncludeLastUsed switch is added" {
            Mock Connect-SQLInstance -MockWith {
                [object]@{
                    Name       = 'SQLServerName';
                    Databases  = [object]@(
                        @{
                            Name            = 'db1';
                            Status            = 'Normal';
                            ReadOnly        = 'false';
                            IsSystemObject  = 'false';
                            RecoveryModel   = 'Full';
                            Owner            = 'sa'
                        }
                    ); #databases
                } #object
            } -ModuleName dbatools #mock connect-sqlserver
            function Invoke-QueryDBlastUsed { }
            Mock Invoke-QueryDBlastUsed -MockWith {
                [object]
                @{
                    dbname        = 'db1';
                    last_read   = (Get-Date).AddHours(-1);
                    last_write  = (Get-Date).AddHours(-1)
                }
            } -ModuleName dbatools
            (Get-DbaDatabase -SqlInstance SQLServerName -IncludeLastUsed).LastRead -ne $null | Should Be $true
            (Get-DbaDatabase -SqlInstance SQLServerName -IncludeLastUsed).LastWrite -ne $null | Should Be $true
        }
        It "Validates that Connect-SqlInstance Mock has been called" {
            $assertMockParams = @{
                'CommandName'  = 'Connect-SqlInstance'
                'Times'           = 2
                'Exactly'       = $true
                'Module'       = 'dbatools'
            }
            Assert-MockCalled @assertMockParams
        }
        It "Validates that Invoke-QueryDBlastUsed Mock has been called" {
            $assertMockParams = @{
                'CommandName'  = 'Invoke-QueryDBlastUsed'
                'Times'           = 2
                'Exactly'       = $true
                'Module'       = 'dbatools'
            }
            Assert-MockCalled @assertMockParams
        }
    }
}