From bd5dfa16689ce4aa209b2733b352a903109ff83c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Sep 2025 10:23:31 +0000 Subject: [PATCH 01/11] Initial plan From 4d6eaaeb6462605223fc955aa341512d6548b27a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Sep 2025 10:39:35 +0000 Subject: [PATCH 02/11] Add integration test for ConvertFrom-SqlDscDatabasePermission command Co-authored-by: johlju <7189721+johlju@users.noreply.github.com> --- azure-pipelines.yml | 1 + ...scDatabasePermission.Integration.Tests.ps1 | 220 ++++++++++++++++++ 2 files changed, 221 insertions(+) create mode 100644 tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 103503d7d8..b9020ab0e6 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -310,6 +310,7 @@ stages: 'tests/Integration/Commands/Deny-SqlDscServerPermission.Integration.Tests.ps1' 'tests/Integration/Commands/Revoke-SqlDscServerPermission.Integration.Tests.ps1' 'tests/Integration/Commands/Get-SqlDscDatabase.Integration.Tests.ps1' + 'tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1' 'tests/Integration/Commands/New-SqlDscDatabase.Integration.Tests.ps1' 'tests/Integration/Commands/Set-SqlDscDatabase.Integration.Tests.ps1' 'tests/Integration/Commands/Test-SqlDscDatabase.Integration.Tests.ps1' diff --git a/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 new file mode 100644 index 0000000000..ec3c05af04 --- /dev/null +++ b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 @@ -0,0 +1,220 @@ +[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification = 'Suppressing this rule because Script Analyzer does not understand Pester syntax.')] +param () + +BeforeDiscovery { + try + { + if (-not (Get-Module -Name 'DscResource.Test')) + { + # Assumes dependencies have been resolved, so if this module is not available, run 'noop' task. + if (-not (Get-Module -Name 'DscResource.Test' -ListAvailable)) + { + # Redirect all streams to $null, except the error stream (stream 2) + & "$PSScriptRoot/../../../build.ps1" -Tasks 'noop' 3>&1 4>&1 5>&1 6>&1 > $null + } + + # If the dependencies have not been resolved, this will throw an error. + Import-Module -Name 'DscResource.Test' -Force -ErrorAction 'Stop' + } + } + catch [System.IO.FileNotFoundException] + { + throw 'DscResource.Test module dependency not found. Please run ".\build.ps1 -ResolveDependency -Tasks build" first.' + } +} + +BeforeAll { + $script:moduleName = 'SqlServerDsc' + + Import-Module -Name $script:moduleName -Force -ErrorAction 'Stop' +} + +Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag @('Integration_SQL2017', 'Integration_SQL2019', 'Integration_SQL2022') { + BeforeAll { + # Starting the named instance SQL Server service prior to running tests. + Start-Service -Name 'MSSQL$DSCSQLTEST' -Verbose -ErrorAction 'Stop' + + $script:mockInstanceName = 'DSCSQLTEST' + + $mockSqlAdministratorUserName = 'SqlAdmin' # Using computer name as NetBIOS name throw exception. + $mockSqlAdministratorPassword = ConvertTo-SecureString -String 'P@ssw0rd1' -AsPlainText -Force + + $script:mockSqlAdminCredential = [System.Management.Automation.PSCredential]::new($mockSqlAdministratorUserName, $mockSqlAdministratorPassword) + + $script:serverObject = Connect-SqlDscDatabaseEngine -InstanceName $script:mockInstanceName -Credential $script:mockSqlAdminCredential + } + + AfterAll { + Disconnect-SqlDscDatabaseEngine -ServerObject $script:serverObject + + # Stop the named instance SQL Server service to save memory on the build worker. + Stop-Service -Name 'MSSQL$DSCSQLTEST' -Verbose -ErrorAction 'Stop' + } + + Context 'When converting DatabasePermission objects' { + Context 'When converting a single permission Grant state' { + It 'Should return a DatabasePermissionSet with correct permissions set' { + $databasePermission = [DatabasePermission] @{ + State = 'Grant' + Permission = @('Connect', 'Select') + } + + $result = ConvertFrom-SqlDscDatabasePermission -Permission $databasePermission -ErrorAction 'Stop' + + $result | Should -Not -BeNullOrEmpty + $result | Should -BeOfType [Microsoft.SqlServer.Management.Smo.DatabasePermissionSet] + $result.Connect | Should -BeTrue + $result.Select | Should -BeTrue + $result.Update | Should -BeFalse + $result.Insert | Should -BeFalse + $result.Delete | Should -BeFalse + } + } + + Context 'When converting multiple permissions' { + It 'Should return a DatabasePermissionSet with all specified permissions set' { + $databasePermission = [DatabasePermission] @{ + State = 'Grant' + Permission = @('Connect', 'Select', 'Update', 'Insert') + } + + $result = ConvertFrom-SqlDscDatabasePermission -Permission $databasePermission -ErrorAction 'Stop' + + $result | Should -Not -BeNullOrEmpty + $result | Should -BeOfType [Microsoft.SqlServer.Management.Smo.DatabasePermissionSet] + $result.Connect | Should -BeTrue + $result.Select | Should -BeTrue + $result.Update | Should -BeTrue + $result.Insert | Should -BeTrue + $result.Delete | Should -BeFalse + $result.Alter | Should -BeFalse + } + } + + Context 'When converting permission with GrantWithGrant state' { + It 'Should return a DatabasePermissionSet with correct permissions set regardless of state' { + $databasePermission = [DatabasePermission] @{ + State = 'GrantWithGrant' + Permission = @('Alter', 'CreateTable') + } + + $result = ConvertFrom-SqlDscDatabasePermission -Permission $databasePermission -ErrorAction 'Stop' + + $result | Should -Not -BeNullOrEmpty + $result | Should -BeOfType [Microsoft.SqlServer.Management.Smo.DatabasePermissionSet] + $result.Alter | Should -BeTrue + $result.CreateTable | Should -BeTrue + $result.Connect | Should -BeFalse + $result.Select | Should -BeFalse + } + } + + Context 'When converting permission with Deny state' { + It 'Should return a DatabasePermissionSet with correct permissions set regardless of state' { + $databasePermission = [DatabasePermission] @{ + State = 'Deny' + Permission = @('Delete', 'Execute') + } + + $result = ConvertFrom-SqlDscDatabasePermission -Permission $databasePermission -ErrorAction 'Stop' + + $result | Should -Not -BeNullOrEmpty + $result | Should -BeOfType [Microsoft.SqlServer.Management.Smo.DatabasePermissionSet] + $result.Delete | Should -BeTrue + $result.Execute | Should -BeTrue + $result.Connect | Should -BeFalse + $result.Select | Should -BeFalse + } + } + + Context 'When using pipeline input' { + It 'Should accept DatabasePermission objects from the pipeline' { + $databasePermission = [DatabasePermission] @{ + State = 'Grant' + Permission = @('Connect', 'ViewDefinition') + } + + $result = $databasePermission | ConvertFrom-SqlDscDatabasePermission -ErrorAction 'Stop' + + $result | Should -Not -BeNullOrEmpty + $result | Should -BeOfType [Microsoft.SqlServer.Management.Smo.DatabasePermissionSet] + $result.Connect | Should -BeTrue + $result.ViewDefinition | Should -BeTrue + $result.Select | Should -BeFalse + } + } + + Context 'When processing multiple DatabasePermission objects through pipeline' { + It 'Should process each permission object and return multiple DatabasePermissionSet objects' { + $databasePermissions = @( + [DatabasePermission] @{ + State = 'Grant' + Permission = @('Connect') + }, + [DatabasePermission] @{ + State = 'Grant' + Permission = @('Select', 'Update') + } + ) + + $results = $databasePermissions | ConvertFrom-SqlDscDatabasePermission -ErrorAction 'Stop' + + $results | Should -Not -BeNullOrEmpty + $results.Count | Should -Be 2 + $results[0] | Should -BeOfType [Microsoft.SqlServer.Management.Smo.DatabasePermissionSet] + $results[1] | Should -BeOfType [Microsoft.SqlServer.Management.Smo.DatabasePermissionSet] + + # First permission set should have Connect + $results[0].Connect | Should -BeTrue + $results[0].Select | Should -BeFalse + + # Second permission set should have Select and Update + $results[1].Connect | Should -BeFalse + $results[1].Select | Should -BeTrue + $results[1].Update | Should -BeTrue + } + } + + Context 'When converting with empty permission array' { + It 'Should return a DatabasePermissionSet with no permissions set' { + $databasePermission = [DatabasePermission] @{ + State = 'Grant' + Permission = @() + } + + $result = ConvertFrom-SqlDscDatabasePermission -Permission $databasePermission -ErrorAction 'Stop' + + $result | Should -Not -BeNullOrEmpty + $result | Should -BeOfType [Microsoft.SqlServer.Management.Smo.DatabasePermissionSet] + $result.Connect | Should -BeFalse + $result.Select | Should -BeFalse + $result.Update | Should -BeFalse + $result.Insert | Should -BeFalse + $result.Delete | Should -BeFalse + } + } + + Context 'When verifying SMO object compatibility' { + It 'Should return a DatabasePermissionSet that can be used with SMO database operations' { + $databasePermission = [DatabasePermission] @{ + State = 'Grant' + Permission = @('Connect', 'Select') + } + + $result = ConvertFrom-SqlDscDatabasePermission -Permission $databasePermission -ErrorAction 'Stop' + + # Verify the result has the expected SMO properties + $result | Should -Not -BeNullOrEmpty + $result | Should -BeOfType [Microsoft.SqlServer.Management.Smo.DatabasePermissionSet] + + # Verify it has the correct SMO properties and methods available + $result | Get-Member -Name 'Connect' -MemberType Property | Should -Not -BeNullOrEmpty + $result | Get-Member -Name 'Select' -MemberType Property | Should -Not -BeNullOrEmpty + $result | Get-Member -Name 'ToString' -MemberType Method | Should -Not -BeNullOrEmpty + + # Verify ToString() method works + $result.ToString() | Should -Not -BeNullOrEmpty + } + } + } +} \ No newline at end of file From 2f7fef93f60b39c4b97c91fe476d00023e4a47b3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Sep 2025 10:44:59 +0000 Subject: [PATCH 03/11] Update CHANGELOG.md for ConvertFrom-SqlDscDatabasePermission integration test Co-authored-by: johlju <7189721+johlju@users.noreply.github.com> --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b224ca2cbc..ffc98a487f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added integration tests for `Remove-SqlDscAudit` command to ensure it functions correctly in real environments [issue #2241](https://github.com/dsccommunity/SqlServerDsc/issues/2241). +- Added integration tests for `ConvertFrom-SqlDscDatabasePermission` command to + ensure it functions correctly in real environments + [issue #2211](https://github.com/dsccommunity/SqlServerDsc/issues/2211). ### Fixed From 89d9a6049a41f4198374fb43f8427642943ad282 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 19 Sep 2025 17:38:13 +0000 Subject: [PATCH 04/11] Fix DatabasePermission class access in integration test using module scope Co-authored-by: johlju <7189721+johlju@users.noreply.github.com> --- ...scDatabasePermission.Integration.Tests.ps1 | 78 +++++++++++-------- 1 file changed, 47 insertions(+), 31 deletions(-) diff --git a/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 index ec3c05af04..50118946ac 100644 --- a/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 +++ b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 @@ -54,9 +54,11 @@ Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag @('Integration_SQL2017', 'I Context 'When converting DatabasePermission objects' { Context 'When converting a single permission Grant state' { It 'Should return a DatabasePermissionSet with correct permissions set' { - $databasePermission = [DatabasePermission] @{ - State = 'Grant' - Permission = @('Connect', 'Select') + $databasePermission = & (Get-Module -Name $script:moduleName) { + [DatabasePermission] @{ + State = 'Grant' + Permission = @('Connect', 'Select') + } } $result = ConvertFrom-SqlDscDatabasePermission -Permission $databasePermission -ErrorAction 'Stop' @@ -73,9 +75,11 @@ Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag @('Integration_SQL2017', 'I Context 'When converting multiple permissions' { It 'Should return a DatabasePermissionSet with all specified permissions set' { - $databasePermission = [DatabasePermission] @{ - State = 'Grant' - Permission = @('Connect', 'Select', 'Update', 'Insert') + $databasePermission = & (Get-Module -Name $script:moduleName) { + [DatabasePermission] @{ + State = 'Grant' + Permission = @('Connect', 'Select', 'Update', 'Insert') + } } $result = ConvertFrom-SqlDscDatabasePermission -Permission $databasePermission -ErrorAction 'Stop' @@ -93,9 +97,11 @@ Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag @('Integration_SQL2017', 'I Context 'When converting permission with GrantWithGrant state' { It 'Should return a DatabasePermissionSet with correct permissions set regardless of state' { - $databasePermission = [DatabasePermission] @{ - State = 'GrantWithGrant' - Permission = @('Alter', 'CreateTable') + $databasePermission = & (Get-Module -Name $script:moduleName) { + [DatabasePermission] @{ + State = 'GrantWithGrant' + Permission = @('Alter', 'CreateTable') + } } $result = ConvertFrom-SqlDscDatabasePermission -Permission $databasePermission -ErrorAction 'Stop' @@ -111,9 +117,11 @@ Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag @('Integration_SQL2017', 'I Context 'When converting permission with Deny state' { It 'Should return a DatabasePermissionSet with correct permissions set regardless of state' { - $databasePermission = [DatabasePermission] @{ - State = 'Deny' - Permission = @('Delete', 'Execute') + $databasePermission = & (Get-Module -Name $script:moduleName) { + [DatabasePermission] @{ + State = 'Deny' + Permission = @('Delete', 'Execute') + } } $result = ConvertFrom-SqlDscDatabasePermission -Permission $databasePermission -ErrorAction 'Stop' @@ -129,9 +137,11 @@ Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag @('Integration_SQL2017', 'I Context 'When using pipeline input' { It 'Should accept DatabasePermission objects from the pipeline' { - $databasePermission = [DatabasePermission] @{ - State = 'Grant' - Permission = @('Connect', 'ViewDefinition') + $databasePermission = & (Get-Module -Name $script:moduleName) { + [DatabasePermission] @{ + State = 'Grant' + Permission = @('Connect', 'ViewDefinition') + } } $result = $databasePermission | ConvertFrom-SqlDscDatabasePermission -ErrorAction 'Stop' @@ -146,16 +156,18 @@ Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag @('Integration_SQL2017', 'I Context 'When processing multiple DatabasePermission objects through pipeline' { It 'Should process each permission object and return multiple DatabasePermissionSet objects' { - $databasePermissions = @( - [DatabasePermission] @{ - State = 'Grant' - Permission = @('Connect') - }, - [DatabasePermission] @{ - State = 'Grant' - Permission = @('Select', 'Update') - } - ) + $databasePermissions = & (Get-Module -Name $script:moduleName) { + @( + [DatabasePermission] @{ + State = 'Grant' + Permission = @('Connect') + }, + [DatabasePermission] @{ + State = 'Grant' + Permission = @('Select', 'Update') + } + ) + } $results = $databasePermissions | ConvertFrom-SqlDscDatabasePermission -ErrorAction 'Stop' @@ -177,9 +189,11 @@ Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag @('Integration_SQL2017', 'I Context 'When converting with empty permission array' { It 'Should return a DatabasePermissionSet with no permissions set' { - $databasePermission = [DatabasePermission] @{ - State = 'Grant' - Permission = @() + $databasePermission = & (Get-Module -Name $script:moduleName) { + [DatabasePermission] @{ + State = 'Grant' + Permission = @() + } } $result = ConvertFrom-SqlDscDatabasePermission -Permission $databasePermission -ErrorAction 'Stop' @@ -196,9 +210,11 @@ Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag @('Integration_SQL2017', 'I Context 'When verifying SMO object compatibility' { It 'Should return a DatabasePermissionSet that can be used with SMO database operations' { - $databasePermission = [DatabasePermission] @{ - State = 'Grant' - Permission = @('Connect', 'Select') + $databasePermission = & (Get-Module -Name $script:moduleName) { + [DatabasePermission] @{ + State = 'Grant' + Permission = @('Connect', 'Select') + } } $result = ConvertFrom-SqlDscDatabasePermission -Permission $databasePermission -ErrorAction 'Stop' From 34fac99d557e4429bcec315612e3b868f57509da Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 19 Sep 2025 17:53:14 +0000 Subject: [PATCH 05/11] Fix integration test: change build to noop, add README entry, ensure file ends with blank line Co-authored-by: johlju <7189721+johlju@users.noreply.github.com> --- ...ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 | 4 ++-- tests/Integration/Commands/README.md | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 index 50118946ac..610aff5750 100644 --- a/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 +++ b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 @@ -19,7 +19,7 @@ BeforeDiscovery { } catch [System.IO.FileNotFoundException] { - throw 'DscResource.Test module dependency not found. Please run ".\build.ps1 -ResolveDependency -Tasks build" first.' + throw 'DscResource.Test module dependency not found. Please run ".\build.ps1 -ResolveDependency -Tasks noop" first.' } } @@ -233,4 +233,4 @@ Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag @('Integration_SQL2017', 'I } } } -} \ No newline at end of file +} diff --git a/tests/Integration/Commands/README.md b/tests/Integration/Commands/README.md index 61c279aa2b..2ef2e2cf68 100644 --- a/tests/Integration/Commands/README.md +++ b/tests/Integration/Commands/README.md @@ -70,6 +70,7 @@ Test-SqlDscServerPermission | 2 | 1 (Install-SqlDscServer), 0 (Prerequisites) | Deny-SqlDscServerPermission | 2 | 1 (Install-SqlDscServer), 0 (Prerequisites) | DSCSQLTEST | Denies AlterTrace permission to login (persistent) Revoke-SqlDscServerPermission | 2 | 1 (Install-SqlDscServer), 0 (Prerequisites) | DSCSQLTEST | - Get-SqlDscDatabase | 2 | 1 (Install-SqlDscServer), 0 (Prerequisites) | DSCSQLTEST | - +ConvertFrom-SqlDscDatabasePermission | 2 | 1 (Install-SqlDscServer), 0 (Prerequisites) | DSCSQLTEST | - New-SqlDscDatabase | 2 | 1 (Install-SqlDscServer), 0 (Prerequisites) | DSCSQLTEST | Test databases Set-SqlDscDatabase | 2 | 1 (Install-SqlDscServer), 0 (Prerequisites) | DSCSQLTEST | - Test-SqlDscDatabase | 2 | 1 (Install-SqlDscServer), 0 (Prerequisites) | DSCSQLTEST | - From 51e181127e9a9cb4e81c75c5f373fea957ef5505 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 19 Sep 2025 19:37:09 +0000 Subject: [PATCH 06/11] Fix integration test expectation for multiple pipeline objects - command combines permissions into single result Co-authored-by: johlju <7189721+johlju@users.noreply.github.com> --- ...scDatabasePermission.Integration.Tests.ps1 | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 index 610aff5750..55f1dd4eec 100644 --- a/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 +++ b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 @@ -155,7 +155,7 @@ Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag @('Integration_SQL2017', 'I } Context 'When processing multiple DatabasePermission objects through pipeline' { - It 'Should process each permission object and return multiple DatabasePermissionSet objects' { + It 'Should process each permission object and combine them into single DatabasePermissionSet object' { $databasePermissions = & (Get-Module -Name $script:moduleName) { @( [DatabasePermission] @{ @@ -169,21 +169,19 @@ Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag @('Integration_SQL2017', 'I ) } - $results = $databasePermissions | ConvertFrom-SqlDscDatabasePermission -ErrorAction 'Stop' + $result = $databasePermissions | ConvertFrom-SqlDscDatabasePermission -ErrorAction 'Stop' - $results | Should -Not -BeNullOrEmpty - $results.Count | Should -Be 2 - $results[0] | Should -BeOfType [Microsoft.SqlServer.Management.Smo.DatabasePermissionSet] - $results[1] | Should -BeOfType [Microsoft.SqlServer.Management.Smo.DatabasePermissionSet] - - # First permission set should have Connect - $results[0].Connect | Should -BeTrue - $results[0].Select | Should -BeFalse + # The command combines all permissions into a single DatabasePermissionSet + $result | Should -Not -BeNullOrEmpty + $result | Should -BeOfType [Microsoft.SqlServer.Management.Smo.DatabasePermissionSet] - # Second permission set should have Select and Update - $results[1].Connect | Should -BeFalse - $results[1].Select | Should -BeTrue - $results[1].Update | Should -BeTrue + # All permissions from both objects should be set to true + $result.Connect | Should -BeTrue + $result.Select | Should -BeTrue + $result.Update | Should -BeTrue + $result.Insert | Should -BeFalse + $result.Delete | Should -BeFalse + } } } From fffcdde695fe133749fb85de50632ca363872c17 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 20 Sep 2025 12:34:46 +0000 Subject: [PATCH 07/11] Fix duplicate closing brace syntax error in integration test Co-authored-by: johlju <7189721+johlju@users.noreply.github.com> --- .../ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 index 55f1dd4eec..6e418258f3 100644 --- a/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 +++ b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 @@ -182,7 +182,6 @@ Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag @('Integration_SQL2017', 'I $result.Insert | Should -BeFalse $result.Delete | Should -BeFalse } - } } Context 'When converting with empty permission array' { From 5c61594b49b48870aaa2ec59131064c15f38a098 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 20 Sep 2025 14:02:26 +0000 Subject: [PATCH 08/11] Add validation steps for empty permission array test to debug object creation issue Co-authored-by: johlju <7189721+johlju@users.noreply.github.com> --- ...onvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 index 6e418258f3..314aadb752 100644 --- a/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 +++ b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 @@ -193,6 +193,11 @@ Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag @('Integration_SQL2017', 'I } } + # Verify the DatabasePermission object was created successfully + $databasePermission | Should -Not -BeNullOrEmpty + $databasePermission.State | Should -Be 'Grant' + $databasePermission.Permission | Should -Be @() + $result = ConvertFrom-SqlDscDatabasePermission -Permission $databasePermission -ErrorAction 'Stop' $result | Should -Not -BeNullOrEmpty From eb3ba8763b8a9ef8fc54e615c2ca30ef20185d10 Mon Sep 17 00:00:00 2001 From: Johan Ljunggren Date: Sat, 20 Sep 2025 16:13:20 +0200 Subject: [PATCH 09/11] Remove unnecessary service start/stop logic from ConvertFrom-SqlDscDatabasePermission integration tests --- ...scDatabasePermission.Integration.Tests.ps1 | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 index 314aadb752..5b664a78b6 100644 --- a/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 +++ b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 @@ -30,27 +30,6 @@ BeforeAll { } Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag @('Integration_SQL2017', 'Integration_SQL2019', 'Integration_SQL2022') { - BeforeAll { - # Starting the named instance SQL Server service prior to running tests. - Start-Service -Name 'MSSQL$DSCSQLTEST' -Verbose -ErrorAction 'Stop' - - $script:mockInstanceName = 'DSCSQLTEST' - - $mockSqlAdministratorUserName = 'SqlAdmin' # Using computer name as NetBIOS name throw exception. - $mockSqlAdministratorPassword = ConvertTo-SecureString -String 'P@ssw0rd1' -AsPlainText -Force - - $script:mockSqlAdminCredential = [System.Management.Automation.PSCredential]::new($mockSqlAdministratorUserName, $mockSqlAdministratorPassword) - - $script:serverObject = Connect-SqlDscDatabaseEngine -InstanceName $script:mockInstanceName -Credential $script:mockSqlAdminCredential - } - - AfterAll { - Disconnect-SqlDscDatabaseEngine -ServerObject $script:serverObject - - # Stop the named instance SQL Server service to save memory on the build worker. - Stop-Service -Name 'MSSQL$DSCSQLTEST' -Verbose -ErrorAction 'Stop' - } - Context 'When converting DatabasePermission objects' { Context 'When converting a single permission Grant state' { It 'Should return a DatabasePermissionSet with correct permissions set' { From 488680d803e58ad6618213ae342ed7c6b465cc72 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 26 Sep 2025 07:13:56 +0000 Subject: [PATCH 10/11] Change empty permission array validation to use Should -BeNullOrEmpty instead of Should -Be @() Co-authored-by: johlju <7189721+johlju@users.noreply.github.com> --- .../ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 index 5b664a78b6..12480c430a 100644 --- a/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 +++ b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 @@ -175,7 +175,7 @@ Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag @('Integration_SQL2017', 'I # Verify the DatabasePermission object was created successfully $databasePermission | Should -Not -BeNullOrEmpty $databasePermission.State | Should -Be 'Grant' - $databasePermission.Permission | Should -Be @() + $databasePermission.Permission | Should -BeNullOrEmpty $result = ConvertFrom-SqlDscDatabasePermission -Permission $databasePermission -ErrorAction 'Stop' From 1a89b9acdf41de560a3509257428cfa533ccebec Mon Sep 17 00:00:00 2001 From: Johan Ljunggren Date: Fri, 26 Sep 2025 11:58:51 +0200 Subject: [PATCH 11/11] Enhance documentation for ConvertFrom-SqlDscDatabasePermission and add tests for multiple DatabasePermission objects --- .../ConvertFrom-SqlDscDatabasePermission.ps1 | 4 +- ...scDatabasePermission.Integration.Tests.ps1 | 51 ++++++------- ...ertFrom-SqlDscDatabasePermission.Tests.ps1 | 75 +++++++++++++++++++ 3 files changed, 103 insertions(+), 27 deletions(-) diff --git a/source/Public/ConvertFrom-SqlDscDatabasePermission.ps1 b/source/Public/ConvertFrom-SqlDscDatabasePermission.ps1 index 7121691b2c..eabb27bb13 100644 --- a/source/Public/ConvertFrom-SqlDscDatabasePermission.ps1 +++ b/source/Public/ConvertFrom-SqlDscDatabasePermission.ps1 @@ -1,10 +1,10 @@ <# .SYNOPSIS - Converts a DatabasePermission object into an object of the type + Converts one or more DatabasePermission objects into an object of the type Microsoft.SqlServer.Management.Smo.DatabasePermissionSet. .DESCRIPTION - Converts a DatabasePermission object into an object of the type + Converts one or more DatabasePermission objects into a single object of the type Microsoft.SqlServer.Management.Smo.DatabasePermissionSet. .PARAMETER Permission diff --git a/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 index 12480c430a..43d0ac7f3b 100644 --- a/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 +++ b/tests/Integration/Commands/ConvertFrom-SqlDscDatabasePermission.Integration.Tests.ps1 @@ -163,31 +163,32 @@ Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag @('Integration_SQL2017', 'I } } - Context 'When converting with empty permission array' { - It 'Should return a DatabasePermissionSet with no permissions set' { - $databasePermission = & (Get-Module -Name $script:moduleName) { - [DatabasePermission] @{ - State = 'Grant' - Permission = @() - } - } - - # Verify the DatabasePermission object was created successfully - $databasePermission | Should -Not -BeNullOrEmpty - $databasePermission.State | Should -Be 'Grant' - $databasePermission.Permission | Should -BeNullOrEmpty - - $result = ConvertFrom-SqlDscDatabasePermission -Permission $databasePermission -ErrorAction 'Stop' - - $result | Should -Not -BeNullOrEmpty - $result | Should -BeOfType [Microsoft.SqlServer.Management.Smo.DatabasePermissionSet] - $result.Connect | Should -BeFalse - $result.Select | Should -BeFalse - $result.Update | Should -BeFalse - $result.Insert | Should -BeFalse - $result.Delete | Should -BeFalse - } - } + # Context 'When converting with empty permission array' { + # It 'Should return a DatabasePermissionSet with no permissions set' { + # $databasePermission = & (Get-Module -Name $script:moduleName) { + # [DatabasePermission] @{ + # State = 'Grant' + # Permission = @() + # } + # } + + # # Verify the DatabasePermission object was created successfully + # $databasePermission | Should -Not -BeNullOrEmpty + # $databasePermission.State | Should -Be 'Grant' + # $databasePermission.Permission | Should -HaveCount 0 + + # $result = ConvertFrom-SqlDscDatabasePermission -Permission $databasePermission -ErrorAction 'Stop' + + # # TODO: This fails with: "Expected a value, but got $null or empty", but the unit tests pass. + # $result | Should -Not -BeNullOrEmpty + # $result | Should -BeOfType [Microsoft.SqlServer.Management.Smo.DatabasePermissionSet] + # $result.Connect | Should -BeFalse + # $result.Select | Should -BeFalse + # $result.Update | Should -BeFalse + # $result.Insert | Should -BeFalse + # $result.Delete | Should -BeFalse + # } + # } Context 'When verifying SMO object compatibility' { It 'Should return a DatabasePermissionSet that can be used with SMO database operations' { diff --git a/tests/Unit/Public/ConvertFrom-SqlDscDatabasePermission.Tests.ps1 b/tests/Unit/Public/ConvertFrom-SqlDscDatabasePermission.Tests.ps1 index 06a736d9de..33e656245b 100644 --- a/tests/Unit/Public/ConvertFrom-SqlDscDatabasePermission.Tests.ps1 +++ b/tests/Unit/Public/ConvertFrom-SqlDscDatabasePermission.Tests.ps1 @@ -79,4 +79,79 @@ Describe 'ConvertFrom-SqlDscDatabasePermission' -Tag 'Public' { $mockResult.Update | Should -BeFalse } } + + Context 'When passing multiple DatabasePermission objects over the pipeline' { + It 'Should consolidate all permissions into a single DatabasePermissionSet' { + $mockPermission1 = InModuleScope -ScriptBlock { + [DatabasePermission] @{ + State = 'Grant' + Permission = @( + 'Connect' + 'Alter' + ) + } + } + + $mockPermission2 = InModuleScope -ScriptBlock { + [DatabasePermission] @{ + State = 'Grant' + Permission = @( + 'Update' + 'Delete' + ) + } + } + + $mockResult = @($mockPermission1, $mockPermission2) | ConvertFrom-SqlDscDatabasePermission + + # Verify permissions from first object are set + $mockResult.Connect | Should -BeTrue + $mockResult.Alter | Should -BeTrue + + # Verify permissions from second object are set + $mockResult.Update | Should -BeTrue + $mockResult.Delete | Should -BeTrue + + # Verify a permission not specified in either object remains false + $mockResult.Insert | Should -BeFalse + } + } + + Context 'When passing a DatabasePermission object with empty permissions' { + It 'Should return a DatabasePermissionSet with all permissions set to false' { + $mockEmptyPermission = InModuleScope -ScriptBlock { + [DatabasePermission] @{ + State = 'Grant' + Permission = @() + } + } + + $mockResult = ConvertFrom-SqlDscDatabasePermission -Permission $mockEmptyPermission + + # Verify that common permissions remain false when no permissions are specified + $mockResult.Connect | Should -BeFalse + $mockResult.Alter | Should -BeFalse + $mockResult.Update | Should -BeFalse + $mockResult.Delete | Should -BeFalse + $mockResult.Insert | Should -BeFalse + } + + It 'Should return a DatabasePermissionSet with all permissions set to false when passed over the pipeline' { + $mockEmptyPermission = InModuleScope -ScriptBlock { + [DatabasePermission] @{ + State = 'Grant' + Permission = @() + } + } + + $mockResult = $mockEmptyPermission | ConvertFrom-SqlDscDatabasePermission + + # Verify that common permissions remain false when no permissions are specified + $mockResult.Connect | Should -BeFalse + $mockResult.Alter | Should -BeFalse + $mockResult.Update | Should -BeFalse + $mockResult.Delete | Should -BeFalse + $mockResult.Insert | Should -BeFalse + } + } }