Modules/M365DSCExoResourceUtils.psm1
function Write-TokenReplacement { param ( [Parameter()] [System.String] $Token, # Parameter help description [Parameter()] [System.String] $Value, # Parameter help description [Parameter()] [System.String] $FilePath ) $content = Get-Content -Path $FilePath $content = $content.Replace($Token, $Value) Set-Content -Path $FilePath -Value $content } function Get-M365DSCHashAsString { [CmdletBinding()] [OutputType([System.String])] param( [Parameter(Mandatory = $true)] [System.Collections.Hashtable] $Values ) $sb = [System.Text.StringBuilder]::New() foreach ($key in $Values.Keys) { switch ($Values.$key.GetType().Name) { 'String' { $sb.AppendLine(" $key = `"$($Values.$key)`"") | Out-Null } 'Int32' { $sb.AppendLine(" $key = $($Values.$key)") | Out-Null } 'UInt32' { $sb.AppendLine(" $key = $($Values.$key)") | Out-Null } 'Boolean' { $sb.AppendLine(" $key = `$$($Values.$key)") | Out-Null } 'String[]' { $stringValue = '' foreach ($item in $Values.$key) { $stringValue += "`"$item`"," } $stringValue = $stringValue.Substring(0, $stringValue.Length - 1) $sb.AppendLine(" $key = `@($stringValue)") | Out-Null } } } return $sb.ToString() } function Get-M365DSCFakeValues { [OutputType([System.Collections.Hashtable])] param( [Parameter(Mandatory = $true)] [System.Object[]] $ParametersInformation, [Parameter()] [System.Boolean] $IntroduceDrift = $false ) $result = @{} foreach ($parameter in $parametersInformation) { switch ($parameter.Type.Name) { 'String' { if ($IntroduceDrift) { if ($parameter.ValidValues.Length -eq 0) { $result.Add($parameter.Name, 'FakeStringValue') } else { $result.Add($parameter.Name, $parameter.ValidValues[1]) } } else { if ($parameter.ValidValues.Length -eq 0) { $result.Add($parameter.Name, 'FakeStringValue2') } else { $result.Add($parameter.Name, $parameter.ValidValues[0]) } } } 'String[]' { if ($IntroduceDrift) { if ($parameter.ValidValues.Length -eq 0) { $result.Add($parameter.Name, @('FakeStringArrayValue1')) } else { $result.Add($parameter.Name, @($parameter.ValidValues[0])) } } else { if ($parameter.ValidValues.Length -eq 0) { $result.Add($parameter.Name, @('FakeStringArrayValue1', 'FakeStringArrayValue2')) } else { $result.Add($parameter.Name, @($parameter.ValidValues[0], $parameter.ValidValues[1])) } } } 'Int32' { if ($IntroduceDrift) { $result.Add($parameter.Name, 7) } else { $result.Add($parameter.Name, 25) } } 'UInt32' { if ($IntroduceDrift) { $result.Add($parameter.Name, 7) } else { $result.Add($parameter.Name, 25) } } 'Boolean' { if ($IntroduceDrift) { $result.Add($parameter.Name, $false) } else { $result.Add($parameter.Name, $true) } } } } return $result } function New-ExoUnitTest { param ( [Parameter(Mandatory = $true)] [System.String] $ResourceName, [Parameter(Mandatory = $true)] [System.String] $OutputPath, [Parameter(Mandatory = $false)] [System.String] $CmdletNoun = '' ) if ($ResourceName.StartsWith('MSFT_')) { $ResourceName = $ResourceName.Substring(5) } if ($CmdletNoun -eq '') { $CmdletNoun = $ResourceName.Substring(3) } # Get properties of resource $ignoredProperties = @('ErrorVariable', ` 'ErrorAction', ` 'InformationVariable', ` 'InformationAction', ` 'WarningVariable', ` 'WarningAction', ` 'OutVariable', ` 'OutBuffer', ` 'PipelineVariable', ` 'Verbose', ` 'WhatIf', ` 'Debug', 'Credential', 'ApplicationId', 'Ensure', 'TenantId', 'CertificateThumbprint', 'CertificatePath', 'CertificatePassword', 'IsSingleInstance') try { Import-Module $('..\DSCResources\MSFT_' + $ResourceName + '\MSFT_' + $ResourceName + '.psm1') -Force -ErrorAction Stop } catch { Write-Host "DSC resource $ResourceName not found!" break; } # Copy unit test template try { $unitTestPath = "$OutputPath\Microsoft365DSC.$($ResourceName).Tests.ps1" Copy-Item -Path ..\..\..\ResourceGenerator\UnitTest.Template.ps1 -Destination $unitTestPath -ErrorAction Stop } catch { Write-Host 'Cannot create unit test file!' break; } $parameterInformation = @() $resourceProperties = (Get-Command Set-TargetResource -Module $("MSFT_$ResourceName")).Parameters foreach ($key in $resourceProperties.Keys) { if ($resourceProperties[$key].Name -notin $ignoredProperties) { $param = @{Name = $resourceProperties[$key].Name; Type = $resourceProperties[$key].ParameterType; ValidValues = $resourceProperties[$key].Attributes.ValidValues } $parameterInformation += $param } } Remove-Module -Name $("MSFT_$ResourceName") -Force -Confirm:$false # build unit test $fakeValues = Get-M365DSCFakeValues -ParametersInformation $parameterInformation -IntroduceDrift $false $fakeValuesString = Get-M365DSCHashAsString -Values $fakeValues Write-TokenReplacement -Token '<FakeValues>' -value $fakeValuesString -FilePath $unitTestPath $fakeDriftValues = Get-M365DSCFakeValues -ParametersInformation $parameterInformation -IntroduceDrift $true $fakeDriftValuesString = Get-M365DSCHashAsString -Values $fakeDriftValues Write-TokenReplacement -Token '<DriftValues>' -value $fakeDriftValuesString -FilePath $unitTestPath Write-TokenReplacement -Token '<ResourceName>' -value $ResourceName -FilePath $unitTestPath Write-TokenReplacement -Token '<GetCmdletName>' -value "Get-$($CmdletNoun)" -FilePath $unitTestPath Write-TokenReplacement -Token '<SetCmdletName>' -value "Set-$($CmdletNoun)" -FilePath $unitTestPath Write-TokenReplacement -Token '<RemoveCmdletName>' -value "Remove-$($CmdletNoun)" -FilePath $unitTestPath Write-TokenReplacement -Token '<NewCmdletName>' -value "New-$($CmdletNoun)" -FilePath $unitTestPath } Export-ModuleMember -Function @( 'New-ExoUnitTest' ) |