Skip to content

Commit e5e8074

Browse files
committed
Add PassThru parameter to Backup-SqlDscDatabase for returning database object and enhance tests
1 parent d3d3f42 commit e5e8074

File tree

2 files changed

+78
-3
lines changed

2 files changed

+78
-3
lines changed

source/Public/Backup-SqlDscDatabase.ps1

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@
6363
.PARAMETER Force
6464
Specifies that the backup should be performed without any confirmation.
6565
66+
.PARAMETER PassThru
67+
Returns the database object that was backed up. By default, this command
68+
does not generate any output.
69+
6670
.EXAMPLE
6771
$serverObject = Connect-SqlDscDatabaseEngine -InstanceName 'MyInstance'
6872
$serverObject | Backup-SqlDscDatabase -Name 'MyDatabase' -BackupFile 'C:\Backups\MyDatabase.bak'
@@ -104,6 +108,14 @@
104108
Performs a compressed full backup with checksum verification of the
105109
database named **MyDatabase**.
106110
111+
.EXAMPLE
112+
$serverObject = Connect-SqlDscDatabaseEngine -InstanceName 'MyInstance'
113+
$databaseObject = $serverObject | Backup-SqlDscDatabase -Name 'MyDatabase' -BackupFile 'C:\Backups\MyDatabase.bak' -PassThru -Force
114+
$databaseObject | Set-SqlDscDatabaseProperty -RecoveryModel 'Simple' -Force
115+
116+
Performs a full backup of the database named **MyDatabase** and returns
117+
the database object for further pipeline operations.
118+
107119
.INPUTS
108120
`Microsoft.SqlServer.Management.Smo.Server`
109121
@@ -116,11 +128,19 @@
116128
117129
.OUTPUTS
118130
None.
131+
132+
No output when the **PassThru** parameter is not specified.
133+
134+
.OUTPUTS
135+
`Microsoft.SqlServer.Management.Smo.Database`
136+
137+
Returns the database object that was backed up when using the **PassThru** parameter.
119138
#>
120139
function Backup-SqlDscDatabase
121140
{
122141
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('UseSyntacticallyCorrectExamples', '', Justification = 'Because the rule does not yet support parsing the code when a parameter type is not available. The ScriptAnalyzer rule UseSyntacticallyCorrectExamples will always error in the editor due to https://github.com/indented-automation/Indented.ScriptAnalyzerRules/issues/8.')]
123142
[OutputType()]
143+
[OutputType([Microsoft.SqlServer.Management.Smo.Database])]
124144
[CmdletBinding(DefaultParameterSetName = 'ServerObject', SupportsShouldProcess = $true, ConfirmImpact = 'Low')]
125145
param
126146
(
@@ -179,7 +199,11 @@ function Backup-SqlDscDatabase
179199

180200
[Parameter()]
181201
[System.Management.Automation.SwitchParameter]
182-
$Force
202+
$Force,
203+
204+
[Parameter()]
205+
[System.Management.Automation.SwitchParameter]
206+
$PassThru
183207
)
184208

185209
begin
@@ -351,6 +375,11 @@ function Backup-SqlDscDatabase
351375
$backup.SqlBackup($ServerObject)
352376

353377
Write-Debug -Message ($script:localizedData.Database_Backup_Success -f $backupTypeDescription, $Name)
378+
379+
if ($PassThru.IsPresent)
380+
{
381+
return $DatabaseObject
382+
}
354383
}
355384
catch
356385
{

tests/Unit/Public/Backup-SqlDscDatabase.Tests.ps1

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,57 @@ Describe 'Backup-SqlDscDatabase' -Tag 'Public' {
242242
}
243243
}
244244

