Tests/GenXdev.Data.SqlServer/Get-SQLServerTableSchema.Tests.ps1
Pester\Describe 'Get-SQLServerTableSchema' { Pester\BeforeAll { Microsoft.PowerShell.Utility\Write-Verbose 'Setting up test environment' $script:TestTableName = 'TestSchemaTable_' + (Microsoft.PowerShell.Utility\Get-Random) $script:TestServer = '.' $script:TestConnectionString = "Server=$script:TestServer;Database=tempdb;Integrated Security=true;TrustServerCertificate=true" # Check if SQL Server is available $script:SqlServerAvailable = $false try { GenXdev.Data\Invoke-SQLServerQuery -DatabaseName 'tempdb' -Server $script:TestServer -Queries "SELECT 1" $script:SqlServerAvailable = $true } catch { Microsoft.PowerShell.Utility\Write-Verbose "SQL Server not available - skipping tests" } if ($script:SqlServerAvailable) { # Create test table with various column types in tempdb $createTableQuery = @" CREATE TABLE tempdb.dbo.${script:TestTableName} ( Id int IDENTITY(1,1) PRIMARY KEY, Name nvarchar(100) NOT NULL, Email nvarchar(255), Age int, Salary decimal(10,2), IsActive bit DEFAULT 1, CreatedDate datetime2 DEFAULT GETDATE() ) "@ GenXdev.Data\Invoke-SQLServerQuery -DatabaseName 'tempdb' -Server $script:TestServer -Queries $createTableQuery } } Pester\AfterAll { # Clean-up if ($script:SqlServerAvailable) { try { $dropQuery = "IF OBJECT_ID('tempdb.dbo.${script:TestTableName}') IS NOT NULL DROP TABLE tempdb.dbo.${script:TestTableName}" GenXdev.Data\Invoke-SQLServerQuery -DatabaseName 'tempdb' -Server $script:TestServer -Queries $dropQuery } catch { Microsoft.PowerShell.Utility\Write-Warning "Could not clean up test table: $_" } } } Pester\It 'Should retrieve table schema using connection string' -Skip:(-not $script:SqlServerAvailable) { $schema = GenXdev.Data\Get-SQLServerTableSchema -ConnectionString $script:TestConnectionString -TableName $script:TestTableName $schema | Pester\Should -Not -BeNullOrEmpty # Check that we got the expected columns $columnNames = $schema | Microsoft.PowerShell.Core\ForEach-Object { $_.COLUMN_NAME } $columnNames | Pester\Should -Contain "Id" $columnNames | Pester\Should -Contain "Name" $columnNames | Pester\Should -Contain "Email" $columnNames | Pester\Should -Contain "Age" $columnNames | Pester\Should -Contain "Salary" $columnNames | Pester\Should -Contain "IsActive" $columnNames | Pester\Should -Contain "CreatedDate" } Pester\It 'Should retrieve table schema using DatabaseName parameter' -Skip:(-not $script:SqlServerAvailable) { $schema = GenXdev.Data\Get-SQLServerTableSchema -DatabaseName 'tempdb' -Server $script:TestServer -TableName $script:TestTableName $schema | Pester\Should -Not -BeNullOrEmpty $schema.Count | Pester\Should -BeGreaterThan 0 } Pester\It 'Should include column data types' -Skip:(-not $script:SqlServerAvailable) { $schema = GenXdev.Data\Get-SQLServerTableSchema -ConnectionString $script:TestConnectionString -TableName $script:TestTableName # Check specific data types $nameColumn = $schema | Microsoft.PowerShell.Utility\Where-Object { $_.COLUMN_NAME -eq "Name" } $nameColumn.DATA_TYPE | Pester\Should -Be "nvarchar" $ageColumn = $schema | Microsoft.PowerShell.Utility\Where-Object { $_.COLUMN_NAME -eq "Age" } $ageColumn.DATA_TYPE | Pester\Should -Be "int" $salaryColumn = $schema | Microsoft.PowerShell.Utility\Where-Object { $_.COLUMN_NAME -eq "Salary" } $salaryColumn.DATA_TYPE | Pester\Should -Be "decimal" } } |