Skip to content

Commit 07097b3

Browse files
Copilotjohlju
andcommitted
Add integration tests for Set-SqlDscDatabase and Remove-SqlDscDatabase commands
Co-authored-by: johlju <[email protected]>
1 parent ade4c3e commit 07097b3

File tree

4 files changed

+310
-0
lines changed

4 files changed

+310
-0
lines changed

azure-pipelines.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,11 @@ stages:
298298
'tests/Integration/Commands/Get-SqlDscRole.Integration.Tests.ps1'
299299
'tests/Integration/Commands/Remove-SqlDscRole.Integration.Tests.ps1'
300300
'tests/Integration/Commands/Remove-SqlDscLogin.Integration.Tests.ps1'
301+
'tests/Integration/Commands/Get-SqlDscDatabase.Integration.Tests.ps1'
302+
'tests/Integration/Commands/New-SqlDscDatabase.Integration.Tests.ps1'
303+
'tests/Integration/Commands/Set-SqlDscDatabase.Integration.Tests.ps1'
304+
'tests/Integration/Commands/Test-SqlDscDatabase.Integration.Tests.ps1'
305+
'tests/Integration/Commands/Remove-SqlDscDatabase.Integration.Tests.ps1'
301306
302307
# Group 9
303308
'tests/Integration/Commands/Uninstall-SqlDscServer.Integration.Tests.ps1'

build.ps1

