diff --git a/.gitignore b/.gitignore index 84a681bb..7a4ebe0b 100644 --- a/.gitignore +++ b/.gitignore @@ -60,7 +60,6 @@ test.xlsx testCCFMT.ps1 testHide.ps1 ImportExcel.zip -.vscode/launch.json .vscode/settings.json ~$* diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..2d3f445f --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,56 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "PowerShell", + "request": "launch", + "name": "PowerShell Pester Tests", + "script": "Import-Module -Name '.\\' -Force ; Invoke-Pester", // Change to '.\\ModuleName.psd1' if Git name different + "args": [""], + "cwd": "${workspaceFolder}" + }, + { + "type": "PowerShell", + "request": "launch", + "name": "PowerShell Launch Current File", + "script": "${file}", + "args": [], + "cwd": "${file}" + }, + { + "type": "PowerShell", + "request": "launch", + "name": "PowerShell Launch Current File in Temporary Console", + "script": "${file}", + "args": [], + "cwd": "${file}", + "createTemporaryIntegratedConsole": true + }, + { + "type": "PowerShell", + "request": "launch", + "name": "PowerShell Launch Current File w/Args Prompt", + "script": "${file}", + "args": [ + "${command:SpecifyScriptArgs}" + ], + "cwd": "${file}" + }, + { + "type": "PowerShell", + "request": "attach", + "name": "PowerShell Attach to Host Process", + "processId": "${command:PickPSHostProcess}", + "runspaceId": 1 + }, + { + "type": "PowerShell", + "request": "launch", + "name": "PowerShell Interactive Session", + "cwd": "" + } + ] +} \ No newline at end of file diff --git a/compare-worksheet.ps1 b/Compare-WorkSheet.ps1 similarity index 100% rename from compare-worksheet.ps1 rename to Compare-WorkSheet.ps1 diff --git a/DoTests.ps1 b/DoTests.ps1 deleted file mode 100644 index c55ff583..00000000 --- a/DoTests.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -param( - [Switch]$DontCreateZip -) - -## -# Used in Appveyor.yml -## - -$PSVersionTable.PSVersion - -## Create the zip before the tests run -## Otherwise the EPPlus.dll is in use after the Pester run -$ModuleVersion = (Invoke-Command -ScriptBlock ([scriptblock]::Create((Get-Content -Raw .\ImportExcel.psd1)))).moduleVersion - -if (!$DontCreateZip) { - $dest = "ImportExcel-{0}-{1}.zip" -f $ModuleVersion, (Get-Date).ToString("yyyyMMddHHmmss") - Compress-Archive -Path . -DestinationPath .\$dest -} - -if ($null -eq (Get-Module -ListAvailable pester)) { - Install-Module -Name Pester -Repository PSGallery -Force -Scope CurrentUser -} - -$result = Invoke-Pester -Script $PSScriptRoot\__tests__ -Verbose -PassThru - -if ($result.FailedCount -gt 0) { - throw "$($result.FailedCount) tests failed." -} \ No newline at end of file diff --git a/Examples/TryMultiplePivotTablesFromOneSheet.ps1 b/Examples/TryMultiplePivotTablesFromOneSheet.ps1 index 3993ebcf..1533a785 100644 --- a/Examples/TryMultiplePivotTablesFromOneSheet.ps1 +++ b/Examples/TryMultiplePivotTablesFromOneSheet.ps1 @@ -1,4 +1,4 @@ -Import-Module ..\ImportExcel.psd1 -Force +try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {} $file = "C:\Temp\test.xlsx" diff --git a/Export-StocksToExcel.ps1 b/Export-StocksToExcel.ps1 index bf3672fa..4785e0b7 100644 --- a/Export-StocksToExcel.ps1 +++ b/Export-StocksToExcel.ps1 @@ -5,7 +5,7 @@ $measure = "Open" ) - $xl = "$env:TEMP\Stocks.xlsx" + $xl = Join-Path ([IO.Path]::GetTempPath()) 'Stocks.xlsx' Remove-Item $xl -ErrorAction SilentlyContinue diff --git a/ImportExcel.psm1 b/ImportExcel.psm1 index 4bdbb55e..fcb5081c 100644 --- a/ImportExcel.psm1 +++ b/ImportExcel.psm1 @@ -4,8 +4,8 @@ Add-Type -Path "$($PSScriptRoot)\EPPlus.dll" . $PSScriptRoot\AddDataValidation.ps1 . $PSScriptRoot\Charting.ps1 . $PSScriptRoot\ColorCompletion.ps1 +. $PSScriptRoot\Compare-WorkSheet.ps1 . $PSScriptRoot\ConvertExcelToImageFile.ps1 -. $PSScriptRoot\compare-workSheet.ps1 . $PSScriptRoot\ConvertFromExcelData.ps1 . $PSScriptRoot\ConvertFromExcelToSQLInsert.ps1 . $PSScriptRoot\ConvertToExcelXlsx.ps1 @@ -23,7 +23,7 @@ Add-Type -Path "$($PSScriptRoot)\EPPlus.dll" . $PSScriptRoot\InferData.ps1 . $PSScriptRoot\Invoke-Sum.ps1 . $PSScriptRoot\Join-Worksheet.ps1 -. $PSScriptRoot\Merge-worksheet.ps1 +. $PSScriptRoot\Merge-Worksheet.ps1 . $PSScriptRoot\New-ConditionalFormattingIconSet.ps1 . $PSScriptRoot\New-ConditionalText.ps1 . $PSScriptRoot\New-ExcelChart.ps1 @@ -31,8 +31,9 @@ Add-Type -Path "$($PSScriptRoot)\EPPlus.dll" . $PSScriptRoot\Open-ExcelPackage.ps1 . $PSScriptRoot\Pivot.ps1 . $PSScriptRoot\PivotTable.ps1 +#. $PSScriptRoot\Plot.ps1 . $PSScriptRoot\RemoveWorksheet.ps1 -. $PSScriptRoot\Send-SqlDataToExcel.ps1 +. $PSScriptRoot\Send-SQLDataToExcel.ps1 . $PSScriptRoot\Set-CellStyle.ps1 . $PSScriptRoot\Set-Column.ps1 . $PSScriptRoot\Set-Row.ps1 @@ -45,7 +46,7 @@ Add-Type -Path "$($PSScriptRoot)\EPPlus.dll" New-Alias -Name Use-ExcelData -Value "ConvertFrom-ExcelData" -Force if ($PSVersionTable.PSVersion.Major -ge 5) { - . $PSScriptRoot\plot.ps1 + . $PSScriptRoot\Plot.ps1 Function New-Plot { [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification = 'New-Plot does not change system state')] @@ -59,6 +60,25 @@ else { Write-Warning 'PowerShell 5 is required for plot.ps1' Write-Warning 'PowerShell Excel is ready, except for that functionality' } +if ($IsLinux -or $IsMacOS) { + $ExcelPackage = [OfficeOpenXml.ExcelPackage]::new() + $Cells = ($ExcelPackage | Add-WorkSheet).Cells['A1'] + $Cells.Value = 'Test' + try { + $Cells.AutoFitColumns() + } + catch { + if ($IsLinux) { + Write-Warning -Message 'ImportExcel Module Cannot Autosize. Please run the following command to install dependencies: "sudo apt-get install -y --no-install-recommends libgdiplus libc6-dev"' + } + if ($IsMacOS) { + Write-Warning -Message 'ImportExcel Module Cannot Autosize. Please run the following command to install dependencies: "brew install mono-libgdiplus"' + } + } + finally { + $ExcelPackage | Close-ExcelPackage -NoSave + } +} #endregion function Import-Excel { <# diff --git a/Install.ps1 b/Install.ps1 index 6b367dda..ae5e08ad 100644 --- a/Install.ps1 +++ b/Install.ps1 @@ -1,104 +1,213 @@ <# .SYNOPSIS - Download the module files from GitHub. - - .DESCRIPTION - Download the module files from GitHub to the local client in the module folder. + Installs module from Git clone or directly from GitHub. + File must not have BOM for GitHub deploy to work. #> - -[CmdLetBinding()] +[CmdletBinding(DefaultParameterSetName = 'Default')] Param ( + # Path to install the module to, if not provided -Scope used. + [Parameter(Mandatory, ParameterSetName = 'ModulePath')] [ValidateNotNullOrEmpty()] - [String]$ModuleName = 'ImportExcel', - [String]$InstallDirectory, + [String]$ModulePath, + + # Path to install the module to, PSModulePath "CurrentUser" or "AllUsers", if not provided "CurrentUser" used. + [Parameter(Mandatory, ParameterSetName = 'Scope')] + [ValidateSet('CurrentUser', 'AllUsers')] + [string] + $Scope = 'CurrentUser', + + # Get module from GitHub instead of local Git clone, for example "https://raw.githubusercontent.com/ili101/Module.Template/master/Install.ps1" [ValidateNotNullOrEmpty()] - [String]$GitPath = 'https://raw.github.com/dfinke/ImportExcel/master' + [Uri]$FromGitHub +) +# Set Files and Folders patterns to Include/Exclude. +$IncludeFiles = @( + '*.dll', + '*.psd1', + '*.psm1', + 'AddConditionalFormatting.ps1', + 'AddDataValidation.ps1', + 'Charting.ps1', + 'ColorCompletion.ps1', + 'Compare-WorkSheet.ps1', + 'ConvertExcelToImageFile.ps1', + 'ConvertFromExcelData.ps1', + 'ConvertFromExcelToSQLInsert.ps1', + 'ConvertToExcelXlsx.ps1', + 'Copy-ExcelWorkSheet.ps1', + 'Export-Excel.ps1', + 'Export-ExcelSheet.ps1', + 'Export-StocksToExcel.ps1', + 'Get-ExcelColumnName.ps1', + 'Get-ExcelSheetInfo.ps1', + 'Get-ExcelWorkbookInfo.ps1', + 'Get-HtmlTable.ps1', + 'Get-Range.ps1', + 'Get-XYRange.ps1', + 'Import-Html.ps1', + 'InferData.ps1', + 'Invoke-Sum.ps1', + 'Join-Worksheet.ps1', + 'Merge-Worksheet.ps1', + 'New-ConditionalFormattingIconSet.ps1', + 'New-ConditionalText.ps1', + 'New-ExcelChart.ps1', + 'New-PSItem.ps1', + 'Open-ExcelPackage.ps1', + 'Pivot.ps1', + 'PivotTable.ps1', + 'Plot.ps1', + 'RemoveWorksheet.ps1', + 'Send-SQLDataToExcel.ps1', + 'Set-CellStyle.ps1', + 'Set-Column.ps1', + 'Set-Row.ps1', + 'Set-WorkSheetProtection.ps1', + 'SetFormat.ps1', + 'TrackingUtils.ps1', + 'Update-FirstObjectProperties.ps1' +) +$ExcludeFiles = @( + 'Install.ps1' ) -Begin { - Try { - Write-Verbose "$ModuleName module installation started" - $Files = @( - 'AddConditionalFormatting.ps1', - 'Charting.ps1', - 'ColorCompletion.ps1', - 'ConvertFromExcelData.ps1', - 'ConvertFromExcelToSQLInsert.ps1', - 'ConvertExcelToImageFile.ps1', - 'ConvertToExcelXlsx.ps1', - 'Copy-ExcelWorkSheet.ps1', - 'EPPlus.dll', - 'Export-charts.ps1', - 'Export-Excel.ps1', - 'Export-ExcelSheet.ps1', - 'formatting.ps1', - 'Get-ExcelColumnName.ps1', - 'Get-ExcelSheetInfo.ps1', - 'Get-ExcelWorkbookInfo.ps1', - 'Get-HtmlTable.ps1', - 'Get-Range.ps1', - 'Get-XYRange.ps1', - 'Import-Html.ps1', - 'ImportExcel.psd1', - 'ImportExcel.psm1', - 'InferData.ps1', - 'Invoke-Sum.ps1', - 'New-ConditionalFormattingIconSet.ps1', - 'New-ConditionalText.ps1', - 'New-ExcelChart.ps1', - 'New-PSItem.ps1', - 'Open-ExcelPackage.ps1', - 'Pivot.ps1', - 'plot.ps1', - 'Send-SqlDataToExcel.ps1', - 'Set-CellStyle.ps1', - 'Set-Column.ps1', - 'Set-Row.ps1', - 'SetFormat.ps1', - 'TrackingUtils.ps1', - 'Update-FirstObjectProperties.ps1' - ) +function Invoke-MultiLike { + [alias("LikeAny")] + [CmdletBinding()] + param + ( + $InputObject, + [Parameter(Mandatory)] + [String[]]$Filters, + [Switch]$Not + ) + $FiltersRegex = foreach ($Filter In $Filters) { + $Filter = [regex]::Escape($Filter) + if ($Filter -match "^\\\*") { + $Filter = $Filter.Remove(0, 2) + } + else { + $Filter = '^' + $Filter + } + if ($Filter -match "\\\*$") { + $Filter = $Filter.Substring(0, $Filter.Length - 2) + } + else { + $Filter = $Filter + '$' + } + $Filter + } + if ($Not) { + $InputObject -notmatch ($FiltersRegex -join '|').replace('\*', '.*').replace('\?', '.') } - Catch { - throw "Failed installing the module in the install directory '$InstallDirectory': $_" + else { + $InputObject -match ($FiltersRegex -join '|').replace('\*', '.*').replace('\?', '.') } } -Process { - Try { - if (-not $InstallDirectory) { - Write-Verbose "$ModuleName no installation directory provided" +Try { + Write-Verbose -Message 'Module installation started' - $PersonalModules = Join-Path -Path ([Environment]::GetFolderPath('MyDocuments')) -ChildPath WindowsPowerShell\Modules - - if (($env:PSModulePath -split ';') -notcontains $PersonalModules) { - Write-Warning "$ModuleName personal module path '$PersonalModules' not found in '`$env:PSModulePath'" - } + if (!$ModulePath) { + if ($Scope -eq 'CurrentUser') { + $ModulePathIndex = 0 + } + else { + $ModulePathIndex = 1 + } + if ($IsLinux -or $IsMacOS) { + $ModulePathSeparator = ':' + } + else { + $ModulePathSeparator = ';' + } + $ModulePath = ($env:PSModulePath -split $ModulePathSeparator)[$ModulePathIndex] + } - if (-not (Test-Path $PersonalModules)) { - Write-Error "$ModuleName path '$PersonalModules' does not exist" - } + # Get $ModuleName, $TargetPath, [$Links] + if ($FromGitHub) { + # Fix Could not create SSL/TLS secure channel + #$SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol + #[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 - $InstallDirectory = Join-Path -Path $PersonalModules -ChildPath $ModuleName - Write-Verbose "$ModuleName default installation directory is '$InstallDirectory'" - } + $WebClient = [System.Net.WebClient]::new() + $GitUri = $FromGitHub.AbsolutePath.Split('/')[1, 2] -join '/' + $GitBranch = $FromGitHub.AbsolutePath.Split('/')[3] + $Links = (Invoke-RestMethod -Uri "https://api.github.com/repos/$GitUri/contents" -Body @{ref = $GitBranch }) | Where-Object { (LikeAny $_.name $IncludeFiles) -and (LikeAny $_.name $ExcludeFiles -Not) } - if (-not (Test-Path $InstallDirectory)) { - $null = New-Item -Path $InstallDirectory -ItemType Directory -EA Stop - Write-Verbose "$ModuleName created module folder '$InstallDirectory'" - } + $ModuleName = [System.IO.Path]::GetFileNameWithoutExtension(($Links | Where-Object { $_.name -like '*.psm1' }).name) + $ModuleVersion = (. ([Scriptblock]::Create((Invoke-WebRequest -Uri ($Links | Where-Object { $_.name -eq "$ModuleName.psd1" }).download_url)))).ModuleVersion + } + else { + $ModuleName = [System.IO.Path]::GetFileNameWithoutExtension((Get-ChildItem -File -Filter *.psm1 -Name -Path $PSScriptRoot)) + $ModuleVersion = (. ([Scriptblock]::Create((Get-Content -Path (Join-Path $PSScriptRoot "$ModuleName.psd1") | Out-String)))).ModuleVersion + } + $TargetPath = Join-Path -Path $ModulePath -ChildPath $ModuleName + $TargetPath = Join-Path -Path $TargetPath -ChildPath $ModuleVersion - $WebClient = New-Object System.Net.WebClient + # Create Directory + if (-not (Test-Path -Path $TargetPath)) { + $null = New-Item -Path $TargetPath -ItemType Directory -ErrorAction Stop + Write-Verbose -Message ('Created module folder: "{0}"' -f $TargetPath) + } - $Files | ForEach-Object { - $WebClient.DownloadFile("$GitPath/$_","$installDirectory\$_") - Write-Verbose "$ModuleName installed module file '$_'" + # Copy Files + if ($FromGitHub) { + foreach ($Link in $Links) { + $TargetPathItem = Join-Path -Path $TargetPath -ChildPath $Link.name + if ($Link.type -ne 'dir') { + $WebClient.DownloadFile($Link.download_url, $TargetPathItem) + Write-Verbose -Message ('Installed module file: "{0}"' -f $Link.name) + } + else { + if (-not (Test-Path -Path $TargetPathItem)) { + $null = New-Item -Path $TargetPathItem -ItemType Directory -ErrorAction Stop + Write-Verbose -Message 'Created module folder: "{0}"' -f $TargetPathItem + } + $SubLinks = (Invoke-RestMethod -Uri $Link.git_url -Body @{recursive = '1' }).tree + foreach ($SubLink in $SubLinks) { + $TargetPathSub = Join-Path -Path $TargetPathItem -ChildPath $SubLink.path + if ($SubLink.'type' -EQ 'tree') { + if (-not (Test-Path -Path $TargetPathSub)) { + $null = New-Item -Path $TargetPathSub -ItemType Directory -ErrorAction Stop + Write-Verbose -Message 'Created module folder: "{0}"' -f $TargetPathSub + } + } + else { + $WebClient.DownloadFile( + ('https://raw.githubusercontent.com/{0}/{1}/{2}/{3}' -f $GitUri, $GitBranch, $Link.name, $SubLink.path), + $TargetPathSub + ) + } + } + } } - - Write-Verbose "$ModuleName module installation successful" } - Catch { - throw "Failed installing the module in the install directory '$InstallDirectory': $_" + else { + Get-ChildItem -Path $PSScriptRoot -Exclude $ExcludeFiles | Where-Object { LikeAny $_.Name $IncludeFiles } | ForEach-Object { + if ($_.Attributes -ne 'Directory') { + Copy-Item -Path $_ -Destination $TargetPath + Write-Verbose -Message ('Installed module file "{0}"' -f $_) + } + else { + Copy-Item -Path $_ -Destination $TargetPath -Recurse -Force + Write-Verbose -Message ('Installed module folder "{0}"' -f $_) + } + } } + + # Import Module + Write-Verbose -Message "$ModuleName module installation successful to $TargetPath" + Import-Module -Name $ModuleName -Force + Write-Verbose -Message "Module installed" +} +Catch { + throw ('Failed installing module "{0}". Error: "{1}" in Line {2}' -f $ModuleName, $_, $_.InvocationInfo.ScriptLineNumber) +} +finally { + #if ($FromGitHub) { + # [Net.ServicePointManager]::SecurityProtocol = $SecurityProtocol + #} + Write-Verbose -Message 'Module installation end' } \ No newline at end of file diff --git a/InstallModule.ps1 b/InstallModule.ps1 deleted file mode 100644 index 1b788527..00000000 --- a/InstallModule.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -$fullPath = 'C:\Program Files\WindowsPowerShell\Modules\ImportExcel' - -Robocopy . $fullPath /mir /XD .vscode .git examples testimonials images spikes /XF appveyor.yml .gitattributes .gitignore \ No newline at end of file diff --git a/Merge-worksheet.ps1 b/Merge-Worksheet.ps1 similarity index 100% rename from Merge-worksheet.ps1 rename to Merge-Worksheet.ps1 diff --git a/plot.ps1 b/Plot.ps1 similarity index 100% rename from plot.ps1 rename to Plot.ps1 diff --git a/PublishToGallery.ps1 b/PublishToGallery.ps1 deleted file mode 100644 index cc352c2f..00000000 --- a/PublishToGallery.ps1 +++ /dev/null @@ -1,7 +0,0 @@ -$p = @{ - Name = "ImportExcel" - NuGetApiKey = $NuGetApiKey - ReleaseNote = "Add NumberFormat parameter" -} - -Publish-Module @p \ No newline at end of file diff --git a/README.md b/README.md index 4261f31b..3aa3ed2d 100644 --- a/README.md +++ b/README.md @@ -15,11 +15,13 @@ If this project helped you reduce the time to get your job done, let me know.

