Checks/Schemas.Tests.ps1

param (
    [object]$config,
    [Object]$SqlInstance,
    [PSCredential]$SqlCredential,
    [String]$Database
)

# FIXME: Potential dbatools command to migrate across. Get Schema details
$sqlSchema = "
        select
            ss.name as 'schemaName',
            sdp.name as 'owner'
        from
            sys.schemas ss inner join sys.database_principals sdp
                on ss.principal_id=sdp.principal_id
"

$dbSchema = Invoke-DbaQuery -SqlInstance $SqlInstance -sqlcredential $sqlcredential -database $database -Query $sqlSchema 

Foreach ($schema in $config.schemas) {
    Describe "Checking schema $($schema.schemaname)" {
        It "Schema $($schema.schemaname) should exist and be owned by $($schema.owner)" {
            ($dbSchema | Where-Object {$_.schemaName -eq $schema.schemaname -and $_.owner -eq $schema.owner} | Measure-Object).count | Should -Be 1
        }
        $checkSql = "select name, type_desc from sys.all_objects where schema_id=SCHEMA_ID('$($schema.schemaname)') and is_ms_shipped=0"
        $objectsSchema = Invoke-DbaQuery -SqlInstance $SqlInstance -sqlcredential $sqlcredential -database $database -Query $checkSql 
        
        # $($schema.objects)
        $title = ($schema.objects) -join ','
        It "Schema $($schema.schemaname) should contain $title Objects" {
            $objectsSchema.count | Should -Be $schema.objects.count -Because "The schema should only contain the specified objects"
        }

        Foreach ($object in  $schema.objects) {
            It "$($schema.schemaname) should contain $($object.object)"{
                ($objectsSchema | Where-Object {$_.name -eq $object.Object } | Measure-Object).count | Should -Be 1
            }
        }
    }
}