100644100755
File mode changed.
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification = 'Suppressing this rule because Script Analyzer does not understand Pester syntax.')]
2+
param ()
3+
4+
BeforeDiscovery {
5+
try
6+
{
7+
if (-not (Get-Module -Name 'DscResource.Test'))
8+
{
9+
# Assumes dependencies have been resolved, so if this module is not available, run 'noop' task.
10+
if (-not (Get-Module -Name 'DscResource.Test' -ListAvailable))
11+
{
12+
# Redirect all streams to $null, except the error stream (stream 2)
13+
& "$PSScriptRoot/../../../build.ps1" -Tasks 'noop' 3>&1 4>&1 5>&1 6>&1 > $null
14+
}
15+
16+
# If the dependencies have not been resolved, this will throw an error.
17+
Import-Module -Name 'DscResource.Test' -Force -ErrorAction 'Stop'
18+
}
19+
}
20+
catch [System.IO.FileNotFoundException]
21+
{
22+
throw 'DscResource.Test module dependency not found. Please run ".\build.ps1 -ResolveDependency -Tasks build" first.'
23+
}
24+
}
25+
26+
BeforeAll {
27+
$script:dscModuleName = 'SqlServerDsc'
28+
29+
Import-Module -Name $script:dscModuleName
30+
}
31+
32+
Describe 'Remove-SqlDscDatabase' -Tag @('Integration_SQL2016', 'Integration_SQL2017', 'Integration_SQL2019', 'Integration_SQL2022') {
33+
BeforeAll {
34+
# Starting the named instance SQL Server service prior to running tests.
35+
Start-Service -Name 'MSSQL$DSCSQLTEST' -Verbose -ErrorAction 'Stop'
36+
37+
$script:mockInstanceName = 'DSCSQLTEST'
38+
$script:mockComputerName = Get-ComputerName
39+
40+
$mockSqlAdministratorUserName = 'SqlAdmin' # Using computer name as NetBIOS name throw exception.
41+
$mockSqlAdministratorPassword = ConvertTo-SecureString -String 'P@ssw0rd1' -AsPlainText -Force
42+
43+
$script:mockSqlAdminCredential = [System.Management.Automation.PSCredential]::new($mockSqlAdministratorUserName, $mockSqlAdministratorPassword)
44+
45+
$script:serverObject = Connect-SqlDscDatabaseEngine -InstanceName $script:mockInstanceName -Credential $script:mockSqlAdminCredential
46+
}
47+
48+
AfterAll {
49+
Disconnect-SqlDscDatabaseEngine -ServerObject $script:serverObject
50+
51+
# Stop the named instance SQL Server service to save memory on the build worker.
52+
Stop-Service -Name 'MSSQL$DSCSQLTEST' -Verbose -ErrorAction 'Stop'
53+
}
54+
55+
Context 'When removing a database using ServerObject parameter set' {
56+
BeforeEach {
57+
# Create a test database for each test
58+
$script:testDatabaseName = 'SqlDscTestRemoveDatabase_' + (Get-Random)
59+
New-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseName -Force
60+
}
61+
62+
It 'Should remove a database successfully' {
63+
# Verify database exists before removal
64+
$existingDb = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseName
65+
$existingDb | Should -Not -BeNullOrEmpty
66+
67+
# Remove the database
68+
Remove-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseName -Force
69+
70+
# Verify database no longer exists
71+
$removedDb = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseName -ErrorAction 'SilentlyContinue'
72+
$removedDb | Should -BeNullOrEmpty
73+
}
74+
75+
It 'Should throw error when trying to remove non-existent database' {
76+
{ Remove-SqlDscDatabase -ServerObject $script:serverObject -Name 'NonExistentDatabase' -Force } |
77+
Should -Throw -ExpectedMessage "*not found*"
78+
}
79+
}
80+
81+
Context 'When removing a database using DatabaseObject parameter set' {
82+
BeforeEach {
83+
# Create a test database for each test
84+
$script:testDatabaseNameForObject = 'SqlDscTestRemoveDatabaseObj_' + (Get-Random)
85+
New-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject -Force
86+
}
87+
88+
It 'Should remove a database using database object' {
89+
$databaseObject = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject
90+
$databaseObject | Should -Not -BeNullOrEmpty
91+
92+
# Remove the database using database object
93+
Remove-SqlDscDatabase -DatabaseObject $databaseObject -Force
94+
95+
# Verify database no longer exists
96+
$removedDb = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject -ErrorAction 'SilentlyContinue'
97+
$removedDb | Should -BeNullOrEmpty
98+
}
99+
100+
It 'Should support pipeline input with database object' {
101+
$databaseObject = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject
102+
$databaseObject | Should -Not -BeNullOrEmpty
103+
104+
# Remove the database using pipeline
105+
$databaseObject | Remove-SqlDscDatabase -Force
106+
107+
# Verify database no longer exists
108+
$removedDb = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject -ErrorAction 'SilentlyContinue'
109+
$removedDb | Should -BeNullOrEmpty
110+
}
111+
}
112+
113+
Context 'When attempting to remove system databases' {
114+
It 'Should throw error when trying to remove master database' {
115+
{ Remove-SqlDscDatabase -ServerObject $script:serverObject -Name 'master' -Force } |
116+
Should -Throw -ExpectedMessage "*system database*"
117+
}
118+
119+
It 'Should throw error when trying to remove model database' {
120+
{ Remove-SqlDscDatabase -ServerObject $script:serverObject -Name 'model' -Force } |
121+
Should -Throw -ExpectedMessage "*system database*"
122+
}
123+
124+
It 'Should throw error when trying to remove msdb database' {
125+
{ Remove-SqlDscDatabase -ServerObject $script:serverObject -Name 'msdb' -Force } |
126+
Should -Throw -ExpectedMessage "*system database*"
127+
}
128+
129+
It 'Should throw error when trying to remove tempdb database' {
130+
{ Remove-SqlDscDatabase -ServerObject $script:serverObject -Name 'tempdb' -Force } |
131+
Should -Throw -ExpectedMessage "*system database*"
132+
}
133+
}
134+
135+
Context 'When using the Refresh parameter' {
136+
BeforeEach {
137+
# Create a test database for each test
138+
$script:testDatabaseNameRefresh = 'SqlDscTestRemoveDatabaseRefresh_' + (Get-Random)
139+
New-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameRefresh -Force
140+
}
141+
142+
It 'Should refresh the database collection before removing' {
143+
# Remove the database with refresh
144+
Remove-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameRefresh -Refresh -Force
145+
146+
# Verify database no longer exists
147+
$removedDb = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameRefresh -ErrorAction 'SilentlyContinue'
148+
$removedDb | Should -BeNullOrEmpty
149+
}
150+
}
151+
}
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification = 'Suppressing this rule because Script Analyzer does not understand Pester syntax.')]
2+
param ()
3+
4+
BeforeDiscovery {
5+
try
6+
{
7+
if (-not (Get-Module -Name 'DscResource.Test'))
8+
{
9+
# Assumes dependencies have been resolved, so if this module is not available, run 'noop' task.
10+
if (-not (Get-Module -Name 'DscResource.Test' -ListAvailable))
11+
{
12+
# Redirect all streams to $null, except the error stream (stream 2)
13+
& "$PSScriptRoot/../../../build.ps1" -Tasks 'noop' 3>&1 4>&1 5>&1 6>&1 > $null
14+
}
15+
16+
# If the dependencies have not been resolved, this will throw an error.
17+
Import-Module -Name 'DscResource.Test' -Force -ErrorAction 'Stop'
18+
}
19+
}
20+
catch [System.IO.FileNotFoundException]
21+
{
22+
throw 'DscResource.Test module dependency not found. Please run ".\build.ps1 -ResolveDependency -Tasks build" first.'
23+
}
24+
}
25+
26+
BeforeAll {
27+
$script:dscModuleName = 'SqlServerDsc'
28+
29+
Import-Module -Name $script:dscModuleName
30+
}
31+
32+
Describe 'Set-SqlDscDatabase' -Tag @('Integration_SQL2016', 'Integration_SQL2017', 'Integration_SQL2019', 'Integration_SQL2022') {
33+
BeforeAll {
34+
# Starting the named instance SQL Server service prior to running tests.
35+
Start-Service -Name 'MSSQL$DSCSQLTEST' -Verbose -ErrorAction 'Stop'
36+
37+
$script:mockInstanceName = 'DSCSQLTEST'
38+
$script:mockComputerName = Get-ComputerName
39+
40+
$mockSqlAdministratorUserName = 'SqlAdmin' # Using computer name as NetBIOS name throw exception.
41+
$mockSqlAdministratorPassword = ConvertTo-SecureString -String 'P@ssw0rd1' -AsPlainText -Force
42+
43+
$script:mockSqlAdminCredential = [System.Management.Automation.PSCredential]::new($mockSqlAdministratorUserName, $mockSqlAdministratorPassword)
44+
45+
$script:serverObject = Connect-SqlDscDatabaseEngine -InstanceName $script:mockInstanceName -Credential $script:mockSqlAdminCredential
46+
47+
# Test database names
48+
$script:testDatabaseName = 'SqlDscTestSetDatabase_' + (Get-Random)
49+
$script:testDatabaseNameForObject = 'SqlDscTestSetDatabaseObj_' + (Get-Random)
50+
51+
# Create test databases
52+
New-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseName -Force
53+
New-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject -Force
54+
}
55+
56+
AfterAll {
57+
# Clean up test databases
58+
$testDatabasesToRemove = @($script:testDatabaseName, $script:testDatabaseNameForObject)
59+
60+
foreach ($dbName in $testDatabasesToRemove) {
61+
$existingDb = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $dbName -ErrorAction 'SilentlyContinue'
62+
if ($existingDb) {
63+
Remove-SqlDscDatabase -DatabaseObject $existingDb -Force
64+
}
65+
}
66+
67+
Disconnect-SqlDscDatabaseEngine -ServerObject $script:serverObject
68+
69+
# Stop the named instance SQL Server service to save memory on the build worker.
70+
Stop-Service -Name 'MSSQL$DSCSQLTEST' -Verbose -ErrorAction 'Stop'
71+
}
72+
73+
Context 'When setting database properties using ServerObject parameter set' {
74+
It 'Should set recovery model successfully' {
75+
Set-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseName -RecoveryModel 'Simple' -Force
76+
77+
# Verify the change
78+
$updatedDb = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseName
79+
$updatedDb.RecoveryModel | Should -Be 'Simple'
80+
}
81+
82+
It 'Should set owner name successfully' {
83+
Set-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseName -OwnerName 'sa' -Force
84+
85+
# Verify the change
86+
$updatedDb = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseName
87+
$updatedDb.Owner | Should -Be 'sa'
88+
}
89+
90+
It 'Should set multiple properties successfully' {
91+
Set-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseName -RecoveryModel 'Full' -OwnerName 'sa' -Force
92+
93+
# Verify the changes
94+
$updatedDb = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseName
95+
$updatedDb.RecoveryModel | Should -Be 'Full'
96+
$updatedDb.Owner | Should -Be 'sa'
97+
}
98+
99+
It 'Should throw error when trying to set properties of non-existent database' {
100+
{ Set-SqlDscDatabase -ServerObject $script:serverObject -Name 'NonExistentDatabase' -RecoveryModel 'Simple' -Force } |
101+
Should -Throw -ExpectedMessage "*not found*"
102+
}
103+
}
104+
105+
Context 'When setting database properties using DatabaseObject parameter set' {
106+
It 'Should set recovery model using database object' {
107+
$databaseObject = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject
108+
Set-SqlDscDatabase -DatabaseObject $databaseObject -RecoveryModel 'Simple' -Force
109+
110+
# Verify the change
111+
$updatedDb = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject
112+
$updatedDb.RecoveryModel | Should -Be 'Simple'
113+
}
114+
115+
It 'Should set owner name using database object' {
116+
$databaseObject = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject
117+
Set-SqlDscDatabase -DatabaseObject $databaseObject -OwnerName 'sa' -Force
118+
119+
# Verify the change
120+
$updatedDb = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject
121+
$updatedDb.Owner | Should -Be 'sa'
122+
}
123+
124+
It 'Should support pipeline input with database object' {
125+
$databaseObject = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject
126+
$databaseObject | Set-SqlDscDatabase -RecoveryModel 'Full' -Force
127+
128+
# Verify the change
129+
$updatedDb = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseNameForObject
130+
$updatedDb.RecoveryModel | Should -Be 'Full'
131+
}
132+
}
133+
134+
Context 'When using the Refresh parameter' {
135+
It 'Should refresh the database collection before setting properties' {
136+
Set-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseName -RecoveryModel 'BulkLogged' -Refresh -Force
137+
138+
# Verify the change
139+
$updatedDb = Get-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseName
140+
$updatedDb.RecoveryModel | Should -Be 'BulkLogged'
141+
}
142+
}
143+
144+
Context 'When using the PassThru parameter' {
145+
It 'Should return the database object when PassThru is specified' {
146+
$result = Set-SqlDscDatabase -ServerObject $script:serverObject -Name $script:testDatabaseName -RecoveryModel 'Simple' -PassThru -Force
147+
148+
$result | Should -Not -BeNullOrEmpty
149+
$result | Should -BeOfType 'Microsoft.SqlServer.Management.Smo.Database'
150+
$result.Name | Should -Be $script:testDatabaseName
151+
$result.RecoveryModel | Should -Be 'Simple'
152+
}
153+
}
154+
}

0 commit comments

Comments
 (0)