-|CI System |OS|Status| -|---|---|---| -|Azure DevOps|Windows|[![Build status](https://dougfinke.visualstudio.com/ImportExcel/_apis/build/status/ImportExcel-CI)](https://dougfinke.visualstudio.com/ImportExcel/_build/latest?definitionId=10)| -|Azure DevOps|Windows, Linux, Mac|[![Build Status](https://dougfinke.visualstudio.com/ImportExcel/_apis/build/status/dfinke.ImportExcel?branchName=master)](https://dougfinke.visualstudio.com/ImportExcel/_build/latest?definitionId=20&branchName=master)| -|Appveyor|Windows|[![Build Status](https://ci.appveyor.com/api/projects/status/21hko6eqtpccrkba/branch/master?svg=true)](https://ci.appveyor.com/project/dfinke/importexcel/branch/master)| +| CI System | Environment | Status | +|--------------|-------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| AppVeyor | Windows, Core preview, Ubuntu | [![Build status](https://ci.appveyor.com/api/projects/status/7c0s1g5rgdx1bbts/branch/Tests?svg=true)](https://ci.appveyor.com/project/ili101/Module-Template) | +| Azure DevOps | Windows | [![Build Status](https://dev.azure.com/ili101/ImportExcel/_apis/build/status/ili101.ImportExcel?branchName=Tests&jobName=Windows)](https://dev.azure.com/ili101/ImportExcel/_build/latest?definitionId=1&branchName=Tests) | +| Azure DevOps | Windows (Core) | [![Build Status](https://dev.azure.com/ili101/ImportExcel/_apis/build/status/ili101.ImportExcel?branchName=Tests&jobName=WindowsPSCore)](https://dev.azure.com/ili101/ImportExcel/_build/latest?definitionId=1&branchName=Tests) | +| Azure DevOps | Ubuntu | [![Build Status](https://dev.azure.com/ili101/ImportExcel/_apis/build/status/ili101.ImportExcel?branchName=Tests&jobName=Ubuntu)](https://dev.azure.com/ili101/ImportExcel/_build/latest?definitionId=1&branchName=Tests) | +| Azure DevOps | macOS | [![Build Status](https://dev.azure.com/ili101/ImportExcel/_apis/build/status/ili101.ImportExcel?branchName=Tests&jobName=macOS)](https://dev.azure.com/ili101/ImportExcel/_build/latest?definitionId=1&branchName=Tests) | diff --git a/Send-SqlDataToExcel.ps1 b/Send-SQLDataToExcel.ps1 similarity index 100% rename from Send-SqlDataToExcel.ps1 rename to Send-SQLDataToExcel.ps1 diff --git a/__tests__/AddTrendlinesToAChart.tests.ps1 b/__tests__/AddTrendlinesToAChart.tests.ps1 index 18bf7e4c..5891fc2b 100644 --- a/__tests__/AddTrendlinesToAChart.tests.ps1 +++ b/__tests__/AddTrendlinesToAChart.tests.ps1 @@ -1,7 +1,4 @@ -Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force -if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" } -$notWindows = ($PSVersionTable.os -and $PSVersionTable.os -notMatch 'Windows' ) -Describe "Test adding trendlines to charts" { +Describe "Test adding trendlines to charts" { BeforeAll { $script:data = ConvertFrom-Csv @" Region,Item,TotalSold @@ -20,7 +17,7 @@ South,avocado,73 } BeforeEach { - $xlfile = "$env:TEMP\trendLine.xlsx" + $xlfile = "TestDrive:\trendLine.xlsx" Remove-Item $xlfile -ErrorAction SilentlyContinue } diff --git a/__tests__/CI.ps1 b/__tests__/CI.ps1 new file mode 100644 index 00000000..55e90a5d --- /dev/null +++ b/__tests__/CI.ps1 @@ -0,0 +1,132 @@ +<# + .SYNOPSIS + Handel Continuous Integration Testing in AppVeyor and Azure DevOps Pipelines. +#> +param +( + # AppVeyor Only - Update AppVeyor build name. + [Switch]$Initialize, + # Installs the module and invoke the Pester tests with the current version of PowerShell. + [Switch]$Test, + # AppVeyor Only - Upload results to AppVeyor "Tests" tab. + [Switch]$Finalize, + # AppVeyor and Azure - Upload module as AppVeyor Artifact. + [Switch]$Artifact +) +$ErrorActionPreference = 'Stop' +if ($Initialize) { + $Psd1 = (Get-ChildItem -File -Filter *.psd1 -Name -Path (Split-Path $PSScriptRoot)).PSPath + $ModuleVersion = (. ([Scriptblock]::Create((Get-Content -Path $Psd1 | Out-String)))).ModuleVersion + Update-AppveyorBuild -Version "$ModuleVersion ($env:APPVEYOR_BUILD_NUMBER) $env:APPVEYOR_REPO_BRANCH" +} +if ($Test) { + function Get-EnvironmentInfo { + if ($null -eq $IsWindows -or $IsWindows) { + # Get Windows Version + try { + $WinRelease, $WinVer = Get-ItemPropertyValue "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" ReleaseId, CurrentMajorVersionNumber, CurrentMinorVersionNumber, CurrentBuildNumber, UBR + $WindowsVersion = "$($WinVer -join '.') ($WinRelease)" + } + catch { + $WindowsVersion = [System.Environment]::OSVersion.Version + } + + # Get .Net Version + # https://stackoverflow.com/questions/3487265/powershell-script-to-return-versions-of-net-framework-on-a-machine + $Lookup = @{ + 378389 = [version]'4.5' + 378675 = [version]'4.5.1' + 378758 = [version]'4.5.1' + 379893 = [version]'4.5.2' + 393295 = [version]'4.6' + 393297 = [version]'4.6' + 394254 = [version]'4.6.1' + 394271 = [version]'4.6.1' + 394802 = [version]'4.6.2' + 394806 = [version]'4.6.2' + 460798 = [version]'4.7' + 460805 = [version]'4.7' + 461308 = [version]'4.7.1' + 461310 = [version]'4.7.1' + 461808 = [version]'4.7.2' + 461814 = [version]'4.7.2' + 528040 = [version]'4.8' + 528049 = [version]'4.8' + } + + # For One True framework (latest .NET 4x), change the Where-Object match + # to PSChildName -eq "Full": + $DotNetVersion = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | + Get-ItemProperty -name Version, Release -EA 0 | + Where-Object { $_.PSChildName -eq "Full" } | + Select-Object @{name = ".NET Framework"; expression = { $_.PSChildName } }, + @{name = "Product"; expression = { $Lookup[$_.Release] } }, + Version, Release + + # Output + [PSCustomObject]($PSVersionTable + @{ + ComputerName = $env:Computername + WindowsVersion = $WindowsVersion + '.Net Version' = '{0} (Version: {1}, Release: {2})' -f $DotNetVersion.Product, $DotNetVersion.Version, $DotNetVersion.Release + #EnvironmentPath = $env:Path + }) + } + else { + # Output + [PSCustomObject]($PSVersionTable + @{ + ComputerName = $env:Computername + #EnvironmentPath = $env:Path + }) + } + } + + '[Info] Testing On:' + Get-EnvironmentInfo + '[Progress] Installing Module.' + . .\Install.ps1 + '[Progress] Invoking Pester.' + Invoke-Pester -OutputFile ('TestResultsPS{0}.xml' -f $PSVersionTable.PSVersion) +} +if ($Finalize) { + '[Progress] Finalizing.' + $Failure = $false + $AppVeyorResultsUri = 'https://ci.appveyor.com/api/testresults/nunit/{0}' -f $env:APPVEYOR_JOB_ID + foreach ($TestResultsFile in Get-ChildItem -Path 'TestResultsPS*.xml') { + $TestResultsFilePath = $TestResultsFile.FullName + "[Info] Uploading Files: $AppVeyorResultsUri, $TestResultsFilePath." + # Add PowerShell version to test results + $PSVersion = $TestResultsFile.Name.Replace('TestResults', '').Replace('.xml', '') + [Xml]$Xml = Get-Content -Path $TestResultsFilePath + Select-Xml -Xml $Xml -XPath '//test-case' | ForEach-Object { $_.Node.name = "$PSVersion " + $_.Node.name } + $Xml.OuterXml | Out-File -FilePath $TestResultsFilePath + + #Invoke-RestMethod -Method Post -Uri $AppVeyorResultsUri -Body $Xml + [Net.WebClient]::new().UploadFile($AppVeyorResultsUri, $TestResultsFilePath) + + if ($Xml.'test-results'.failures -ne '0') { + $Failure = $true + } + } + if ($Failure) { + throw 'Tests failed.' + } +} +if ($Artifact) { + # Get Module Info + $ModuleName = [System.IO.Path]::GetFileNameWithoutExtension((Get-ChildItem -File -Filter *.psm1 -Name -Path (Split-Path $PSScriptRoot))) + $ModulePath = (Get-Module -Name $ModuleName -ListAvailable).ModuleBase | Split-Path + $VersionLocal = ((Get-Module -Name $ModuleName -ListAvailable).Version | Measure-Object -Maximum).Maximum + "[Progress] Artifact Start for Module: $ModuleName, Version: $VersionLocal." + if ($env:APPVEYOR) { + $ZipFileName = "{0} {1} {2} {3:yyyy-MM-dd HH-mm-ss}.zip" -f $ModuleName, $VersionLocal, $env:APPVEYOR_REPO_BRANCH, (Get-Date) + $ZipFileFullPath = Join-Path -Path $PSScriptRoot -ChildPath $ZipFileName + "[Info] Artifact. $ModuleName, ZipFileName: $ZipFileName." + #Compress-Archive -Path $ModulePath -DestinationPath $ZipFileFullPath + [System.IO.Compression.ZipFile]::CreateFromDirectory($ModulePath, $ZipFileFullPath, [System.IO.Compression.CompressionLevel]::Optimal, $true) + Push-AppveyorArtifact $ZipFileFullPath -DeploymentName $ModuleName + } + elseif ($env:AGENT_NAME) { + #Write-Host "##vso[task.setvariable variable=ModuleName]$ModuleName" + Copy-Item -Path $ModulePath -Destination $env:Build_ArtifactStagingDirectory -Recurse + } +} \ No newline at end of file diff --git a/__tests__/Compare-WorkSheet.tests.ps1 b/__tests__/Compare-WorkSheet.tests.ps1 index e3c300e5..d94d29d6 100644 --- a/__tests__/Compare-WorkSheet.tests.ps1 +++ b/__tests__/Compare-WorkSheet.tests.ps1 @@ -1,28 +1,32 @@ #Requires -Modules Pester -if ($PSVersionTable.os -and $PSVersionTable.os -notMatch 'Windows' ) {return} #Currently this test outputs windows services so only run on Windows. -if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() } -Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force -if ($PSVersionTable.PSVersion.Major -gt 5) { Write-Warning "Can't test grid view on V6 and later" } -else {Add-Type -AssemblyName System.Windows.Forms } +#Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force + Describe "Compare Worksheet" { - Context "Simple comparison output" { - BeforeAll { - Remove-Item -Path "$env:temp\server*.xlsx" - [System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property Name, RequiredServices, CanPauseAndContinue, CanShutdown, CanStop, DisplayName, DependentServices, MachineName - $s | Export-Excel -Path $env:temp\server1.xlsx - #$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s - $row4Displayname = $s[2].DisplayName - $s[2].DisplayName = "Changed from the orginal" - $d = $s[-1] | Select-Object -Property * - $d.DisplayName = "Dummy Service" - $d.Name = "Dummy" - $s.Insert(3,$d) - $row6Name = $s[5].name - $s.RemoveAt(5) - $s | Export-Excel -Path $env:temp\server2.xlsx - #Assume default worksheet name, (sheet1) and column header for key ("name") - $comp = compare-WorkSheet "$env:temp\server1.xlsx" "$env:temp\server2.xlsx" | Sort-Object -Property _row, _file + BeforeAll { + if ($PSVersionTable.PSVersion.Major -gt 5) { + It "GridView Support" { + Set-ItResult -Pending -Because "Can't test grid view on V6 and later" + } } + else { Add-Type -AssemblyName System.Windows.Forms } + . "$PSScriptRoot\Samples\Samples.ps1" + Remove-Item -Path "TestDrive:\server*.xlsx" + [System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property Name, RequiredServices, CanPauseAndContinue, CanShutdown, CanStop, DisplayName, DependentServices, MachineName + $s | Export-Excel -Path TestDrive:\server1.xlsx + #$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s + $row4Displayname = $s[2].DisplayName + $s[2].DisplayName = "Changed from the orginal" + $d = $s[-1] | Select-Object -Property * + $d.DisplayName = "Dummy Service" + $d.Name = "Dummy" + $s.Insert(3,$d) + $row6Name = $s[5].name + $s.RemoveAt(5) + $s | Export-Excel -Path TestDrive:\server2.xlsx + #Assume default worksheet name, (sheet1) and column header for key ("name") + $comp = compare-WorkSheet "TestDrive:\server1.xlsx" "TestDrive:\server2.xlsx" | Sort-Object -Property _row, _file + } + Context "Simple comparison output" { it "Found the right number of differences " { $comp | should not beNullOrEmpty $comp.Count | should be 4 @@ -57,13 +61,13 @@ Describe "Compare Worksheet" { $ModulePath = (Get-Command -Name 'Compare-WorkSheet').Module.Path $PowerShellExec = if ($PSEdition -eq 'Core') {'pwsh.exe'} else {'powershell.exe'} $PowerShellPath = Join-Path -Path $PSHOME -ChildPath $PowerShellExec - . $PowerShellPath -Command ("Import-Module $ModulePath; " + '$null = Compare-WorkSheet "$env:temp\server1.xlsx" "$env:temp\server2.xlsx" -BackgroundColor ([System.Drawing.Color]::LightGreen) -GridView; Start-Sleep -sec 5') + . $PowerShellPath -Command ('Import-Module {0}; $null = Compare-WorkSheet "{1}server1.xlsx" "{1}server2.xlsx" -BackgroundColor ([System.Drawing.Color]::LightGreen) -GridView; Start-Sleep -sec 5' -f $ModulePath, (Resolve-Path 'TestDrive:').ProviderPath) } else { - $null = Compare-WorkSheet "$env:temp\server1.xlsx" "$env:temp\server2.xlsx" -BackgroundColor ([System.Drawing.Color]::LightGreen) -GridView:$useGrid + $null = Compare-WorkSheet "TestDrive:\server1.xlsx" "TestDrive:\server2.xlsx" -BackgroundColor ([System.Drawing.Color]::LightGreen) -GridView:$useGrid } - $xl1 = Open-ExcelPackage -Path "$env:temp\server1.xlsx" - $xl2 = Open-ExcelPackage -Path "$env:temp\server2.xlsx" + $xl1 = Open-ExcelPackage -Path "TestDrive:\server1.xlsx" + $xl2 = Open-ExcelPackage -Path "TestDrive:\server2.xlsx" $s1Sheet = $xl1.Workbook.Worksheets[1] $s2Sheet = $xl2.Workbook.Worksheets[1] } @@ -87,9 +91,9 @@ Describe "Compare Worksheet" { Context "Setting the forgound to highlight changed properties" { BeforeAll { - $null = compare-WorkSheet "$env:temp\server1.xlsx" "$env:temp\server2.xlsx" -AllDataBackgroundColor([System.Drawing.Color]::white) -BackgroundColor ([System.Drawing.Color]::LightGreen) -FontColor ([System.Drawing.Color]::DarkRed) - $xl1 = Open-ExcelPackage -Path "$env:temp\server1.xlsx" - $xl2 = Open-ExcelPackage -Path "$env:temp\server2.xlsx" + $null = compare-WorkSheet "TestDrive:\server1.xlsx" "TestDrive:\server2.xlsx" -AllDataBackgroundColor([System.Drawing.Color]::white) -BackgroundColor ([System.Drawing.Color]::LightGreen) -FontColor ([System.Drawing.Color]::DarkRed) + $xl1 = Open-ExcelPackage -Path "TestDrive:\server1.xlsx" + $xl2 = Open-ExcelPackage -Path "TestDrive:\server2.xlsx" $s1Sheet = $xl1.Workbook.Worksheets[1] $s2Sheet = $xl2.Workbook.Worksheets[1] } @@ -118,7 +122,7 @@ Describe "Compare Worksheet" { BeforeAll { [System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property RequiredServices, CanPauseAndContinue, CanShutdown, CanStop, DisplayName, DependentServices, MachineName, ServiceName, ServicesDependedOn, ServiceHandle, Status, ServiceType, StartType -ExcludeProperty Name - $s | Export-Excel -Path $env:temp\server1.xlsx -WorkSheetname Server1 + $s | Export-Excel -Path TestDrive:\server1.xlsx -WorkSheetname server1 #$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s $row4Displayname = $s[2].DisplayName $s[2].DisplayName = "Changed from the orginal" @@ -130,11 +134,11 @@ Describe "Compare Worksheet" { $s.RemoveAt(5) $s[10].ServiceType = "Changed should not matter" - $s | Select-Object -Property ServiceName, DisplayName, StartType, ServiceType | Export-Excel -Path $env:temp\server2.xlsx -WorkSheetname server2 + $s | Select-Object -Property ServiceName, DisplayName, StartType, ServiceType | Export-Excel -Path TestDrive:\server2.xlsx -WorkSheetname server2 #Assume default worksheet name, (sheet1) and column header for key ("name") - $comp = compare-WorkSheet "$env:temp\server1.xlsx" "$env:temp\server2.xlsx" -WorkSheetName Server1,Server2 -Key ServiceName -Property DisplayName,StartType -AllDataBackgroundColor ([System.Drawing.Color]::AliceBlue) -BackgroundColor ([System.Drawing.Color]::White) -FontColor ([System.Drawing.Color]::Red) | Sort-Object _row,_file - $xl1 = Open-ExcelPackage -Path "$env:temp\server1.xlsx" - $xl2 = Open-ExcelPackage -Path "$env:temp\server2.xlsx" + $comp = compare-WorkSheet "TestDrive:\server1.xlsx" "TestDrive:\server2.xlsx" -WorkSheetName server1,server2 -Key ServiceName -Property DisplayName,StartType -AllDataBackgroundColor ([System.Drawing.Color]::AliceBlue) -BackgroundColor ([System.Drawing.Color]::White) -FontColor ([System.Drawing.Color]::Red) | Sort-Object _row,_file + $xl1 = Open-ExcelPackage -Path "TestDrive:\server1.xlsx" + $xl2 = Open-ExcelPackage -Path "TestDrive:\server2.xlsx" $s1Sheet = $xl1.Workbook.Worksheets["server1"] $s2Sheet = $xl2.Workbook.Worksheets["server2"] } @@ -188,36 +192,36 @@ Describe "Compare Worksheet" { } Describe "Merge Worksheet" { - Context "Merge with 3 properties" { - BeforeAll { - Remove-Item -Path "$env:temp\server*.xlsx" , "$env:temp\combined*.xlsx" -ErrorAction SilentlyContinue - [System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property * + BeforeAll { + Remove-Item -Path "TestDrive:\server*.xlsx" , "TestDrive:\combined*.xlsx" -ErrorAction SilentlyContinue + [System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property * - $s | Export-Excel -Path $env:temp\server1.xlsx + $s | Export-Excel -Path TestDrive:\server1.xlsx - #$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s - $s[2].DisplayName = "Changed from the orginal" + #$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s + $s[2].DisplayName = "Changed from the orginal" - $d = $s[-1] | Select-Object -Property * - $d.DisplayName = "Dummy Service" - $d.Name = "Dummy" - $s.Insert(3,$d) + $d = $s[-1] | Select-Object -Property * + $d.DisplayName = "Dummy Service" + $d.Name = "Dummy" + $s.Insert(3,$d) - $s.RemoveAt(5) + $s.RemoveAt(5) - $s | Export-Excel -Path $env:temp\server2.xlsx - #Assume default worksheet name, (sheet1) and column header for key ("name") - Merge-Worksheet -Referencefile "$env:temp\server1.xlsx" -Differencefile "$env:temp\server2.xlsx" -OutputFile "$env:temp\combined1.xlsx" -Property name,displayname,startType -Key name - $excel = Open-ExcelPackage -Path "$env:temp\combined1.xlsx" - $ws = $excel.Workbook.Worksheets["sheet1"] - } + $s | Export-Excel -Path TestDrive:\server2.xlsx + #Assume default worksheet name, (sheet1) and column header for key ("name") + Merge-Worksheet -Referencefile "TestDrive:\server1.xlsx" -Differencefile "TestDrive:\server2.xlsx" -OutputFile "TestDrive:\combined1.xlsx" -Property name,displayname,startType -Key name + $excel = Open-ExcelPackage -Path "TestDrive:\combined1.xlsx" + $ws = $excel.Workbook.Worksheets["sheet1"] + } + Context "Merge with 3 properties" { it "Created a worksheet with the correct headings " { $ws | should not beNullOrEmpty $ws.Cells[ 1,1].Value | Should be "name" $ws.Cells[ 1,2].Value | Should be "DisplayName" $ws.Cells[ 1,3].Value | Should be "StartType" - $ws.Cells[ 1,4].Value | Should be "Server2 DisplayName" - $ws.Cells[ 1,5].Value | Should be "Server2 StartType" + $ws.Cells[ 1,4].Value | Should be "server2 DisplayName" + $ws.Cells[ 1,5].Value | Should be "server2 StartType" } it "Joined the two sheets correctly " { $ws.Cells[ 2,2].Value | Should be $ws.Cells[ 2,4].Value @@ -249,16 +253,16 @@ Describe "Merge Worksheet" { } Context "Wider data set" { it "Coped with columns beyond Z in the Output sheet " { - { Merge-Worksheet -Referencefile "$env:temp\server1.xlsx" -Differencefile "$env:temp\server2.xlsx" -OutputFile "$env:temp\combined2.xlsx" } | Should not throw + { Merge-Worksheet -Referencefile "TestDrive:\server1.xlsx" -Differencefile "TestDrive:\server2.xlsx" -OutputFile "TestDrive:\combined2.xlsx" } | Should not throw } } } Describe "Merge Multiple sheets" { Context "Merge 3 sheets with 3 properties" { BeforeAll { - Remove-Item -Path "$env:temp\server*.xlsx" , "$env:temp\combined*.xlsx" -ErrorAction SilentlyContinue + Remove-Item -Path "TestDrive:\server*.xlsx" , "TestDrive:\combined*.xlsx" -ErrorAction SilentlyContinue [System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property Name,DisplayName,StartType - $s | Export-Excel -Path $env:temp\server1.xlsx + $s | Export-Excel -Path TestDrive:\server1.xlsx #$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s $row4Displayname = $s[2].DisplayName @@ -271,7 +275,7 @@ Describe "Merge Multiple sheets" { $s.RemoveAt(5) - $s | Export-Excel -Path $env:temp\server2.xlsx + $s | Export-Excel -Path TestDrive:\server2.xlsx $s[2].displayname = $row4Displayname @@ -281,22 +285,22 @@ Describe "Merge Multiple sheets" { $s.Insert(6,$d) $s.RemoveAt(8) - $s | Export-Excel -Path $env:temp\server3.xlsx + $s | Export-Excel -Path TestDrive:\server3.xlsx - Merge-MultipleSheets -Path "$env:temp\server1.xlsx", "$env:temp\server2.xlsx","$env:temp\server3.xlsx" -OutputFile "$env:temp\combined3.xlsx" -Property name,displayname,startType -Key name - $excel = Open-ExcelPackage -Path "$env:temp\combined3.xlsx" + Merge-MultipleSheets -Path "TestDrive:\server1.xlsx", "TestDrive:\server2.xlsx","TestDrive:\server3.xlsx" -OutputFile "TestDrive:\combined3.xlsx" -Property name,displayname,startType -Key name + $excel = Open-ExcelPackage -Path "TestDrive:\combined3.xlsx" $ws = $excel.Workbook.Worksheets["sheet1"] } it "Created a worksheet with the correct headings " { $ws | Should not beNullOrEmpty $ws.Cells[ 1,2 ].Value | Should be "name" - $ws.Cells[ 1,3 ].Value | Should be "Server1 DisplayName" - $ws.Cells[ 1,4 ].Value | Should be "Server1 StartType" - $ws.Cells[ 1,5 ].Value | Should be "Server2 DisplayName" - $ws.Cells[ 1,6 ].Value | Should be "Server2 StartType" + $ws.Cells[ 1,3 ].Value | Should be "server1 DisplayName" + $ws.Cells[ 1,4 ].Value | Should be "server1 StartType" + $ws.Cells[ 1,5 ].Value | Should be "server2 DisplayName" + $ws.Cells[ 1,6 ].Value | Should be "server2 StartType" $ws.Column(7).hidden | Should be $true - $ws.Cells[ 1,8].Value | Should be "Server2 Row" + $ws.Cells[ 1,8].Value | Should be "server2 Row" $ws.Cells[ 1,9 ].Value | Should be "server3 DisplayName" $ws.Cells[ 1,10].Value | Should be "server3 StartType" $ws.Column(11).hidden | Should be $true diff --git a/__tests__/ConvertFromExcelToSQLInsert.tests.ps1 b/__tests__/ConvertFromExcelToSQLInsert.tests.ps1 index bda88902..d506fa98 100644 --- a/__tests__/ConvertFromExcelToSQLInsert.tests.ps1 +++ b/__tests__/ConvertFromExcelToSQLInsert.tests.ps1 @@ -1,6 +1,6 @@ -Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force -if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" } -$xlFile = "$env:TEMP\testSQL.xlsx" +#Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force + +$xlFile = "TestDrive:\testSQL.xlsx" Describe "ConvertFrom-ExcelToSQLInsert" { diff --git a/__tests__/Copy-ExcelWorksheet.Tests.ps1 b/__tests__/Copy-ExcelWorksheet.Tests.ps1 index 04c98093..d260522f 100644 --- a/__tests__/Copy-ExcelWorksheet.Tests.ps1 +++ b/__tests__/Copy-ExcelWorksheet.Tests.ps1 @@ -1,39 +1,36 @@ -if ($PSVersionTable.os -and $PSVersionTable.os -notMatch 'Windows' ) {return} #Currently this test outputs windows services so only run on Windows. -if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" } - -$path1 = "$env:TEMP\Test1.xlsx" -$path2 = "$env:TEMP\Test2.xlsx" -Remove-item -Path $path1, $path2 -ErrorAction SilentlyContinue +Describe "Copy-Worksheet" { + $path1 = "TestDrive:\Test1.xlsx" + $path2 = "TestDrive:\Test2.xlsx" + Remove-Item -Path $path1, $path2 -ErrorAction SilentlyContinue -$ProcRange = Get-Process | Export-Excel $path1 -DisplayPropertySet -WorkSheetname Processes -ReturnRange + $ProcRange = Get-Process | Export-Excel $path1 -DisplayPropertySet -WorkSheetname Processes -ReturnRange -if ((Get-Culture).NumberFormat.CurrencySymbol -eq "£") {$OtherCurrencySymbol = "$"} -else {$OtherCurrencySymbol = "£"} -[PSCustOmobject][Ordered]@{ - Date = Get-Date - Formula1 = '=SUM(F2:G2)' - String1 = 'My String' - Float = [math]::pi - IPAddress = '10.10.25.5' - StrLeadZero = '07670' - StrComma = '0,26' - StrEngThousand = '1,234.56' - StrEuroThousand = '1.555,83' - StrDot = '1.2' - StrNegInt = '-31' - StrTrailingNeg = '31-' - StrParens = '(123)' - strLocalCurrency = ('{0}123.45' -f (Get-Culture).NumberFormat.CurrencySymbol ) - strOtherCurrency = ('{0}123.45' -f $OtherCurrencySymbol ) - StrE164Phone = '+32 (444) 444 4444' - StrAltPhone1 = '+32 4 4444 444' - StrAltPhone2 = '+3244444444' - StrLeadSpace = ' 123' - StrTrailSpace = '123 ' - Link1 = [uri]"https://github.com/dfinke/ImportExcel" - Link2 = "https://github.com/dfinke/ImportExcel" # Links are not copied correctly, hopefully this will be fixed at some future date -} | Export-Excel -NoNumberConversion IPAddress, StrLeadZero, StrAltPhone2 -WorkSheetname MixedTypes -Path $path2 -Describe "Copy-Worksheet" { + if ((Get-Culture).NumberFormat.CurrencySymbol -eq "£") { $OtherCurrencySymbol = "$" } + else { $OtherCurrencySymbol = "£" } + [PSCustOmobject][Ordered]@{ + Date = Get-Date + Formula1 = '=SUM(F2:G2)' + String1 = 'My String' + Float = [math]::pi + IPAddress = '10.10.25.5' + StrLeadZero = '07670' + StrComma = '0,26' + StrEngThousand = '1,234.56' + StrEuroThousand = '1.555,83' + StrDot = '1.2' + StrNegInt = '-31' + StrTrailingNeg = '31-' + StrParens = '(123)' + strLocalCurrency = ('{0}123.45' -f (Get-Culture).NumberFormat.CurrencySymbol ) + strOtherCurrency = ('{0}123.45' -f $OtherCurrencySymbol ) + StrE164Phone = '+32 (444) 444 4444' + StrAltPhone1 = '+32 4 4444 444' + StrAltPhone2 = '+3244444444' + StrLeadSpace = ' 123' + StrTrailSpace = '123 ' + Link1 = [uri]"https://github.com/dfinke/ImportExcel" + Link2 = "https://github.com/dfinke/ImportExcel" # Links are not copied correctly, hopefully this will be fixed at some future date + } | Export-Excel -NoNumberConversion IPAddress, StrLeadZero, StrAltPhone2 -WorkSheetname MixedTypes -Path $path2 Context "Simplest copy" { BeforeAll { Copy-ExcelWorkSheet -SourceWorkbook $path1 -DestinationWorkbook $path2 @@ -91,8 +88,8 @@ Describe "Copy-Worksheet" { Context "Copy worksheet should close all files" { BeforeAll { - $xlfile = "$env:TEMP\reports.xlsx" - $xlfileArchive = "$env:TEMP\reportsArchive.xlsx" + $xlfile = "TestDrive:\reports.xlsx" + $xlfileArchive = "TestDrive:\reportsArchive.xlsx" Remove-Item $xlfile -ErrorAction SilentlyContinue Remove-Item $xlfileArchive -ErrorAction SilentlyContinue @@ -119,8 +116,8 @@ Describe "Copy-Worksheet" { Context "Copy worksheet should support piped input" { BeforeAll { - $xlfile = "$env:TEMP\reports.xlsx" - $xlfileArchive = "$env:TEMP\reportsArchive.xlsx" + $xlfile = "TestDrive:\reports.xlsx" + $xlfileArchive = "TestDrive:\reportsArchive.xlsx" Remove-Item $xlfile -ErrorAction SilentlyContinue Remove-Item $xlfileArchive -ErrorAction SilentlyContinue diff --git a/__tests__/Export-Excel.Tests.ps1 b/__tests__/Export-Excel.Tests.ps1 index 964efc42..2bf181c7 100644 --- a/__tests__/Export-Excel.Tests.ps1 +++ b/__tests__/Export-Excel.Tests.ps1 @@ -1,14 +1,20 @@ #Requires -Modules Pester -Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force -if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" } -$notWindows = ($PSVersionTable.os -and $PSVersionTable.os -notMatch 'Windows' ) +#Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force -if (Get-process -Name Excel,xlim -ErrorAction SilentlyContinue) { Write-Warning -Message "You need to close Excel before running the tests." ; return} Describe ExportExcel { + . "$PSScriptRoot\Samples\Samples.ps1" + if (Get-process -Name Excel,xlim -ErrorAction SilentlyContinue) { + It "Excel is open" { + $Warning = "You need to close Excel before running the tests." + Write-Warning -Message $Warning + Set-ItResult -Inconclusive -Because $Warning + } + return + } Context "#Example 1 # Creates and opens a file with the right number of rows and columns" { - $path = Join-Path $Env:TEMP "test.xlsx" + $path = "TestDrive:\test.xlsx" Remove-item -Path $path -ErrorAction SilentlyContinue #Test with a maximum of 100 processes for speed; export all properties, then export smaller subsets. $processes = Get-Process | where {$_.StartTime} | Select-Object -first 100 -Property * -excludeProperty Parent @@ -70,7 +76,7 @@ Describe ExportExcel { } Context " # NoAliasOrScriptPropeties -ExcludeProperty and -DisplayPropertySet work" { - $path = Join-Path $Env:TEMP "test.xlsx" + $path = "TestDrive:\test.xlsx" Remove-item -Path $path -ErrorAction SilentlyContinue $processes = Get-Process | Select-Object -First 100 $propertyNames = $Processes[0].psobject.properties.where( {$_.MemberType -eq 'Property'}).name @@ -119,7 +125,7 @@ Describe ExportExcel { Context "#Example 2 # Exports a list of numbers and applies number format " { - $path = Join-Path $Env:TEMP "test.xlsx" + $path = "TestDrive:\test.xlsx" Remove-item -Path $path -ErrorAction SilentlyContinue #testing -ReturnRange switch and applying number format to Formulas as well as values. $returnedRange = @($null, -1, 0, 34, 777, "", -0.5, 119, -0.1, 234, 788,"=A9+A10") | Export-Excel -NumberFormat '[Blue]$#,##0.00;[Red]-$#,##0.00' -Path $path -ReturnRange @@ -158,7 +164,7 @@ Describe ExportExcel { Context " # Number format parameter" { BeforeAll { - $path = Join-Path $Env:TEMP "test.xlsx" + $path = "TestDrive:\test.xlsx" Remove-Item -Path $path -ErrorAction SilentlyContinue 1..10 | Export-Excel -Path $path -Numberformat 'Number' 1..10 | Export-Excel -Path $path -Numberformat 'Percentage' -Append @@ -181,7 +187,7 @@ Describe ExportExcel { if ((Get-Culture).NumberFormat.CurrencySymbol -eq "£") {$OtherCurrencySymbol = "$"} else {$OtherCurrencySymbol = "£"} - $path = Join-Path $Env:TEMP "test.xlsx" + $path = "TestDrive:\test.xlsx" $warnVar = $null #Test correct export of different data types and number formats; test hyperlinks, test -NoNumberConversion test object is converted to a string with no warnings, test calcuation of formula Remove-item -Path $path -ErrorAction SilentlyContinue @@ -298,7 +304,7 @@ Describe ExportExcel { Context "# # Setting cells for different data types with -noHeader" { - $path = Join-Path $Env:TEMP "test.xlsx" + $path = "TestDrive:\test.xlsx" Remove-item -Path $path -ErrorAction SilentlyContinue #Test -NoHeader & -NoNumberConversion [PSCustOmobject][Ordered]@{ @@ -359,7 +365,7 @@ Describe ExportExcel { #Test New-ConditionalText builds correctly $ct = New-ConditionalText -ConditionalType GreaterThan 525 -ConditionalTextColor ([System.Drawing.Color]::DarkRed) -BackgroundColor ([System.Drawing.Color]::LightPink) - $path = Join-Path $Env:TEMP "test.xlsx" + $path = "TestDrive:\test.xlsx" Remove-item -Path $path -ErrorAction SilentlyContinue #Test -ConditionalText with a single conditional spec. Write-Output 489 668 299 777 860 151 119 497 234 788 | Export-Excel -Path $path -ConditionalText $ct @@ -386,19 +392,19 @@ Describe ExportExcel { } } - Context "#Example 6 # Adding multiple conditional formats using short form syntax. " { - if ($notwindows) {Write-warning "Test only runs on Windows" ; return} - #Test adding mutliple conditional blocks and using the minimal syntax for new-ConditionalText - $path = Join-Path $Env:TEMP "test.xlsx" - Remove-item -Path $path -ErrorAction SilentlyContinue + #Test adding mutliple conditional blocks and using the minimal syntax for new-ConditionalText + $path = "TestDrive:\test.xlsx" + Remove-item -Path $path -ErrorAction SilentlyContinue - #Testing -Passthrough - $Excel = Get-Service | Select-Object Name, Status, DisplayName, ServiceName | - Export-Excel $path -PassThru -ConditionalText $( - New-ConditionalText Stop ([System.Drawing.Color]::DarkRed) ([System.Drawing.Color]::LightPink) - New-ConditionalText Running ([System.Drawing.Color]::Blue) ([System.Drawing.Color]::Cyan) - ) - $ws = $Excel.Workbook.Worksheets[1] + #Testing -Passthrough + $Excel = Get-Service | Select-Object Name, Status, DisplayName, ServiceName | + Export-Excel $path -PassThru -ConditionalText $( + New-ConditionalText Stop ([System.Drawing.Color]::DarkRed) ([System.Drawing.Color]::LightPink) + New-ConditionalText Running ([System.Drawing.Color]::Blue) ([System.Drawing.Color]::Cyan) + ) + $ws = $Excel.Workbook.Worksheets[1] + + Context "#Example 6 # Adding multiple conditional formats using short form syntax. " { it "Added two blocks of conditional formating for the data range " { $ws.ConditionalFormatting.Count | Should be 2 $ws.ConditionalFormatting[0].Address | Should be ($ws.Dimension.Address) @@ -411,8 +417,8 @@ Describe ExportExcel { $ws.ConditionalFormatting[1].Type | Should be "ContainsText" #Add RGB Comparison } - Close-ExcelPackage -ExcelPackage $Excel } + Close-ExcelPackage -ExcelPackage $Excel Context "#Example 7 # Update-FirstObjectProperties works " { $Array = @() @@ -451,11 +457,9 @@ Describe ExportExcel { } Context "#Examples 8 & 9 # Adding Pivot tables and charts from parameters" { - $path = Join-Path $Env:TEMP "test.xlsx" + $path = "TestDrive:\test.xlsx" #Test -passthru and -worksheetName creating a new, named, sheet in an existing file. - $Script:Procs= Get-Process | Select-Object -first 20 -Property Name, cpu, pm, handles, company - if ($Procs.count -lt 20) {Write-warning "Not enough proceses were returned by get-Process to run the test." ; return} - $Excel = $Script:Procs| Export-Excel $path -WorkSheetname Processes -PassThru + $Excel = Get-Process | Select-Object -first 20 -Property Name, cpu, pm, handles, company | Export-Excel $path -WorkSheetname Processes -PassThru #Testing -Excel Pacakage and adding a Pivot-table as a second step. Want to save and re-open it ... Export-Excel -ExcelPackage $Excel -WorkSheetname Processes -IncludePivotTable -PivotRows Company -PivotData PM -NoTotalsInPivot -PivotDataToColumn -Activate @@ -471,8 +475,9 @@ Describe ExportExcel { $excel.Workbook.Worksheets["Processes"].Dimension.rows | Should be 21 #20 data + 1 header } it "Selected the Pivottable page " { + Set-ItResult -Pending -Because "Bug in EPPLus 4.5" $PTws.View.TabSelected | Should be $true - } -Skip # << Bug in EPPLus 4.5 + } $pt = $PTws.PivotTables[0] it "Built the expected Pivot table " { $pt.RowFields.Count | Should be 1 @@ -512,7 +517,7 @@ Describe ExportExcel { } Context " # Add-Worksheet inserted sheets, moved them correctly, and copied a sheet" { - $path = Join-Path $Env:TEMP "test.xlsx" + $path = "TestDrive:\test.xlsx" #Test the -CopySource and -Movexxxx parameters for Add-WorkSheet $Excel = Open-ExcelPackage $path #At this point Sheets Should be in the order Sheet1, Processes, ProcessesPivotTable @@ -534,7 +539,7 @@ Describe ExportExcel { $excel.Workbook.Worksheets[5].Name | Should be "Processes" $excel.Workbook.Worksheets[6].Name | Should be "NearDone" $excel.Workbook.Worksheets[7].Name | Should be "Sheet1" - } -skip:($Procs.count -lt 20) + } it "Cloned 'Sheet1' to 'NewSheet' " { $newWs = $excel.Workbook.Worksheets["NewSheet"] @@ -547,15 +552,13 @@ Describe ExportExcel { } Context " # Create and append with Start row and Start Column, inc ranges and Pivot table. " { - $path = Join-Path $Env:TEMP "test.xlsx" + $path = "TestDrive:\test.xlsx" remove-item -Path $path -ErrorAction SilentlyContinue #Catch warning $warnVar = $null #Test -Append with no existing sheet. Test adding a named pivot table from command line parameters and extending ranges when they're not specified explictly - $Script:Procs= Get-Process - if ($Procs.count -lt 20) {Write-warning "Not enough proceses were returned by get-Process to run the test." ; return} - $Script:Procs| Select-Object -First 10 -Property Name, cpu, pm, handles, company | Export-Excel -StartRow 3 -StartColumn 3 -BoldTopRow -IncludePivotTable -PivotRows Company -PivotData PM -PivotTableName 'PTOffset' -Path $path -WorkSheetname withOffset -Append -PivotFilter Name -NoTotalsInPivot -RangeName procs -AutoFilter -AutoNameRange - $Script:Procs| Select-Object -Last 10 -Property Name, cpu, pm, handles, company | Export-Excel -StartRow 3 -StartColumn 3 -BoldTopRow -IncludePivotTable -PivotRows Company -PivotData PM -PivotTableName 'PTOffset' -Path $path -WorkSheetname withOffset -Append -WarningAction SilentlyContinue -WarningVariable warnvar + Get-Process | Select-Object -first 10 -Property Name, cpu, pm, handles, company | Export-Excel -StartRow 3 -StartColumn 3 -BoldTopRow -IncludePivotTable -PivotRows Company -PivotData PM -PivotTableName 'PTOffset' -Path $path -WorkSheetname withOffset -Append -PivotFilter Name -NoTotalsInPivot -RangeName procs -AutoFilter -AutoNameRange + Get-Process | Select-Object -last 10 -Property Name, cpu, pm, handles, company | Export-Excel -StartRow 3 -StartColumn 3 -BoldTopRow -IncludePivotTable -PivotRows Company -PivotData PM -PivotTableName 'PTOffset' -Path $path -WorkSheetname withOffset -Append -WarningAction SilentlyContinue -WarningVariable warnvar $Excel = Open-ExcelPackage $path $dataWs = $Excel.Workbook.Worksheets["withOffset"] $pt = $Excel.Workbook.Worksheets["PTOffset"].PivotTables[0] @@ -599,14 +602,11 @@ Describe ExportExcel { } Context " # Create and append explicit and auto table and range extension" { - $path = Join-Path $Env:TEMP "test.xlsx" + $path = "TestDrive:\test.xlsx" #Test -Append automatically extends a table, even when it is not specified in the append command; - $Script:Procs= Get-process - if ($Procs.count -lt 20) {Write-warning "Not enough proceses were returned by get-Process to run the test." ; return} - - $Script:Procs| Select-Object -first 10 -Property Name, cpu, pm, handles, company | Export-Excel -Path $path -TableName ProcTab -AutoNameRange -WorkSheetname NoOffset -ClearSheet + Get-Process | Select-Object -first 10 -Property Name, cpu, pm, handles, company | Export-Excel -Path $path -TableName ProcTab -AutoNameRange -WorkSheetname NoOffset -ClearSheet #Test number format applying to new data - $Script:Procs| Select-Object -last 10 -Property Name, cpu, pm, handles, company | Export-Excel -Path $path -AutoNameRange -WorkSheetname NoOffset -Append -Numberformat 'Number' + Get-Process | Select-Object -last 10 -Property Name, cpu, pm, handles, company | Export-Excel -Path $path -AutoNameRange -WorkSheetname NoOffset -Append -Numberformat 'Number' $Excel = Open-ExcelPackage $path $dataWs = $Excel.Workbook.Worksheets["NoOffset"] @@ -635,8 +635,7 @@ Describe ExportExcel { } Context "#Example 11 # Create and append with title, inc ranges and Pivot table" { - if ($Procs.count -lt 20) {Write-warning "Not enough proceses were returned by get-Process to run the test." ; return} - $path = Join-Path $Env:TEMP "test.xlsx" + $path = "TestDrive:\test.xlsx" #Test New-PivotTableDefinition builds definition using -Pivotfilter and -PivotTotals options. $ptDef = [ordered]@{} $ptDef += New-PivotTableDefinition -PivotTableName "PT1" -SourceWorkSheet 'Sheet1' -PivotRows "Status" -PivotData @{'Status' = 'Count'} -PivotTotals Columns -PivotFilter "StartType" -IncludePivotChart -ChartType BarClustered3D -ChartTitle "Services by status" -ChartHeight 512 -ChartWidth 768 -ChartRow 10 -ChartColumn 0 -NoLegend -PivotColumns CanPauseAndContinue @@ -718,8 +717,8 @@ Describe ExportExcel { } Context "#Example 13 # Formatting and another way to do a pivot. " { - $path = Join-Path $Env:TEMP "test.xlsx" - Remove-Item $path -ErrorAction SilentlyContinue + $path = "TestDrive:\test.xlsx" + Remove-Item $path #Test freezing top row/first column, adding formats and a pivot table - from Add-Pivot table not a specification variable - after the export $excel = Get-Process | Select-Object -Property Name, Company, Handles, CPU, PM, NPM, WS | Export-Excel -Path $path -ClearSheet -WorkSheetname "Processes" -FreezeTopRowFirstColumn -PassThru $sheet = $excel.Workbook.Worksheets["Processes"] @@ -747,6 +746,8 @@ Describe ExportExcel { } it "Applied the formating " { $sheet | Should not beNullOrEmpty + $sheet.Column(1).wdith | Should not be $sheet.DefaultColWidth + $sheet.Column(7).wdith | Should not be $sheet.DefaultColWidth $sheet.Column(1).style.font.bold | Should be $true $sheet.Column(2).style.wraptext | Should be $true $sheet.Column(2).width | Should be 29 @@ -769,10 +770,6 @@ Describe ExportExcel { $sheet.ConditionalFormatting[2].Formula | Should be '104857600' $sheet.ConditionalFormatting[2].Style.Font.Color.Color.Name | Should be 'ffff0000' } - it "Applied autowidth " { - $sheet.Column(1).wdith | Should not be $sheet.DefaultColWidth - $sheet.Column(7).wdith | Should not be $sheet.DefaultColWidth - } -skip:$notwindows it "Created the named ranges " { $sheet.Names.Count | Should be 7 $sheet.Names[0].Start.Column | Should be 1 @@ -800,7 +797,7 @@ Describe ExportExcel { } Context " # Chart from MultiSeries.ps1 in the Examples\charts Directory" { - $path = Join-Path $Env:TEMP "test.xlsx" + $path = "TestDrive:\test.xlsx" Remove-Item -Path $path -ErrorAction SilentlyContinue #Test we haven't missed any parameters on New-ChartDefinition which are on add chart or vice versa. @@ -823,7 +820,7 @@ Describe ExportExcel { $data[1].Handles | Should not beNullOrEmpty $data[1].PM | Should not beNullOrEmpty $data[1].VirtualMemorySize | Should not beNullOrEmpty - } -skip:($procs.count -lt 20) + } $c = New-ExcelChartDefinition -Title Stats -ChartType LineMarkersStacked -XRange "Processes[Name]" -YRange "Processes[PM]", "Processes[VirtualMemorySize]" -SeriesHeader 'PM', 'VMSize' it "Created the Excel chart definition " { @@ -858,7 +855,7 @@ Describe ExportExcel { } Context " # variation of plot.ps1 from Examples Directory using Add chart outside ExportExcel" { - $path = Join-Path $Env:TEMP "test.xlsx" + $path = "TestDrive:\test.xlsx" #Test inserting a fomual $excel = 0..360 | ForEach-Object {[pscustomobject][ordered]@{x = $_; Sinx = "=Sin(Radians(x)) "}} | Export-Excel -AutoNameRange -Path $path -WorkSheetname SinX -ClearSheet -FreezeFirstColumn -PassThru #Test-Add Excel Chart to existing data. Test add Conditional formatting with a formula @@ -900,7 +897,7 @@ Describe ExportExcel { } Context " # Quick line chart" { - $path = Join-Path $Env:TEMP "test.xlsx" + $path = "TestDrive:\test.xlsx" Remove-Item -Path $path -ErrorAction SilentlyContinue #test drawing a chart when data doesn't have a string 0..360 | ForEach-Object {[pscustomobject][ordered]@{x = $_; Sinx = "=Sin(Radians(x)) "}} | Export-Excel -AutoNameRange -Path $path -LineChart @@ -918,10 +915,8 @@ Describe ExportExcel { } Context " # Quick Pie chart and three icon conditional formating" { - $path = Join-Path $Env:TEMP "Pie.xlsx" + $path = "TestDrive:\Pie.xlsx" Remove-Item -Path $path -ErrorAction SilentlyContinue - $Script:Procs= Get-Process - if ($Procs.count -lt 20) {Write-warning "Not enough proceses were returned by get-Process to run the test." ; return} $range = Get-Process| Group-Object -Property company | Where-Object -Property name | Select-Object -Property Name, @{n="TotalPm";e={($_.group | Measure-Object -sum -Property pm).sum }} | Export-Excel -NoHeader -AutoNameRange -path $path -ReturnRange -PieChart -ShowPercent @@ -957,11 +952,16 @@ Describe ExportExcel { } Context " # Awkward multiple tables" { - if ($notWindows) {Write-warning "Test only runs on Windows" ; return} - $path = Join-Path $Env:TEMP "test.xlsx" + $path = "TestDrive:\test.xlsx" #Test creating 3 on overlapping tables on the same page. Create rightmost the left most then middle. remove-item -Path $path -ErrorAction SilentlyContinue - $r = Get-ChildItem -path C:\WINDOWS\system32 -File + if ($IsLinux -or $IsMacOS) { + $SystemFolder = '/etc' + } + else { + $SystemFolder = 'C:\WINDOWS\system32' + } + $r = Get-ChildItem -path $SystemFolder -File "Biggest files" | Export-Excel -Path $path -StartRow 1 -StartColumn 7 $r | Sort-Object length -Descending | Select-Object -First 14 Name, @{n="Size";e={$_.Length}} | @@ -993,7 +993,7 @@ Describe ExportExcel { } Context " # Parameters and ParameterSets" { - $Path = join-path $env:TEMP "temp.xlsx" + $Path = Join-Path (Resolve-Path 'TestDrive:').ProviderPath "test.xlsx" Remove-Item -Path $Path -ErrorAction SilentlyContinue $Processes = Get-Process | Select-Object -first 10 -Property Name, cpu, pm, handles, company @@ -1028,26 +1028,24 @@ Describe ExportExcel { $ExcelPackage.File | Should Be $Path $Worksheet.Tables[0].Name | Should Be 'Table1' } - it "Now will use temp Path, set TableName with generated name".PadRight(87) { + it "Now will use temp Path, set TableName with generated name and AutoSize".PadRight(87) { $ExcelPackage = $Processes | Export-Excel -Now -PassThru - $Script:Worksheet = $ExcelPackage.Workbook.Worksheets[1] + $Worksheet = $ExcelPackage.Workbook.Worksheets[1] + $ExcelPackage.File | Should BeLike ([IO.Path]::GetTempPath() + '*') - $Script:Worksheet.Tables[0].Name | Should Be 'Table1' - $Script:Worksheet.AutoFilterAddress | Should BeNullOrEmpty} - it "Applies AutoSize with these".PadRight(87) { - $Script:Worksheet.Column(5).Width | Should BeGreaterThan 9.5 - } -skip:$notwindows + $Worksheet.Tables[0].Name | Should Be 'Table1' + $Worksheet.AutoFilterAddress | Should BeNullOrEmpty + $Worksheet.Column(5).Width | Should BeGreaterThan 9.5 + } it "Now allows override of Path and TableName".PadRight(87) { $ExcelPackage = $Processes | Export-Excel -Now -PassThru -Path $Path -TableName:$false - $Script:Worksheet = $ExcelPackage.Workbook.Worksheets[1] + $Worksheet = $ExcelPackage.Workbook.Worksheets[1] $ExcelPackage.File | Should Be $Path - $Script:Worksheet.Tables | Should BeNullOrEmpty - $Script:Worksheet.AutoFilterAddress | Should BeNullOrEmpty + $Worksheet.Tables | Should BeNullOrEmpty + $Worksheet.AutoFilterAddress | Should BeNullOrEmpty + $Worksheet.Column(5).Width | Should BeGreaterThan 9.5 } - it "Allows AutoSize with the override".PadRight(87) { - $Script:Worksheet.Column(5).Width | Should BeGreaterThan 9.5 - } -skip:$notwindows <# Mock looks unreliable need to check Mock -CommandName 'Invoke-Item' it "Now will Show".PadRight(87) { @@ -1069,14 +1067,11 @@ Describe ExportExcel { } it "Now allows to set TableName".PadRight(87) { $ExcelPackage = $Processes | Export-Excel -Now -PassThru -TableName 'Data' - $Script:Worksheet = $ExcelPackage.Workbook.Worksheets[1] + $Worksheet = $ExcelPackage.Workbook.Worksheets[1] - $Script:Worksheet.Tables[0].Name | Should Be 'Data' - $Script:Worksheet.AutoFilterAddress | Should BeNullOrEmpty + $Worksheet.Tables[0].Name | Should Be 'Data' + $Worksheet.AutoFilterAddress | Should BeNullOrEmpty + $Worksheet.Column(5).Width | Should BeGreaterThan 9.5 } - it "Allows to set TableName with AutoSize".PadRight(87) { - $Script:Worksheet.Column(5).Width | Should BeGreaterThan 9.5 - } -skip:$notwindows - } } diff --git a/__tests__/ExtraLongCmd.tests.ps1 b/__tests__/ExtraLongCmd.tests.ps1 index ecb8c17f..8f5eeaa3 100644 --- a/__tests__/ExtraLongCmd.tests.ps1 +++ b/__tests__/ExtraLongCmd.tests.ps1 @@ -1,9 +1,9 @@ -if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" } -$path = Join-Path $Env:TEMP "test.xlsx" -remove-item -path $path -ErrorAction SilentlyContinue -ConvertFrom-Csv @" +Describe "Creating workbook with a single line" { + $path = "TestDrive:\test.xlsx" + remove-item -path $path -ErrorAction SilentlyContinue + ConvertFrom-Csv @" Product, City, Gross, Net Apple, London , 300, 250 Orange, London , 400, 350 @@ -17,10 +17,9 @@ Apple, New York, 1200,700 PivotChartDefinition=@{Title="Gross and net by city and product"; ChartType="ColumnClustered"; Column=6; Width=600; Height=360; YMajorUnit=500; YMinorUnit=100; YAxisNumberformat="$#,##0"; LegendPosition="Bottom"}}} -$excel = Open-ExcelPackage $path -$ws1 = $excel.Workbook.Worksheets[1] -$ws2 = $excel.Workbook.Worksheets[2] -Describe "Creating workbook with a single line" { + $excel = Open-ExcelPackage $path + $ws1 = $excel.Workbook.Worksheets[1] + $ws2 = $excel.Workbook.Worksheets[2] Context "Data Page" { It "Inserted the data and created the table " { $ws1.Tables[0] | Should not beNullOrEmpty @@ -52,8 +51,9 @@ Describe "Creating workbook with a single line" { $ws2.PivotTables[0].ColumGrandTotals | Should be $true #Epplus's mis-spelling of column not mine } it "Made the PivotTable page active " { + Set-ItResult -Pending -Because "Bug in EPPLus 4.5" $ws2.View.TabSelected | Should be $true - } -Skip # << Bug in EPPLus 4.5 + } it "Created the Pivot Chart " { $ws2.Drawings[0] | Should not beNullOrEmpty $ws2.Drawings[0].ChartType.ToString() | Should be ColumnClustered diff --git a/__tests__/First10Races.tests.ps1 b/__tests__/First10Races.tests.ps1 index 3eaa9249..cb4902dd 100644 --- a/__tests__/First10Races.tests.ps1 +++ b/__tests__/First10Races.tests.ps1 @@ -1,11 +1,9 @@ -if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" } - -$scriptPath = Split-Path -Path $MyInvocation.MyCommand.path -Parent +$scriptPath = Split-Path -Path $MyInvocation.MyCommand.path -Parent $dataPath = Join-Path -Path $scriptPath -ChildPath "First10Races.csv" Describe "Creating small named ranges with hyperlinks" { BeforeAll { - $path = Join-Path $Env:TEMP "results.xlsx" + $path = "TestDrive:\Results.xlsx" Remove-Item -Path $path -ErrorAction SilentlyContinue #Read race results, and group by race name : export 1 row to get headers, leaving enough rows aboce to put in a link for each race $results = Import-Csv -Path $dataPath | @@ -94,11 +92,12 @@ Describe "Creating small named ranges with hyperlinks" { $sheet.ConditionalFormatting[1].StopIfTrue | Should be $true } It "Applied ConditionalFormatting, including Reverse " { + Set-ItResult -Pending -Because "Bug in EPPLus 4.5" $sheet.ConditionalFormatting[3].LowValue.Color.R | Should begreaterThan 180 $sheet.ConditionalFormatting[3].LowValue.Color.G | Should beLessThan 128 $sheet.ConditionalFormatting[3].HighValue.Color.R | Should beLessThan 128 $sheet.ConditionalFormatting[3].HighValue.Color.G | Should begreaterThan 180 - } -Skip # << Bug in EPPLus 4.5 + } } Context "Adding a table" { it "Created a table " { diff --git a/__tests__/FunctionAlias.tests.ps1 b/__tests__/FunctionAlias.tests.ps1 index 02bd6e4b..86fbe10b 100644 --- a/__tests__/FunctionAlias.tests.ps1 +++ b/__tests__/FunctionAlias.tests.ps1 @@ -1,6 +1,6 @@ #Requires -Modules Pester -remove-module importExcel -erroraction silentlyContinue -Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force +#remove-module importExcel -erroraction silentlyContinue +#Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force Describe "Check if Function aliases exist" { diff --git a/__tests__/ImportExcelTests/Simple.tests.ps1 b/__tests__/ImportExcelTests/Simple.tests.ps1 index 7248b076..46f8d071 100644 --- a/__tests__/ImportExcelTests/Simple.tests.ps1 +++ b/__tests__/ImportExcelTests/Simple.tests.ps1 @@ -1,4 +1,4 @@ -Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 +#Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 Describe "Tests" { BeforeAll { diff --git a/__tests__/InputItemParameter.tests.ps1 b/__tests__/InputItemParameter.tests.ps1 index 4c026096..f85739b4 100644 --- a/__tests__/InputItemParameter.tests.ps1 +++ b/__tests__/InputItemParameter.tests.ps1 @@ -1,8 +1,6 @@ -if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" } - Describe "Exporting with -Inputobject" { BeforeAll { - $path = Join-Path $Env:TEMP "results.xlsx" + $path = "TestDrive:\Results.xlsx" Remove-Item -Path $path -ErrorAction SilentlyContinue #Read race results, and group by race name : export 1 row to get headers, leaving enough rows aboce to put in a link for each race $results = ((Get-Process) + (Get-Process -id $PID)) | Select-Object -last 10 -Property Name, cpu, pm, handles, StartTime diff --git a/__tests__/InstallPowerShell.ps1 b/__tests__/InstallPowerShell.ps1 new file mode 100644 index 00000000..b4f3cc70 --- /dev/null +++ b/__tests__/InstallPowerShell.ps1 @@ -0,0 +1,26 @@ +<# + .SYNOPSIS + Installs PowerShell Core on Windows. +#> +[CmdLetBinding()] +Param +( + # Version to install in the format from the .msi, for example "7.0.0-preview.1" + [Parameter(Mandatory)] + [String]$Version +) +$ErrorActionPreference = 'Stop' + +'[Progress] Downloading PowerShell Core.' +$MsiPath = Join-Path $env:TEMP "PowerShell-$Version-win-x64.msi" +[System.Net.WebClient]::new().DownloadFile("https://github.com/PowerShell/PowerShell/releases/download/v$Version/PowerShell-$Version-win-x64.msi", $MsiPath) + +'[Progress] Installing PowerShell Core.' +Start-Process 'msiexec.exe' -Wait -ArgumentList "/i $MsiPath /quiet" +Remove-Item -Path $MsiPath +$PowerShellFolder = $Version[0] +if ($Version -like "*preview*") { + $PowerShellFolder += '-preview' +} +$env:Path = "$env:ProgramFiles\PowerShell\$PowerShellFolder;$env:Path" +'[Progress] PowerShell Core Installed.' \ No newline at end of file diff --git a/__tests__/Join-Worksheet.tests.ps1 b/__tests__/Join-Worksheet.tests.ps1 index c6b87b36..31f40497 100644 --- a/__tests__/Join-Worksheet.tests.ps1 +++ b/__tests__/Join-Worksheet.tests.ps1 @@ -1,7 +1,4 @@ -if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" } -$notWindows = ($PSVersionTable.os -and $PSVersionTable.os -notMatch 'Windows' ) - -$data1 = ConvertFrom-Csv -InputObject @" +$data1 = ConvertFrom-Csv -InputObject @" ID,Product,Quantity,Price,Total 12001,Nails,37,3.99,147.63 12002,Hammer,5,12.10,60.5 @@ -27,7 +24,8 @@ ID,Product,Quantity,Price,Total Describe "Join Worksheet part 1" { BeforeAll { - $path = Join-Path $Env:TEMP "test.xlsx" + . "$PSScriptRoot\Samples\Samples.ps1" + $path = "TestDrive:\test.xlsx" Remove-Item -Path $path -ErrorAction SilentlyContinue $data1 | Export-Excel -Path $path -WorkSheetname Oxford $data2 | Export-Excel -Path $path -WorkSheetname Abingdon @@ -53,9 +51,10 @@ Describe "Join Worksheet part 1" { $excel.Workbook.Worksheets["SummaryPivot"].Hidden | Should be 'Visible' } it "Activated the correct worksheet " { + Set-ItResult -Pending -Because "Bug in EPPLus 4.5" $excel.Workbook.worksheets["SummaryPivot"].View.TabSelected | Should be $true $excel.Workbook.worksheets["Total"].View.TabSelected | Should be $false - } -Skip # << Bug in EPPLus 4.5 + } } Context "Merging 3 blocks" { @@ -92,11 +91,10 @@ Describe "Join Worksheet part 1" { } } } - $path = Join-Path $Env:TEMP "Test.xlsx" + $path = "TestDrive:\Test.xlsx" Remove-item -Path $path -ErrorAction SilentlyContinue #switched to CIM objects so test runs on V6 Describe "Join Worksheet part 2" { - if ($notWindows) {Write-warning -message "Test only runs on Windows" ; return} Get-CimInstance -ClassName win32_logicaldisk | Select-Object -Property DeviceId,VolumeName, Size,Freespace | Export-Excel -Path $path -WorkSheetname Volumes -NumberFormat "0,000" diff --git a/__tests__/PasswordProtection.tests.ps1 b/__tests__/PasswordProtection.tests.ps1 index ec4e6a60..eea9fc7f 100644 --- a/__tests__/PasswordProtection.tests.ps1 +++ b/__tests__/PasswordProtection.tests.ps1 @@ -2,13 +2,15 @@ Describe "Password Support" { if ($PSVersionTable.PSVersion.Major -GT 5) { - Write-Warning "Can't test passwords on V6 and later" + It "Password Supported" { + Set-ItResult -Pending -Because "Can't test passwords on V6 and later" + } return } Context "Password protected sheet" { BeforeAll { $password = "YouMustRememberThis" - $path = "$env:TEMP\Test.xlsx" + $path = "TestDrive:\Test.xlsx" Remove-Item $path -ErrorAction SilentlyContinue Get-Service | Select-Object -First 10 | Export-excel -password $password -Path $Path -DisplayPropertySet } diff --git a/__tests__/ProtectWorksheet.tests.ps1 b/__tests__/ProtectWorksheet.tests.ps1 index 14c8f65f..28c65b75 100644 --- a/__tests__/ProtectWorksheet.tests.ps1 +++ b/__tests__/ProtectWorksheet.tests.ps1 @@ -1,8 +1,8 @@ -if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" } - -$path = Join-Path $Env:TEMP "test.xlsx" -Remove-Item -path $path -ErrorAction SilentlyContinue -$excel = ConvertFrom-Csv @" +Describe "Setting worksheet protection " { + BeforeAll { + $path = "TestDrive:\test.xlsx" + Remove-Item -path $path -ErrorAction SilentlyContinue + $excel = ConvertFrom-Csv @" Product, City, Gross, Net Apple, London , 300, 250 Orange, London , 400, 350 @@ -13,14 +13,11 @@ Apple, New York, 1200,700 "@ | Export-Excel -Path $path -WorksheetName Sheet1 -PassThru -$ws = $excel.sheet1 + $ws = $excel.sheet1 -Set-WorkSheetProtection -WorkSheet $ws -IsProtected -BlockEditObject -AllowFormatRows -UnLockAddress "1:1" + Set-WorkSheetProtection -WorkSheet $ws -IsProtected -BlockEditObject -AllowFormatRows -UnLockAddress "1:1" -Close-ExcelPackage -ExcelPackage $excel - -Describe "Setting worksheet protection " { - BeforeAll { + Close-ExcelPackage -ExcelPackage $excel $excel = Open-ExcelPackage -Path $path $ws = $ws = $excel.sheet1 } diff --git a/__tests__/Publish.ps1 b/__tests__/Publish.ps1 new file mode 100644 index 00000000..625d5bfc --- /dev/null +++ b/__tests__/Publish.ps1 @@ -0,0 +1,105 @@ +<# + .SYNOPSIS + Deploy module to PowerShellGallery. +#> +[CmdletBinding(DefaultParameterSetName = 'ModuleName')] +Param +( + # The name of the installed module to be deployed, if not provided the name of the .psm1 file in the parent folder is used. + [Parameter(ParameterSetName = 'ModuleName')] + [ValidateNotNullOrEmpty()] + [String]$ModuleName, + + # Publish module from path (module folder), if not provided -ModuleName is used. + [Parameter(Mandatory, ParameterSetName = 'Path')] + [ValidateNotNullOrEmpty()] + [String]$Path, + + # Key for PowerShellGallery deployment, if not provided $env:NugetApiKey is used. + [ValidateNotNullOrEmpty()] + [String]$NugetApiKey, + + # Skip Version verification for PowerShellGallery deployment, can be used for first release. + [Switch]$Force +) +$ErrorActionPreference = 'Stop' + +if ($Path) { + $Path = Resolve-Path -Path $Path + if ($Path.Count -ne 1) { + throw ('Invalid Path, $Path.Count: {0}.' -f $Path.Count) + } + $Psd1Path = (Get-ChildItem -File -Filter *.psd1 -Path $Path -Recurse)[0].FullName + $ModuleName = [System.IO.Path]::GetFileNameWithoutExtension($Psd1Path) + $VersionLocal = (. ([Scriptblock]::Create((Get-Content -Path $Psd1Path | Out-String)))).ModuleVersion +} +else { + # Get Script Root + if ($PSScriptRoot) { + $ScriptRoot = $PSScriptRoot + } + elseif ($psISE.CurrentFile.IsUntitled -eq $false) { + $ScriptRoot = Split-Path -Path $psISE.CurrentFile.FullPath + } + elseif ($null -ne $psEditor.GetEditorContext().CurrentFile.Path -and $psEditor.GetEditorContext().CurrentFile.Path -notlike 'untitled:*') { + $ScriptRoot = Split-Path -Path $psEditor.GetEditorContext().CurrentFile.Path + } + else { + $ScriptRoot = '.' + } + + # Get Module Info + if (!$ModuleName) { + $ModuleName = [System.IO.Path]::GetFileNameWithoutExtension((Get-ChildItem -File -Filter *.psm1 -Name -Path (Split-Path $ScriptRoot))) + } + $VersionLocal = ((Get-Module -Name $ModuleName -ListAvailable).Version | Measure-Object -Maximum).Maximum +} + +"[Progress] Deploy Script Start for Module: $ModuleName, Version: $VersionLocal." + +# Deploy to PowerShell Gallery if run locally OR from AppVeyor & GitHub master +if (!$env:APPVEYOR -or $env:APPVEYOR_REPO_BRANCH -eq 'master') { + if ($env:APPVEYOR) { + $Success = $true + $AppVeyorProject = Invoke-RestMethod -Uri "https://ci.appveyor.com/api/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG" + $AppVeyorProject.build.jobs | ForEach-Object { + '[Info] AppVeyor job name: "{0}", Id: {1}, Status: {2}.' -f $_.name, $_.jobId, $_.status + if ($_.jobId -ne $env:APPVEYOR_JOB_ID -and $_.status -ne "success") { + $Success = $false + } + } + if (!$Success) { + '[Info] There are filed jobs skipping PowerShell Gallery deploy.' + break + } + } + try { + $VersionGallery = (Find-Module -Name $ModuleName -ErrorAction Stop).Version + } + catch { + if ($_.Exception.Message -notlike 'No match was found for the specified search criteria*' -or !$Force) { + throw $_ + } + } + + "[Info] PowerShellGallery. $ModuleName, VersionGallery: $VersionGallery, VersionLocal: $VersionLocal." + if ($VersionGallery -lt $VersionLocal -or $Force) { + if (!$NugetApiKey) { + $NugetApiKey = $env:NugetApiKey + } + "[Info] PowerShellGallery. Deploying $ModuleName version $VersionLocal." + if ($Path) { + Publish-Module -NuGetApiKey $NugetApiKey -Path $Path + } + else { + Publish-Module -NuGetApiKey $NugetApiKey -Name $ModuleName -RequiredVersion $VersionLocal + } + } + else { + '[Info] PowerShellGallery Deploy Skipped (Version Check).' + } +} +else { + '[Info] PowerShellGallery Deploy Skipped.' +} +'[Progress] Deploy Ended.' \ No newline at end of file diff --git a/__tests__/RangePassing.ps1 b/__tests__/RangePassing.ps1 index c26f9d00..e0dc7704 100644 --- a/__tests__/RangePassing.ps1 +++ b/__tests__/RangePassing.ps1 @@ -1,10 +1,5 @@ - -if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" } -$notWindows = ($PSVersionTable.os -and $PSVersionTable.os -notMatch 'Windows' ) - -$path = Join-Path $Env:TEMP "test.xlsx" +$path = "TestDrive:\test.xlsx" describe "Consistent passing of ranges." { - if ($notWindows) {Write-warning -message "Test uses get-service so only works on Windows" ; return} Context "Conditional Formatting" { Remove-Item -path $path -ErrorAction SilentlyContinue $excel = Get-Service | Export-Excel -Path $path -WorksheetName Services -PassThru -AutoSize -DisplayPropertySet -AutoNameRange -Title "Services on $Env:COMPUTERNAME" diff --git a/__tests__/Remove-WorkSheet.tests.ps1 b/__tests__/Remove-WorkSheet.tests.ps1 index 9458619e..b433b456 100644 --- a/__tests__/Remove-WorkSheet.tests.ps1 +++ b/__tests__/Remove-WorkSheet.tests.ps1 @@ -1,6 +1,5 @@ #Requires -Modules Pester -Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force -if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" } +#Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force Describe "Remove Worksheet" { Context "Remove a worksheet output" { @@ -11,7 +10,7 @@ Name,Age Jane,10 John,20 "@ - $xlFile1 = Join-Path $Env:TEMP "removeWorsheet1.xlsx" + $xlFile1 = "TestDrive:\RemoveWorsheet1.xlsx" Remove-Item $xlFile1 -ErrorAction SilentlyContinue $data | Export-Excel -Path $xlFile1 -WorksheetName Target1 @@ -19,7 +18,7 @@ John,20 $data | Export-Excel -Path $xlFile1 -WorksheetName Target3 $data | Export-Excel -Path $xlFile1 -WorksheetName Sheet1 - $xlFile2 = Join-Path $Env:TEMP "removeWorsheet2.xlsx" + $xlFile2 = "TestDrive:\RemoveWorsheet2.xlsx" Remove-Item $xlFile2 -ErrorAction SilentlyContinue $data | Export-Excel -Path $xlFile2 -WorksheetName Target1 @@ -66,7 +65,7 @@ John,20 it "Should delete sheet from multiple workbooks".PadRight(87) { - Get-ChildItem (Join-Path $Env:TEMP "removeWorsheet*.xlsx") | Remove-WorkSheet + Get-ChildItem "TestDrive:\RemoveWorsheet*.xlsx" | Remove-WorkSheet $actual = Get-ExcelSheetInfo -Path $xlFile1 diff --git a/__tests__/Samples/Get-CimInstanceDisk.xml b/__tests__/Samples/Get-CimInstanceDisk.xml new file mode 100644 index 00000000..9c9d5786 Binary files /dev/null and b/__tests__/Samples/Get-CimInstanceDisk.xml differ diff --git a/__tests__/Samples/Get-CimInstanceNetAdapter.xml b/__tests__/Samples/Get-CimInstanceNetAdapter.xml new file mode 100644 index 00000000..27db7a49 Binary files /dev/null and b/__tests__/Samples/Get-CimInstanceNetAdapter.xml differ diff --git a/__tests__/Samples/Get-Process.xml b/__tests__/Samples/Get-Process.xml new file mode 100644 index 00000000..763098df Binary files /dev/null and b/__tests__/Samples/Get-Process.xml differ diff --git a/__tests__/Samples/Get-Service.xml b/__tests__/Samples/Get-Service.xml new file mode 100644 index 00000000..d8181a52 Binary files /dev/null and b/__tests__/Samples/Get-Service.xml differ diff --git a/__tests__/Samples/Samples.ps1 b/__tests__/Samples/Samples.ps1 new file mode 100644 index 00000000..0d14446c --- /dev/null +++ b/__tests__/Samples/Samples.ps1 @@ -0,0 +1,53 @@ +if ($IsLinux -or $IsMacOS) { + if (-not (Get-Command 'Get-Service' -ErrorAction SilentlyContinue)) { + function Get-Service { + Import-Clixml -Path (Join-Path $PSScriptRoot Get-Service.xml) + } + } + if (-not (Get-Command 'Get-CimInstance' -ErrorAction SilentlyContinue)) { + function Get-CimInstance { + param ( + $ClassName, + $Namespace, + $class + ) + if ($ClassName -eq 'win32_logicaldisk') { + Import-Clixml -Path (Join-Path $PSScriptRoot Get-CimInstanceDisk.xml) + } + elseif ($class -eq 'MSFT_NetAdapter') { + Import-Clixml -Path (Join-Path $PSScriptRoot Get-CimInstanceNetAdapter.xml) + } + } + } + function Get-Process { + param ( + $Name, + $Id + ) + if (-not $Name) { + if ($Id) { + (Import-Clixml -Path (Join-Path $PSScriptRoot Get-Process.xml))[0] + } + else { + Import-Clixml -Path (Join-Path $PSScriptRoot Get-Process.xml) + } + } + } +} + +<# Creating the samples +Get-Service | Select-Object -First 30 | Export-Clixml -Path Get-Service.xml + +$Disk = Get-CimInstance -ClassName win32_logicaldisk | Select-Object -Property DeviceId,VolumeName, Size,Freespace +$Disk | Export-Clixml -Path Get-CimInstanceDisk.xml + +$NetAdapter = Get-CimInstance -Namespace root/StandardCimv2 -class MSFT_NetAdapter | Select-Object -Property Name, InterfaceDescription, MacAddress, LinkSpeed +$NetAdapter | Export-Clixml -Path Get-CimInstanceNetAdapter.xml + +$Process = Get-Process | Where-Object { $_.StartTime -and $_.StartInfo -and $_.Modules -and $_.Company -notlike '*Microsoft*' } | Select-Object -first 20 +$Process | Export-Clixml -Path $Path +$Process = Import-Clixml -Path $Path +$Process | foreach {$_.Threads = 'System.Diagnostics.ProcessThreadCollection'} +$Process | foreach {$_.Modules = 'System.Diagnostics.ProcessThreadCollection'} +$Process | Export-Clixml -Path $Path +#> \ No newline at end of file diff --git a/__tests__/Set-Row_Set-Column-SetFormat.tests.ps1 b/__tests__/Set-Row_Set-Column-SetFormat.tests.ps1 index b8028958..2b6bac09 100644 --- a/__tests__/Set-Row_Set-Column-SetFormat.tests.ps1 +++ b/__tests__/Set-Row_Set-Column-SetFormat.tests.ps1 @@ -1,6 +1,4 @@ -Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force -if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" } -$path = Join-Path $Env:TEMP "test.xlsx" +$path = "TestDrive:\test.xlsx" $data = ConvertFrom-Csv -InputObject @" ID,Product,Quantity,Price @@ -284,7 +282,7 @@ Describe "Set-ExcelColumn, Set-ExcelRow and Set-ExcelRange" { Describe "Conditional Formatting" { BeforeAll { - Remove-Item $path + #Remove-Item $path $data = Get-Process | Where-Object company | Select-Object company, name, pm, handles, *mem* $cfmt = New-ConditionalFormattingIconSet -Range "c:c" -ConditionalFormat ThreeIconSet -IconType Arrows $data | Export-Excel -path $Path -AutoSize -ConditionalFormat $cfmt @@ -300,7 +298,7 @@ Describe "Conditional Formatting" { } } -$path = Join-Path $Env:TEMP "test.xlsx" +$path = "TestDrive:\test.xlsx" $data2 = ConvertFrom-Csv -InputObject @" ID,Product,Quantity,Price,Total 12001,Nails,37,3.99,147.63 @@ -321,7 +319,7 @@ ID,Product,Quantity,Price,Total Describe "AutoNameRange data with a single property name" { BeforeEach { - $xlfile = Join-Path $Env:TEMP "testNamedRange.xlsx" + $xlfile = "TestDrive:\testNamedRange.xlsx" Remove-Item $xlfile -ErrorAction SilentlyContinue } @@ -359,7 +357,7 @@ Sold,ID Describe "Table Formatting" { BeforeAll { - Remove-Item $path + #Remove-Item $path $excel = $data2 | Export-excel -path $path -WorksheetName Hardware -AutoNameRange -AutoSize -BoldTopRow -FreezeTopRow -PassThru $ws = $excel.Workbook.Worksheets[1] #test showfilter & TotalSettings diff --git a/__tests__/Validation.tests.ps1 b/__tests__/Validation.tests.ps1 index 7c30e43d..8fe59eb1 100644 --- a/__tests__/Validation.tests.ps1 +++ b/__tests__/Validation.tests.ps1 @@ -1,7 +1,3 @@ -Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force -if (-not $env:TEMP) {$env:TEMP = [IO.Path]::GetTempPath() -replace "/$","" } -$notWindows = ($PSVersionTable.os -and $PSVersionTable.os -notMatch 'Windows' ) - $data = ConvertFrom-Csv -InputObject @" ID,Product,Quantity,Price 12001,Nails,37,3.99 @@ -11,7 +7,7 @@ ID,Product,Quantity,Price 12011,Crowbar,7,23.48 "@ -$path = Join-Path $Env:TEMP "DataValidation.xlsx" +$path = "TestDrive:\DataValidation.xlsx" Describe "Data validation and protection" { Context "Data Validation rules" { diff --git a/appveyor.yml b/appveyor.yml index b92d3b30..47012cc7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,17 +1,67 @@ -image: - - Visual Studio 2015 - # - Ubuntu +# Version format +version: '({build})' -build: off +# Build worker image (VM templates) +image: + - Ubuntu1804 + - 'Visual Studio 2019' -test_script: - - ps: .\DoTests.ps1 - - pwsh: .\DoTests.ps1 -DontCreateZip +# Fix CRLF on Windows +init: + - cmd: 'git config --global --unset core.autocrlf' +# To disable automatic builds +build: off + +# Skipping commits with particular message or from specific user skip_commits: + message: '/\[skip av\]/' files: - - README.md + - '*.md' + +# Including commits with particular message or from specific user +#only_commits: +# message: '/\[build\]/' # Start a new build if message contains 'build' + +# Scripts that run after cloning repository +install: + - ps: 'Install-Module -Name Pester -Force -SkipPublisherCheck' + - ps: 'Install-Module -Name Assert -Force' + # PowerShell Core + - ps: '& .\__tests__\InstallPowerShell.ps1 -Version "7.0.0-preview.3"' # Install other PowerShell Core version (Optional) + - pwsh: 'Install-Module -Name Pester -Force' + - pwsh: 'Install-Module -Name Assert -Force' + +# To run your custom scripts instead of automatic tests +test_script: + - ps: '& .\__tests__\CI.ps1 -Test' + - pwsh: '& .\__tests__\CI.ps1 -Test' + - ps: '& .\__tests__\CI.ps1 -Finalize' # Collect and upload results + +# Deploy +deploy_script: + - ps: '& .\__tests__\CI.ps1 -Artifact' + #- ps: '$null = Install-PackageProvider -Name NuGet -Force ; & .\__tests__\Publish.ps1' -artifacts: - - path: ImportExcel*.zip - name: ImportExcel +# Linux setup +for: + - + matrix: + only: + - image: Ubuntu1804 + # Install other PowerShell Core version (Optional) + init: + - sh: 'sudo apt-get -qq update && sudo apt-get -qq install powershell-preview && sudo rm /usr/bin/pwsh && sudo ln -s /opt/microsoft/powershell/7-preview/pwsh /usr/bin/pwsh' + - sh: 'export LANG=en_US.UTF-8' # Fix for PowerShell 7.0.0-preview.2, Remove if using other version. + # Scripts that run after cloning repository + install: + - pwsh: '& .\__tests__\CI.ps1 -Initialize' # Set AppVeyor build version + - pwsh: 'Install-Module -Name Pester -Force' + - pwsh: 'Install-Module -Name Assert -Force' + # To run your custom scripts instead of automatic tests + test_script: + - pwsh: '& .\__tests__\CI.ps1 -Test' + - pwsh: '& .\__tests__\CI.ps1 -Finalize' # Collect and upload results + # Skip Deploy + deploy_script: + - pwsh: '"Deploy skiped on Linux."' \ No newline at end of file diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 69f45b6a..c125bceb 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1,44 +1,93 @@ -jobs: - - job: Build_PS_Win2016 - pool: - vmImage: vs2017-win2016 - steps: - - powershell: | - .\DoTests.ps1 - displayName: 'Run Tests on Windows' - - # - job: Build_PSCore_Ubuntu1604 - - # pool: - # vmImage: ubuntu-16.04 - - # steps: - # - script: | - # curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - - # curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list - # sudo apt-get update - # sudo apt-get install -y powershell - # displayName: 'Install PowerShell Core' - - # - script: | - # pwsh -c '.\DoTests.ps1' - # displayName: 'Run Tests on Linux' - - # - job: Build_PSCore_MacOS1013 - # pool: - # vmImage: xcode9-macos10.13 - # steps: - # - script: | - # brew update - # brew tap caskroom/cask - # brew cask install powershell - # displayName: 'Install PowerShell Core' - - # - script: | - # pwsh -c '.\DoTests.ps1' - # displayName: 'Run Tests on macOS' +# Starter pipeline +# Start with a minimal pipeline that you can customize to build and deploy your code. +# Add steps that build, run tests, deploy, and more: +# https://aka.ms/yaml trigger: + branches: + include: + - '*' + # - master + # - releases/* paths: exclude: - README.md + - CHANGELOG.md + +jobs: + - job: Windows + pool: + vmImage: 'windows-latest' + + steps: + - powershell: 'Install-Module -Name Pester -Force -SkipPublisherCheck' + displayName: 'Update Pester' + - powershell: './__tests__/CI.ps1 -Test' + displayName: 'Install and Test' + + - task: PublishTestResults@2 + inputs: + testResultsFormat: 'NUnit' + testResultsFiles: '**/TestResults*.xml' + failTaskOnFailedTests: true + + - powershell: './__tests__/CI.ps1 -Artifact' + displayName: 'Prepare Artifact' + - task: PublishPipelineArtifact@1 + inputs: + targetPath: '$(Build.ArtifactStagingDirectory)' + artifact: 'Modules' + - task: PublishPipelineArtifact@1 + inputs: + targetPath: '$(Build.SourcesDirectory)' + artifact: 'Source' + + - job: WindowsPSCore + pool: + vmImage: 'windows-latest' + + steps: + - pwsh: 'Install-Module -Name Pester -Force' + displayName: 'Update Pester' + - pwsh: './__tests__/CI.ps1 -Test' + displayName: 'Install and Test' + + - task: PublishTestResults@2 + inputs: + testResultsFormat: 'NUnit' + testResultsFiles: '**/TestResults*.xml' + failTaskOnFailedTests: true + + - job: Ubuntu + pool: + vmImage: 'ubuntu-latest' + + steps: + - powershell: 'Install-Module -Name Pester -Force' + displayName: 'Update Pester' + - powershell: './__tests__/CI.ps1 -Test' + displayName: 'Install and Test' + + - task: PublishTestResults@2 + inputs: + testResultsFormat: 'NUnit' + testResultsFiles: '**/TestResults*.xml' + failTaskOnFailedTests: true + + - job: macOS + pool: + vmImage: 'macOS-latest' + + steps: + - script: brew install mono-libgdiplus + displayName: 'Install mono-libgdiplus' + - powershell: 'Install-Module -Name Pester -Force' + displayName: 'Update Pester' + - powershell: './__tests__/CI.ps1 -Test' + displayName: 'Install and Test' + + - task: PublishTestResults@2 + inputs: + testResultsFormat: 'NUnit' + testResultsFiles: '**/TestResults*.xml' + failTaskOnFailedTests: true \ No newline at end of file diff --git a/filelist.txt b/filelist.txt index ebe3d59e..e6bd0dc9 100644 --- a/filelist.txt +++ b/filelist.txt @@ -2,17 +2,18 @@ *.psd1 *.psm1 AddConditionalFormatting.ps1 +AddDataValidation.ps1 Charting.ps1 ColorCompletion.ps1 -Compare-Worksheet.ps1 +Compare-WorkSheet.ps1 ConvertExcelToImageFile.ps1 ConvertFromExcelData.ps1 ConvertFromExcelToSQLInsert.ps1 ConvertToExcelXlsx.ps1 Copy-ExcelWorkSheet.ps1 -Export-Charts.ps1 Export-Excel.ps1 Export-ExcelSheet.ps1 +Export-StocksToExcel.ps1 Get-ExcelColumnName.ps1 Get-ExcelSheetInfo.ps1 Get-ExcelWorkbookInfo.ps1 @@ -32,10 +33,12 @@ Open-ExcelPackage.ps1 Pivot.ps1 PivotTable.ps1 Plot.ps1 +RemoveWorksheet.ps1 Send-SQLDataToExcel.ps1 Set-CellStyle.ps1 Set-Column.ps1 Set-Row.ps1 +Set-WorkSheetProtection.ps1 SetFormat.ps1 TrackingUtils.ps1 Update-FirstObjectProperties.ps1 \ No newline at end of file