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+ }
0 commit comments