Pretty print Export-FormatData XML output (#6691)

Pretty print Export-FormatData XML output by default.
Refactor Export-FormatData tests, remove test duplications.
This commit is contained in:
Ilya
2018-04-24 10:04:42 +05:00
committed by GitHub
parent 942c68e796
commit 313a8596bb
3 changed files with 144 additions and 86 deletions
@@ -41,7 +41,12 @@ namespace Microsoft.PowerShell.Commands
try
{
using (XmlWriter xmlWriter = XmlWriter.Create(streamWriter))
var settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = " ";
settings.NewLineOnAttributes = true;
using (XmlWriter xmlWriter = XmlWriter.Create(streamWriter, settings))
{
var writer = new FormatXmlWriter
{
@@ -1,11 +1,68 @@
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
Describe "Export-FormatData DRT Unit Tests" -Tags "CI" {
It "Test basic functionality" {
Describe "Export-FormatData" -Tags "CI" {
BeforeAll {
$fd = Get-FormatData
$tempFile = Join-Path $TestDrive -ChildPath "exportFormatTest.txt"
$results = Export-FormatData -InputObject $fd[0] -Path $tempFile
$content = Get-Content $tempFile
$testOutput = Join-Path -Path $TestDrive -ChildPath "outputfile"
}
AfterEach {
Remove-Item $testOutput -Force -ErrorAction SilentlyContinue
}
It "Can export all types" {
try
{
$fd | Export-FormatData -path $TESTDRIVE\allformat.ps1xml -IncludeScriptBlock
$sessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault()
$sessionState.Formats.Clear()
$sessionState.Types.Clear()
$runspace = [System.Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace($sessionState)
$runspace.Open()
$runspace.CreatePipeline("Update-FormatData -AppendPath $TESTDRIVE\allformat.ps1xml").Invoke()
$actualAllFormat = $runspace.CreatePipeline("Get-FormatData -TypeName *").Invoke()
$fd.Count | Should -Be $actualAllFormat.Count
Compare-Object $fd $actualAllFormat | Should -Be $null
}
finally
{
$runspace.Close()
Remove-Item -Path $TESTDRIVE\allformat.ps1xml -Force -ErrorAction SilentlyContinue
}
}
It "Works with literal path" {
$filename = 'TestDrive:\[formats.ps1xml'
$fd | Export-FormatData -LiteralPath $filename
(Test-Path -LiteralPath $filename) | Should -BeTrue
}
It "Should overwrite the destination file" {
$filename = 'TestDrive:\ExportFormatDataWithForce.ps1xml'
$unexpected = "SHOULD BE OVERWRITTEN"
$unexpected | Out-File -FilePath $filename -Force
$file = Get-Item $filename
$file.IsReadOnly = $true
$fd | Export-FormatData -Path $filename -Force
$actual = @(Get-Content $filename)[0]
$actual | Should -Not -Be $unexpected
}
It "should not overwrite the destination file with NoClobber" {
$filename = "TestDrive:\ExportFormatDataWithNoClobber.ps1xml"
$fd | Export-FormatData -LiteralPath $filename
{ $fd | Export-FormatData -LiteralPath $filename -NoClobber } | Should -Throw -ErrorId 'NoClobber,Microsoft.PowerShell.Commands.ExportFormatDataCommand'
}
It "Test basic functionality" {
Export-FormatData -InputObject $fd[0] -Path $testOutput
$content = Get-Content $testOutput -Raw
$formatViewDefinition = $fd[0].FormatViewDefinition
$typeName = $fd[0].TypeName
$content.Contains($typeName) | Should -BeTrue
@@ -14,33 +71,86 @@ Describe "Export-FormatData DRT Unit Tests" -Tags "CI" {
$content.Contains($formatViewDefinition[$i].Name) | Should -BeTrue
}
}
}
Describe "Export-FormatData" -Tags "CI" {
$testOutput = Join-Path -Path $TestDrive -ChildPath "outputfile"
AfterEach {
Remove-Item $testOutput -Force -ErrorAction SilentlyContinue
It "Should have a valid xml tag at the start of the file" {
$fd | Export-FormatData -Path $testOutput
$piped = Get-Content $testOutput -Raw
$piped[0] | Should -BeExactly "<"
}
Context "Check Export-FormatData can be called validly." {
It "Should be able to be called without error" {
{ Get-FormatData | Export-FormatData -Path $testOutput } | Should -Not -Throw
}
}
It "Should pretty print xml output" {
$xmlContent=@"
<Configuration>
<ViewDefinitions>
<View>
<Name>ExportFormatDataName</Name>
<ViewSelectedBy>
<TypeName>ExportFormatDataTypeName</TypeName>
</ViewSelectedBy>
<TableControl>
<TableHeaders />
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<TableColumnItem>
<PropertyName>Guid</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
</ViewDefinitions>
</Configuration>
"@
$expected = @"
<?xml version="1.0" encoding="utf-8"?>
<Configuration>
<ViewDefinitions>
<View>
<Name>ExportFormatDataName</Name>
<ViewSelectedBy>
<TypeName>ExportFormatDataTypeName</TypeName>
</ViewSelectedBy>
<TableControl>
<TableHeaders />
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<TableColumnItem>
<PropertyName>Guid</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
</ViewDefinitions>
</Configuration>
"@ -replace "`r`n?|`n", ""
try
{
$testfilename = [guid]::NewGuid().ToString('N')
$testfile = Join-Path -Path $TestDrive -ChildPath "$testfilename.ps1xml"
Set-Content -Path $testfile -Value $xmlContent
Context "Check that the output is in the correct format" {
It "Should not return an empty xml file" {
Get-FormatData | Export-FormatData -Path $testOutput
$piped = Get-Content $testOutput
$piped | Should -Not -BeNullOrEmpty
}
$sessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault()
$sessionState.Formats.Clear()
$sessionState.Types.Clear()
It "Should have a valid xml tag at the start of the file" {
Get-FormatData | Export-FormatData -Path $testOutput
$piped = Get-Content $testOutput
$piped[0] | Should -BeExactly "<"
}
$runspace = [System.Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace($sessionState)
$runspace.Open()
$runspace.CreatePipeline("Update-FormatData -prependPath $testfile").Invoke()
$runspace.CreatePipeline("Get-FormatData -TypeName 'ExportFormatDataTypeName' | Export-FormatData -Path $testOutput").Invoke()
$content = (Get-Content $testOutput -Raw) -replace "`r`n?|`n", ""
$content | Should -BeExactly $expected
}
finally
{
$runspace.Close()
}
}
}
@@ -1,57 +0,0 @@
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
Describe "FormatData" -tags "Feature" {
Context "Export" {
It "can export all types" {
try
{
$expectAllFormat = Get-FormatData -typename *
$expectAllFormat | Export-FormatData -path $TESTDRIVE\allformat.ps1xml -IncludeScriptBlock
$sessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault()
$sessionState.Formats.Clear()
$sessionState.Types.Clear()
$runspace = [System.Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace($sessionState)
$runspace.Open()
$runspace.CreatePipeline("Update-FormatData -AppendPath $TESTDRIVE\allformat.ps1xml").Invoke()
$actualAllFormat = $runspace.CreatePipeline("Get-FormatData -TypeName *").Invoke()
$expectAllFormat.Count | Should -Be $actualAllFormat.Count
Compare-Object $expectAllFormat $actualAllFormat | Should -Be $null
$runspace.Close()
}
finally
{
Remove-Item -Path $TESTDRIVE\allformat.ps1xml -Force -ErrorAction SilentlyContinue
}
}
It "works with literal path" {
$filename = 'TestDrive:\[formats.ps1xml'
Get-FormatData -TypeName * | Export-FormatData -LiteralPath $filename
(Test-Path -LiteralPath $filename) | Should -BeTrue
}
It "should overwrite the destination file" {
$filename = 'TestDrive:\ExportFormatDataWithForce.ps1xml'
$unexpected = "SHOULD BE OVERWRITTEN"
$unexpected | Out-File -FilePath $filename -Force
$file = Get-Item $filename
$file.IsReadOnly = $true
Get-FormatData -TypeName * | Export-FormatData -Path $filename -Force
$actual = @(Get-Content $filename)[0]
$actual | Should -Not -Be $unexpected
}
It "should not overwrite the destination file with NoClobber" {
$filename = "TestDrive:\ExportFormatDataWithNoClobber.ps1xml"
Get-FormatData -TypeName * | Export-FormatData -LiteralPath $filename
{ Get-FormatData -TypeName * | Export-FormatData -LiteralPath $filename -NoClobber } | Should -Throw -ErrorId 'NoClobber,Microsoft.PowerShell.Commands.ExportFormatDataCommand'
}
}
}