Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
Prev Previous commit
Next Next commit
Update tests, validate missing Prerelease better
  • Loading branch information
Jaykul committed Nov 7, 2018
commit 8ff455fd6d01945f77b1d8cb7af6502320b63a0b
21 changes: 13 additions & 8 deletions Source/Public/Build-Module.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -134,12 +134,12 @@ function Build-Module {
# BEFORE we InitializeBuild we need to "fix" the version
if($PSCmdlet.ParameterSetName -ne "SemanticVersion") {
Write-Verbose "Calculate the Semantic Version from the $Version - $Prerelease + $BuildMetadata"
$SemVer = $Version
$SemVer = "$Version"
if($Prerelease) {
$SemVer = $Version + '-' + $Prerelease
$SemVer = "$Version-$Prerelease"
}
if($BuildMetadata) {
$SemVer = $SemVer + '+' + $BuildMetadata
$SemVer = "$SemVer+$BuildMetadata"
}
}

Expand Down Expand Up @@ -215,11 +215,16 @@ function Build-Module {
Write-Warning "Failed to update version to $Version. $_"
}

if ($Prerelease) {
Write-Verbose "Update Manifest at $OutputManifest with Prerelease: $Prerelease"
Update-Metadata -Path $OutputManifest -PropertyName PrivateData.PSData.Prerelease -Value $Prerelease
} else {
Update-Metadata -Path $OutputManifest -PropertyName PrivateData.PSData.Prerelease -Value ""
if ($null -ne (Get-Metadata -Path $OutputManifest -PropertyName PrivateData.PSData.Prerelease -ErrorAction SilentlyContinue)) {
if ($Prerelease) {
Write-Verbose "Update Manifest at $OutputManifest with Prerelease: $Prerelease"
Update-Metadata -Path $OutputManifest -PropertyName PrivateData.PSData.Prerelease -Value $Prerelease
} else {
Update-Metadata -Path $OutputManifest -PropertyName PrivateData.PSData.Prerelease -Value ""
}
} elseif($Prerelease) {
Write-Warning ("Cannot set Prerelease in module manifest. Add an empty Prerelease to your module manifest, like:`n" +
' PrivateData = @{ PSData = @{ Prerelease = "" } }')
}

if ($BuildMetadata) {
Expand Down
117 changes: 117 additions & 0 deletions Tests/Public/Build-Module.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -296,4 +296,121 @@ Describe "Build-Module" {

Pop-Location -StackName BuildModuleTest
}

Context "Setting the version and pre-release" {
# $SemVer = "1.0.0-beta03+sha.22c35ffff166f34addc49a3b80e622b543199cc5.Date.2018-10-11"
$SemVer = @{
Version = "1.0.0"
Prerelease = "beta03"
BuildMetadata = "Sha.22c35ffff166f34addc49a3b80e622b543199cc5.Date.2018-10-11"
}
$global:ExpectedVersion = "1.0.0"
Push-Location TestDrive:\ -StackName BuildModuleTest
New-Item -ItemType Directory -Path TestDrive:\MyModule\ -Force
New-Item -ItemType Directory -Path "TestDrive:\$ExpectedVersion\" -Force

Mock SetModuleContent -ModuleName ModuleBuilder {}
Mock Update-Metadata -ModuleName ModuleBuilder {}

Mock InitializeBuild -ModuleName ModuleBuilder {
# These are actually all the values that we need
[PSCustomObject]@{
OutputDirectory = "TestDrive:\$Version"
Name = "MyModule"
ModuleBase = "TestDrive:\MyModule\"
CopyDirectories = @()
Encoding = "UTF8"
PublicFilter = "Public\*.ps1"
}
}

Mock New-Item { [IO.FileInfo]"TestDrive:\$ExpectedVersion" } -Parameter {
$Path -eq "TestDrive:\$ExpectedVersion" -and
$ItemType -eq "Directory" -and
$Force -eq $true
} -ModuleName ModuleBuilder

Mock Test-Path {$True} -Parameter {$Path -eq "TestDrive:\$ExpectedVersion"} -ModuleName ModuleBuilder
Mock Remove-Item {} -Parameter {$Path.StartsWith((Convert-Path "TestDrive:\$ExpectedVersion"))} -ModuleName ModuleBuilder
Mock Set-Location {} -ModuleName ModuleBuilder
Mock Copy-Item {} -ModuleName ModuleBuilder
# Release notes
Mock Get-Metadata { "First Release" } -ModuleName ModuleBuilder
Mock Join-Path {
[IO.Path]::Combine($Path, $ChildPath)
} -ModuleName ModuleBuilder

Mock Get-ChildItem {
[IO.FileInfo]$(Join-Path $(Convert-Path "TestDrive:\") "MyModule\Public\Get-MyInfo.ps1")
} -ModuleName ModuleBuilder

try {
Build-Module @SemVer
} catch {
Pop-Location -StackName BuildModuleTest
throw
}

It "Should build to an output folder with the simple version." {
Assert-MockCalled Remove-Item -ModuleName ModuleBuilder
Assert-MockCalled New-Item -ModuleName ModuleBuilder
}

It "Should update the module version to the simple version." {
Assert-MockCalled Update-Metadata -ModuleName ModuleBuilder -ParameterFilter {
$PropertyName -eq "ModuleVersion" -and $Value -eq $ExpectedVersion
}
}
It "Should update the module pre-release version" {
Assert-MockCalled Update-Metadata -ModuleName ModuleBuilder -ParameterFilter {
$PropertyName -eq "PrivateData.PSData.Prerelease" -and $Value -eq "beta03"
}
}
It "When there are simple release notes, it should insert a line with the module name and full semver" {
Assert-MockCalled Update-Metadata -ModuleName ModuleBuilder -ParameterFilter {
$PropertyName -eq "PrivateData.PSData.ReleaseNotes" -and
$Value -eq "MyModule v$($SemVer.Version)-$($SemVer.Prerelease)+$($SemVer.BuildMetadata)`nFirst Release"
}
}

It "When there's no release notes, it should insert the module name and full semver" {
# If there's no release notes, but it was left uncommented
Mock Get-Metadata { "" } -ModuleName ModuleBuilder

try {
Build-Module @SemVer
} catch {
Pop-Location -StackName BuildModuleTest
throw
}

Assert-MockCalled Update-Metadata -ModuleName ModuleBuilder -ParameterFilter {
$PropertyName -eq "PrivateData.PSData.ReleaseNotes" -and
$Value -eq "MyModule v$($SemVer.Version)-$($SemVer.Prerelease)+$($SemVer.BuildMetadata)"
}
}

It "When there's a prefix empty line, it should insert the module name and full semver the same way" {
# If there's no release notes, but it was left uncommented
Mock Get-Metadata { "
Multi-line Release Notes
With a prefix carriage return" } -ModuleName ModuleBuilder

try {
Build-Module @SemVer
} catch {
Pop-Location -StackName BuildModuleTest
throw
}

Assert-MockCalled Update-Metadata -ModuleName ModuleBuilder -ParameterFilter {
$PropertyName -eq "PrivateData.PSData.ReleaseNotes" -and $Value -eq "
MyModule v$($SemVer.Version)-$($SemVer.Prerelease)+$($SemVer.BuildMetadata)
Multi-line Release Notes
With a prefix carriage return"
}
}

Pop-Location -StackName BuildModuleTest
}
}