@@ -53,11 +53,11 @@ Describe 'Remove-SqlDscLogin' -Tag 'Public' {
5353 It ' Should have the correct parameters in parameter set <MockParameterSetName>' - ForEach @ (
5454 @ {
5555 MockParameterSetName = ' ServerObject'
56- MockExpectedParameters = ' -ServerObject <Server> -Name <string> [-Force] [-Refresh] [-WhatIf] [-Confirm] [<CommonParameters>]'
56+ MockExpectedParameters = ' -ServerObject <Server> -Name <string> [-KillActiveSessions] [- Force] [-Refresh] [-WhatIf] [-Confirm] [<CommonParameters>]'
5757 }
5858 @ {
5959 MockParameterSetName = ' LoginObject'
60- MockExpectedParameters = ' -LoginObject <Login> [-Force] [-WhatIf] [-Confirm] [<CommonParameters>]'
60+ MockExpectedParameters = ' -LoginObject <Login> [-KillActiveSessions] [- Force] [-WhatIf] [-Confirm] [<CommonParameters>]'
6161 }
6262 ) {
6363 $result = (Get-Command - Name ' Remove-SqlDscLogin' ).ParameterSets |
@@ -285,4 +285,125 @@ Describe 'Remove-SqlDscLogin' -Tag 'Public' {
285285 { Remove-SqlDscLogin - Force @mockDefaultParameters } | Should - Throw - ExpectedMessage ' *Removal of the login '' TestLogin'' failed*'
286286 }
287287 }
288+
289+ Context ' When using parameter KillActiveSessions' {
290+ BeforeAll {
291+ $mockServerObject = New-Object - TypeName ' Microsoft.SqlServer.Management.Smo.Server'
292+ $mockServerObject.InstanceName = ' TestInstance'
293+ }
294+
295+ BeforeEach {
296+ $script :mockMethodDropCallCount = 0
297+ }
298+
299+ Context ' When there are active sessions for the login' {
300+ BeforeAll {
301+ # The SMO stub EnumProcesses returns a DataTable with SPID 51 for any login name
302+ $script :mockLoginObjectWithProcesses = New-Object - TypeName ' Microsoft.SqlServer.Management.Smo.Login' - ArgumentList @ (
303+ $mockServerObject ,
304+ ' TestLogin'
305+ ) |
306+ Add-Member - MemberType ' ScriptMethod' - Name ' Drop' - Value {
307+ $script :mockMethodDropCallCount += 1
308+ } - PassThru - Force
309+
310+ $script :mockDefaultParametersWithProcesses = @ {
311+ LoginObject = $script :mockLoginObjectWithProcesses
312+ KillActiveSessions = $true
313+ }
314+ }
315+
316+ It ' Should kill active sessions and drop the login' {
317+ Remove-SqlDscLogin - Force @mockDefaultParametersWithProcesses
318+
319+ $script :mockMethodDropCallCount | Should - Be 1
320+ }
321+ }
322+
323+ Context ' When using WhatIf with KillActiveSessions' {
324+ BeforeAll {
325+ $script :mockLoginObjectWhatIf = New-Object - TypeName ' Microsoft.SqlServer.Management.Smo.Login' - ArgumentList @ (
326+ $mockServerObject ,
327+ ' TestLogin'
328+ ) |
329+ Add-Member - MemberType ' ScriptMethod' - Name ' Drop' - Value {
330+ $script :mockMethodDropCallCount += 1
331+ } - PassThru - Force
332+
333+ $script :mockDefaultParametersWhatIf = @ {
334+ LoginObject = $script :mockLoginObjectWhatIf
335+ KillActiveSessions = $true
336+ }
337+ }
338+
339+ It ' Should not kill sessions or drop the login' {
340+ Remove-SqlDscLogin - WhatIf @mockDefaultParametersWhatIf
341+
342+ $script :mockMethodDropCallCount | Should - Be 0
343+ }
344+ }
345+
346+ Context ' When using ServerObject parameter set with KillActiveSessions' {
347+ BeforeAll {
348+ $mockServerObjectWithProcesses = New-Object - TypeName ' Microsoft.SqlServer.Management.Smo.Server'
349+ $mockServerObjectWithProcesses.InstanceName = ' TestInstance'
350+
351+ Mock - CommandName Get-SqlDscLogin - MockWith {
352+ return New-Object - TypeName ' Microsoft.SqlServer.Management.Smo.Login' - ArgumentList @ (
353+ $mockServerObjectWithProcesses ,
354+ ' TestLogin'
355+ ) |
356+ Add-Member - MemberType ' ScriptMethod' - Name ' Drop' - Value {
357+ $script :mockMethodDropCallCount += 1
358+ } - PassThru - Force
359+ }
360+ }
361+
362+ It ' Should kill active sessions and drop the login' {
363+ Remove-SqlDscLogin - ServerObject $mockServerObjectWithProcesses - Name ' TestLogin' - KillActiveSessions - Force
364+
365+ $script :mockMethodDropCallCount | Should - Be 1
366+ }
367+
368+ It ' Should not kill sessions or drop the login when using WhatIf' {
369+ Remove-SqlDscLogin - ServerObject $mockServerObjectWithProcesses - Name ' TestLogin' - KillActiveSessions - Force - WhatIf
370+
371+ $script :mockMethodDropCallCount | Should - Be 0
372+ }
373+ }
374+
375+ Context ' When EnumProcesses returns no active sessions' {
376+ BeforeAll {
377+ # Create a server object that returns an empty DataTable from EnumProcesses
378+ $mockServerObjectNoProcesses = New-Object - TypeName ' Microsoft.SqlServer.Management.Smo.Server'
379+ $mockServerObjectNoProcesses.InstanceName = ' TestInstance'
380+
381+ # Override EnumProcesses to return an empty DataTable
382+ $mockServerObjectNoProcesses | Add-Member - MemberType ' ScriptMethod' - Name ' EnumProcesses' - Value {
383+ param ($loginName )
384+
385+ $dataTable = New-Object - TypeName ' System.Data.DataTable'
386+ $null = $dataTable.Columns.Add (' Spid' , [System.Int32 ])
387+ $null = $dataTable.Columns.Add (' Login' , [System.String ])
388+
389+ # Return empty DataTable (no rows)
390+ return $dataTable
391+ } - Force
392+
393+ $script :mockLoginObjectNoProcesses = New-Object - TypeName ' Microsoft.SqlServer.Management.Smo.Login' - ArgumentList @ (
394+ $mockServerObjectNoProcesses ,
395+ ' TestLogin'
396+ ) |
397+ Add-Member - MemberType ' ScriptMethod' - Name ' Drop' - Value {
398+ $script :mockMethodDropCallCount += 1
399+ } - PassThru - Force
400+ }
401+
402+ It ' Should drop the login without attempting to kill any sessions' {
403+ Remove-SqlDscLogin - LoginObject $script :mockLoginObjectNoProcesses - KillActiveSessions - Force
404+
405+ $script :mockMethodDropCallCount | Should - Be 1
406+ }
407+ }
408+ }
288409}
0 commit comments