From ef0dc67726e8bace1891b53e21e402656a3613c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Sun, 27 May 2018 16:47:50 +0100 Subject: [PATCH 01/20] Add -Description parameter - Support for #171 --- .../CatalogItems/Write-RsCatalogItem.ps1 | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 index c62389ad..72f3d8e2 100644 --- a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 +++ b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 @@ -18,6 +18,9 @@ function Write-RsCatalogItem .PARAMETER RsFolder Folder on reportserver to upload the item to. + .PARAMETER Description + Specify the description to be added to the data source. + .PARAMETER Overwrite Overwrite the old entry, if an existing catalog item with same name exists at the specified destination. @@ -52,6 +55,9 @@ function Write-RsCatalogItem [string] $RsFolder, + [string] + $Description, + [Alias('Override')] [switch] $Overwrite, @@ -69,6 +75,8 @@ function Write-RsCatalogItem Begin { $Proxy = New-RsWebServiceProxyHelper -BoundParameters $PSBoundParameters + $namespace = $proxy.GetType().Namespace + $propertyDataType = "$namespace.Property" } Process @@ -187,11 +195,18 @@ function Write-RsCatalogItem #region Upload other stuff else { + $additionalProperties = New-Object System.Collections.Generic.List[$propertyDataType] + + $descriptionProperty = New-Object $propertyDataType + $descriptionProperty.Name = 'Description' + $descriptionProperty.Value = $Description + $additionalProperties.Add($descriptionProperty) + $bytes = [System.IO.File]::ReadAllBytes($EntirePath) $warnings = $null try { - $Proxy.CreateCatalogItem($itemType, $itemName, $RsFolder, $Overwrite, $bytes, $null, [ref]$warnings) | Out-Null + $Proxy.CreateCatalogItem($itemType, $itemName, $RsFolder, $Overwrite, $bytes, $additionalProperties, [ref]$warnings) | Out-Null if ($warnings) { foreach ($warn in $warnings) From 2701e442ffd80fdba82e813b038bb8d05c620e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Sun, 27 May 2018 17:40:07 +0100 Subject: [PATCH 02/20] Allow upload of jpg/png files Issue #140 --- .../CatalogItems/Write-RsCatalogItem.ps1 | 77 ++++++++++++++----- 1 file changed, 59 insertions(+), 18 deletions(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 index 72f3d8e2..9007f53a 100644 --- a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 +++ b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 @@ -96,7 +96,8 @@ function Write-RsCatalogItem if ($itemType -ne "Report" -and $itemType -ne "DataSource" -and - $itemType -ne "DataSet") + $itemType -ne "DataSet" -and + $itemType -ne "Resource") { throw "Invalid item specified! You can only upload Report, DataSource and DataSet using this command!" } @@ -195,29 +196,69 @@ function Write-RsCatalogItem #region Upload other stuff else { - $additionalProperties = New-Object System.Collections.Generic.List[$propertyDataType] + if ($itemType -eq 'Resource') + { + $additionalProperties = New-Object System.Collections.Generic.List[$propertyDataType] + + $descriptionProperty = New-Object $propertyDataType + $descriptionProperty.Name = 'MimeType' + if ($item.Extension -eq "png") + { + $descriptionProperty.Value = 'image/png' + } + else + { + $descriptionProperty.Value = 'image/jpeg' + } - $descriptionProperty = New-Object $propertyDataType - $descriptionProperty.Name = 'Description' - $descriptionProperty.Value = $Description - $additionalProperties.Add($descriptionProperty) + $additionalProperties.Add($descriptionProperty) - $bytes = [System.IO.File]::ReadAllBytes($EntirePath) - $warnings = $null - try - { - $Proxy.CreateCatalogItem($itemType, $itemName, $RsFolder, $Overwrite, $bytes, $additionalProperties, [ref]$warnings) | Out-Null - if ($warnings) + $bytes = [System.IO.File]::ReadAllBytes($EntirePath) + $warnings = $null + try + { + $Proxy.CreateCatalogItem($itemType, $item.Name, $RsFolder, $Overwrite, $bytes, $descriptionProperty, [ref]$warnings) + if ($warnings) + { + foreach ($warn in $warnings) + { + Write-Warning $warn.Message + } + } + } + catch { - foreach ($warn in $warnings) - { - Write-Warning $warn.Message - } + throw (New-Object System.Exception("Failed to create resource item $($item.Name): $($_.Exception.Message)", $_.Exception)) } } - catch + else { - throw (New-Object System.Exception("Failed to create catalog item: $($_.Exception.Message)", $_.Exception)) + + $additionalProperties = New-Object System.Collections.Generic.List[$propertyDataType] + + $descriptionProperty = New-Object $propertyDataType + $descriptionProperty.Name = 'Description' + $descriptionProperty.Value = $Description + $additionalProperties.Add($descriptionProperty) + + $bytes = [System.IO.File]::ReadAllBytes($EntirePath) + $warnings = $null + try + { + $Proxy.CreateCatalogItem($itemType, $itemName, $RsFolder, $Overwrite, $bytes, $additionalProperties, [ref]$warnings) | Out-Null + if ($warnings) + { + foreach ($warn in $warnings) + { + Write-Warning $warn.Message + } + } + } + catch + { + throw (New-Object System.Exception("Failed to create catalog item $itemName : $($_.Exception.Message)", $_.Exception)) + } + } } #endregion Upload other stuff From 1a7185919574e43b14de7aade4c75f93d61cb581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Sun, 27 May 2018 17:41:01 +0100 Subject: [PATCH 03/20] Update command description to include jpg/png formats --- .../Functions/CatalogItems/Write-RsCatalogItem.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 index 9007f53a..6bd54957 100644 --- a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 +++ b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 @@ -10,7 +10,7 @@ function Write-RsCatalogItem .DESCRIPTION Uploads an item from disk to a report server. - Currently, we are only supporting Report, DataSource and DataSet for uploads + Currently, we are only supporting Report, DataSource, DataSet and jpg/png for uploads .PARAMETER Path Path to item to upload on disk. From 16a5c5a336420e91993d1ec9b6ffb42f93d42dc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Sun, 27 May 2018 17:49:39 +0100 Subject: [PATCH 04/20] To support jpg/png when uploading whole folder --- .../CatalogItems/Write-RsFolderContent.ps1 | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Write-RsFolderContent.ps1 b/ReportingServicesTools/Functions/CatalogItems/Write-RsFolderContent.ps1 index b2bb01a1..2afb565c 100644 --- a/ReportingServicesTools/Functions/CatalogItems/Write-RsFolderContent.ps1 +++ b/ReportingServicesTools/Functions/CatalogItems/Write-RsFolderContent.ps1 @@ -7,39 +7,39 @@ function Write-RsFolderContent <# .SYNOPSIS Uploads all items in a folder on disk to a report server. - + .DESCRIPTION Uploads all items in a folder on disk to a report server. - Currently, we are only supporting Report, DataSource and DataSet for uploads - + Currently, we are only supporting Report, DataSource, DataSet and jpg/png for uploads + .PARAMETER Recurse A description of the Recurse parameter. - + .PARAMETER Path Path to folder which contains items to upload on disk. - + .PARAMETER RsFolder Folder on reportserver to upload the item to. .PARAMETER Overwrite Overwrite the old entry, if an existing catalog item with same name exists at the specified destination. - + .PARAMETER ReportServerUri Specify the Report Server URL to your SQL Server Reporting Services Instance. Use the "Connect-RsReportServer" function to set/update a default value. - + .PARAMETER Credential Specify the credentials to use when connecting to the Report Server. Use the "Connect-RsReportServer" function to set/update a default value. - + .PARAMETER Proxy Report server proxy to use. Use "New-RsWebServiceProxy" to generate a proxy object for reuse. Useful when repeatedly having to connect to multiple different Report Server. - + .EXAMPLE Write-RsFolderContent -ReportServerUri 'http://localhost/reportserver_sql2012' -Path c:\monthlyreports -RsFolder /monthlyReports - + Description ----------- Uploads all reports under c:\monthlyreports to folder /monthlyReports. @@ -116,16 +116,19 @@ function Write-RsFolderContent throw (New-Object System.Exception("Failed to create folder '$($item.Name)' in '$parentFolder': $($_.Exception.Message)", $_.Exception)) } } - + if ($item.Extension -eq ".rdl" -or $item.Extension -eq ".rsds" -or $item.Extension -eq ".rsd" -or - $item.Extension -eq ".rds") + $item.Extension -eq ".rds" -or + $item.Extension -eq ".jpg" -or + $item.Extension -eq ".jpeg" -or + $item.Extension -eq ".png" ) { $relativePath = Clear-Substring -string $item.FullName -substring $sourceFolder.FullName.TrimEnd("\") -position front $relativePath = Clear-Substring -string $relativePath -substring ("\" + $item.Name) -position back $relativePath = $relativePath.replace("\", "/") - + if ($RsFolder -eq "/" -and $relativePath -ne "") { $parentFolder = $relativePath From d1c9ae77950c5395e10a1e11b0f7629a095665e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Sun, 27 May 2018 17:53:56 +0100 Subject: [PATCH 05/20] Error message improved - Include failed object Fixes #158 --- .../Functions/CatalogItems/Write-RsCatalogItem.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 index 6bd54957..71329040 100644 --- a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 +++ b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 @@ -228,7 +228,7 @@ function Write-RsCatalogItem } catch { - throw (New-Object System.Exception("Failed to create resource item $($item.Name): $($_.Exception.Message)", $_.Exception)) + throw (New-Object System.Exception("Failed to create resource item $($item.FullName): $($_.Exception.Message)", $_.Exception)) } } else @@ -256,7 +256,7 @@ function Write-RsCatalogItem } catch { - throw (New-Object System.Exception("Failed to create catalog item $itemName : $($_.Exception.Message)", $_.Exception)) + throw (New-Object System.Exception("Failed to create catalog item $($item.FullName) : $($_.Exception.Message)", $_.Exception)) } } From 6c2ea6a78624681e56a4a0f120b5361d0a81f488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Sun, 27 May 2018 18:03:38 +0100 Subject: [PATCH 06/20] Fix parameter description --- .../Functions/CatalogItems/Write-RsCatalogItem.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 index 71329040..b5f8ed6c 100644 --- a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 +++ b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 @@ -19,7 +19,7 @@ function Write-RsCatalogItem Folder on reportserver to upload the item to. .PARAMETER Description - Specify the description to be added to the data source. + Specify the description to be added to the report. .PARAMETER Overwrite Overwrite the old entry, if an existing catalog item with same name exists at the specified destination. From f88ae7b3b94dfbc60f279cc49cfa8865e24fd1a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Sun, 27 May 2018 18:04:26 +0100 Subject: [PATCH 07/20] Add -Description parameter - Support for #171 Support for #171 but for Rest --- .../CatalogItems/Rest/Write-RsRestCatalogItem.ps1 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ReportingServicesTools/Functions/CatalogItems/Rest/Write-RsRestCatalogItem.ps1 b/ReportingServicesTools/Functions/CatalogItems/Rest/Write-RsRestCatalogItem.ps1 index 1d082281..200b355b 100644 --- a/ReportingServicesTools/Functions/CatalogItems/Rest/Write-RsRestCatalogItem.ps1 +++ b/ReportingServicesTools/Functions/CatalogItems/Rest/Write-RsRestCatalogItem.ps1 @@ -16,6 +16,9 @@ function Write-RsRestCatalogItem .PARAMETER RsFolder Folder on reportserver to upload the item to. + .PARAMETER Description + Specify the description to be added to the report. + .PARAMETER Overwrite Overwrite the old entry, if an existing catalog item with same name exists at the specified destination. @@ -73,6 +76,9 @@ function Write-RsRestCatalogItem [string] $RsFolder, + [string] + $Description, + [Alias('Override')] [switch] $Overwrite, @@ -226,6 +232,7 @@ function Write-RsRestCatalogItem "Content" = [System.Convert]::ToBase64String($bytes); "ContentType"=""; "Name" = $itemName; + "Description" = $Description "Path" = $itemPath; } } From a4253a44af7d3e35e234ed7501afefed0f4e4d16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Sun, 27 May 2018 19:36:32 +0100 Subject: [PATCH 08/20] Improve description and validation --- .../Functions/CatalogItems/Write-RsCatalogItem.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 index b5f8ed6c..228279a0 100644 --- a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 +++ b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 @@ -99,7 +99,7 @@ function Write-RsCatalogItem $itemType -ne "DataSet" -and $itemType -ne "Resource") { - throw "Invalid item specified! You can only upload Report, DataSource and DataSet using this command!" + throw "Invalid item specified! You can only upload Report, DataSource, DataSet and jpg/png files using this command!" } if ($RsFolder -eq "/") @@ -196,7 +196,7 @@ function Write-RsCatalogItem #region Upload other stuff else { - if ($itemType -eq 'Resource') + if ($itemType -eq 'Resource' -and $item.Extension -in ('png', 'jpg', 'jpeg')) { $additionalProperties = New-Object System.Collections.Generic.List[$propertyDataType] From 8b8facfa623f1186082bf391fd459be8dc0ab80e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Sun, 27 May 2018 19:39:13 +0100 Subject: [PATCH 09/20] Missed the dot before extension --- .../Functions/CatalogItems/Write-RsCatalogItem.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 index 228279a0..4524c42d 100644 --- a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 +++ b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 @@ -196,13 +196,13 @@ function Write-RsCatalogItem #region Upload other stuff else { - if ($itemType -eq 'Resource' -and $item.Extension -in ('png', 'jpg', 'jpeg')) + if ($itemType -eq 'Resource' -and $item.Extension -in ('.png', '.jpg', '.jpeg')) { $additionalProperties = New-Object System.Collections.Generic.List[$propertyDataType] $descriptionProperty = New-Object $propertyDataType $descriptionProperty.Name = 'MimeType' - if ($item.Extension -eq "png") + if ($item.Extension -eq ".png") { $descriptionProperty.Value = 'image/png' } From 07cd88181892764fc7f0fd971791c6ad4a1f54ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Sun, 27 May 2018 21:28:43 +0100 Subject: [PATCH 10/20] A better validation of extensions Keep the behavior of non-supported files types like before --- .../CatalogItems/Write-RsCatalogItem.ps1 | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 index 4524c42d..52bfbe6e 100644 --- a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 +++ b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 @@ -94,10 +94,18 @@ function Write-RsCatalogItem $itemType = Get-ItemType $item.Extension $itemName = $item.BaseName - if ($itemType -ne "Report" -and - $itemType -ne "DataSource" -and - $itemType -ne "DataSet" -and - $itemType -ne "Resource") + if ( + ( + $itemType -ne "Report" -and + $itemType -ne "DataSource" -and + $itemType -ne "DataSet" -and + $itemType -ne "Resource" + ) -or + ( + $itemType -eq "Resource" -and + $item.Extension -notin ('.png', '.jpg', '.jpeg') + ) + ) { throw "Invalid item specified! You can only upload Report, DataSource, DataSet and jpg/png files using this command!" } @@ -196,7 +204,7 @@ function Write-RsCatalogItem #region Upload other stuff else { - if ($itemType -eq 'Resource' -and $item.Extension -in ('.png', '.jpg', '.jpeg')) + if ($itemType -eq 'Resource') { $additionalProperties = New-Object System.Collections.Generic.List[$propertyDataType] From fc7df6d05f31b6d757654f59e19da1908a209aff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Tue, 29 May 2018 22:26:52 +0100 Subject: [PATCH 11/20] Include -Description parameter on tests --- .../Write-RsCatalogItem.Tests.ps1 | 49 ++++++++++--------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/Tests/CatalogItems/Write-RsCatalogItem.Tests.ps1 b/Tests/CatalogItems/Write-RsCatalogItem.Tests.ps1 index 474b9fbe..ba6d4d63 100644 --- a/Tests/CatalogItems/Write-RsCatalogItem.Tests.ps1 +++ b/Tests/CatalogItems/Write-RsCatalogItem.Tests.ps1 @@ -2,29 +2,30 @@ # Licensed under the MIT License (MIT) Describe "Write-RsCatalogItem" { - + Context "Write-RsCatalogItem with min parameters"{ $folderName = 'SutWriteRsCatalogItem_MinParameters' + [guid]::NewGuid() New-RsFolder -Path / -FolderName $folderName $folderPath = '/' + $folderName $localPath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources' - + It "Should upload a local report in Report Server" { - $localReportPath = $localPath + '\emptyReport.rdl' - Write-RsCatalogItem -Path $localReportPath -RsFolder $folderPath + $localReportPath = $localPath + '\emptyReport.rdl' + Write-RsCatalogItem -Path $localReportPath -RsFolder $folderPath -Description 'newDescription' $uploadedReport = (Get-RsFolderContent -RsFolder $folderPath ) | Where-Object TypeName -eq 'Report' $uploadedReport.Name | Should Be 'emptyReport' + $uploadedReport.Description | Should Be 'newDescription' } It "Should upload a local RsDataSource in Report Server" { - $localDataSourcePath = $localPath + '\SutWriteRsFolderContent_DataSource.rsds' + $localDataSourcePath = $localPath + '\SutWriteRsFolderContent_DataSource.rsds' Write-RsCatalogItem -Path $localDataSourcePath -RsFolder $folderPath $uploadedDataSource = (Get-RsFolderContent -RsFolder $folderPath ) | Where-Object TypeName -eq 'DataSource' $uploadedDataSource.Name | Should Be 'SutWriteRsFolderContent_DataSource' } It "Should upload a local DataSet in Report Server" { - $localDataSetPath = $localPath + '\UnDataset.rsd' + $localDataSetPath = $localPath + '\UnDataset.rsd' Write-RsCatalogItem -Path $localDataSetPath -RsFolder $folderPath $uploadedDataSet = (Get-RsFolderContent -RsFolder $folderPath ) | Where-Object TypeName -eq 'DataSet' $uploadedDataSet.Name | Should Be 'UnDataset' @@ -37,13 +38,14 @@ Describe "Write-RsCatalogItem" { $folderName = 'SutWriteRsCatalogItem_ProxyParameter' + [guid]::NewGuid() New-RsFolder -Path / -FolderName $folderName $folderPath = '/' + $folderName - $proxy = New-RsWebServiceProxy - $localReportPath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources\emptyReport.rdl' - Write-RsCatalogItem -Path $localReportPath -RsFolder $folderPath -Proxy $proxy - + $proxy = New-RsWebServiceProxy + $localReportPath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources\emptyReport.rdl' + Write-RsCatalogItem -Path $localReportPath -RsFolder $folderPath -Proxy $proxy -Description 'newDescription' + It "Should upload a local Report in ReportServer with Proxy Parameter" { $uploadedReport = (Get-RsFolderContent -RsFolder $folderPath ) | Where-Object TypeName -eq 'Report' $uploadedReport.Name | Should Be 'emptyReport' + $uploadedReport.Description | Should Be 'newDescription' } # Removing folders used for testing Remove-RsCatalogItem -RsFolder $folderPath -Confirm:$false @@ -53,14 +55,15 @@ Describe "Write-RsCatalogItem" { $folderName = 'SutWriteRsCatalogItem_ReporServerUrioProxyParameters' + [guid]::NewGuid() New-RsFolder -Path / -FolderName $folderName $folderPath = '/' + $folderName - $proxy = New-RsWebServiceProxy + $proxy = New-RsWebServiceProxy $reportServerUri = 'http://localhost/reportserver' - $localReportPath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources\emptyReport.rdl' - Write-RsCatalogItem -Path $localReportPath -RsFolder $folderPath -Proxy $proxy -ReportServerUri $reportServerUri - + $localReportPath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources\emptyReport.rdl' + Write-RsCatalogItem -Path $localReportPath -RsFolder $folderPath -Proxy $proxy -ReportServerUri $reportServerUri -Description 'newDescription' + It "Should upload a local Report in ReportServer with Proxy and ReportServerUri Parameter" { $uploadedReport = (Get-RsFolderContent -RsFolder $folderPath ) | Where-Object TypeName -eq 'Report' $uploadedReport.Name | Should Be 'emptyReport' + $uploadedReport.Description | Should Be 'newDescription' } # Removing folders used for testing Remove-RsCatalogItem -RsFolder $folderPath -Confirm:$false @@ -71,12 +74,13 @@ Describe "Write-RsCatalogItem" { New-RsFolder -Path / -FolderName $folderName $folderPath = '/' + $folderName $reportServerUri = 'http://localhost/reportserver' - $localReportPath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources\emptyReport.rdl' - Write-RsCatalogItem -Path $localReportPath -RsFolder $folderPath -ReportServerUri $reportServerUri - + $localReportPath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources\emptyReport.rdl' + Write-RsCatalogItem -Path $localReportPath -RsFolder $folderPath -ReportServerUri $reportServerUri -Description 'newDescription' + It "Should upload a local Report in ReportServer with ReportServerUri Parameter" { $uploadedReport = (Get-RsFolderContent -RsFolder $folderPath ) | Where-Object TypeName -eq 'Report' $uploadedReport.Name | Should Be 'emptyReport' + $uploadedReport.Description | Should Be 'newDescription' } # Removing folders used for testing Remove-RsCatalogItem -RsFolder $folderPath -Confirm:$false @@ -86,15 +90,16 @@ Describe "Write-RsCatalogItem" { $folderName = 'SutWriteCatalogItem_OverwriteParameter' + [guid]::NewGuid() New-RsFolder -Path / -FolderName $folderName $folderPath = '/' + $folderName - $localReportPath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources\emptyReport.rdl' - Write-RsCatalogItem -Path $localReportPath -RsFolder $folderPath - $localDataSourcePath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources\SutWriteRsFolderContent_DataSource.rsds' - + $localReportPath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources\emptyReport.rdl' + Write-RsCatalogItem -Path $localReportPath -RsFolder $folderPath -Description 'newDescription' + $localDataSourcePath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources\SutWriteRsFolderContent_DataSource.rsds' + It "Should upload a local Report in ReportServer with Overwrite Parameter" { { Write-RsCatalogItem -Path $localReportPath -RsFolder $folderPath } | Should Throw - { Write-RsCatalogItem -Path $localReportPath -RsFolder $folderPath -Overwrite } | Should Not Throw + { Write-RsCatalogItem -Path $localReportPath -RsFolder $folderPath -Overwrite -Description 'overwrittenDescription' } | Should Not Throw $overwrittenReport = (Get-RsFolderContent -RsFolder $folderPath ) | Where-Object TypeName -eq 'Report' $overwrittenReport.Name | Should Be 'emptyReport' + $overwrittenReport.Description | Should Be 'overwrittenDescription' } # Removing folders used for testing Remove-RsCatalogItem -RsFolder $folderPath -Confirm:$false From 0ae386e7a6ded7032a5bd42b8f855d5df7f7bc2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Tue, 29 May 2018 22:47:52 +0100 Subject: [PATCH 12/20] Add tests for upload images (JPG/PNG) --- .../Write-RsCatalogItem.Tests.ps1 | 32 ++++++++++++++++++ .../imagesResources/PowerShellHero.jpg | Bin 0 -> 41526 bytes .../testResources/imagesResources/SSRS.png | Bin 0 -> 37221 bytes 3 files changed, 32 insertions(+) create mode 100644 Tests/CatalogItems/testResources/imagesResources/PowerShellHero.jpg create mode 100644 Tests/CatalogItems/testResources/imagesResources/SSRS.png diff --git a/Tests/CatalogItems/Write-RsCatalogItem.Tests.ps1 b/Tests/CatalogItems/Write-RsCatalogItem.Tests.ps1 index ba6d4d63..0dcfc3ae 100644 --- a/Tests/CatalogItems/Write-RsCatalogItem.Tests.ps1 +++ b/Tests/CatalogItems/Write-RsCatalogItem.Tests.ps1 @@ -104,4 +104,36 @@ Describe "Write-RsCatalogItem" { # Removing folders used for testing Remove-RsCatalogItem -RsFolder $folderPath -Confirm:$false } + + + Context "Write-RsCatalogItem with images"{ + $jpgFolderName = 'SutWriteCatalogItem_JPGimages' + [guid]::NewGuid() + New-RsFolder -Path / -FolderName $jpgFolderName + $jpgFolderPath = '/' + $jpgFolderName + $localJPGImagePath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources\imagesResources\PowerShellHero.jpg' + Write-RsCatalogItem -Path $localJPGImagePath -RsFolder $jpgFolderPath + + It "Should upload a local jpg image in ReportServer with Overwrite Parameter" { + $jpgImageResource = (Get-RsFolderContent -RsFolder $jpgFolderPath ) | Where-Object TypeName -eq 'Resource' + $jpgImageResource.Name | Should Be 'PowerShellHero.jpg' + $jpgImageResource.ItemMetadata.Name | Should Be 'MIMEType' + $jpgImageResource.ItemMetadata.Value | Should Be 'image/jpeg' + } + + $pngFolderName = 'SutWriteCatalogItem_PNGimages' + [guid]::NewGuid() + New-RsFolder -Path / -FolderName $pngFolderName + $pngFolderPath = '/' + $pngFolderName + $localPNGImagePath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources\imagesResources\SSRS.png' + Write-RsCatalogItem -Path $localPNGImagePath -RsFolder $pngFolderPath + + It "Should upload a local png image in ReportServer with Overwrite Parameter" { + $jpgImageResource = (Get-RsFolderContent -RsFolder $pngFolderPath ) | Where-Object TypeName -eq 'Resource' + $jpgImageResource.Name | Should Be 'SSRS.png' + $jpgImageResource.ItemMetadata.Name | Should Be 'MIMEType' + $jpgImageResource.ItemMetadata.Value | Should Be 'image/png' + } + + # Removing folders used for testing + Remove-RsCatalogItem -RsFolder $folderPath -Confirm:$false + } } \ No newline at end of file diff --git a/Tests/CatalogItems/testResources/imagesResources/PowerShellHero.jpg b/Tests/CatalogItems/testResources/imagesResources/PowerShellHero.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f4731dbebd484e39681b3fbb01f070459ebb22ba GIT binary patch literal 41526 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 literal 0 HcmV?d00001 diff --git a/Tests/CatalogItems/testResources/imagesResources/SSRS.png b/Tests/CatalogItems/testResources/imagesResources/SSRS.png new file mode 100644 index 0000000000000000000000000000000000000000..de401a93b9be0840ef15010c8123913ae229ed47 GIT binary patch literal 37221 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 literal 0 HcmV?d00001 From 5fed5a93cc6ee7b73ec99d1a49c6ef60f82b0cd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Tue, 29 May 2018 23:17:12 +0100 Subject: [PATCH 13/20] Add test to upload JPG/PNG files --- .../Rest/Write-RsRestCatalogItem.Tests.ps1 | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Tests/CatalogItems/Rest/Write-RsRestCatalogItem.Tests.ps1 b/Tests/CatalogItems/Rest/Write-RsRestCatalogItem.Tests.ps1 index b190a8e5..6e4c89c8 100644 --- a/Tests/CatalogItems/Rest/Write-RsRestCatalogItem.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Write-RsRestCatalogItem.Tests.ps1 @@ -108,6 +108,18 @@ Describe "Write-RsRestCatalogItem" { Write-RsRestCatalogItem -ReportPortalUri $reportPortalUri -Path $itemPath -RsFolder $rsFolderPath { Write-RsRestCatalogItem -ReportPortalUri $reportPortalUri -Path $itemPath -RsFolder $rsFolderPath -Verbose } | Should Throw } + + It "Should upload a local JPG file" { + $itemPath = $localPath + '\imageResources\PowerShellHero.jpg' + Write-RsRestCatalogItem -ReportPortalUri $reportPortalUri -Path $itemPath -RsFolder $rsFolderPath -Verbose + VerifyCatalogItemExists -itemName 'PowerShellHero.jpg' -itemType 'Resource' -folderPath $rsFolderPath -reportServerUri $reportServerUri + } + + It "Should upload a local PNG file" { + $itemPath = $localPath + '\imageResources\SSRS.png' + Write-RsRestCatalogItem -ReportPortalUri $reportPortalUri -Path $itemPath -RsFolder $rsFolderPath -Verbose + VerifyCatalogItemExists -itemName 'SSRS.png' -itemType 'Resource' -folderPath $rsFolderPath -reportServerUri $reportServerUri + } } Context "WebSession parameter" { @@ -167,6 +179,18 @@ Describe "Write-RsRestCatalogItem" { VerifyCatalogItemExists -itemName 'NewKPI' -itemType 'Kpi' -folderPath $rsFolderPath -reportServerUri $reportServerUri } + It "Should upload a local JPG file" { + $itemPath = $localPath + '\imageResources\PowerShellHero.jpg' + Write-RsRestCatalogItem -WebSession $webSession -Path $itemPath -RsFolder $rsFolderPath -Verbose + VerifyCatalogItemExists -itemName 'PowerShellHero.jpg' -itemType 'Resource' -folderPath $rsFolderPath -reportServerUri $reportServerUri + } + + It "Should upload a local PNG file" { + $itemPath = $localPath + '\imageResources\SSRS.png' + Write-RsRestCatalogItem -WebSession $webSession -Path $itemPath -RsFolder $rsFolderPath -Verbose + VerifyCatalogItemExists -itemName 'SSRS.png' -itemType 'Resource' -folderPath $rsFolderPath -reportServerUri $reportServerUri + } + It "Should overwrite a file when -Overwrite is specified" { $itemPath = Join-Path -Path $localPath -ChildPath emptyReport.rdl Write-RsRestCatalogItem -WebSession $webSession -Path $itemPath -RsFolder $rsFolderPath From d6fddbc3508d7bf389c538e22f7606412d77a5f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Wed, 30 May 2018 00:56:31 +0100 Subject: [PATCH 14/20] Since we add new folder now the value must be 3 --- Tests/CatalogItems/Write-RsFolderContent.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/CatalogItems/Write-RsFolderContent.Tests.ps1 b/Tests/CatalogItems/Write-RsFolderContent.Tests.ps1 index 10c61980..adb84860 100644 --- a/Tests/CatalogItems/Write-RsFolderContent.Tests.ps1 +++ b/Tests/CatalogItems/Write-RsFolderContent.Tests.ps1 @@ -82,7 +82,7 @@ Describe "Write-RsFolderContent" { Write-RsFolderContent -Path $localReportPath -RsFolder $folderPath -Recurse It "Should upload a local subFolder with Recurse Parameter" { $uploadedFolders = (Get-RsFolderContent -RsFolder $folderPath -Recurse ) | Where-Object TypeName -eq 'Folder' | Sort-Object -Property Name -Descending - $uploadedFolders.Count | Should Be 2 + $uploadedFolders.Count | Should Be 3 $uploadedFolders[0].Name | Should Be 'testResources2' $uploadedFolders[1].Name | Should Be 'datasources' } From bb5bb8d16b538e6ce855bf752c62fca2a7fc9df3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Wed, 30 May 2018 08:35:20 +0100 Subject: [PATCH 15/20] Format and fix error on Recurse Test folder names --- .../Write-RsFolderContent.Tests.ps1 | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/Tests/CatalogItems/Write-RsFolderContent.Tests.ps1 b/Tests/CatalogItems/Write-RsFolderContent.Tests.ps1 index adb84860..b3a5de61 100644 --- a/Tests/CatalogItems/Write-RsFolderContent.Tests.ps1 +++ b/Tests/CatalogItems/Write-RsFolderContent.Tests.ps1 @@ -3,13 +3,13 @@ Describe "Write-RsFolderContent" { - Context "Write-RsFolderContent with min parameters"{ + Context "Write-RsFolderContent with min parameters" { $folderName = 'SutWriteRsFolderContentMinParameters' + [guid]::NewGuid() New-RsFolder -Path / -FolderName $folderName $folderPath = '/' + $folderName - $localReportPath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources' + $localReportPath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources' Write-RsFolderContent -Path $localReportPath -RsFolder $folderPath - + It "Should upload a local report in Report Server" { $uploadedReport = (Get-RsFolderContent -RsFolder $folderPath ) | Where-Object TypeName -eq 'Report' $uploadedReport.Name | Should Be 'emptyReport' @@ -28,11 +28,11 @@ Describe "Write-RsFolderContent" { Remove-RsCatalogItem -RsFolder $folderPath -Confirm:$false } - Context "Write-RsFolderContent with ReportServerUri parameter"{ + Context "Write-RsFolderContent with ReportServerUri parameter" { $folderName = 'SutWriteRsFolderContentReportServerUri' + [guid]::NewGuid() New-RsFolder -Path / -FolderName $folderName $folderPath = '/' + $folderName - $localReportPath = (Get-Item -Path ".\" -Verbose).FullName + '\Tests\CatalogItems\testResources' + $localReportPath = (Get-Item -Path ".\" -Verbose).FullName + '\Tests\CatalogItems\testResources' $reportServerUri = 'http://localhost/reportserver' Write-RsFolderContent -Path $localReportPath -RsFolder $folderPath -ReportServerUri $reportServerUri $uploadedReport = (Get-RsFolderContent -RsFolder $folderPath ) | Where-Object TypeName -eq 'Report' @@ -43,12 +43,12 @@ Describe "Write-RsFolderContent" { Remove-RsCatalogItem -RsFolder $folderPath -Confirm:$false } - Context "Write-RsFolderContent with Proxy Parameter"{ + Context "Write-RsFolderContent with Proxy Parameter" { $folderName = 'SutWriteRsFolderContentProxy' + [guid]::NewGuid() New-RsFolder -Path / -FolderName $folderName $folderPath = '/' + $folderName - $localReportPath = (Get-Item -Path ".\" -Verbose).FullName + '\Tests\CatalogItems\testResources' - $proxy = New-RsWebServiceProxy + $localReportPath = (Get-Item -Path ".\" -Verbose).FullName + '\Tests\CatalogItems\testResources' + $proxy = New-RsWebServiceProxy Write-RsFolderContent -Path $localReportPath -RsFolder $folderPath -Proxy $proxy $uploadedReport = (Get-RsFolderContent -RsFolder $folderPath ) | Where-Object TypeName -eq 'Report' It "Should upload a local report in Report Server with Proxy Parameter" { @@ -58,12 +58,12 @@ Describe "Write-RsFolderContent" { Remove-RsCatalogItem -RsFolder $folderPath -Confirm:$false } - Context "Write-RsFolderContent with Proxy and ReportServerUri"{ + Context "Write-RsFolderContent with Proxy and ReportServerUri" { $folderName = 'SutWriteRsFolderContentAll' + [guid]::NewGuid() New-RsFolder -Path / -FolderName $folderName $folderPath = '/' + $folderName - $localReportPath = (Get-Item -Path ".\" -Verbose).FullName + '\Tests\CatalogItems\testResources' - $proxy = New-RsWebServiceProxy + $localReportPath = (Get-Item -Path ".\" -Verbose).FullName + '\Tests\CatalogItems\testResources' + $proxy = New-RsWebServiceProxy $reportServerUri = 'http://localhost/reportserver' Write-RsFolderContent -Path $localReportPath -RsFolder $folderPath -Proxy $proxy -ReportServerUri $reportServerUri $uploadedReport = (Get-RsFolderContent -RsFolder $folderPath ) | Where-Object TypeName -eq 'Report' @@ -74,25 +74,26 @@ Describe "Write-RsFolderContent" { Remove-RsCatalogItem -RsFolder $folderPath -Confirm:$false } - Context "Write-RsFolderContent with Recurse Parameter"{ + Context "Write-RsFolderContent with Recurse Parameter" { $folderName = 'SutWriteRsFolderContentRecurse' + [guid]::NewGuid() New-RsFolder -Path / -FolderName $folderName $folderPath = '/' + $folderName - $localReportPath = (Get-Item -Path ".\" -Verbose).FullName + '\Tests\CatalogItems\testResources' + $localReportPath = (Get-Item -Path ".\" -Verbose).FullName + '\Tests\CatalogItems\testResources' Write-RsFolderContent -Path $localReportPath -RsFolder $folderPath -Recurse - It "Should upload a local subFolder with Recurse Parameter" { + It "Should upload a local subFolder with Recurse Parameter" { $uploadedFolders = (Get-RsFolderContent -RsFolder $folderPath -Recurse ) | Where-Object TypeName -eq 'Folder' | Sort-Object -Property Name -Descending $uploadedFolders.Count | Should Be 3 $uploadedFolders[0].Name | Should Be 'testResources2' - $uploadedFolders[1].Name | Should Be 'datasources' + $uploadedFolders[1].Name | Should Be 'imagesResources' + $uploadedFolders[2].Name | Should Be 'datasources' } - It "Should upload a report that is in a folder and a second report that is in a subfolder" { + It "Should upload a report that is in a folder and a second report that is in a subfolder" { $uploadedReports = (Get-RsFolderContent -RsFolder $folderPath -Recurse ) | Where-Object TypeName -eq 'Report' $uploadedReports.Count | Should Be 4 } - It "Should upload a local RsDataSource in Report Server" { + It "Should upload a local RsDataSource in Report Server" { $uploadedDataSource = (Get-RsFolderContent -RsFolder $folderPath -Recurse ) | Where-Object TypeName -eq 'DataSource' $uploadedDataSource.Name | Should Be 'SutWriteRsFolderContent_DataSource' } From a578bf73fc11ea7c83df11fc3ee8b58a5272e53e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Wed, 30 May 2018 08:35:43 +0100 Subject: [PATCH 16/20] Fix wording and remove correct image folders --- Tests/CatalogItems/Write-RsCatalogItem.Tests.ps1 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Tests/CatalogItems/Write-RsCatalogItem.Tests.ps1 b/Tests/CatalogItems/Write-RsCatalogItem.Tests.ps1 index 0dcfc3ae..f72ed08b 100644 --- a/Tests/CatalogItems/Write-RsCatalogItem.Tests.ps1 +++ b/Tests/CatalogItems/Write-RsCatalogItem.Tests.ps1 @@ -113,7 +113,7 @@ Describe "Write-RsCatalogItem" { $localJPGImagePath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources\imagesResources\PowerShellHero.jpg' Write-RsCatalogItem -Path $localJPGImagePath -RsFolder $jpgFolderPath - It "Should upload a local jpg image in ReportServer with Overwrite Parameter" { + It "Should upload a local jpg image in ReportServer" { $jpgImageResource = (Get-RsFolderContent -RsFolder $jpgFolderPath ) | Where-Object TypeName -eq 'Resource' $jpgImageResource.Name | Should Be 'PowerShellHero.jpg' $jpgImageResource.ItemMetadata.Name | Should Be 'MIMEType' @@ -126,7 +126,7 @@ Describe "Write-RsCatalogItem" { $localPNGImagePath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources\imagesResources\SSRS.png' Write-RsCatalogItem -Path $localPNGImagePath -RsFolder $pngFolderPath - It "Should upload a local png image in ReportServer with Overwrite Parameter" { + It "Should upload a local png image in ReportServer" { $jpgImageResource = (Get-RsFolderContent -RsFolder $pngFolderPath ) | Where-Object TypeName -eq 'Resource' $jpgImageResource.Name | Should Be 'SSRS.png' $jpgImageResource.ItemMetadata.Name | Should Be 'MIMEType' @@ -134,6 +134,7 @@ Describe "Write-RsCatalogItem" { } # Removing folders used for testing - Remove-RsCatalogItem -RsFolder $folderPath -Confirm:$false + Remove-RsCatalogItem -RsFolder $jpgFolderPath -Confirm:$false + Remove-RsCatalogItem -RsFolder $pngFolderPath -Confirm:$false } } \ No newline at end of file From 5904ea7b19494f781acf8e5798331d6fdc4a0b75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Wed, 30 May 2018 08:36:08 +0100 Subject: [PATCH 17/20] Fix images folder name. Missing 's' --- Tests/CatalogItems/Rest/Write-RsRestCatalogItem.Tests.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests/CatalogItems/Rest/Write-RsRestCatalogItem.Tests.ps1 b/Tests/CatalogItems/Rest/Write-RsRestCatalogItem.Tests.ps1 index 6e4c89c8..d7860912 100644 --- a/Tests/CatalogItems/Rest/Write-RsRestCatalogItem.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Write-RsRestCatalogItem.Tests.ps1 @@ -110,13 +110,13 @@ Describe "Write-RsRestCatalogItem" { } It "Should upload a local JPG file" { - $itemPath = $localPath + '\imageResources\PowerShellHero.jpg' + $itemPath = $localPath + '\imagesResources\PowerShellHero.jpg' Write-RsRestCatalogItem -ReportPortalUri $reportPortalUri -Path $itemPath -RsFolder $rsFolderPath -Verbose VerifyCatalogItemExists -itemName 'PowerShellHero.jpg' -itemType 'Resource' -folderPath $rsFolderPath -reportServerUri $reportServerUri } It "Should upload a local PNG file" { - $itemPath = $localPath + '\imageResources\SSRS.png' + $itemPath = $localPath + '\imagesResources\SSRS.png' Write-RsRestCatalogItem -ReportPortalUri $reportPortalUri -Path $itemPath -RsFolder $rsFolderPath -Verbose VerifyCatalogItemExists -itemName 'SSRS.png' -itemType 'Resource' -folderPath $rsFolderPath -reportServerUri $reportServerUri } @@ -180,13 +180,13 @@ Describe "Write-RsRestCatalogItem" { } It "Should upload a local JPG file" { - $itemPath = $localPath + '\imageResources\PowerShellHero.jpg' + $itemPath = $localPath + '\imagesResources\PowerShellHero.jpg' Write-RsRestCatalogItem -WebSession $webSession -Path $itemPath -RsFolder $rsFolderPath -Verbose VerifyCatalogItemExists -itemName 'PowerShellHero.jpg' -itemType 'Resource' -folderPath $rsFolderPath -reportServerUri $reportServerUri } It "Should upload a local PNG file" { - $itemPath = $localPath + '\imageResources\SSRS.png' + $itemPath = $localPath + '\imagesResources\SSRS.png' Write-RsRestCatalogItem -WebSession $webSession -Path $itemPath -RsFolder $rsFolderPath -Verbose VerifyCatalogItemExists -itemName 'SSRS.png' -itemType 'Resource' -folderPath $rsFolderPath -reportServerUri $reportServerUri } From 3f288aa8603be2336ce4ad6a14c5de700fa437ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Mon, 4 Jun 2018 20:37:57 +0100 Subject: [PATCH 18/20] Logic simplified and remove duplicated code --- .../CatalogItems/Write-RsCatalogItem.ps1 | 70 +++++++------------ 1 file changed, 24 insertions(+), 46 deletions(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 index 52bfbe6e..c8e6105a 100644 --- a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 +++ b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 @@ -204,69 +204,47 @@ function Write-RsCatalogItem #region Upload other stuff else { + $additionalProperties = New-Object System.Collections.Generic.List[$propertyDataType] + $property = New-Object $propertyDataType + if ($itemType -eq 'Resource') { - $additionalProperties = New-Object System.Collections.Generic.List[$propertyDataType] - - $descriptionProperty = New-Object $propertyDataType - $descriptionProperty.Name = 'MimeType' + $property.Name = 'MimeType' if ($item.Extension -eq ".png") { - $descriptionProperty.Value = 'image/png' + $property.Value = 'image/png' } else { - $descriptionProperty.Value = 'image/jpeg' - } - - $additionalProperties.Add($descriptionProperty) - - $bytes = [System.IO.File]::ReadAllBytes($EntirePath) - $warnings = $null - try - { - $Proxy.CreateCatalogItem($itemType, $item.Name, $RsFolder, $Overwrite, $bytes, $descriptionProperty, [ref]$warnings) - if ($warnings) - { - foreach ($warn in $warnings) - { - Write-Warning $warn.Message - } - } - } - catch - { - throw (New-Object System.Exception("Failed to create resource item $($item.FullName): $($_.Exception.Message)", $_.Exception)) + $property.Value = 'image/jpeg' } + $erroMessageItemType = 'resource' } else { + $property.Name = 'Description' + $property.Value = $Description + $erroMessageItemType = 'catalog' + } - $additionalProperties = New-Object System.Collections.Generic.List[$propertyDataType] - - $descriptionProperty = New-Object $propertyDataType - $descriptionProperty.Name = 'Description' - $descriptionProperty.Value = $Description - $additionalProperties.Add($descriptionProperty) + $additionalProperties.Add($property) - $bytes = [System.IO.File]::ReadAllBytes($EntirePath) - $warnings = $null - try + $bytes = [System.IO.File]::ReadAllBytes($EntirePath) + $warnings = $null + try + { + $Proxy.CreateCatalogItem($itemType, $itemName, $RsFolder, $Overwrite, $bytes, $additionalProperties, [ref]$warnings) | Out-Null + if ($warnings) { - $Proxy.CreateCatalogItem($itemType, $itemName, $RsFolder, $Overwrite, $bytes, $additionalProperties, [ref]$warnings) | Out-Null - if ($warnings) + foreach ($warn in $warnings) { - foreach ($warn in $warnings) - { - Write-Warning $warn.Message - } + Write-Warning $warn.Message } } - catch - { - throw (New-Object System.Exception("Failed to create catalog item $($item.FullName) : $($_.Exception.Message)", $_.Exception)) - } - + } + catch + { + throw (New-Object System.Exception("Failed to create $erroMessageItemType item $($item.FullName) : $($_.Exception.Message)", $_.Exception)) } } #endregion Upload other stuff From 3e87c417763d04544635c63db75742ccd52ff8ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Tue, 5 Jun 2018 16:58:08 +0100 Subject: [PATCH 19/20] Use $item.Name to save resource with the extension --- .../Functions/CatalogItems/Write-RsCatalogItem.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 index c8e6105a..745a7395 100644 --- a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 +++ b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 @@ -233,7 +233,7 @@ function Write-RsCatalogItem $warnings = $null try { - $Proxy.CreateCatalogItem($itemType, $itemName, $RsFolder, $Overwrite, $bytes, $additionalProperties, [ref]$warnings) | Out-Null + $Proxy.CreateCatalogItem($itemType, $item.Name, $RsFolder, $Overwrite, $bytes, $additionalProperties, [ref]$warnings) | Out-Null if ($warnings) { foreach ($warn in $warnings) From 498942ec048d3c5cbac401615edd7576edfa9b51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Silva?= Date: Tue, 5 Jun 2018 18:37:17 +0100 Subject: [PATCH 20/20] Only use extension when it is resource --- .../Functions/CatalogItems/Write-RsCatalogItem.ps1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 index 745a7395..c0ae1799 100644 --- a/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 +++ b/ReportingServicesTools/Functions/CatalogItems/Write-RsCatalogItem.ps1 @@ -209,6 +209,8 @@ function Write-RsCatalogItem if ($itemType -eq 'Resource') { + #If it is a resource we need to save the extension so the file can be recognized + $itemName = $item.Name $property.Name = 'MimeType' if ($item.Extension -eq ".png") { @@ -233,7 +235,7 @@ function Write-RsCatalogItem $warnings = $null try { - $Proxy.CreateCatalogItem($itemType, $item.Name, $RsFolder, $Overwrite, $bytes, $additionalProperties, [ref]$warnings) | Out-Null + $Proxy.CreateCatalogItem($itemType, $itemName, $RsFolder, $Overwrite, $bytes, $additionalProperties, [ref]$warnings) | Out-Null if ($warnings) { foreach ($warn in $warnings)