Skip to content

Commit

Permalink
Merge pull request PowerShell#76 from bgelens/dev
Browse files Browse the repository at this point in the history
Added additional tests to deal with Class resource / Mixed resource modules
  • Loading branch information
eshaparmar authored Nov 7, 2016
2 parents a242740 + 6d5d271 commit 3979443
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 0 deletions.
50 changes: 50 additions & 0 deletions Meta.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,10 @@ try
}
}

# Declare resource type detection variables
$ScriptResource = $false
$ClassResource = $false

# Force convert to array
$psm1Files = @(
Get-ChildItem -Path $RepoRoot\DscResources -Recurse -Filter '*.psm1' -File |
Expand All @@ -200,10 +204,12 @@ try
$MofFilePath = Join-Path -Path $_.DirectoryName -ChildPath $MofFileName
if (Test-Path -Path $MofFilePath -ErrorAction SilentlyContinue)
{
$ScriptResource = $true
Write-Output -InputObject $_
}
elseif (Test-ClassResource -Path $_.FullName)
{
$ClassResource = $true
Write-Output -InputObject $_
}
}
Expand All @@ -214,6 +220,50 @@ try
Write-Verbose -Verbose 'There are no resource files to analyze'
} else {

# Set MinimumPSVersion variable based on resource types detected
if ($ClassResource -and $ScriptResource)
{
#Mixed module
$MinimumPSVersion = [Version]'5.1'
}
elseif ($ClassResource)
{
$MinimumPSVersion = [Version]'5.0'
}
else
{
$MinimumPSVersion = [Version]'4.0'
}

Context 'Root Manifest' {

$RootManifest = Resolve-Path -Path $moduleRoot\*.psd1
$ModuleManifest = Test-ModuleManifest -Path $RootManifest

it "Minimum PowerShell version $MinimumPSVersion based on resource types" {

$ModuleManifest.PowerShellVersion -ge $MinimumPSVersion | Should Be $true
}

if ($ClassResource)
{
foreach ($psm1file in $psm1Files)
{
$ClassResourceName = Get-ClassResource -Path $psm1file.FullName
if ($null -ne $ClassResourceName)
{
It "DscResourcesToExport key should contain: $ClassResourceName" {
$ModuleManifest.ExportedDscResources -contains $ClassResourceName | Should Be $true
}

It "NestedModules key should contain path to: $ClassResourceName" {
$ModuleManifest.NestedModules.Name -contains $ClassResourceName | Should Be $true
}
}
}
}
}

Write-Verbose -Verbose "Analyzing $($psm1Files.Count) resources"

Context 'Correctness' {
Expand Down
33 changes: 33 additions & 0 deletions TestHelper.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -537,3 +537,36 @@ function Test-ClassResource
}
return $result
}

<#
.SYNOPSIS
Get DSC Class resource names from a PowerShell module (psm1) file.
.PARAMETER Path
This is the full path of the psm1 file.
.EXAMPLE
Get-ClassResource -Path 'c:\mymodule\myclassmodule.psm1'
This command will get DSC Class resource names from the myclassmodule module.
#>
function Get-ClassResource
{
param
(
[Parameter(ValueFromPipeline = $true, Mandatory = $true)]
[String] $Path
)
if (Test-ClassResource -Path $Path)
{
$ast = [System.Management.Automation.Language.Parser]::ParseFile($Path, [ref]$null, [ref]$null)
$Result = $ast.FindAll({$args[0] -is [System.Management.Automation.Language.TypeDefinitionAst]}, $false)
foreach ($Item in $Result)
{
if ($Item.Attributes.TypeName.Name -eq 'DscResource')
{
$Item.Name
}
}
}
}

0 comments on commit 3979443

Please sign in to comment.