Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,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).
- Added integration test for `ConvertTo-SqlDscEditionName` command to ensure
command reliability in real environments
[issue #2208](https://github.com/dsccommunity/SqlServerDsc/issues/2208).
Expand Down
1 change: 1 addition & 0 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,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'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,236 @@
[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 noop" 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 = & (Get-Module -Name $script:moduleName) {
[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 = & (Get-Module -Name $script:moduleName) {
[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 = & (Get-Module -Name $script:moduleName) {
[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 = & (Get-Module -Name $script:moduleName) {
[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 = & (Get-Module -Name $script:moduleName) {
[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 = & (Get-Module -Name $script:moduleName) {
@(
[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 = & (Get-Module -Name $script:moduleName) {
[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 = & (Get-Module -Name $script:moduleName) {
[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
}
}
}
}
1 change: 1 addition & 0 deletions tests/Integration/Commands/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 | -
Expand Down
Loading