245+
Context 'When using PassThru parameter' {
246+
BeforeAll {
247+
$mockDatabaseObject = New-Object -TypeName 'Microsoft.SqlServer.Management.Smo.Database'
248+
$mockDatabaseObject | Add-Member -MemberType 'NoteProperty' -Name 'Name' -Value 'TestDatabase' -Force
249+
$mockDatabaseObject | Add-Member -MemberType 'NoteProperty' -Name 'RecoveryModel' -Value ([Microsoft.SqlServer.Management.Smo.RecoveryModel]::Full) -Force
250+
$mockDatabaseObject | Add-Member -MemberType 'NoteProperty' -Name 'Status' -Value ([Microsoft.SqlServer.Management.Smo.DatabaseStatus]::Normal) -Force
251+
$mockDatabaseObject | Add-Member -MemberType 'ScriptProperty' -Name 'Parent' -Value {
252+
$mockParent = New-Object -TypeName 'Microsoft.SqlServer.Management.Smo.Server'
253+
$mockParent | Add-Member -MemberType 'NoteProperty' -Name 'InstanceName' -Value 'TestInstance' -Force
254+
return $mockParent
255+
} -Force
256+
257+
$mockServerObject = New-Object -TypeName 'Microsoft.SqlServer.Management.Smo.Server'
258+
$mockServerObject | Add-Member -MemberType 'NoteProperty' -Name 'InstanceName' -Value 'TestInstance' -Force
259+
$mockServerObject | Add-Member -MemberType 'ScriptProperty' -Name 'Databases' -Value {
260+
return @{
261+
'TestDatabase' = $mockDatabaseObject
262+
} | Add-Member -MemberType 'ScriptMethod' -Name 'Refresh' -Value {
263+
# Mock implementation
264+
} -PassThru -Force
265+
} -Force
266+
}
267+
268+
It 'Should return database object when PassThru is specified with ServerObject' {
269+
$result = Backup-SqlDscDatabase -ServerObject $mockServerObject -Name 'TestDatabase' -BackupFile 'C:\Backups\TestDatabase.bak' -PassThru -Force
270+
271+
$result | Should -Not -BeNullOrEmpty
272+
$result | Should -BeOfType 'Microsoft.SqlServer.Management.Smo.Database'
273+
$result.Name | Should -Be 'TestDatabase'
274+
}
275+
276+
It 'Should return database object when PassThru is specified with DatabaseObject' {
277+
$result = Backup-SqlDscDatabase -DatabaseObject $mockDatabaseObject -BackupFile 'C:\Backups\TestDatabase.bak' -PassThru -Force
278+
279+
$result | Should -Not -BeNullOrEmpty
280+
$result | Should -BeOfType 'Microsoft.SqlServer.Management.Smo.Database'
281+
$result.Name | Should -Be 'TestDatabase'
282+
}
283+
284+
It 'Should not return anything when PassThru is not specified' {
285+
$result = Backup-SqlDscDatabase -DatabaseObject $mockDatabaseObject -BackupFile 'C:\Backups\TestDatabase.bak' -Force
286+
287+
$result | Should -BeNullOrEmpty
288+
}
289+
}
290+
245291
Context 'Parameter validation' {
246292
It 'Should have the correct parameters in parameter set ServerObject' -ForEach @(
247293
@{
248294
ExpectedParameterSetName = 'ServerObject'
249-
ExpectedParameters = '-ServerObject <Server> -Name <string> -BackupFile <string> [-BackupType <string>] [-CopyOnly] [-Compress] [-Checksum] [-Description <string>] [-RetainDays <int>] [-Initialize] [-Refresh] [-Force] [-WhatIf] [-Confirm] [<CommonParameters>]'
295+
ExpectedParameters = '-ServerObject <Server> -Name <string> -BackupFile <string> [-BackupType <string>] [-CopyOnly] [-Compress] [-Checksum] [-Description <string>] [-RetainDays <int>] [-Initialize] [-Refresh] [-Force] [-PassThru] [-WhatIf] [-Confirm] [<CommonParameters>]'
250296
}
251297
) {
252298
$result = (Get-Command -Name 'Backup-SqlDscDatabase').ParameterSets |
@@ -263,7 +309,7 @@ Describe 'Backup-SqlDscDatabase' -Tag 'Public' {
263309
It 'Should have the correct parameters in parameter set DatabaseObject' -ForEach @(
264310
@{
265311
ExpectedParameterSetName = 'DatabaseObject'
266-
ExpectedParameters = '-DatabaseObject <Database> -BackupFile <string> [-BackupType <string>] [-CopyOnly] [-Compress] [-Checksum] [-Description <string>] [-RetainDays <int>] [-Initialize] [-Force] [-WhatIf] [-Confirm] [<CommonParameters>]'
312+
ExpectedParameters = '-DatabaseObject <Database> -BackupFile <string> [-BackupType <string>] [-CopyOnly] [-Compress] [-Checksum] [-Description <string>] [-RetainDays <int>] [-Initialize] [-Force] [-PassThru] [-WhatIf] [-Confirm] [<CommonParameters>]'
267313
}
268314
) {
269315
$result = (Get-Command -Name 'Backup-SqlDscDatabase').ParameterSets |

0 commit comments

Comments
 (0)